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

123次阅读
没有评论

 

1.说明

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

2.效果

  • 我训练的是检测苹果的的分类器文件,可以实现对苹果的识别。
    opencv训练自己的模型,实现特定物体的识别

3.准备

3.1 程序准备

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

3.2 样本数据准备

  • 正样本数据 : 也就是我们需要检测的物体图片,可以自己用手机拍摄下你要检测的物体的图片,多拍摄一些不同角度的图片。
  • 我的正样本数据在这个目录下 imagepositiveimg,大概有50多张图片
    opencv训练自己的模型,实现特定物体的识别
  • 然后在imagepositive目录下新建一个info.dat文件,在其中记录正样本图片信息
    opencv训练自己的模型,实现特定物体的识别
  • 参数介绍
    • img/1.jpg : 文件路径和文件名
    • 1:表示图片中有几个目标物体,一般一个就行了
    • 0,0:目标物体起始坐标
    • 1280,1706:目标物体大小
  • 负样本数据:不包含我们要检测物体的图片,可以拍摄一些风景之类的图片,尽量多一些。
  • 我的负样本数据在这个目录下 imagenegitiveimg
    opencv训练自己的模型,实现特定物体的识别
  • 然后在imagenegitive目录下新建一个bg.txt文件,在其中记录负样本图片信息
  • 负样本图片信息我们只需记录路径和文件名就行了,但是这里要注意,路径名要写绝对路径,后面会说为什么。
    opencv训练自己的模型,实现特定物体的识别

3.3 正样本VEC文件创建

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

参考

  • 在安装包的这个目录下opencvbuildx64vc15bin可以找到opencv_createsamples.exe程序,我们生成下vec文件
D:opencv3.4.12opencvbuildx64vc15binopencv_createsamples.exe -info C:UserslngDesktopimagepositiveinfo.dat -vec C:UserslngDesktopimagesample.vec -num 58 -bgcolor 0 -bgthresh 0 -w 24 -h 24
  • 在image目录下就生成了vec文件
    opencv训练自己的模型,实现特定物体的识别

4.样本数据训练

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

参考

  • 在安装包的这个目录下opencvbuildx64vc15bin可以找到opencv_traincascade.exe程序,开始训练样本
  • 这里注意下
    • 指定-bg参数时,文件名前不能加路径,所以需要把刚才在imagenegitive下创建的bg.txt文件拷贝到opencv_traincascade.exe程序所在目录下,所以要在bg.txt写负样本图片的绝对路径。
    • 指定numPos参数时,因为每个阶段训练时有些正样本可能会被识别为负样本,故每个训练阶段后都会消耗一定的正样本。因此,此处使用的正样本数量绝对不能等于或超过positive文件夹下的正样本个数,一般留有一定的余量
    • 指定-numNeg参数时,可以多于negitive目录下的负样本数量
D:opencv3.4.12opencvbuildx64vc15binopencv_traincascade.exe -data C:UserslngDesktopimage -vec C:UserslngDesktopimagesample.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:UserslngDesktopimage
vecFileName: C:UserslngDesktopimagesample.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 =====

Training until now has taken 0 days 0 hours 0 minutes 1 seconds.

===== TRAINING 1-stage =====

Training until now has taken 0 days 0 hours 0 minutes 3 seconds.

===== TRAINING 2-stage =====

Training until now has taken 0 days 0 hours 0 minutes 5 seconds.

===== TRAINING 3-stage =====

Training until now has taken 0 days 0 hours 0 minutes 7 seconds.

===== TRAINING 4-stage =====

Training until now has taken 0 days 0 hours 0 minutes 11 seconds.

===== TRAINING 5-stage =====

Training until now has taken 0 days 0 hours 0 minutes 15 seconds.

===== TRAINING 6-stage =====
  • 训练完成后,在img目录下就会生成以下文件。
    opencv训练自己的模型,实现特定物体的识别
  • cascade.xml就是我们需要的分类器文件,其他都是过程文件。

5.测试代码

  • main.cpp
#include 
#include 

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 open(0);


	if (!videoCap->isOpened()) {
		videoCap->release();
		std::cout 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<:rect> faces;

    // 检测苹果
	faceCascade.detectMultiScale(frame, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
	for (int i = 0; i  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);
		

	}
}

</:rect>
  • 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.12opencvbuildx64vc15bin目录下的opencv_world3412.dll和opencv_world3412d.dll到可执行程序目录下。

备注

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

文章转载遵循CC 4.0 BY-SA版权协议,来源于互联网: opencv训练自己的模型,实现特定物体的识别 | https://blog.csdn.net/new9232/article/details/127439039

正文完
 0
评论(没有评论)