首页 > 编程知识 正文

opencv分类器物体识别,opencv测量物体尺寸

时间:2023-05-03 09:42:52 阅读:151481 作者:2441

环境: python3.7 OpenCV3.4.3.18

工具:

opencv_annotation.exe

opencv_createsamples.exe

opencv_traincascade.exe

下载安装环境和工具

OpenCV库在cmd上执行终端命令

pip install-I https://pypi.tuna.Tsinghua.edu.cn/simple opencv-contrib-python==3.4.3. 18

包括OpenCV主要模块和OpenCV贡献库

工具在GitHub上下载

3359 github.com/opencv/opencv/releases? after=3.4.3

安装OpenCV后,位于以下目录中

一.准备阶段

文件模板

positive_images放置正样本图像,negative_image放置负样本图像,xml是训练有素的分类器文件

样品收集

正样本:我想要与正确分类的类别对应的样本。 例如,如果将图像分类以确定它是否属于菠萝,则在训练时菠萝图像是正样本。

负样本:不是与我们想要的分类相对应的样本,而是去掉菠萝后的照片。

样本数据越多检测效果越好,正样本特征越明显越好,负样本背景越复杂越好。

1、前往www.kaggle.com下载想要的数据集,或使用scrapy selenium大量登录图片

2、自己拍摄想要检测的物体的图像

二.预处理

图像注水处理:通过自动化图像旋转、平移和缩放来增加样本数量

例如,通过旋转

“path”是图像路径,执行后,生成在同一目录下每次旋转30度的11张图像的“defspin(path ) :retval=cv2.imread ) path”he、 we=retval.shape(33602 ) path 12 ) : m=cv2.getrotation matrix 2d (center=(we/2,he/2 ),angle=x*30,sccov2

' path是图像的路径,运行时会在同一目录下生成5张亮度依次增加的图像。' deflight(path ) : retval=cv2.im read (path ) img_HSV=cv2.cvtcolor ) retval,cv2.color _ bgr2HSV (darker ) 2 )2* ydarker _ img=cv2.cvtcolor (darker _ HSV,cv2.COLOR_HSV2BGR ) new_path=path(:-3 ) )-light

批量重命名文件夹中的图像文件

importosfrompilimportimageclassbatchrename (: def _ init _ ) self ) : self.path=r '. positive _ images ' def I=0foriteminfilelist : if item.endswith (.jpg ) ) : src=OS.path.join (OS.path.abspath ) self.path,id

continue print ('total %d to rename & converted %d jpgs' % (total_num, i)) if __name__ == '__main__': demo = BatchRename() demo.rename() pass

执行后 

批量修改图片尺寸

from PIL import Imageimport os.pathimport globdef convertjpg(jpgfile,outdir,width=40,height=40): img=Image.open(jpgfile) try: new_img=img.resize((width,height),Image.BILINEAR) new_img.save(os.path.join(outdir,os.path.basename(jpgfile))) except Exception as e: print(e)for jpgfile in glob.glob(r".positive_images*.jpg"): #像素修改后存入images文件 convertjpg(jpgfile,r".positive_images")

三、生成样本描述文件

生成正样本描述文件可以利用标注工具opencv_annotation.exe

opencv_annotation.exe的使用,在当前目录cmd下输入opencv_annotation.exe可以看到是使用说明

 比如:opencv_annotation.exe -a=生成的pos.txt路径 -i=正样本文件夹路径

 

用鼠标左键标记进行矩形框选想要识别的物体 

 英文下,’c'是确认框选,'d'删除所选的框,'n'是下一张,'esc'是停止。

如果图片中只有一个物体,可直接生成描述文件(尽量自己用opencv_annotation标注,效果更好)

file_dir=os.getcwd()print(file_dir)file_dir=r'.positive_images'L=[]i=0with open(r".pos.txt","w+") as f: for root, dirs, files in os.walk(file_dir): for file in files: if os.path.splitext(file)[1] == '.jpg': L.append(os.path.join(root, file)) f.write(L[i]+' 1'+' 0'+' 0'+' 40'+' 40'+'n') i+=1

生成pos.txt 

生成负样本描述文件(不用进行标注)

file_dir=r'.negative_image'L=[]i=0with open(r".neg.txt","w+") as f: for root, dirs, files in os.walk(file_dir): for file in files: if os.path.splitext(file)[1] == '.jpg': L.append(os.path.join(root, file)) f.write(L[i]+'n') i+=1print("ok")

生成neg.txt

四、 合成样本vec文件

这里只需要合成正样本vec文件,负样本不需要,这里使用opencv_createsamples.exe

opencv_createsamples.exe的使用,在当前目录cmd下输入opencv_createsamples.exe可以看到是使用说明

 比如opencv_createsamples.exe -vec pos.vec  -info pos.txt -num 50 -w 40 -h 40

-vec  参数代表.vec文件的存储位置;

-info  代表生成的annotation的位置;

-num  生成的正样本的数目

-w 窗口的宽度;-h 窗口的高度;

 结束之后在当前目录下生成pos.vec文件

五、训练模型

训练模型使用opencv_traincascade.exe

opencv_traincascade.exe的使用,在当前目录cmd下输入opencv_traincascade.exe可以看到是使用说明

 比如:opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 10 -numNeg 2000 -numStages 15 -w 40 -h 40 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -mode ALL

-data:指定保存训练结果的文件夹;

-vec:指定正样本集;

-bg:指定负样本的描述文件夹;

-numPos:指定每一级参与训练的正样本的数目(要小于正样本总数);

-numNeg:指定每一级参与训练的负样本的数目(可以大于负样本图片的总数);

-numStage:训练的级数;

-w:正样本的宽;-h:正样本的高;(必须与opencv_createsample中使用的-w和-h值一致)

-minHitRate:每一级需要达到的命中率(一般取值0.95-0.995);

-maxFalseAlarmRate:每一级所允许的最大误检率;

-mode:使用Haar-like特征时使用,可选BASIC、CORE或者ALL;(ALL使用垂直和45度角旋转特征。)

(这个截图是训练好模型后,再次运行opencv_traincascade.exe的结果)

 训练好分类器的文件在xml文件夹下

六、测试模型

import numpy as npimport cv2#加载级联器pineapple_cascade = cv2.CascadeClassifier(r'xmlcascade.xml')#检测def detect(image): #将图像转变为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #调用级联器 pineapples = face_cascade.detectMultiScale(gray, scaleFactor=1.15, minNeighbors=5, minSize=(10, 10)) print(pineapples) print("发现{0}个菠萝!".format(len(pineapples))) #绘制出菠萝区域 for (x, y, w, h) in pineapples: cv2.circle(image, (int((x + x + w) / 2), int((y + y + h) / 2)), int(w / 2), (0, 255, 0), 2) return imageretval=cv2.imread(r'test.jpg')image=detect(retval)cv2.imwrite('detect.jpg',image)

 运行后生成检测后的图片detect.jpg(这里只是个展示,样本少,效果不是很好)

 

 以上只是一个简单的训练步骤展示,供参考学习使用

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。