1.说明

  • opencv安装包中有训练好的分类器文件,可以实现人脸的识别。当然,我们也可以训练自己的分类器文件,实现对特定物体的识别。本文章就详细介绍下如何训练自己的分类器文件。

2.效果

  • 我训练的是检测苹果的的分类器文件,可以实现对苹果的识别。

3.准备

3.1 程序准备

  • 训练自己的分类器文件,需要用到两个程序 : opencv_createsamples.exeopencv_traincascade.exe
  • opencv最新的安装包中没有这两个程序,我们可以下载 3.4.14这个版本的安装包进行安装。
    • opencv安装包 : opencv-3.4.14-vc14_vc15.exe
  • 安装完成后,在这个目录下就会有这两个程序文件 opencv\build\x64\vc15\bin

3.2 样本数据准备

  • 正样本数据 : 也就是我们需要检测的物体图片,可以自己用手机拍摄下你要检测的物体的图片,多拍摄一些不同角度的图片。

  • 我的正样本数据在这个目录下 image\positive\img,大概有50多张图片

  • 然后在image\positive目录下新建一个info.dat文件,在其中记录正样本图片信息

  • 参数介绍

    • img/1.jpg : 文件路径和文件名
    • 1:表示图片中有几个目标物体,一般一个就行了
    • 0,0:目标物体起始坐标
    • 1280,1706:目标物体大小
  • 负样本数据:不包含我们要检测物体的图片,可以拍摄一些风景之类的图片,尽量多一些。

  • 我的负样本数据在这个目录下 image\negitive\img

  • 然后在image\negitive目录下新建一个bg.txt文件,在其中记录负样本图片信息

  • 负样本图片信息我们只需记录路径和文件名就行了,但是这里要注意,路径名要写绝对路径,后面会说为什么。

3.3 正样本VEC文件创建

  • 训练样本之前先要生成vec文件,要用到opencv_createsamples.exe程序
  • opencv_createsamples.exe部分参数介绍
  [-info <collection_file_name>]  # 记录样本数据的文件(就是我们刚才创建的info.data文件)[-img <image_file_name>]    [-vec <vec_file_name>]   # 输出文件,内含用于训练的正样本。 [-bg <background_file_name>]  # 背景图像的描述文件[-num <number_of_samples = 1000>]   #样本数量(默认为1000)[-bgcolor <background_color = 0>]    #指定背景颜色[-w <sample_width = 24>]#输出样本的宽度(以像素为单位)[-h <sample_height = 24>]#输出样本的高度(以像素为单位)

参考

  • 在安装包的这个目录下opencv\build\x64\vc15\bin可以找到opencv_createsamples.exe程序,我们生成下vec文件
D:\opencv3.4.12\opencv\build\x64\vc15\bin\opencv_createsamples.exe -info C:\Users\lng\Desktop\image\positive\info.dat -vec C:\Users\lng\Desktop\image\sample.vec -num 58 -bgcolor 0 -bgthresh 0 -w 24 -h 24
  • 在image目录下就生成了vec文件

4.样本数据训练

  • 完成上面的准备工作,就可以开始训练样本。训练样本需要用到opencv_traincascaded.exe程序
  • opencv_traincascaded.exe程序部分参数介绍
 -data <cascade_dir_name>     #目录名,如不存在训练程序会创建它,用于存放训练好的分类器-vec <vec_file_name>              #包含正样本的vec文件名-bg <background_file_name>   #背景描述文件[-numPos <number_of_positive_samples = 2000>]   #每级分类器训练时所用的正样本数目[-numNeg <number_of_negative_samples = 1000>]   #每级分类器训练时所用的负样本数目[-numStages <number_of_stages = 20>]   #训练的分类器的级数
--cascadeParams--[-featureType <{HAAR(default), LBP, HOG}>]  # 特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征[-w <sampleWidth = 24>] #训练样本的尺寸(单位为像素)[-h <sampleHeight = 24>] #训练样本的尺寸(单位为像素)
--boostParams--[-minHitRate <min_hit_rate> = 0.995>] #分类器的每一级希望得到的最小检测率[-maxFalseAlarmRate <max_false_alarm_rate = 0.5>] #分类器的每一级希望得到的最大误检率

参考

  • 在安装包的这个目录下opencv\build\x64\vc15\bin可以找到opencv_traincascade.exe程序,开始训练样本
  • 这里注意下
    • 指定-bg参数时,文件名前不能加路径,所以需要把刚才在image\negitive下创建的bg.txt文件拷贝到opencv_traincascade.exe程序所在目录下,所以要在bg.txt写负样本图片的绝对路径。
    • 指定numPos参数时,因为每个阶段训练时有些正样本可能会被识别为负样本,故每个训练阶段后都会消耗一定的正样本。因此,此处使用的正样本数量绝对不能等于或超过positive文件夹下的正样本个数,一般留有一定的余量
    • 指定-numNeg参数时,可以多于negitive目录下的负样本数量
D:\opencv3.4.12\opencv\build\x64\vc15\bin\opencv_traincascade.exe -data C:\Users\lng\Desktop\image -vec C:\Users\lng\Desktop\image\sample.vec -bg bg.txt -numPos 50 -numNeg 500 -numStages 12 -feattureType HAAR -w 24 -h 24 -minHitRate 0.995 -maxFalseAlarmRate 0.5
  • 执行结果
PARAMETERS:
cascadeDirName: C:\Users\lng\Desktop\image
vecFileName: C:\Users\lng\Desktop\image\sample.vec
bgFileName: bg.txt
numPos: 50
numNeg: 500
numStages: 12
precalcValBufSize[Mb] : 1024
precalcIdxBufSize[Mb] : 1024
acceptanceRatioBreakValue : -1
stageType: BOOST
featureType: HAAR
sampleWidth: 24
sampleHeight: 24
boostType: GAB
minHitRate: 0.995
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100
mode: BASIC
Number of unique features given windowSize [24,24] : 162336===== TRAINING 0-stage =====
<BEGIN
POS count : consumed   50 : 50
NEG count : acceptanceRatio    500 : 1
Precalculation time: 0.581
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|     0.05|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 1 seconds.===== TRAINING 1-stage =====
<BEGIN
POS count : consumed   50 : 50
NEG count : acceptanceRatio    500 : 0.084832
Precalculation time: 0.576
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|    0.146|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 3 seconds.===== TRAINING 2-stage =====
<BEGIN
POS count : consumed   50 : 50
NEG count : acceptanceRatio    500 : 0.0149993
Precalculation time: 0.592
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|    0.186|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 5 seconds.===== TRAINING 3-stage =====
<BEGIN
POS count : consumed   50 : 50
NEG count : acceptanceRatio    500 : 0.00288033
Precalculation time: 0.652
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|    0.298|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 7 seconds.===== TRAINING 4-stage =====
<BEGIN
POS count : consumed   50 : 50
NEG count : acceptanceRatio    500 : 0.000768845
Precalculation time: 0.615
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|        1|
+----+---------+---------+
|   3|        1|    0.366|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 11 seconds.===== TRAINING 5-stage =====
<BEGIN
POS count : consumed   50 : 50
NEG count : acceptanceRatio    500 : 0.000375057
Precalculation time: 0.61
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|        1|
+----+---------+---------+
|   3|        1|    0.366|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 15 seconds.===== TRAINING 6-stage =====
<BEGIN
POS count : consumed   50 : 50
NEG count : acceptanceRatio    2 : 0.00016276
Required leaf false alarm rate achieved. Branch training t
  • 训练完成后,在img目录下就会生成以下文件。
  • cascade.xml就是我们需要的分类器文件,其他都是过程文件。

5.测试代码

  • main.cpp
#include <iostream>
#include <opencv2/opencv.hpp>char* face_cascade_name = "C:\\Users\\lng\\Desktop\\image\\cascade.xml";void faceRecongize(cv::CascadeClassifier faceCascade, cv::Mat frame);int main(){cv::VideoCapture *videoCap = new cv::VideoCapture;cv::CascadeClassifier faceCascade;// 加载苹果分类器文件if (!faceCascade.load(face_cascade_name)) {std::cout << "load face_cascade_name failed. " << std::endl;return -1;}// 打开摄像机videoCap->open(0);if (!videoCap->isOpened()) {videoCap->release();std::cout << "open camera failed"<< std::endl;return -1;}std::cout << "open camera success"<< std::endl;while(1){cv::Mat frame;//读取视频帧videoCap->read(frame);if (frame.empty()) {videoCap->release();return -1;}//进行苹果识别faceRecongize(faceCascade, frame);//窗口进行展示imshow("face", frame);//等待回车键按下退出程序if (cv::waitKey(30) == 13) {cv::destroyAllWindows();return 0;}}system("pause");return 0;
}void faceRecongize(cv::CascadeClassifier faceCascade, cv::CascadeClassifier eyesCascade, cv::CascadeClassifier mouthCascade, cv::Mat frame) {std::vector<cv::Rect> faces;// 检测苹果faceCascade.detectMultiScale(frame, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));for (int i = 0; i < faces.size(); i++) {// 用椭圆画出苹果部分cv::Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);ellipse(frame, center, cv::Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, cv::Scalar(255, 0, 255), 4, 8, 0);cv::Mat faceROI = frame(faces[i]);std::vector<cv::Rect> eyes;// 苹果上方区域写字进行标识cv::Point centerText(faces[i].x + faces[i].width / 2 - 40, faces[i].y - 20);cv::putText(frame, "apple", centerText, cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 255), 2);}
}
  • CMakeLists
cmake_minimum_required (VERSION 3.5)
project (faceRecongize2015)MESSAGE(STATUS "PROJECT_SOURCE_DIR " ${PROJECT_SOURCE_DIR})
SET(SRC_LISTS ${PROJECT_SOURCE_DIR}/src/main.cpp)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")#set(CMAKE_AUTOMOC ON)
#set(CMAKE_AUTOUIC ON)
#set(CMAKE_AUTORCC ON)# 配置头文件目录
include_directories(${PROJECT_SOURCE_DIR}/src)
include_directories("D:\\opencv3.4.12\\opencv\\build\\include")
include_directories("D:\\opencv3.4.12\\opencv\\build\\include\\opencv2")# 设置不显示命令框
if(MSVC)#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
endif()# 添加库文件
set(PRO_OPENCV_LIB "D:\\opencv3.4.12\\opencv\\build\\x64\\vc15\\lib\\opencv_world3412.lib" "D:\\opencv3.4.12\\opencv\\build\\x64\\vc15\\lib\\opencv_world3412d.lib")IF(WIN32)# 生成可执行程序ADD_EXECUTABLE(faceRecongize2015 ${SRC_LISTS})# 链接库文件TARGET_LINK_LIBRARIES(faceRecongize2015 ${PRO_OPENCV_LIB})
ENDIF()

6.编译说明

  • 我的opencv 3.4.12的安装路径是 D:\opencv3.4.12
  • 目录结构
- src- mian.cpp
- build_x64
- CMakeLists
  • 编译命令, 在build_x64目录下执行
cmake -G "Visual Studio 14 2015 Win64" ..
cmake --build ./ --config Release
  • 编译完成后拷贝D:\opencv3.4.12\opencv\build\x64\vc15\bin目录下的opencv_world3412.dll和opencv_world3412d.dll到可执行程序目录下。

备注

  • 经过测试,自己训练的样本,准确度还是比较差的。可能是正样本数据太少,且图片背景占据位置较多。要提高准确度,首先增加正样本图片数量,还要就是尽量让你的目标物体占满整个图片,不要留有太多的背景。而且也要有尽可能多的负样本数据。

opencv训练自己的模型,实现特定物体的识别相关推荐

  1. 使用opencv训练目标检测模型基于cascade模型

    使用opencv训练目标检测模型基于cascade模型 基于Haar特征的cascade分类器(classifiers) 是Paul Viola和 Michael Jone在2001年,论文" ...

  2. 《OpenCv视觉之眼》Python图像处理十九:Opencv图像处理实战四之通过OpenCV进行人脸口罩模型训练并进行口罩检测

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  3. 使用OpenCV调用Caffe-SSD训练好的模型

    前言 1.OpenCV3之后的dnn模型可以可以调用好多用深度学习框架的训练好的模型. 2.这里我演示是我自己训练的一个围棋棋盘识别模型,使用的神经网络是VGG16,OpenCV3.3,IDE是VS2 ...

  4. OpenCV的dnn模块调用TesorFlow训练的MoblieNet模型

    七月 上海| 高性能计算之GPU CUDA培训 7月27-29日三天密集式学习  快速带你入门阅读全文> 正文共2073个字,2张图,预计阅读时间10分钟. 一.初得模型 那是一个月之前的事情了 ...

  5. OpenCvSharp (C# OpenCV) DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别、骰子识别、菜品识别)(附源码)

    本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别.骰子识别.菜品识别)! 前言: 下 ...

  6. opencv调用自己训练的yolo3模型

    一 实现流程 1.准备好自己的数据集,通过yolo3结构框架训练好自己的模型文件(loss值一般训练到10就OK)yolov3源码:https://github.com/qqwweee/keras-y ...

  7. 边缘设备上的实时AI人员检测:使用预先训练的SSD模型检测人员

    下载数据-19.3 MB 下载模型-43.5 MB 下载结果-36.66 MB 在本系列的上一篇文章中,我们选择了两种SSD模型进行进一步工作,一种基于MobileNet,另一种基于SqueezeNe ...

  8. 用浏览器训练Tensorflow.js模型的18个技巧(上)

    摘要: 送你18个训练Tensorflow.js模型的小技巧! 在移植现有模型(除tensorflow.js)进行物体检测.人脸检测.人脸识别后,我发现一些模型不能以最佳性能发挥.而tensorflo ...

  9. 使用预先训练的SSD模型检测害虫

    目录 介绍 选择网络架构 害虫检测代码 它能运行吗? 它可以在边缘设备上工作吗? 下一步 在这里,我们给出了有关如何使用预训练的MobileSSD模型检测对象的简短说明.然后,我们提供并解释用于使用S ...

最新文章

  1. JAVA一个项目的路径为_java 得到项目路径
  2. Linux服务器通过LVM扩展其磁盘空间
  3. ActiveMQ的使用
  4. Go 标准库: path
  5. call() apply() bind()
  6. 【TI-ONE系列教程(四)】如何使用 TI-ONE Notebook 玩转算法大赛
  7. DB2-407 SQLCODE: -407, SQLSTATE: 23502
  8. nlp-tutorial代码注释3-3,双向RNN简介
  9. iphonex屏幕失灵乱跳_6plus触屏失灵时好时坏,屏幕乱闪乱跳
  10. Java将html转换PDF文件
  11. python 苹果电脑 怎么安装_mac怎么安装python2.7(python苹果电脑如何安装教程)
  12. 理解modle下的gradle
  13. 计算机系统软件和应用软件的区别
  14. 移动应用性能测试简介
  15. 后缀自动机1003 HDU 4416
  16. FOTRIC 692Pro红外热成像仪 人体体温筛查
  17. 包含头文件使用 书名号与双引号的区别(直接打符号竟然发表不了,太难了)
  18. 大话设计模式——UML图
  19. AfxWnd42 qq2006中怎样取得发送消息窗口中的Richedit
  20. PHP“动能”运动膳食微信小程序的开发 计算机毕业设计源码504978

热门文章

  1. 关于网易云音乐的一些感想
  2. 大数据的应用场景都有哪些(交通篇)
  3. php-opencv身份证识别,python opencv实现证件照换底功能
  4. SpringBoot系列之(一):入门
  5. linux远程主机拒绝连接,linux – Telnet [无法连接到远程主机:拒绝连接]
  6. TCP/IP协议族在异构网络互联中的作用
  7. MSP430 GPIO概述 第六章
  8. 2020年中式烹调师(高级)考试试卷及中式烹调师(高级)模拟考试题
  9. 用python画画简单代码_Python3使用PyQt5制作简单的画板/手写板实例
  10. cl 7ar xyz index php,GIF 文件格式分析 -- chinawrc的世界 -- [北方博客].mht