基于OpenCV训练⼝罩检测数据集并测试
以下内容是利⽤opencv⾃带的训练器与,来对⼝罩数据集进⾏训练。内容是⾃⼰操作过程中的笔记,可能会有些杂乱,其他的可以查看⼀下参考资料。
⽂章⽬录
0. 检测器初体验
由于这⾥需要opencv⾃带的xml⽂件,这⾥我⽤的是conda的虚拟环境,所以xml⽂件处于E:\anacanda\envs\pytorch\Lib\site-packages\cv2\data中,这⾥使⽤了⼀个关于⼈脸检测的xml⽂件。
import cv2
#识别⼈脸的xml⽂件,构建⼈脸检测器
facexml_path ="E:/anacanda/envs/pytorch/Lib/site-packages/cv2/data/haarcascade_l"
detector= cv2.CascadeClassifier(facexml_path)
#获取0号摄像头的实例
cap = cv2.VideoCapture(0)
while True:
# 就是从摄像头获取到图像,这个函数返回了两个变量,第⼀个为布尔值表⽰成功与否,以及第⼆个是图像。
ret, img = ad()
assert ret is True,"Cramae Capture Nothing"
# 转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取⼈脸坐标
faces = detector.detectMultiScale(gray,1.1,3)
for(x, y, w, h)in faces:
#参数分别为图⽚、左上⾓坐标,右下⾓坐标,颜⾊,厚度
cv2.imshow('Test Detection', img)
# 在10ms内等待按键,否则显⽰下⼀帧,也就是10ms内按Esc退出循环
if cv2.waitKey(10)==27:
break
cv2.destroyAllWindows()
这⾥体验了⼀下opencv⾃带的xml来构建⼈脸检测器,但是,检测得过程不是特别的稳定。关于opencv⾃带的检测器其实还有关于其他⽅⾯的,如下所⽰,具体的可以⾃⾏体验。
1. 数据的准备
正样本:仅包含被检测物体的样本,并且距离边界尽量要⼩,图⽚尺⼨⼤⼩⼀致,附件需要有路径还需要添加重复吃属于⽬标图⽚的矩形框。
eg:E:\学习\机器学习\数据集\mask2\positive\100000.jpg 1 0 0 20 20
ps:这⾥1表⽰当前图⽚重复出现的次数是1, 0 0 50 50表⽰⽬标图⽚⼤⼩是矩形框从(0,0)到(50,50)
负样本:不包含被检测物体的样本,图⽚尺⼨⼤⼩⽆要求,路径存放没有要求。
eg:E:\学习\机器学习\数据集\mask2\negative\100000.jpg
这⾥⼝罩的数据集中的正样本数为:352,负样本数为:1053
正样本名字处理脚本
这⾥对正样本进⾏名字的添加处理我写了⼀个脚本来实现,具体变现为:E:\学习\机器学习\数据集\mask2\positive\100000.jpg ->
E:\学习\机器学习\数据集\mask2\positive\100000.jpg 1 0 0 20 20
import os
# 读取⽂件所有数据
rf =open(r"E:/学习/机器学习/数据集/mask2/","r")
rdata = rf.readlines()
# 改写数据并保存
wdata =[]
for data in rdata:
oneline = data[:-1]+" 1 0 0 20 20\n"
wdata.append(oneline)
# 写⼊数据
wf =open(r"E:/学习/机器学习/数据集/mask2/","w")
wf.writelines(wdata)
# 关闭⽂件描述符
rf.close()
wf.close()
保存图⽚⽂件名处理脚本
把图⽚⽂件名保存在⼀个⽂件中,构建成⼀个函数使⽤.
不过这个操作可以通过使⽤cmd打开对应的⽂件夹,输⼊:dir /b/s/p/w *.jpg > 来实现,简洁版本是:dir /b *.jpg >
import os
# dir:图⽚⽂件夹的路径
# filename:保存⽂件名称
def SaveImageName(dir, filename):
imgnames = os.listdir(dir)
imglists =[]
for imgname in imgnames:
imgname =dir+'/'+ imgname +'\n'
imglists.append(imgname)
wf =open(os.path.join(dir, filename),"w")
wf.writelines(imglists)
wf.close()
# 测试函数
imgdir ="E:/学习/机器学习/数据集/mask2/negative"
filename =""
SaveImageName(imgdir, filename)
ps:dir /b *.jpg >
输⼊完了之后就会⽣成对应的file,⾥⾯存储的是当前⽂件夹下全部后缀名为md的⽂件名。
2. 创建正样本vec⽂件rectangle函数opencv
-vec pos.vec - -num 352-w 20-h 20
成功获得pos.vec⽂件
info,指样本说明⽂件
vec,样本描述⽂件的名字及路径
num,总共⼏个样本,要注意,这⾥的样本数是指标定后的20x20的样本数,⽽不是⼤图的数⽬,其实就是样本说明⽂件第2列的所有数字累加
-w -h指明想让样本缩放到什么尺⼨。
3. 训练获得xml⽂件
最后运⾏成功的代码:
-data xml -vec pos.vec - -numPos 100-numNeg 300-numStages 20-w 20-h 20-mode ALL
参数列表如下所⽰:
data <cascade_dir_name>:应存储经过训练的分类器的位置。此⽂件夹应事先⼿动创建。
vec <vec_file_name>: 带有正样本的 vec ⽂件(由 opencv_createsamples 实⽤程序创建)。
bg <background_file_name>: 背景描述⽂件。这是包含负样本图像的⽂件。
numPos <number_of_positive_samples>:每个分类器阶段训练中使⽤的正样本数。
numNeg <number_of_negative_samples>:每个分类器阶段训练中使⽤的负样本数。
numStages <number_of_stages>:要训练的级联阶段数。
precalcValBufSize <precalculated_vals_buffer_size_in_Mb>:预先计算的特征值的缓冲区⼤⼩(以 Mb 为单位)。您分配的内存越多,训练过程就越快,但请记住,两者的-precalcValBufSize总和-precalcIdxBufSize不应超过您可⽤的系统内存。
precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>:预先计算的特征索引的缓冲区⼤⼩(以 Mb 为单位)。您分配的内存越多,训练过程就越快,但请记住,两者的-precalcValBufSize总和-precalcIdxBufSize不应超过您可⽤的系统内存。
baseFormatSave: 这个论点在 Haar-like 特征的情况下是真实的。如果指定,级联将以旧格式保存。这只适⽤于向后兼容的原因,并允许⽤户坚持使⽤旧的已弃⽤界⾯,⾄少可以使⽤较新的界⾯训练模型。
numThreads <max_number_of_threads>:训练期间使⽤的最⼤线程数。请注意,实际使⽤的线程数可能会更少,具体取决于您的机器和编译选项。默认情况下,如果您使⽤ TBB ⽀持构建 OpenCV,则会选择最⼤可⽤线程,这是优化所必需的。
acceptanceRatioBreakValue <break_value>:此参数⽤于确定您的模型应该保持学习的精确程度以及何时停⽌。⼀个好的指导原则是训练不超过 10e-5,以确保模型不会过度训练您的训练数据。默认情况下,此值设置为 -1 以禁⽤此功能。
ps:这⾥需要⼩⼼调整numPos与numNeg的⼤⼩,这⾥指的每个分类器阶段训练中使⽤样本数,设置得过⼤可能会引起错误。设置的numPos过⼤,由于训练时pos count 会从你设置的numPos增⼤,每⼀级都按⼀定的次序增⼤,后来可能会超过样本库中正样本的个数,就会报这个错误。
Error: Bad argument (Can not get new positive sample. The most
possible reason is insufficient count of samples in given vec-file.
根据参考资料3,这⾥设置调整的值⼀般满⾜关系为:
numneg (负样本)数设置为总数的⼀半,或者其他值,
numpos (正样本)数设置为负样本数的3分1
训练完成后,得到最后的l⽂件
ps:这个xml的⽂件夹需要⾃⼰创建
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论