前言

  红胖子,来也!
  做图像处理,经常头痛的是明明分离出来了(非颜色的),分为几块区域,那怎么知道这几块区域到底哪一块是我们需要的,那么这部分就涉及到需要识别了。
  识别可以自己写模板匹配、特征点识别、级联分类器训练识别。
  本文章就是讲解级联分类器的训练与识别。

明确目标

  目标是识别视频中的歌手,我们先手动采集数据集合。
  视频为《绿色》,如下图:

 

训练分类器前的准备工作

采集正样本图片

  正样本的尺寸不是必须一致的,但是要和生成的正样本矢量文件中的宽高有相同的比例(因为训练过程中,会根据设置的宽高进行等比缩放,比如设置正版本图片是128x128的,那么样本为256x256会缩放,假设杨文为256x128的那么比例就不同了,这个图怎么处理?待定);
  正样本图片应该尽可能包含少的干扰背景信息。在训练过程中多余的背景信息也会成为正样本的一个局部特征,此处与深度学习不同,深度学习现在主流无脑深度学习,图像基本的一些去噪都可能不做。
  数据来源尽可能做到多样化,比如样本为车,车的姿态场景应稍丰富些。同一正样本目标的图像太多会使局部特征过于明显,造成这个目标的训练过拟合,影响检测精度,不利于训练器泛化使用。
  我们采集视频的人脸,先把视频解码后保存成jpg图片。
  此处省略一万字…

 

创建样本:opencv_createsamples.exe

  使用opencv自带的命令行工具opencv_createsamples.exe

  • [-info <collection_file_name>]
    样本说明文件,每一行的内容为
xxx.jpg nums x y width height

  例如:图片中有两个目标

xxx.jpg 2 0 0 100 100 200 200 100 100

  生成样本在windows上依托命令行

dir /b > pos.data
  • [-img <image_file_name>]
      通过一张图片的扭曲形变成多张图片作为样本,就填写这个参数,参数的内容为要扭曲的图片的路径。填入后,-info参数不再有效。
  • [-vec <vec_file_name>]
      样本描述文件的名字及路径
  • [-bg <background_file_name>]
      负样本描述文件的名字及路径,如果省略,则使用bgcolor的值填充作为背景。就是跟存放负样本图片(背景图片)目录位置相同的描述文件的路径,可用txt,dat等格式保存,每一行的内容为:xxx.jpg。
  • [-inv]
      如果指定该标志,前景图像的颜色将翻转
  • [-randinv]
      如果指定该标志,颜色将随机地翻转
  • [-num <number_of_samples = 1000>]
      总共几个样本,可以省略,则按照输入的实际样本数量产生
  • [-bgcolor <background_color = 0>]
      背景颜色(目前为灰度图);背景颜色表示透明颜色。因为图像压缩可造成颜色偏差,颜色的容差可以由-bgthresh指定。所有处于bgcolor-bgthresh和bgcolor+bgthresh之间的像素都被设置为透明像素。
  • [-bgthresh <background_color_threshold = 80>]
      (参考-bgcolor)
  • [-maxidev <max_intensity_deviation = 40>]
      前景样本里像素的亮度梯度的最大值
  • [-maxxangle <max_x_rotation_angle = 1.100000>]
      x轴最大旋转角度,单位弧度
  • [-maxyangle <max_y_rotation_angle = 1.100000>]
      y轴最大旋转角度,单位弧度
  • [-maxzangle <max_z_rotation_angle = 0.500000>]
      z轴最大旋转角度,单位弧度
  • [-show [<scale = 4.000000>]]
      显示样本,作为创建样本时的调试
  • [-w <sample_width = 24>]
      样本缩放到的尺寸
  • [-h <sample_height = 24>]
      样本缩放到的尺寸
  • [-maxscale ]:
  • [-rngseed ]:

创建正样本


创建负样本


创建样本文件vec

opencv_createsamples -vec pos.vec -info pos/pos.txt -bg neg/neg.txt -show -w 50 -h 70  -maxxangle 6.28 -maxyangle 6.28 -maxzangle 6.28

(注意:LBP特征50x70等都可以可以训练,实测HAAR则必须是24x24 or 20x20)

 

训练样本opencv_traincascade.exe

  使用opencv自带的命令行工具opencv_traincascade.exe,可以训练三个特征目标:HAAR、HOG、LBP。

  • -data <cascade_dir_name>
      训练的分类器的存储目录。
  • -vec <vec_file_name>
      通过opencv_createsamples生成的vec文件,正样本的数据。
  • -bg <background_file_name>
      负样本说明文件,主要包含负样本文件所在的目录及负样本文件名。
  • [-numPos <number_of_positive_samples = 2000>]
      每级分类器训练时所用到的正样本数目,但是应当注意,这个数值一定要比准备正样本时的数目少。
  • [-numNeg <number_of_negative_samples = 1000>]
      每级分类器训练时所用到的负样本数目,可以大于-bg指 定的图片数目。
  • [-numStages <number_of_stages = 20>]
      训练分类器的级数,强分类器的个数
  • [-precalcValBufSize <precalculated_vals_buffer_size_in_Mb = 1024>]
      缓存大小,用于存储预先计算的特征值,单位MB
  • [-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = 1024>]
      缓存大小,用于存储预先计算的特征索引,单位MB
  • [-baseFormatSave]
      仅在使用Haar特征时有效,如果指定,级联分类器将以老格式存储。
  • [-numThreads <max_number_of_threads = 1>]
      支持多线程并行训练
  • [-acceptanceRatioBreakValue = -1>]
      此参数用于确定模型应保持学习的精确程度以及何时停止。一个好的指导方针是训练不超过10e-5(等于10*10^(-5) ),以确保模型不会过度训练您的训练数据。默认情况下,此值设置为-1以禁用此功能。

–cascadeParams–

  • [-stageType <BOOST(default)>]
      级联类型,目前只能取BOOST
  • [-featureType <{HAAR(default), LBP, HOG}>]
      训练使用的特征类型,目前支持的特征有Haar,LBP和HOG
  • [-w <sampleWidth = 24>]
      训练的正样本的宽度,Haar特征的w和h一般为20,LBP特征的w和h一般为24,HOG特征的w和h一般为64
  • [-h <sampleHeight = 24>]
      训练的正样本的高

–boostParams–

  • [-bt <{DAB, RAB, LB, GAB(default)}>]
      增强分类器类型:DAB-Discrete AdaBoost,RAB-Real AdaBoost,LB-LogitBoost,GAB-Gentle AdaBoost。
  • [-minHitRate <min_hit_rate> = 0.995>]
      类器每个阶段的最小期望命中率。总体命中率估计为(最小命中率^阶段数)。
  • [-maxFalseAlarmRate <max_false_alarm_rate = 0.5>]
      分类器每个阶段的最大期望误报率。
  • [-weightTrimRate <weight_trim_rate = 0.95>]
      指定是否应使用修剪及其权重。一个不错的选择是0.95。
  • [-maxDepth <max_depth_of_weak_tree = 1>]
      弱树的最大深度。一个不错的选择是1,这是树桩的情况。
  • [-maxWeakCount <max_weak_tree_count = 100>]
      每个级联阶段的最大弱树数。提升分类器(stage)将具有许多弱树(<=maxWeakCount),以实现给定的-maxFalseAllRate。

–haarFeatureParams–

  • [-mode <BASIC(default) | CORE | ALL>]
      选择训练中使用的Haar特征集的类型。基本只使用直立特征,而所有特征都使用全套直立和45度旋转特征集。

训练级联分类器

opencv_traincascade.exe -data data -vec pos.vec -bg neg\neg.txt \
-numPos 41 -numNeg 215 -numStages 16 -featureType HAAR -w 64 -h 64

训练出错如下:

更换LBP特征,继续训练:

opencv_traincascade.exe -data data -vec pos.vec -bg neg\neg.txt \
-numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 64 -h 64

训练出错如下:

  根据错误宽高是要跟创建的样本一样,改为50x70,(创建的样本为50x70),继续训练:

opencv_traincascade.exe -data data -vec pos.vec -bg neg\neg.txt  \
-numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 50 -h 70

  负样本再生成一次绝对路径:

dir /b /s >negAb.txt


  删掉非图片的行
  然后继续训练:

opencv_traincascade.exe -data data -vec pos.vec -bg neg\negAb.txt \
-numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 50 -h 70

训练出错,如下:

手动创建data目录

  继续训练:

opencv_traincascade.exe -data data -vec pos.vec -bg neg\negAb.txt -numPos 41 -numNeg 215 -numStages 16 -featureType LBP -w 50 -h 70

  然后,正常训练,训练完成:

如何训练Haar

  要训练haar特征级联分类器,最开始创建样本就必须为24x24 or 20x20的(经过多次尝试论证),最终设置24x24训练出来如下:

opencv_traincascade.exe -data data -vec pos.vec -bg neg\negAb.txt \
-numPos 41 -numNeg 215 -numStages 16 -featureType HAAR -w 24 -h 24

  训练

opencv_createsamples -vec pos.vec -info pos/pos.txt -bg neg/neg.txt -\
show -w 24 -h 24 -maxxangle 6.28 -maxyangle 6.28 -maxzangle 6.28



  使用该级联分类器,使用cascade.xml加载即可。

 

Haar级联分类器的测试

 

OpenCV开发笔记(七十一):红胖子8分钟带你深入级联分类器训练的更多相关文章

  1. OpenCV开发笔记(七十二):红胖子8分钟带你使用opencv+dnn+tensorFlow识别物体

    前言   级联分类器的效果并不是很好,准确度相对深度学习较低,本章使用opencv通过tensorflow深度学习,检测已有模型的分类.   Demo       可以猜测,1其实是人,18序号类是狗 ...

  2. OpenCV开发笔记(七十三):红胖子8分钟带你使用opencv+dnn+yolov3识别物体

      前言   级联分类器的效果并不是很好,准确度相对深度学习较低,上一章节使用了dnn中的tensorflow,本章使用yolov3模型,识别出具体的分类.   Demo   320x320,置信度0 ...

  3. OpenCV开发笔记(六十五):红胖子8分钟带你深入了解ORB特征点(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  4. OpenCV开发笔记(六十四):红胖子8分钟带你深入了解SURF特征点(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  5. OpenCV开发笔记(六十九):红胖子8分钟带你使用传统方法识别已知物体(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  6. OpenCV开发笔记(五十五):红胖子8分钟带你深入了解Haar、LBP特征以及级联分类器识别过程(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. OpenCV开发笔记(五十六):红胖子8分钟带你深入了解多种图形拟合逼近轮廓(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  8. OpenCV开发笔记(七十四):OpenCV3.4.1+ffmpeg3.4.8交叉编译移植到海思平台Hi35xx平台

    前言   移植opencv到海思平台,opencv支持对视频进行解码,需要对应的ffmpeg支持.   Ffmpeg的移植   Ffmpeg的移植请参考之前的文章:<FFmpeg开发笔记(十): ...

  9. Modbus库开发笔记之十一:关于Modbus协议栈开发的说明(转)

    源: Modbus库开发笔记之十一:关于Modbus协议栈开发的说明

随机推荐

  1. 熬夜23天吃透,九大核心专题,成功收割了阿里、百度、美团3家offer

    前言 今年受疫情影响非常大,春招和金三银四都要比往年来得更迟一些.春招结束之后,我特意把自己的面试经历顺了顺,总结出了不少的经验.对了,这次一共收割了3个大厂offer,分别是蚂蚁金服.美团和网易,特 ...

  2. 分布式文件系统之FastDFS安装部署

    前面我们了解了分布式文件系统mogilefs的框架以及安装部署和简单使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/tag/MogileFS/:今天我们来了解下 ...

  3. c语言之结构

    定义结构: struct point { int x; int y; }; 定义结构并声明变量: struct point { int x; int y; }pt1,pt2,pt3; 声明结构变量 s ...

  4. linux操作指南-01

    目录 1.1 MBR 1.2 装双系统的坑 1.3 主机硬盘的主要规划 前言:记录下最近在看的鸟哥Liunx私房菜,虽然不是第一次看了..想记录几章开发中用的比较多的部分大致是以下几个章节 第3章 主 ...

  5. Spring Boot 项目打成 war 包部署

    Spring Boot 一个非常方便的功能就是支持内置的 Servlet 容器,一般我们部署 Spring Boot 应用时都是打成一个可执行的 Jar 包进行部署.其实 Spring Boot 也是 ...

  6. 帮你理清React的生命周期

    这是一个从印记中文 | react官方文档提取总结的,算是帮自己理清并且强化记忆React的生命周期,以便以后编写组件的时候能够有更清晰的思路.本文如有纰漏,欢迎指正 整体上来讲,React生命周期分 ...

  7. Centos6.6x系统与unbutu18.04系统升级ssh到8.3版本

    Centos6.6升级ssh5.3版本到ssh8.3版本 下载所需要的源码包: ]#wget https://files-cdn.cnblogs.com/files/luckjinyan/zlib-1 ...

  8. Java知识系统回顾整理01基础06数组01创建数组

    一.数组定义 定义:数组是一个固定长度的,包含了相同类型数据的 容器 二.声明数组 int[] a; 声明了一个数组变量. []表示该变量是一个数组 int 表示数组里的每一个元素都是一个整数 a 是 ...

  9. Arduino 多线程简单代码

    转载: 1.   https://www.csdn.net/gather_27/MtTaggzsMDExMS1ibG9n.html 2.   https://v.youku.com/v_show/id ...

  10. P3545 [POI2012]HUR-Warehouse Store

    题目描述 n天.第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择满足顾客的要求,或是无视掉他. 如果要满足顾客的需求,就必须要有足够的库存.问最多能够满足多少个顾客的需求. ...