ubuntu下openCV-Haar特征分类器训练


  • 这段时间在学openCV,准备做一个头部检测,但是openCV自带的分类器只有人脸检测的,而且准确度不高,就准备自己训练一个分类器。在网上看了很多的博客,都讲得不是很清楚,而且全是在windows上训练的,对与用习惯linux的我来说,用cmd实在是太痛苦了,而我没有在网上找到这方面的博客,甚至连opencv_createsamplesopencv_traincascade在哪都没说只说在openCV目录下,但是直接安装的openCV下很多是没有的,对于新手来讲会非常迷茫,完全搞不懂。

  • 然后我就到github上看openCV的仓库,发现仓库的apps目录下有分类器源码,觉得可以自己在linux下编译一个训练器

  • 进过几次尝试,我发现openCV4以上版本源码编译出来是没有我需要的这两个训练器的,3一下版本的会报错,具体什么原因我不清楚,openCV-3.4.9版本的完全没有问题

一、安装Cmake

1、安装方法一

sudo apt install cmake 

2、安装方法二

2.1 CMake 下载地址

2.2 安装配置

  • 解压:tar zxvf cmake-3.16.5-Linux-x86_64.tar.gz

  • 移到opt目录下:mv cmake-3.16.5-Linux-x86_64 /opt

  • 建立软连接:ln -s /opt/cmake-3.16.5-Linux-x86_64/bin/* /usr/bin

  • 检测安装是否成功:

    • cmake --version

      cmake version 3.16.5
      CMake suite maintained and supported by Kitware (kitware.com/cmake).

二、编译openCV

1、下载

2、安装依赖

  • 下面的步骤已经在Ubuntu10.04上测试过了,但是也可以在其他发行版上使用。

  • 必需的包

    • GCC 4.4.x 或更新

    • CMake 2.8.7 或更高版本

    • Git

    • GTK+2.x 或更高版本, including 头 (libgtk2.0-dev)

    • pkg-config

    • Python 2.6或更高版本以及带有开发人员包的Numpy 1.5或更高版本(Python -dev, Python - Numpy)

    • ffmpeg或libav开发包:libavcodec-dev,libavformat-dev,libswscale-dev

    • [可选] libtbb2 libtbb-dev

    • [可选] libdc1394 2.x

    • [可选] libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev, libdc1394-22-dev

    • [可选] CUDA Toolkit 6.5 or higher

  • sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
    sudo apt-get install build-essential
    # 如果安装了cmake 和git 的可以删下面的选项
    sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
    sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

3、编译

  • 解压:unzip mirrors-opencv-3.4.9.zip

  • cd opencv
    mkdir build    # 编译会生成很多文件,最好建一个文件夹来保存
    cd build    
    cmake ../         # 生成makefile
    make                 # 使用makefile编译     时间会很长,二十分钟的样子
  • 编译好后就可以找我们需要的训练器了

    cd build/bin          # 这样就可以看见了

三、训练分类器

1、教程:

2、准备样本

  • 创建pos目录装正样本

    • 正负样本都要转化成灰度图,而且对于正样本用haar特征训练是规格化成20×20或其他大小,最好不要太大,过多的haar特征会影响分类器的训练时间;对于LBP特征正样本要规格化为24×24大小,而对于HOG要规格化成64×64. 负样本对尺寸没有统一要求,在训练对应的分类器时,选择的负样本尺寸一定要大于等于正样本规定的尺寸。

  • 创建neg目录装负样本

    • 负样本有两点要求:1)不能包含正样本且尽可能多的提供场景的背景图;2)负样本尽可能的多,而且要多样化,和正样本有一定的差距但是差别也不要太大,否则容易在第一级就全部被分类器reject,训练时不能显示负样本的个数,从而导致卡死。

  • 创建xml目录装训练数据

  • 将训练器opencv_createsamples opencv_traincascade拷贝到当前路径下

  • ls -rt pos  > pos.txt    # pos.txt  正样本相对路径表
    ls -rt neg > neg.txt # neg.txt 负样本相对路径表
  • 修改pos.txt和neg.txt

  • gedit pos.txt
  • Ctrl + A 全选 ,然后按Tab 键

  • 选一个空格

  • 选择查找替换

  • 全部替换,neg.txt的这一步替换长neg/

  • pos.txt还需要多一步,否则会报错,1 代表个数 0 0 代表照片的起点坐标,50 50 为我的照片的大小

3、生成描述文件

  • ./opencv_createsamples -info pos.txt -vec pos.vec -bg neg.txt -num 2874 -w 50 -h 50

  • 以上参数的含义如下: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>:背景色最大的偏离度。 -maxangel<max_x_rotation_angle>, -maxangle<max_y_rotation_angle>, -maxzangle<max_x_rotation_angle>:最大旋转角度,以弧度为单位。 -show:如果指定,每个样本会被显示出来,按下"esc"会关闭这一开关,即不显示样本图片,而创建过程 继续。这是个有用的debug 选项。 -w<sample_width>:输出样本的宽度(以像素为单位) -h<sample_height>:输出样本的高度(以像素为单位)

    只需要对正样本进行以上操作,负样本不需要生成vec文件。。。

4、训练

  • 注意:这里要找一台好一点的电脑训练,我训练一万的样本,从最开始一天训练一级,然后每级的时间增加半天,到第五级已经差不多需要三天了,预计到20级没一两月搞不定

  • ./opencv_traincascade -data xml -vec pos.vec -bg neg.txt -numPos 2000 -numNeg 7370  -numStages 20 -featureType HAAR -w 50 -h 50   
    # 注意大小写,写错可能不会报错,但是识别不了,就会使用默认值,这里我就被坑过
    # 训练时间会非常非常长,我第一次用了198正样本、368负样本就训练了一个晚上,第二次用两千多的正样本,三千多的负样本就更长了,但是训练中途断了再执行命令时会继续上一次训练
    # 注意 :这里的-numPos *** 一定要比 准备.vec文件时的 -num *** 小,否则在训练时可能会报错,显示找不到更多正样本
  • 像我这里输入-numPos 2000 ,在训练到第三级时就需要2018个正样本,如果.vec里只有2000个就会找不到新的正样本,从而报错

  • 以上参数的含义如下:

    -data <cascade_dir_name>:目录用于保存训练产生的分类器xml文件和中间文件,如不存在训练程序会创建它;

    -vec <vec_file_name>:由 opencv_createsamples 程序生成的包含正样本的vec文件名;

    -bg <background_file_name>:背景描述文件,也就是包含负样本文件名的那个描述文件

    -numPos <number_of_positive_samples>:每级分类器训练时所用的正样本数目(默认值为2000); -numNeg <number_of_negative_samples>:每级分类器训练时所用的负样本数目,可以大于 -bg 指定的图片数目(默认值为1000);

    -numStages <number_of_stages>:训练的分类器的级数(默认值为20级);

    -precalcValBufSize <precalculated_vals_buffer_size_in_Mb>:缓存大小,用于存储预先计算的特征值(feature values),单位为MB(默认值为256); -precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>:缓存大小,用于存储预先计算的特征索引(feature indices),单位为MB(默认值为256);

    内存越大,训练时间越短。 -baseFormatSave:这个参数仅在使用Haar特征时有效。如果指定这个参数,那么级联分类器将以老的格式存储(默认不指定该参数项,此时其值为false;一旦指定则其值默认为true);

    级联参数:CvCascadeParams类,定义于cascadeclassifier.h -stageType <BOOST(default)>:级别(stage)参数。目前只支持将BOOST分类器作为级联的类型; -featureType<{HAAR(default), LBP}>:特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征(默认Harr); -w <sampleWidth>:训练样本的宽(单位为像素,默认24); -h <sampleHeight>:训练样本的高(单位为像素,默认24); 训练样本的尺寸必须跟训练样本创建(使用 opencv_createsamples 程序创建)时的尺寸保持一致。

    Boosted分类器参数:CvCascadeBoostParams类,定义于boost.h -bt <{DAB, RAB, LB, GAB(default)}>:Boosted分类器的类型(DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost为默认); -minHitRate <min_hit_rate>:分类器的每一级希望得到的最小检测率(默认值为0.995),总的检测率大约为 min_hit_rate^number_of_stages; -maxFalseAlarmRate <max_false_alarm_rate>:分类器的每一级希望得到的最大误检率(默认值为0.5),总的误检率大约为 max_false_alarm_rate^number_of_stages; -weightTrimRate <weight_trim_rate>:Specifies whether trimming should be used and its weight,一个还不错的数值是0.95; -maxDepth <max_depth_of_weak_tree>:弱分类器树最大的深度。一个还不错的数值是1,是二叉树(stumps);

    -maxWeakCount <max_weak_tree_count>:每一级中的弱分类器的最大数目(默认值为100)。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate;

  • 最后等一晚上就可以得到训练的分类器了,cascade.xml就是我们的分类器

四、分类器

五、测试程序

import  cv2

face = cv2.CascadeClassifier("./data/cascade.xml")  #人脸识别
cap = cv2.VideoCapture(2)

while True:
   ret, img = cap.read()
   roi_color = 0
   gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    #转换为灰度图片,haar特征都是在灰度上检测
   faces = face.detectMultiScale(gray,1.3,5)       #参数1:灰度图片数据   2:缩放比例 3:人脸大小不能小于5个像素

   # 获取宽高信息,个人脸画方框
   for (x,y,w,h) in faces:
       # img:要画的图片,(x,y):起始坐标 ,(x+w,y+h):宽高,颜色,线条宽度
       cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
   
   cv2.imshow('10',img)
   if cv2.waitKey(5) & 0xff == ord("q"):
       break

cap.release()
cv2.destroyAllWindows()

ubuntu下openCV-Haar特征分类器训练的更多相关文章

  1. Ubuntu下OpenCV不能被某个python版本识别

    Ubuntu下OpenCV不能被某个python版本识别 Solution: 可以进入相应版本的python,查看该python的path: python import sys print(sys.p ...

  2. [学习OpenCV攻略][002][Ubuntu下OpenCV安装]

    配置环境 操作系统 Ubuntu 12.04 OpenCV版本 opencv-1.0.0 学习书籍 <学习OpenCV> Liunx软件安装方法主要有3种: 1.编译安装,也就是通过编译源 ...

  3. Ubuntu下opencv的安装及IDEA开发配置

    Ubuntu下opencv的安装及IDEA开发配置 环境配置  这篇博客主要介绍Ubuntu下opencv的安装编译,以及IDEA对opencv进行Java开发的环境配置 安装opencv 首先安装o ...

  4. 【macOS】 在OpenCV下训练Haar特征分类器

    本教程基于以下环境 macOS 10.12.6,OpenCV 3.3.0,python 3.6.由于网上基于masOS系统的教程太少,想出一篇相关教程造福大家-本文旨在学习如何在opencv中基于ha ...

  5. 【原/转】opencv的级联分类器训练与分类全程记录

    众所周知,opencv下有自带的供人脸识别以及行人检测的分类器,也就是说已经有现成的xml文件供你用.如果我们不做人脸识别或者行人检测,而是想做点其他的目标检测该怎么做呢?答案自然是自己训练一个特定的 ...

  6. opencv人脸检测分类器训练小结

    这两天在初学目标检测的算法及步骤,其中人脸检测作为最经典的算法,于是进行了重点研究.该算法最重要的是建立人脸检测分类器,因此我用了一天的时间来学习分类器的训练.这方面的资料很多,但是能按照一个资料运行 ...

  7. opencv:级联分类器训练(cascade classifier training)(两个分类器的区别)

    # 介绍 级联分类器包括两个工作阶段:训练(traning),检测(detection).检测阶段在文档<objdetect module of general OpenCV documenta ...

  8. ubuntu下opencv在Qt中的使用

    1. 编译安装OpenCV2.4.9  本博已有文章描述 2. 安装Qt和QtCreator 从qt-project.org 下载Qt安装文件 qt-opensource-linux-x64-5.4. ...

  9. ubuntu下opencv 3.0和python2.7安装测试

    1.安装opencv所需的库(编译器.必须库.可选库) sudo apt-get install build-essential sudo apt-get install cmake git libg ...

  10. ubuntu下opencv使用cvNamedWindow()和cvShowImage()出错的解决方法

    重装系统和opencv,编译运行显示一副图像的程序,报错如下 liurf@liurf-Lenovo-G470:~/WorkSpace/slambook-master/ch5/imageBasics$ ...

随机推荐

  1. 重新点亮linux 命令树————网络管理和网络配置文件[十一六]

    前言 简单整理一下网络管理和网络配置文件. 正文 网络服务程序分为两种:分别是SysV和systemd service network start|stop|restart chkconfig --l ...

  2. 给picgo上传的图片加个水印

    之前给大家介绍了picgo和免费的图床神器.我们本可以开开心心的进行markdown写作了. 但是总是会有那么一些爬虫网站过来爬你的文章,还把你的文章标明是他们的原著.咋办呢?这里有一个好的办法就是把 ...

  3. C#S7.NET实现西门子PLCDB块数据采集的完整步骤

    前言 本文介绍了如何使用S7.NET库实现对西门子PLC DB块数据的读写,记录了使用计算机仿真,模拟PLC,自至完成测试的详细流程,并重点介绍了在这个过程中的易错点,供参考. 用到的软件: 1.Wi ...

  4. 力扣524(java)-通过删除字母匹配到字典里最长单词(中等)

    题目: 给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到. 如果答案不止一个,返回长度最长且字 ...

  5. 为什么游戏行业喜欢用PolarDB

    简介: PolarDB 在游戏行业的最佳实践 为什么游戏行业喜欢用PolarDB 游戏行业痛点 在我看来, 不同行业对数据库使用有巨大的差别. 比如游戏行业没有复杂的事务交易场景, 他有一个非常大的b ...

  6. 兑现 Service Mesh 的新价值:精确控制“爆炸半径”

    ​简介:本文分享了阿里云内部所沉淀的全链路流量打标与路由的能力,做出服务网格技术新体验的同时,很好地兑现了服务网格的新价值. 作者:至简 软件是以持续迭代的方式去不断演进的.某种程度上,我们并不担心软 ...

  7. Serverless 应用引擎 SAE 携手谱尼测试共同抗疫

    ​简介:潮落江平未有风,扁舟共济与君同. 阿里云联合乘云至达与谱尼测试携手, 共同筑建抗疫堡垒,共抗疫情.共克时艰. 作者 | 计缘 背景 当前疫情形势依然严峻,各行各业众志成城,携手抗疫.新冠病毒核 ...

  8. Vite + React 组件开发实践

    简介: 毫不夸张的说,Vite 给前端带来的绝对是一次革命性的变化.或者也可以说是 Vite 背后整合的 esbuild . Browser es modules.HMR.Pre-Bundling 等 ...

  9. C# 采集知网

    采集知网 WebClient /// <summary> /// 支持 Session 和 Cookie 的 WebClient. /// </summary> public ...

  10. CMDB开发(二)

    一.项目架构:目录规范 # 遵循软件开发架构目录规范 bin 启动文件 src 源文件(核心代码) config 配置文件 lib 公共方法 tests 测试文件 二.采集规范 # bin目录下新建s ...