天天看点

OpenCV 级联分类器训练(一)——步骤和方法

关于原理,其他博客有的已经介绍的很详细了,这里主要把我进行训练时的步骤列出来,有的是根据别人的博客参考的,但进行过程中还是会出错,现在把我真正使用的步骤列出来,以供参考

一、关于正样本的准备

正样本的选取原则

  1. 正样本的尺寸不是必须一致的,但是要和生成的正样本矢量文件中的宽高有相同的比例(训练过程中,会根据矢量文件中设置的宽高,自动对正样本进行缩放)
  2. 正样本图片中可以包含背景信息,但是不能太多。因为如果正样本图像中包含背景信息,会在训练过程中将这些背景信息也最为有效数据训练成正样本的一个局部特征,使得特征值的计算包含干扰信息。
  3. 对于待训练的数据库来说,如果同一正样本目标的图像太多,就会使局部特征过于明显,造成这个目标的训练过拟合,影响检测精度

1、采集正样本图片

因为正样本最后需要大小归一化,所以我在采集样本的时候就直接把它从原图里抠出来了,方便后面缩放嘛,而不是只保存它的框个数和框位置信息(框个数、框位置信息看下一步解释),在裁剪的过程中尽量保持样本的长宽比例一致。比如我最后要归一化成64 X 64,在裁剪样本的时候,我都是64 X 64(跟我的自身用途有关,对于人头检测这种要保证缩放不变性的样本,肯定就可以超过啦)

2、获取正样本路径列表

在你的图片文件夹里,编写一个bat程序(get route.bat,bat是避免每次都需要去dos框输入,那里又不能复制又不能粘贴!),如下所示:

OpenCV 级联分类器训练(一)——步骤和方法

运行bat文件,就会生成如下dat文件:

OpenCV 级联分类器训练(一)——步骤和方法

把这个dat文件中的所有非图片的路径都删掉,比如上图的头两行,再将bmp 替换成 jpg 1 0 0 64 64,如下:

OpenCV 级联分类器训练(一)——步骤和方法

(1代表个数,后四个分别对应 left top width height,如果我们之前不是把样本裁剪下来的,那么你的这个dat可能就长成这样1. jpg 3 1 3 24 24 26 28 25 25 60 80 26 26,1. jpg是完全的原图啊,你之前的样本就是从这张图上扣下来的)

3、获取正样本矢量集vec文件

这里,我们得利用opencv里的一个程序叫opencv_createsamples.exe,可以把它拷贝出来。针对它的命令输入也是写成bat文件啦,因为cascade训练的时候用的是vec。如下:

OpenCV 级联分类器训练(一)——步骤和方法

运行bat,就在我们得pos文件夹里生成了如下vec文件:

OpenCV 级联分类器训练(一)——步骤和方法

就此有关正样本的东西准备结束。

注意:

样本矢量库的宽和高设置不宜过大,如果太大,会使样本在训练过程中占用内存较大,可能出现内存分配失败的错误,如Out of memory.

另外,一般,我们训练都需要几千甚至上万张正样本。但如果只有一张包含物体的图像,如公司的logo图标,那么可以通过对物体图像的随机旋转、改变LOGO亮度和将LOGO放在任意的背景上而获得大量的正样本。生成的正样本以及随机的旋转程度都可以通过opencv_createsamples的命令行参数进行控制。

创建vec命令行参数:

  • -vec 输出文件,内含有用于训练的正样本
  • -img 输入图片文件名(例如一个公司的LOGO)
  • -bg 背景描述文件,文件中包含一系列的图像文件名,这些图像将被随机选作物体的背景
  • -num 生成正样本的数目
  • bgcolor 背景颜色(目前为灰度图),背景颜色表示透明颜色。因为图像压缩可造成颜色偏差,颜色的容差可以由 -bgthresh 指定。所有处于 bgcolor-bgthresh 和bgcolor+bgthresh 之间的像素都被设置为透明像素。
  • -bgthresh
  • -inv 如果指定该标志,前景图像的颜色将翻转。
  • -randinv 如果指定该标志,颜色将随机地翻转。
  • -maxidev 前景样本里像素的亮度梯度的最大值。
  • -maxxangle X轴最大旋转角度,必须以弧度为单位。
  • -maxyangle Y轴最大旋转角度,必须以弧度为单位。
  • -maxzangle Z轴最大旋转角度,必须以弧度为单位。
  • -show 很有用的调试选项。如果指定该选项,每个样本都将被显示。如果按下 Esc 键,程序将继续创建样本但不再显示。
  • -w 输出样本的宽度(以像素为单位)。
  • -h 输出样本的高度(以像素为单位)。

创建样本的流程如下:

输入图像沿着三个轴随机旋转。

旋转的角度由 -max?angle 限定。然后像素的亮度值位于 [bg_color-bg_color_threshold;bg_color+bg_color_threshold]范围的像素被设置为透明像素。将白噪声加到前景图像上。

如果指定了-inv ,那么前景图像的颜色将被翻转。如果指定了-randinv ,程序将随机选择是否将颜色进行翻转。

任选背景图像,将获得的前景图像放到背景图像上,并将图像调整到-w 和-h 指定的大小。最后将图像存入vec文件,vec文件名由命令行参数-vec 指定。

正样本也可从一系列事先标记好的图像中创建。标记信息可以存储于一个文本文件,与背景描述文件类似。文件中的每行对应一个图像文件。每行的第一个元素为图像文件名,后面是物体的数目,最后是物体位置和大小的描述 (x, y, width, height)。

二、关于负样本的准备

负样本的选取原则:

  1. 在负样本图片中不能包含正样本目标;
  2. 每个负样本之间是各不相同的,即确保负样本的多样性;
  3. 每个负样本的尺寸不是必须相同的,但负样本的尺寸不能小于正样本矢量集图像的宽和高,本文设置的是64*64;

这个特别简单,直接拿原始图,不需要裁剪抠图,也不需要保存框,只要保证比正样本大小大就可以了,只要把路径保存下来。同正样本类似,步骤图如下:

OpenCV 级联分类器训练(一)——步骤和方法

至此有关负样本的也准备完成。

OpenCV 级联分类器训练(一)——步骤和方法

进行训练的话,创建一个classify20.bat

OpenCV 级联分类器训练(一)——步骤和方法

双击运行即可开始训练。

注意:numPos *2 < numNeg < numPos*4

需要的文件都在这里列出:

OpenCV 级联分类器训练(一)——步骤和方法
OpenCV 级联分类器训练(一)——步骤和方法

关于OpenCV级联分类器训练的参数设置与解释在下一篇文章中会提到

——参OpenCV级联分类器训练(二)

继续阅读