OpenCV 级联分类器训练——训练步骤详解(一)

参考文章:http://blog.csdn.net/xiao_lxl/article/details/44645969
根据本人实践过程和理解写了下文。

一、正样本准备

正样本的选取原则

  1. 正样本的尺寸不是必须一致的,但是要和生成的正样本矢量文件中的宽高有相同的比例(训练过程中,会根据矢量文件中设置的宽高,自动对正样本进行缩放,比如我在用程序标注时,框选目标尺寸为30X30,但生产vec文件时填的尺寸为64X64,训练时会自动将框选图像做等比例缩放);

  2. 正样本图片应该尽可能包含少的干扰背景信息。在训练过程中这些背景信息也会成为正样本的一个局部特征,使得特征值的计算包含干扰信息。

  3. 数据来源尽可能做到多样化,比如样本为车,车的姿态场景应稍丰富些。同一正样本目标的图像太多会使局部特征过于明显,造成这个目标的训练过拟合,影响检测精度,不利于训练器泛化使用。

1、采集正样本图片

正样本最后需要大小归一化,采集样本时可直接把它从原图里抠出来以便缩放;但是我是保留了原图,且在一张图上对多个目标做位置标注了,即保存了它的框个数和框位置信息;我在裁剪时将裁剪框做了比例约束,使得裁剪出来的框和最后需要归一化尺寸等比例。比如要归一化成64 X 64,在裁剪样本的时候,我按长宽等比例裁剪(如32X32,48X48);也可以是非1:1的长宽比,具体看你目标对象的尺寸比例而定。

2、获取正样本路径列表

在你的图片文件夹里,编写一个.bat文件或者是一个.cmd文件(get route.bat,bat是避免每次都需要去dos框输入),如下所示:
内容也可更改为: dir pos /b > pos.txt          其中pos是文件夹名字,将pos文件夹中的所有文件名保存到pos.txt文件中;
这里写图片描述

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

这里写图片描述

把这个dat文件中的所有非图片的路径都删掉,比如上图的头两行,由于我不是裁剪的,所以txt中的目标位置我都是通过一个objectMaker小程序生产的框和尺寸坐标位置:

(pos.txt文件内容中:图像格式后面的数字代表个数(可不只是1),后四个分别对应框的 left top width height,我不是把样本裁剪下来的,那txt中是xxx. jpg 3 1 3 24 24 26 28 25 25 60 80 26 26,xxx. jpg是原图,3为该图上的框数量,后面的数是每个框的信息)

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

利用opencv里的一个程序叫opencv_createsamples.exe,把它拷贝出来,放在当前目录下。针对它的命令输入也是写成bat文件,因为cascade训练的时候用的是vec。如下:可通过加-show显示某个正样本图像。可以根据自己需求更改num数,-w和-h

这里写图片描述

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

这里写图片描述

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

注意:
样本矢量库的宽和高设置太大会使样本在训练过程中占用内存较大,可能出现内存分配失败的错误,根据实际情况适当更改。. 

创建vec命令行参数:

  • -vec 输出文件,内含有用于训练的正样本

  • -img 输入图片文件名

  • -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;

这个特别简单,直接拿原始图,不需要裁剪抠图,也不需要保存框,只要保证比正样本尺寸大就可以了,只要把路径保存下来。同正样本类似,同理也可以是.cmd文件,内容如:dir neg /b > neg.txt     其中neg为负样本所在的图像文件夹名。neg.txt中内容不含框和位置信息。图如下:

这里写图片描述

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

这里写图片描述

进行训练的话,创建一个classify20.bat
我写的.bat内容为:
@echo off
opencv_traincascade.exe -data data -vec pos.vec -bg neg\neg.txt -numPos 20000 -numNeg 50000 -numStages 16 -featureType HOG -w 64 -h 64
pause
会在data文件夹中生产一个xml文件,即分类器。

这里写图片描述

双击运行即可开始训练。

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

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

这里写图片描述
这里写图片描述

  • 16
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值