1 首先准备好正样本:(这里我们训练的头部分类器)
2 将正样本统一到固定尺寸
这里我使用python实现,python读取文件夹还没有用过,直接先手动操作:
打开命令行,进入正样本文件夹中,输入:
dir /b >pos.txt
这样就在正样本文件夹中生成了pos.txt,记录了所有的文件名:
直接在ue中打开,切换到16进制模式,选择替换,将0D 0A替换为2C 0D 0A
保存后修改文件名为:pos.csv
这样就得到了个csv文件,保存了所有文件的名称(感觉有点蠢,第一次先这样吧)。
开始写代码,代码很简单,就是读取csv文件,打开图像,灰度化,统一尺寸到32*32,保存文件
#coding=utf-8
import pandas as pd
import numpy
from numpy import NaN
import cv2
test = pd.read_csv('pos.csv',index_col=False,header=None)#读取csv文件
test.columns = ['Dir']#修改列名称
print(test.head(5))#看看数据情况
num = test.shape[0]#取出个数
print(num)
for i in range(0,num):
#读取文件
print(i)
#print(test.Dir[i])
image = cv2.imread(test.Dir[i])
if image is None:
test.Dir[i] = NaN#设置为空
continue
image = cv2.resize(image,(30,30))
image = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
cv2.imwrite(test.Dir[i],image)
test.dropna(axis=0,how='any')#去除调Na行
test=test.dropna()
print(test.shape[0])
test.to_csv('pos.csv',index=False,header=False)
print("OK end")
3 生成正样本描述文件
还记得刚才的pos.txt吧,直接打开,将jpg都替换为jpg 1 0 0 30 30
记得检查一下,必须全部都是jpg文件,别弄错了。
4 生成负样本描述文件
命令行进入负样本目录,直接输入:
dir /b > neg.txt
5 生成vec文件
命令行进入上一层,输入命令:(前提当然是opencv安装好了)
opencv_createsamples.exe -vec pos.vec -info pos\pos.txt -bg neg\neg.txt -w 30 -h 30 -num 3000
这就生成了pos.vec文件
6 开始训练:
opencv_traincascade.exe -data data -vec pos.vec -bg neg/neg.txt -numPos 3000 -numNeg 5000 -numStages 4 -featureType Haar -w 30 -h 30 -mode ALL
结果发生错误:
经过了长时间的扑腾,最终发现,是负样本的neg.txt必须包含相对路径,使用ue打开,直接列模式编辑添加,终于可以了。
(后面测试opencv2.4.9版本貌似没有这个路径的问题)
(顺便吐槽下,harr特征的训练实在太慢了,建议测试时候先使用HOG或者LBP特征确定步骤是否正确)