任务:在本文章,我们将进行苹果检测。我们需要创建一个自己的级联分类器,该分类器是后缀为xml文件,使用它也很简单,只需要文件存放的路径,和cv2.CascadeClassifier()函数即可。
一、opencv自带工具的下载(注:只有老版本有自带)
想使用的话直接下载就行,给大家放在下面链接了,我们只需要使用俩个.exe文件,使用也简单,放心下载吧。
链接:https://pan.baidu.com/s/1vCdmWnRRjRNmOCKm30602w?pwd=zur8
提取码:zur8
2. 理论导论
使用基于Haar特征的级联分类器的对象检测是Paul Viola和Michael Jones在其论文“使用简单特征的增强级联进行快速对象检测”中于2001年提出的一种有效的对象检测方法。这是一种基于机器学习的方法,其中从许多正负图像中训练级联函数。然后用于检测其他图像中的对象。
三、评价与思考
opencv自带了训练级联分类器的文件,使用后的评价:
- 使用简单,图像分类的输出只有yes和no。新手如果想快速上手,早点看到效果,可以选择自己制作分类器
- 如果对图像识别方向感兴趣,建议学习神经网络,训练自己的模型。
4. 正式步骤
- 阳性样本的处理
- 负样本的处理
- 训练级联分类器
- 目标检测
4.1
正样本选用的是5张苹果图,大家在百度上搜就行了,把原图放进自己的文件夹。为了避免颜色干扰还有尺度不同带来的干扰,我们将使用opencv的几个函数对图像进行处理保存,因为比较简单,就不对函数进行解释了。
# -*- coding=utf-8 -*-
import os
import sys
import cv2
#输入图片的
input_dir = './input_img'
output_dir = './output_img'
width = 50
height = 50
if not os.path.exists(output_dir):
os.makedirs(output_dir)
index = 1
for (path,dirnames,filenames) in os.walk(input_dir):
for filename in filenames:
if filename.endswith('.jpg'):
print('正在处理第 %s 张图片' % index)
img_path = path + '/' + filename
img = cv2.imread(img_path)
image=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
new_img = cv2.resize(image,(width,height))
cv2.imwrite(output_dir + '/' + str(index) + '.jpg', new_img)
index += 1
key = cv2.waitKey(30) & 0xff
if key == 27:# esc键
sys.exit(0)
如图我们需要建立一个pos.txt文件,它的格式格式为:图片路径 检测目标在图片中的个数 起始监测点坐标(x,y) 图片大小(w,h),可以用cmd运行命令行再手动添加后面这些数字,python水平高也可以写代码跑一些,偷懒的话数据量小直接跟着打就行hhh,不过这一步不能出错哦。
4.2负样本的处理
负样本的数量至少要正样本的4倍哦,建议选择一些和正样本有关的图片,例如香蕉,梨子,葡萄,偷懒了选择下载了一些人的数据集,需要的话自取,对了,图像已经经过灰度和尺寸处理了。
链接:https://pan.baidu.com/s/1qM51JSaA5_lD5arL9ghjug?pwd=aqkf
提取码:aqkf
dir/b /s > pos.txt
上面是cmd的命令行哦,注意得先cd进去目录,/s是绝对路径,很多人在最后的运行会报错,使用绝对路径你的neg文件可以随便放,还少了报错的风险。
4.3训练级联分类器
cmd下运行以下命令 cd进去exe文件,运行完代码会有ves.pos文件生成,正样本的处理结束!
opencv_createsamples.exe -vec pos.vec -info 路径 -num 5 -w 50 -h 50。
最后将pos.vec和neg.txt文件拷贝到同一文件夹下,即可开始我们的训练之旅行。
opencv_traincascade.exe -data data -vec pos.vec -bg neg.txt -numPos 5 -numNeg 2000 -numStages 2 -featureType HOG -w 50 -h 50
效果如下,亲测数据少几分钟就训练完成哦,这个cascade即为我们的分类器。
上面的参数需要改改哦,偷懒了不做解释了。下一篇写一下对xml文件的使用(附代码)。
文章出处登录后可见!