基于opencv训练自己的分类器生成xml文件,实现特定物体的识别检测(Python实现)

1、准备数据集
正样本、负样本的图片比例为一比三左右;
在这里我为了实验就随手照了50张我鼠标的图片,不含鼠标的图片为150张;
(注:这里的样本数我用的可能有点少,根据情况可进行调整)
2、数据集的处理:
在pycharm中新建python项目:
test-opencv-train在该项目下新建python文件create_pos_neg()

数据集的处理编程用opencv来实现,代码如下:

# -*- coding: utf8 -*-
"""

Created on Mon Mar 2 17:35 2020

@author:wan

处理正负样本,将图片压缩成指定大小并以灰度图进行读取

生成.txt的正负样本描述文件
create_pos_neg.py
"""
import cv2
path = "D:\yangben\pos\pos"
for i in range(1, 27):
    print(path+str(i)+'.jpg')
    img = cv2.imread(path+str(i)+'.jpg',cv2.IMREAD_GRAYSCALE)
    img5050 = cv2.resize(img, (50, 50))#将图片裁剪成50*50大小
    cv2.imshow("img", img5050)
    cv2.waitKey(20)
    cv2.imwrite('D:\yangben\pos1'+str(i)+'.jpg', img5050)
path2 = "D:\yangben\pneg\pneg"
for j in range(1, 30):
    print(path2+str(j)+'.jpg')
    img = cv2.imread(path2+str(j)+'.jpg', cv2.IMREAD_GRAYSCALE)
    cv2.imwrite('D:\yangben\pneg1'+str(j)+'.jpg', img)

3、生成路径:
在pos文件夹下创建一个route.bat 文件
文件内容如下:

dir /b > pos.txt

然后双击运行.bat文件,会生成一个pos.txt文件,文件内容为:
在这里插入图片描述
删除第一行的pos.txt和最后一行的route.bat和
将修改好的pos.txt文件和route.bat文件剪切到上一级目录yangben下。
对剪切到yangben下的pos.txt文件进行修改:
如图:
在每一行的前面加上相对路径pos/,在每一行的后面加上 1 0 0 50 50;
其中,1 0 0 50 50 中的1表示目标个数,后面四个数字代表left top width height.
类似的,我们也需要在pneg目录下创建一个route2.bat文件–>运行生成pneg.txt–>剪切到样本目录下–>对pneg.txt文件进行修改。
route2.bat文件的内容为:

dir /b > pneg.txt

在yangben目录下创建opencv_createsamples.bat;内容如下:

opencv_createsamples.exe -vec pos.vec  -info pos.txt -num 27 -w 50 -h 50 pause

其中,-num后面的数字是正样本个数,-w后面的数字是正样本图片的长,-h后面的数字是正样本图片的高;pencv_createsamples.bat后出现pos.vec即为运行成功;
4、训练生成xml文件
在yangben文件夹下新建xml文件夹和train.bat文件
内容为:

opencv_traincascade -data xml -vec pos.vec -bg pneg.txt -numStages 5 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 50 -numNeg 150 -w 50 -h 50 -mode ALL -precalcValBufSize 1024 -precalcIdxBufSize 1024

注:-nstages表示的是训练分类器的级数,不能太大也不能太小,
-nsplits
-minhitrate 分类器每一级希望得到的最小检测率;
-maxfalsealarm 分类器每一级希望得到的最大误检率;
-w -h 必不可少,否则会报错;

双击运行train.bat文件会在xml文件夹中生成五个xml文件:
如图
在这里插入图片描述

opencv_createsamples.和haartraining.exe百度网盘地址:
提取码:wr5j

xml文件的引用
在项目工程下新建examples文件夹,在examples文件夹下再建一个pos文件夹,将生成的cascade.xml文件拷贝到pos目录下、

然后在项目工程下新建python文件test.py

扫描二维码关注公众号,回复: 12729786 查看本文章
# -*- coding: utf8 -*-
"""

Create on Sat Fre 29 13:08 2020

@author: wan

"""
import numpy as np
import cv2

cascade = cv2.CascadeClassifier('./examples/pos/cascade.xml')
img = cv2.imread('D:\yangben\data\ptest.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

flower = cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in flower:
    img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

运行即可。。。

猜你喜欢

转载自blog.csdn.net/qq_40096391/article/details/104650895