Windows使用opencv训练模型过程记录(提供样本)

首先按照这个指引安装好所需要的工具:

Windows环境下训练OpenCV分类器

Windows环境下训练OpenCV分类器_@陌阡的博客-CSDN博客

Python + pip

下载 opencv_createsamples.exe和opencv_traincascade.exe

准备训练库opencv_bin,自己拍照进行训练。

自己试了几个训练结果,发现都不理想。一般训练识别不准确。

后来经过多次尝试,觉得应该收集更多正样本,于是以消毒液为例子,自己进行拍照,剪裁得到正样本。我拍了130多张。

Windows使用opencv训练模型过程记录(提供样本)_第1张图片

然后使用QQ截图并剪裁功能,剪裁出了质量达标的105张:

Windows使用opencv训练模型过程记录(提供样本)_第2张图片

然后使用上面博主提供的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])  # 保存图片

Windows使用opencv训练模型过程记录(提供样本)_第3张图片

然后使用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, 测试了一下,基本能达到要求,需要还是有一定的误识别率,但是对于需要识别的本尊基本都能稳定识别到了。

Windows使用opencv训练模型过程记录(提供样本)_第4张图片

其中样本已上传:

消毒液瓶doctmp.zip-机器学习文档类资源-CSDN下载

你可能感兴趣的:(Android,opencv,windows,计算机视觉)