检测的物体是否为绝对刚性的物体,也就是检测的目标是一个固定物体,没有变化(如特定公司的商标),这样的物体只要提供一份样本就可以进行训练。但绝大数时候我们想进行训练的目标是非绝对刚性的物体,如对人的检测,包括人脸识别、手势识别。
分类器的训练以分为以下三部进行:
1、 样本的创建(正样本和负样本)
2、 训练分类器(生成.xml)
3、 利用训练好的分类器进行目标检测
正样本:所谓正样本就是只包含检测目标的图片
1、要求尺寸必须相同,例如40x30
2、进行灰度处理
负样本:不包含检测目标的任何图片(背景图片)
1.不要求样本尺寸,但要大于等于正样本的大小;且负样本不能重复,要增大负样本的差异性。
2.负样本灰度化,同正样本操作相同。
制作正样本:
1、收集数据(截图或拍照等)进行处理:
2、 将所有图像调整成一致大小,我用的“美图看看”这款软件,批量处理的,我处理的统一尺寸是40x30
3、进行灰度处理
#include "stdafx.h"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main()
{
char buffer[50];
char buffer1[50];
int i = 0;
for (i = 1; i <= 100; i++)
{
sprintf_s(buffer, "C:\\Users\\Administrator\\Desktop\\xml\\ww\\%d.png", i);
sprintf_s(buffer1, "C:\\Users\\Administrator\\Desktop\\xml\\pos\\%d.png", i);
Mat src = imread(buffer, IMREAD_COLOR);
if (src.empty())
{
return -1;
}
cvtColor(src, src, COLOR_BGR2GRAY);
equalizeHist(src, src);
imwrite(buffer1, src);
}
return 0;
}
4、这样正样本就处理好了,接下来要生成posdata.dat文件
将opencv安装目录的D:\Program Files\opencv\build\x64\vc15\bin\opencv_createsamples.exe和opencv_traincascade.exe复制到需要进行图像处理的目录下(也可不复制,操作时加上目录)
制作dos命令操作文件dat_cmd.bat:输入dir /b > posdata.dat(表示将当前文件写入posdata.dat)
双击执行dat_cmd.bat生成posdata.dat,打开posdata.dat,删除不需要文件
在对文件进行处理,使其含有图片信息,格式为:图片路径 检测目标在图片中的个数 起始监测点坐标(x,y) 图片大小(w,h)
5、生成训练.vec文件
命令行参数:
-vec <vec_file_name>
输出文件,内含用于训练的正样本。
-img <image_file_name>
输入图像文件名(例如一个公司的标志)。
-bg <background_file_name>
背景图像的描述文件,文件中包含一系列的图像文件名,这些图像将被随机选作物体的背景。
-num <number_of_samples>
生成的正样本的数目。
-bgcolor <background_color>
背景颜色(目前为灰度图);背景颜色表示透明颜色。因为图像压缩可造成颜色偏差,颜色的容差可以由 -bgthresh 指定。所有处于 bgcolor-bgthresh 和 bgcolor+bgthresh 之间的像素都被设置为透明像素。
-bgthresh <background_color_threshold>
-inv
如果指定该标志,前景图像的颜色将翻转。
-randinv
如果指定该标志,颜色将随机地翻转。
-maxidev <max_intensity_deviation>
前景样本里像素的亮度梯度的最大值。
-maxxangle <max_x_rotation_angle>
X轴最大旋转角度,必须以弧度为单位。
-maxyangle <max_y_rotation_angle>
Y轴最大旋转角度,必须以弧度为单位。
-maxzangle <max_z_rotation_angle>
Z轴最大旋转角度,必须以弧度为单位。
-show
很有用的调试选项。如果指定该选项,每个样本都将被显示。如果按下 Esc 键,程序将继续创建样本但不再显示。
-w <sample_width>
输出样本的宽度(以像素为单位)。
-h <sample_height>
输出样本的高度(以像素为单位)。
6、处理负样本:对负样本只需得到.dat文件(同正样本处理)
二、训练级联分类器
1、将生成的的负样本negdata.dat复制到和opencv_traincascade.exe同目录下(也可以吧正样本的pos.vec复制到此目录下)
并且制作训练命令train.bat
参考