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实现特定物体的识别内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

如何利用opencv训练自己的模型实现特定物体的识别的更多相关文章

  1. iOS使用openCV检测来自摄像头的矩形

    如果我在处理它之前克隆matimage,通过记录它,它似乎处理图像甚至找到矩形,但矩形不会被绘制到图像输出到imageView.我很确定我错过了一些东西,可能是因为我没有正确传递某个对象,指向对象的指针等等,而我需要修改的对象则没有.无论如何,如果这不是正确的方法,我真的很感谢他们做这样的事情的教程或例子,使用openCV或GPUImage…它不需要尝试使用matimage来设置imageView.image,而只需要将matimage转换为在imageView中实际修改,因为CvVideoCamera已

  2. 使用Xcode为OS X Lion / Mountain Lion编译OpenCV(2.3.1)

    任何人都可以为我提供一些如何使用Xcode在OSXLion上编译OpenCV2.3.1的详细指南吗?我对此感到生气…我得到了源码,使用cmake创建Xcode模板并尝试构建它,但它失败了大约200个错误.提前致谢,大教堂解答我的回答帖子.解决方法详细指南如何使用MacPorts在Xcode4.2.1的OSXLion下启动和运行OpenCV2.3.1编辑08/06/2012:这也适用于OpenCV2.4.1.只需确保您获得最新版本的Xcode并安装“命令行工具”.编辑15/08/2012:使用Mountai

  3. ios – OpenCV构建问题,找不到ext/atomicity.h

    我得到编译器错误抱怨在构建包含OpenCV的项目时.环境是针对iOS的Xcode4.5.它为模拟器编译良好,但在为设备构建时失败.这是错误文本:我正在使用opencv2.framework,使用指令here构建cmake.解决方法默认情况下,XCode4.5使用libc(支持C11的LLVMC标准库)生成要构建的新项目.但OpenCV期望针对GNUlibstd

  4. 从IOS / iPad / iPhone的最大速度

    我使用OpenCVforiOS完成计算密集型应用程序.当然这很慢.但它比我的PC原型慢了200倍.所以我正在优化它.从最初的15秒,我能够获得0.4秒的速度.我想知道我是否找到了所有的东西以及别人想要分享的东西.我做了什么:>将OpenCV中的“double”数据类型替换为“float”.双倍是64位,32位cpu不能轻易处理,所以浮动给了我一些速度.OpenCV经常使用双倍.>为编译器选项添加了

  5. 在Swift iOS中使用OpenCV

    在我的xcode项目中添加OpenCV2框架后,我试图搜索samlpes或教程与swift集成。有什么好的教程同样吗?OpenCV是用C编写的框架。苹果的reference告诉我们YoucannotimportC++codedirectlyintoSwift.Instead,createanObjective-CorCwrapperforC++code.所以你不能在一个swift项目中直接导入和使用OpenCV,但这实际上并不坏,因为你(需要)继续使用框架的C语法,这是在网络上有很多文档。那么你怎么进行呢

  6. 在Android Studio中解决已弃用的NDK警告

    或者除了添加所有已编译的代码并设置我之前提到的标志之外,还有其他方法可以将OpenCV导入Android项目吗?任何有关这方面的帮助将不胜感激.解决方法我建议迁移到使用cmake的本机支持.您可以查看链接,该链接提供了使用cmake通过以下link添加OpenCV的分步教程.您的代码应该保持不变而不做任何更改,只有必要的操作才能弄清楚如何使用CMakeLists.txt将它们包含在构建过程中.

  7. android – opencv管理器包没找到?如何自动安装?

    我正在使用openCV,每当我运行代码时它都会给我包管理器没有安装,那么如何通过我的应用程序安装它.是必须从Play商店下载它还是我们可以在设备中自动安装它.请帮我.提前致谢.解决方法您需要使用静态初始化来包含apk中的所有OpenCV二进制文件.请参阅此文档:ApplicationDevelopmentwithStaticInitialization

  8. 如何从Android相机中找到框架的轮廓并将其转换为box2d实体?

    使用openframeworks,OpenCV和Box2D,我能够以良好的帧速率实现它.使用Android似乎是一项更复杂的任务(部分原因是我是JAVA新手).这就是我的开始:>使用“OpenCV示例–图像处理”并删除除“canny”效果之外的所有内容,这会产生一个漂亮的黑色&白色图像,非常适合找到轮廓.>从“OpenCVSample–color-blob-detection”中我抓住了在Mat中

  9. 在Android上的OpenCV中逐帧处理视频

    如果是的话,你知道任何例子.>编译适用于Android的FFMPEG也是一种选择.但是,我认为自己编写FrameGrabber和FrameRecorder有点过分.我认为除了JavaCV之外,还必须存在一些解决方案.>从API18开始,Android中有MediaCodec和Mediamuxer.也许他们可以帮助我?

  10. 使用opencv进行android角点跟踪

    当我相对于Android相机移动它时,我试图跟踪一张纸的角落的位置(您可以假设纸张将是与背景完全不同的颜色).我想找到android屏幕上每个角落的x,y坐标.我也希望能够改变纸张的角度,因此它不一定会一直呈现出完美的矩形.我正在使用opencv2.4.1forAndroid,但我在包中找不到cvgoodfeaturetotrack或cvfindcornersubpix.现在我正在考虑使用CvCa

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部