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
# -*- 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()
运行即可。。。