首先按照这个指引安装好所需要的工具:
Windows环境下训练OpenCV分类器
Windows环境下训练OpenCV分类器_@陌阡的博客-CSDN博客
Python + pip
下载 opencv_createsamples.exe和opencv_traincascade.exe
准备训练库opencv_bin,自己拍照进行训练。
自己试了几个训练结果,发现都不理想。一般训练识别不准确。
后来经过多次尝试,觉得应该收集更多正样本,于是以消毒液为例子,自己进行拍照,剪裁得到正样本。我拍了130多张。
然后使用QQ截图并剪裁功能,剪裁出了质量达标的105张:
然后使用上面博主提供的1.py进行灰度和大小处理,得到正样本105张:
import os from skimage.color import rgb2gray import numpy as np import skimage.io as io import cv2 def convert_gray(f, **args): # 图片处理与格式化的函数 rgb = io.imread(f) # 读取图片 gray = rgb2gray(rgb) # 将彩色图片转换为灰度图片 dst = cv2.resize(gray, (50, 50)) # 调整大小,图像分辨率为40*40 return dst if __name__ == '__main__': ''' 批量转灰度图 ''' datapath = r'.' # 图片所在的路径 str = datapath + '/org/*.jpg' # 识别.jpg的图像 coll = io.ImageCollection(str, load_func=convert_gray) # 批处理 for i in range(len(coll)): io.imsave('./pos/' + np.str(i) + '.jpg', coll[i]) # 保存图片 |
然后使用3.py生成info.txt, 使用上面下载到的负样本生成 bg.txt
import os def create_pos_n_neg(): for file_type in ['pos', 'neg1964']: #此处修改neg或pos即可 if not os.path.exists(file_type): continue for img in os.listdir(file_type): if (file_type.startswith('neg')): line = 'D:/DEV_SDKs/Opencv/train3/'+file_type + '/' + img + '\n' with open('bg.txt', 'a') as f: f.write(line) elif (file_type.startswith('pos')): line = 'D:/DEV_SDKs/Opencv/train5/'+file_type + '/' + img + ' 1 0 0 50 50\n' with open('info.txt', 'a') as f: f.write(line) if __name__ == '__main__': create_pos_n_neg() print('描述文件已生成!') |
生成的info.txt内容是这样的:
D:/DEV_SDKs/Opencv/train5/pos/0.jpg 1 0 0 50 50 D:/DEV_SDKs/Opencv/train5/pos/1.jpg 1 0 0 50 50 D:/DEV_SDKs/Opencv/train5/pos/10.jpg 1 0 0 50 50 ... |
生成的bg.txt内容是这样的:
D:/DEV_SDKs/Opencv/train5/neg/1.jpg D:/DEV_SDKs/Opencv/train5/neg/10.jpg D:/DEV_SDKs/Opencv/train5/neg/100.jpg D:/DEV_SDKs/Opencv/train5/neg/11.jpg ... |
这里使用的是绝对路径,那只需要复制info.txt, bg.txt到需要的目录而不需要修改图片所在的目录 。
下面到opencv_bin目录下,把info.txt, bg.tx粘贴下来。生成样本文件:
opencv_createsamples.exe -vec info.vec -info info.txt -bg bg.txt -num 105 -w 50 -h 50 |
这一步会生成一个 info.vec文件,下一步需要用到。
在opencv_bin目录下创建一个data目录用于存放结果,然后调用训练命令:
opencv_traincascade.exe -data data -vec info.vec -bg bg.txt -numPos 105 -numNeg 315 -numStages 20 -w 50 -h 50 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -featureType LBP |
注意:虽然这里有1964个负样本,但是不能用那么多,只需要正样本的3倍就可以了;使用太多反而增加训练时间,影响准确率。
等待了大约5小时,到stage15后就停止了,生成了一个13kb的结果xml, 测试了一下,基本能达到要求,需要还是有一定的误识别率,但是对于需要识别的本尊基本都能稳定识别到了。
其中样本已上传: