用opencv_traincascade自己训练一个分类器

准备样本

需要训练一个婴面头部的分类器,从网上找了一些图片,作为正样本。正样本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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值