python识别物体⼤⼩_Python-OpenCV——物体识别
(TrainCascade。。。
在上次教程Python-OpenCV —— Machine Learning讲述了如何建⽴模型,进⾏训练,然后利⽤模型对新获得的照⽚进⾏预测并给出预测值,本期教程针对某个特定的物体进⾏检测,将其标记出来,分为3个步骤,第⼀:训练特定物体,第⼆:extremepapers
训练模型
ssnd级联分类器
前⼏天看到⼀个笑话,很有意思,说的是
理论就是你什么都知道但是什么都⼲不了
实践就是你什么都能⼲但是不知道为什么
我就不⼀样了,我可以理论与实践相结合——什么都⼲不了⽽且不知道为什么
开个玩笑,⽬前有很⼤⼀部分的东西都是⼈们实践得来的经验,有些东西也许很好⽤,但未必是好理论,
⽐如现在的深度学习,扯远了,继续今天的话题,到底什么是级联分类器,其实就是把分类器按照⼀定的顺序联合到⼀起。⼀个分类器也许不好⽤,没关系,我给你多加⼏个,俗话说得好,三个臭⽪匠,顶个诸葛亮呢。
具体来说,OpenCV实现的Cascade(级联)分类器就是基于多个弱分类器对不同的特征进⾏依次处理(分类)来完成对⽬标的检测,简单的说有多个弱分类器串起来,然后提取每个平滑窗上的不同特征,把这些特征依次放进不同的弱分类器⾥判断,如果所有的弱分类器都判断正标签,则表⽰该该平滑窗内检测到⽬标。这样做的好处是不但通过多个弱分类器来形成⼀个强的级联分类器,⽽且可以减少运算量,⽐如当⼀个平滑窗第⼀个特征没有通过第⼀个分类器,那么就没有必要继续运算下去,直接拒绝掉当前平滑窗,转⽽处理下⼀个平滑窗,事实上作者的⽬的就是为了快速抛弃没有⽬标的平滑窗,从⽽达到快速检测⽬标。
本次⽤到了OpenCV的两个程序,分别是和,分别⽤来创建样本⽂件和训练级联分类器。
准备训练数据
正样本
正样本就是你要检测的东西,⽐如说⾹蕉、车牌、酒瓶、红绿灯等等,你可以找相关的数据集,或者⾃⼰⼿动截图,只取你想要识别的那部分,下⾯我给了⼀个⼩程序⽤来将你截取的图⽚都变成统⼀⼤⼩。
#改变图⽚尺⼨为统⼀⼤⼩,在当前⽬录创建⼀个名为pos的⽂件夹
#把需要统⼀尺⼨的正样本放到⾥⾯,写上尺⼨,运⾏程序就可以了,⼀般来说建议长宽在100像素⼀下,不然训练会很慢
import cv2
import os
w = **
h = **
def getimage(file_dir):
images = {}
for root, dirs, files in os.walk(file_dir):
for name in files:
images[name] = os.path.join(root,name)
return images
best是什么意思if __name__ == '__main__':
n=-1
aa = os.getcwd()
dirpath = os.path.join(aa, 'pos')
imagedic = getimage(dirpath)
try :
for key,value in imagedic.items():
img = cv2.imread(value)
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img2 = size(img1,(w,h))
cv2.imwrite('pos'+str(n+1).rjust(3,'0')+'.jpg',img2)
n+=1
except KeyboardInterrupt:
print('暂停⼀下')
修改完图⽚尺⼨之后,需要⽣成图⽚的路径,我也写了⼀个代码,运⾏后,会在当前⽬录⽣成⼀个如图所⽰的⽂件
<
每⼀⾏分别代表⽂件路径 1代表⾥⾯有⼏个⽬标,咱们⽤的截取好的,所以只有⼀个,然后 0 0 60 120 分别代表着图⽚的起始像素和终⽌像素的长宽
#会在当前⽬录⽣成⼀个如图所⽰的⽂件,记得修改 w h 为上⾯修改后的尺⼨值
import os
def getimage(file_dir):
images = {}
for root, dirs, files in os.walk(file_dir):
for name in files:
images[name] = os.path.join(root,name)
return images
if __name__ == '__main__':
n=0
aa = os.getcwd()
dirpath = os.path.join(aa, 'pos')
imagedic = getimage(dirpath)
#print (imagedic)
try :
for key,value in imagedic.items():
四级听力下载
with open ('','a') as f:
f.write('pos/'+str(key).rjust(3,'0')+' 1 0 0 w h''\n')
except KeyboardInterrupt:
print('暂停⼀下')
million的用法接下来就要⽤⽣成正样本⽂件了,写了⼀个批处理⽂件,新建crate_samples.bat,打开编辑
"在此处写上你的路径" -info "" -vec pos.vec -num 200 -w 60 -h 120
⼀些参数解释:above反义词
info 输⼊正样本描述⽂件
img 输⼊图像⽂件名,默认NULL
bg 负样本描述⽂件,⽂件中包含⼀系列的被随机选作物体背景的图像⽂件名,默认NULL
num ⽣成正样本的数⽬,默认1000
bgcolor 背景颜⾊,表⽰透明颜⾊,默认0
bgthresh 颜⾊容差,所有处于bgcolor- bgthresh和bgcolor+bgthresh之间的像素被置为透明像素,也就是将⽩噪声加到前景图像上,默认80
inv 前景图像颜⾊翻转标志,如果指定颜⾊翻转,默认0(不翻转)
randinv 如果指定颜⾊将随机翻转,默认0
英语商标maxidev 前景图像中像素的亮度梯度最⼤值,默认40
maxxangle X轴最⼤旋转⾓度,以弧度为单位,默认1.1
maxyangle Y轴最⼤旋转⾓度,以弧度为单位,默认1.1
maxzangle Z轴最⼤旋转⾓度,以弧度为单位,默认0.5
输⼊图像沿着三个轴进⾏旋转,旋转⾓度由上述3个值限定。
show 如果指定,每个样本都将被显⽰,按下Esc键,程序将继续创建样本⽽不在显⽰,默认为0(不显⽰)
scale 显⽰图像的缩放⽐例,默认4.0
w 输出样本宽度,默认24
h 输出样本⾼度,默认24
vec 输出⽤于训练的.vec⽂件
负样本cbd是什么意思
负样本只需要⽣成路径⽂件,不需要⽣成vec⽂件,具体步骤跟上⾯类似,要注意的是负样本要尽可能⽐正样本多,⼤概⼗倍的样⼦吧。
开始训练
新建⼀个⽂件夹TrainCascadeClassification,⼀会训练好的⽂件就在这⾥
新建⼀个train.bat,编辑
"你的⽬录" -data "你的TrainCascadeClassification⽬录" -vec pos.vec - -numPos 160 -numNeg 500 -numStages 15 -precalcValBufSize 3000 -precalcIdxBufSize 3000 -featureType LBP -w 60 -h 120
Pau
⼀些参数解释
cnn在线收听
data 训练的分类器的存储⽬录
vec 正样本⽂件,由⽣成,正样本⽂件后缀名为.vec
bg 负样本说明⽂件,主要包含负样本⽂件所在的⽬录及负样本⽂件名
numPos 每级分类器训练时所⽤到的正样本数⽬,应⼩于vec⽂件中正样本的数⽬,具体数⽬限制条件为:numPos+(numStages-
1)numPos(1- minHitRate)<=vec⽂件中正样本的数⽬。根据我的经验,⼀般为正样本⽂件的80%
numNeg 每级分类器训练时所⽤到的负样本数⽬,可以⼤于- bg指定的图⽚数⽬。根据我的经验,⼀般为numPos的2-3倍
numStages 训练分类器的级数,强分类器的个数。根据我的经验,⼀般为12-20
precalcValBufSize 缓存⼤⼩,⽤于存储预先计算的特征值,单位MB,根据⾃⼰内存⼤⼩分配
precalcIdxBufSize 缓存⼤⼩,⽤于存储预先计算的特征索引,单位MB,根据⾃⼰内存⼤⼩分配
featureType 训练使⽤的特征类型,⽬前⽀持的特征有Haar,LBP和HOG
w 训练的正样本的宽度
h 训练的正样本的⾼
进阶参数
minHitRate 影响每个强分类器阈值,每⼀级分类器最⼩命中率,表⽰每⼀级强分类器对正样本的的分类准确率
maxFalAlarm 最⼤虚警率,影响弱分类器的阈值,表⽰每个弱分类器将负样本误分为正样本的⽐例,⼀般默认值为0.5
weightTrimRate 0- 1之间的阈值,影响参与训练的样本,样本权重更新排序后(从⼩到⼤),从前⾯累计权重⼩于(1- weightTrimRate)的样本将不参与下⼀次训练,⼀般默认值为0.95
maxDepth 每⼀个弱分类器决策树的深度,默认是1,是⼆叉树(stumps),只使⽤⼀个特征。
maxWeakCount 每级强分类器中弱分类器的最⼤个数,当FA降不到指定的maxFalAlarm时可以通过指定最⼤弱分类器个数停⽌单个强分类器
这个时候先看⼀下我们的⼯作⽬录下都有那些东西,没有的话,记得补全它。
⼯作⽬录
调控情绪然后打开train.bat,等着就可以了,训练结束后,会得到⾃⼰的xml⽂件,就可以调⽤了。