文章目录

  • 准备样本
  • 图片预处理
  • 缺少程序
  • 生成正样本.vec文件
  • 生成自己的分类器


准备样本

需要训练一个婴面头部的分类器,从网上找了一些图片,作为正样本。正样本50张

opencv 人像分割 opencv图像分类训练_人脸识别

负样本直接选择了人脸识别的负样本,负样本选中了2000张。

opencv 人像分割 opencv图像分类训练_人脸识别_02

图片预处理

对图片进行灰度化、归一化处理。

"""
作者: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)

处理之后的样子是,有点点吓人哈哈哈:

opencv 人像分割 opencv图像分类训练_计算机视觉_03

负样本本来已经经过灰度处理啦,但还要归一化:

opencv 人像分割 opencv图像分类训练_opencv 人像分割_04

接下来需要生成描述文件

"""
作者: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 人像分割 opencv图像分类训练_opencv_05

opencv 人像分割 opencv图像分类训练_opencv_06

缺少程序

因为我使用的版本没有要用到的opencv_traincascade和opencv_createsamples,查了很多办法很麻烦我选择直接拷贝exe文件。最后要用到这些文件:

opencv 人像分割 opencv图像分类训练_分类算法_07

也不用一个一个去找,因为不满足条件,会提醒你少了什么文件直接拷贝过来就好了。

生成正样本.vec文件

将这些文件拷贝到自己图片文件夹下,也就是这样:

opencv 人像分割 opencv图像分类训练_opencv_08

然后开始生成正样本的.vec文件,执行

#用之前生成的info.txt来生成pos.vec 数量是50 长宽分别是50 50
opencv_createsamples.exe -vec pos.vec -info info.txt -num 50 -w 50 -h 50

不需要生成负样本的.vec文件

opencv 人像分割 opencv图像分类训练_opencv 人像分割_09

生成自己的分类器

开始训练啦!

#用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.

opencv 人像分割 opencv图像分类训练_计算机视觉_10

因为没有创建data这个文件夹,需要在同级下建立空文件夹,取别的名字也可以,但我这里之前写的data

opencv 人像分割 opencv图像分类训练_opencv_11

然后开始训练啦!

opencv 人像分割 opencv图像分类训练_分类算法_12

训练的时候出现卡住的情况

opencv 人像分割 opencv图像分类训练_人脸识别_13

卡在这里不动的原因是,negNum是在每轮参与训练的数量,成功训练的负样本不会再训练,所以,需要减小nugNum的数量。
抱歉让大家看到了错误的方法。上述操作确实能够解决训练卡在某个stage的情况,但是训练出来的casca.xml是跑不动的。 negNUM = posNUM * 2。