首先感几位谢博主的分享,对我的帮助很大!
https://blog.csdn.net/hongxisen/article/details/82017099
https://blog.csdn.net/cwlwlw/article/details/103223502
https://blog.csdn.net/YK_LaNce/article/details/100576560
采集公司的业务需要,要采集激光点的位置,大体的流程-> 拍照采集,制作样本,训练分类器。使用分类器识别点。
开发环境 mac os ,opencv 4.1.2 ,辅助 Python 2.7.17 、idea、 ps。
生成自己的样本大体分为以下三部进行:
1、 采集样本 正负样本
2、 样本数据的处理
3、训练分类器
首先要采集正负样本
正负样本流程->拍照,裁剪标示物图像,统一图像分辨率,灰度化,生成描述文件,利用生成描述文件生成 .vec文件 /end
手机拍照采集正样本
1、大概拍了50多张
image.png
2、然后用ps把图片里面的激光点都截取出来
image.png
image.png
3、统一分辨率,将截取后的图片放到一个文件夹里面,使用ps图像批处理功能将图像统一裁剪成统一像素大小 2020 / 3030 / 5050/基本上大多数都是这几种,小的速度快,看个人,我这里选取的是5050
image.png
得到裁剪后的图像,并重命名(之后脚本处理方便)
image.png
4、灰度化,利用python处理处理图像,实际上就是将每一张图像灰度化
import cv2
path = "/Users/Pictures/HY/pos/" #文件路径
# 处理正样本 负样本
for i in range(1, 59): #循环处理文件个数
print(path + str(i) + '.jpg')
img = cv2.imread(path + str(i) + '.jpg', cv2.IMREAD_GRAYSCALE) #加载图像
img5050 = cv2.resize(img, (50, 50)) #灰度化
cv2.imshow("img", img5050)
cv2.waitKey(50)
cv2.imwrite('/Users/Pictures/HY/pos/' + str(i) + '.jpg', img5050) #存储处理好的图片
处理后
image.png
5、生成描述文件,
# 生成描述文件
import os
path = "/Users/Pictures/HY/pos/"
for file_type in ['pos']:
for img in os.listdir(path):
if (file_type == 'pos'):
print(path + img)
line = path + img + ' 1 0 0 50 50 \n'
with open(path + '/pos.txt', 'a') as f:
f.write(line)
描述文件
image.png
其实就是将灰度后的图片路径加描述写到文本里面,也可以手动完成
5、正样本最后一步,利用opencv的 opencv_createsamples命令生成 .vec文件
/usr/local/Cellar/opencv@2/2.4.13.7_5/bin/opencv_createsamples -vec pos.vec -info pos.txt -num 59 -w 50 -h 50
image.png
image.png
得到正样本 pos.vec
到此,我们的正样本就处理完成了
负样本
1、负样本采用的是weizmann团队http://www.wisdom.weizmann.ac.il/~vision/Seg_Evaluation_DB/dl.html 网站上的图像分割数据库里面的灰色图像,直接就可以用,图像不需要任何处理
2、也可以自己采集,和正样本图像一样,需要灰度化,不要求样本尺寸,且负样本不能重复,要增大负样本的差异性。
这里我用的是1,这个文件夹里面就是我们需要的灰度图,直接把这些图片取出来放到一起就行,重命名,生成描述文件
image.png
image.png
image.png
注意,这里生成负样本的描述文件不需要像正样本那样附带文件的信息,直接就是文件的路径
得到我们的负样本的描述文件 neg.txt
到此,我们的负样本就处理完成了
经过正负样本的处理,最后得到两个文件 neg.txt pos.vec
image.png
制作xml文件
最简单,也是浪费我最长时间的一步
/usr/local/Cellar/opencv@2/2.4.13.7_5/bin/opencv_haartraining -data xml -vec pos.vec -bg neg.txt -nstages 10 -nsplits 1 -npos 50 -nneg 80 -mem 1280 -mode all -w 50 -h 50
只需要这一个命令,将这两个文件制作成xml
一切都正常就应该得到这样的结果,得到xml文件
image.png
image.png
采集样本结束,接下来我们就可以用我们自己做的分类器进行识别了,end
过程中遇到两个问题
1、如图,会卡在那里,只能control+c来取消
image.png
2、Invalid background description file.
image.png
1、这两个问题都是负样本的问题,pos:50 50 1.00 说明正样本没问题了,检查负样本的描述文件是否包含其他格式的文件,或者包含其他多余的换行字符,
2、实在没找到问题,就重新创建灰度化的图片,生成样本,(我之前是把png的图片批量处理成jpg的文件,生成描述文件就一直报错,后来用灰度原图png生成就OK了)
完成
至此 分类器制作完成,接下来放到你的识别项目进行识别就可以了
image.png














网友评论