准备样本
需要训练一个婴面头部的分类器,从网上找了一些图片,作为正样本。正样本50张
负样本直接选择了人脸识别的负样本,负样本选中了2000张。
图片预处理
对图片进行灰度化、归一化处理。
"""
作者:Shirley
日期:2021年05月12日
对处理正负样本,灰度化,归一化,大小为(50,50)
"""
import cv2
path = r"F:\Desktop\profile\pos"
for i in range(1, 51):
print(path+'\\'+str(i)+'.png')
img = cv2.imread(path+'\\'+str(i)+'.png', cv2.IMREAD_GRAYSCALE)
img5050 = cv2.resize(img, (50, 50))
cv2.imshow("img", img5050)
cv2.waitKey(20)
cv2.imwrite(r'F:\Desktop\profile\gray_pos'+"\\"+str(i)+'.jpg', img5050)
# path = r"F:\Desktop\profile\negdata"
# for i in range(1, 2001):
# print(path + '\\' + str(i) + '.jpg')
# img = cv2.imread(path + '\\image_' + str(i) + '.jpg', cv2.IMREAD_GRAYSCALE)
# img5050 = cv2.resize(img, (50, 50))
# cv2.imshow("img", img5050)
# cv2.waitKey(20)
# cv2.imwrite(r'F:\Desktop\profile\gray_neg' + "\\" + str(i) + '.jpg', img5050)
处理之后的样子是,有点点吓人哈哈哈:
负样本本来已经经过灰度处理啦,但还要归一化:
接下来需要生成描述文件
"""
作者:Shirley
日期:2021年05月12日
生成正负样本描述文件
"""
import os
def create_pos_n_neg():
for file_type in ['gray_neg']:
for img in os.listdir(file_type):
if (file_type == 'gray_neg'):
line = file_type + '/' + img + '\n'
with open('bg.txt', 'a') as f:
f.write(line)
for file_type in ['gray_pos']:
for img in os.listdir(file_type):
if (file_type == 'gray_pos'):
line = 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()
这样会生成两个txt文档
缺少程序
因为我使用的版本没有要用到的opencv_traincascade和opencv_createsamples,查了很多办法很麻烦我选择直接拷贝exe文件。最后要用到这些文件:
也不用一个一个去找,因为不满足条件,会提醒你少了什么文件直接拷贝过来就好了。
生成正样本.vec文件
将这些文件拷贝到自己图片文件夹下,也就是这样:
然后开始生成正样本的.vec文件,执行
#用之前生成的info.txt来生成pos.vec 数量是50 长宽分别是50 50
opencv_createsamples.exe -vec pos.vec -info info.txt -num 50 -w 50 -h 50
不需要生成负样本的.vec文件
生成自己的分类器
开始训练啦!
#用pos.vec 和bg.txt中指定的图片进行训练 正样本50张 负样本 2000张 训练20轮
opencv_traincascade.exe -data data -vec pos.vec -bg bg.txt -numPos 50 -numNeg 2000 -featureType HOG -w 50 -h 50 -numStages 20
然后就出问题了Parameters can not be written, because file data/params.xml can not be opened.
因为没有创建data这个文件夹,需要在同级下建立空文件夹,取别的名字也可以,但我这里之前写的data
然后开始训练啦!
训练的时候出现卡住的情况
卡在这里不动的原因是,negNum是在每轮参与训练的数量,成功训练的负样本不会再训练,所以,需要减小nugNum的数量。
抱歉让大家看到了错误的方法。上述操作确实能够解决训练卡在某个stage的情况,但是训练出来的casca.xml是跑不动的。 negNUM = posNUM * 2。