opencv训练自己的模型,实现特定物体的识别
1.说明
- opencv安装包中有训练好的分类器文件,可以实现人脸的识别。当然,我们也可以训练自己的分类器文件,实现对特定物体的识别。本文章就详细介绍下如何训练自己的分类器文件。
2.效果
- 我训练的是检测苹果的的分类器文件,可以实现对苹果的识别。
3.准备
3.1 程序准备
- 训练自己的分类器文件,需要用到两个程序 : opencv_createsamples.exe和opencv_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训练自己的模型,实现特定物体的识别相关推荐
- 使用opencv训练目标检测模型基于cascade模型
使用opencv训练目标检测模型基于cascade模型 基于Haar特征的cascade分类器(classifiers) 是Paul Viola和 Michael Jone在2001年,论文" ...
- 《OpenCv视觉之眼》Python图像处理十九:Opencv图像处理实战四之通过OpenCV进行人脸口罩模型训练并进行口罩检测
本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...
- 使用OpenCV调用Caffe-SSD训练好的模型
前言 1.OpenCV3之后的dnn模型可以可以调用好多用深度学习框架的训练好的模型. 2.这里我演示是我自己训练的一个围棋棋盘识别模型,使用的神经网络是VGG16,OpenCV3.3,IDE是VS2 ...
- OpenCV的dnn模块调用TesorFlow训练的MoblieNet模型
七月 上海| 高性能计算之GPU CUDA培训 7月27-29日三天密集式学习 快速带你入门阅读全文> 正文共2073个字,2张图,预计阅读时间10分钟. 一.初得模型 那是一个月之前的事情了 ...
- OpenCvSharp (C# OpenCV) DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别、骰子识别、菜品识别)(附源码)
本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别.骰子识别.菜品识别)! 前言: 下 ...
- opencv调用自己训练的yolo3模型
一 实现流程 1.准备好自己的数据集,通过yolo3结构框架训练好自己的模型文件(loss值一般训练到10就OK)yolov3源码:https://github.com/qqwweee/keras-y ...
- 边缘设备上的实时AI人员检测:使用预先训练的SSD模型检测人员
下载数据-19.3 MB 下载模型-43.5 MB 下载结果-36.66 MB 在本系列的上一篇文章中,我们选择了两种SSD模型进行进一步工作,一种基于MobileNet,另一种基于SqueezeNe ...
- 用浏览器训练Tensorflow.js模型的18个技巧(上)
摘要: 送你18个训练Tensorflow.js模型的小技巧! 在移植现有模型(除tensorflow.js)进行物体检测.人脸检测.人脸识别后,我发现一些模型不能以最佳性能发挥.而tensorflo ...
- 使用预先训练的SSD模型检测害虫
目录 介绍 选择网络架构 害虫检测代码 它能运行吗? 它可以在边缘设备上工作吗? 下一步 在这里,我们给出了有关如何使用预训练的MobileSSD模型检测对象的简短说明.然后,我们提供并解释用于使用S ...
最新文章
- JAVA一个项目的路径为_java 得到项目路径
- Linux服务器通过LVM扩展其磁盘空间
- ActiveMQ的使用
- Go 标准库: path
- call() apply() bind()
- 【TI-ONE系列教程(四)】如何使用 TI-ONE Notebook 玩转算法大赛
- DB2-407 SQLCODE: -407, SQLSTATE: 23502
- nlp-tutorial代码注释3-3,双向RNN简介
- iphonex屏幕失灵乱跳_6plus触屏失灵时好时坏,屏幕乱闪乱跳
- Java将html转换PDF文件
- python 苹果电脑 怎么安装_mac怎么安装python2.7(python苹果电脑如何安装教程)
- 理解modle下的gradle
- 计算机系统软件和应用软件的区别
- 移动应用性能测试简介
- 后缀自动机1003 HDU 4416
- FOTRIC 692Pro红外热成像仪 人体体温筛查
- 包含头文件使用 书名号与双引号的区别(直接打符号竟然发表不了,太难了)
- 大话设计模式——UML图
- AfxWnd42 qq2006中怎样取得发送消息窗口中的Richedit
- PHP“动能”运动膳食微信小程序的开发 计算机毕业设计源码504978
热门文章
- 关于网易云音乐的一些感想
- 大数据的应用场景都有哪些(交通篇)
- php-opencv身份证识别,python opencv实现证件照换底功能
- SpringBoot系列之(一):入门
- linux远程主机拒绝连接,linux – Telnet [无法连接到远程主机:拒绝连接]
- TCP/IP协议族在异构网络互联中的作用
- MSP430 GPIO概述 第六章
- 2020年中式烹调师(高级)考试试卷及中式烹调师(高级)模拟考试题
- 用python画画简单代码_Python3使用PyQt5制作简单的画板/手写板实例
- cl 7ar xyz index php,GIF 文件格式分析 -- chinawrc的世界 -- [北方博客].mht