在上次教程Python-OpenCV —— Machine Learning讲述了如何建立模型,进行训练,然后利用模型对新获得的照片进行预测并给出预测值,本期教程针对某个特定的物体进行检测,将其标记出来,分为3个步骤,第一:训练特定物体,第二:

训练模型

级联分类器

前几天看到一个笑话,很有意思,说的是

理论就是你什么都知道但是什么都干不了

实践就是你什么都能干但是不知道为什么

我就不一样了,我可以理论与实践相结合——什么都干不了而且不知道为什么

开个玩笑,目前有很大一部分的东西都是人们实践得来的经验,有些东西也许很好用,但未必是好理论,比如现在的深度学习,扯远了,继续今天的话题,到底什么是级联分类器,其实就是把分类器按照一定的顺序联合到一起。一个分类器也许不好用,没关系,我给你多加几个,俗话说得好,三个臭皮匠,顶个诸葛亮呢。

具体来说,OpenCV实现的Cascade(级联)分类器就是基于多个弱分类器对不同的特征进行依次处理(分类)来完成对目标的检测,简单的说有多个弱分类器串起来,然后提取每个平滑窗上的不同特征,把这些特征依次放进不同的弱分类器里判断,如果所有的弱分类器都判断正标签,则表示该该平滑窗内检测到目标。这样做的好处是不但通过多个弱分类器来形成一个强的级联分类器,而且可以减少运算量,比如当一个平滑窗第一个特征没有通过第一个分类器,那么就没有必要继续运算下去,直接拒绝掉当前平滑窗,转而处理下一个平滑窗,事实上作者的目的就是为了快速抛弃没有目标的平滑窗,从而达到快速检测目标。

本次用到了OpenCV的两个程序,分别是opencv_createsamples.exe和opencv_traincascade.exe,分别用来创建样本文件和训练级联分类器。

准备训练数据

正样本

正样本就是你要检测的东西,比如说香蕉、车牌、酒瓶、红绿灯等等,你可以找相关的数据集,或者自己手动截图,只取你想要识别的那部分,下面我给了一个小程序用来将你截取的图片都变成统一大小。

#改变图片尺寸为统一大小,在当前目录创建一个名为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

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 = cv2.resize(img1,(w,h))

cv2.imwrite('pos'+str(n+1).rjust(3,'0')+'.jpg',img2)

n+=1

except KeyboardInterrupt:

print('暂停一下')

修改完图片尺寸之后,需要生成图片的路径,我也写了一个代码,运行后,会在当前目录生成一个如图所示的文件

pos.txt

每一行分别代表文件路径 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 ('pos.txt','a') as f:

f.write('pos/'+str(key).rjust(3,'0')+' 1 0 0 w h''\n')

except KeyboardInterrupt:

print('暂停一下')

接下来就要用opencv_createsamples.exe生成正样本文件了,写了一个批处理文件,新建crate_samples.bat,打开编辑

"在此处写上你的opencv_createsamples.exe路径" -info "pos.txt" -vec pos.vec -num 200 -w 60 -h 120

一些参数解释:

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文件

负样本

负样本只需要生成路径文件,不需要生成vec文件,具体步骤跟上面类似,要注意的是负样本要尽可能比正样本多,大概十倍的样子吧。

开始训练

新建一个文件夹TrainCascadeClassification,一会训练好的文件就在这里

新建一个train.bat,编辑

"你的opencv_traincascade.exe目录" -data "你的TrainCascadeClassification目录" -vec pos.vec -bg neg.txt -numPos 160 -numNeg 500 -numStages 15 -precalcValBufSize 3000 -precalcIdxBufSize 3000 -featureType LBP -w 60 -h 120

Pause

一些参数解释

data 训练的分类器的存储目录

vec 正样本文件,由open_createsamples.exe生成,正样本文件后缀名为.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 影响每个强分类器阈值,每一级分类器最小命中率,表示每一级强分类器对正样本的的分类准确率

maxFalseAlarm 最大虚警率,影响弱分类器的阈值,表示每个弱分类器将负样本误分为正样本的比例,一般默认值为0.5

weightTrimRate 0- 1之间的阈值,影响参与训练的样本,样本权重更新排序后(从小到大),从前面累计权重小于(1- weightTrimRate)的样本将不参与下一次训练,一般默认值为0.95

maxDepth 每一个弱分类器决策树的深度,默认是1,是二叉树(stumps),只使用一个特征。

maxWeakCount 每级强分类器中弱分类器的最大个数,当FA降不到指定的maxFalseAlarm时可以通过指定最大弱分类器个数停止单个强分类器

这个时候先看一下我们的工作目录下都有那些东西,没有的话,记得补全它。

工作目录

然后打开train.bat,等着就可以了,训练结束后,会得到自己的xml文件,就可以调用了。

python 作物识别_Python-OpenCV —— 物体识别(TrainCascadeClassification)相关推荐

  1. python人脸照片分类_Python OpenCV 人脸识别(一)

    前面介绍了Numpy模块,下面再介绍一个OpenCV模块,就基于这两个库看一下当下很火的人工智能是如何实现的,我们介绍几个:人脸识别(当下非常火的).音视频操作等等.今天先介绍一下静态图片的人脸识别, ...

  2. Python OpenCV 物体识别

    基于Python OpenCV 隐马尔可夫模型 物体识别,汽车飞机摩托车. 网上自己收集的图片进行识别的,准确率可以达到60% 其中通过star 和sift 特征检测. SIFT算法 来源: 尺度不变 ...

  3. opencv人脸识别以及自定义物体识别系统

    目录 一.简介: 二.软硬件应用: 三.模块介绍: (一)人脸识别: (二).自定义物体识别: (三).图片展示: (四).python框架: (五).执行器--单片机: 四.效果展示: 五.总结 : ...

  4. python实现验证码识别_Python实现验证码识别

    大致介绍 在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 1.计算验证码 2.滑块验证码 3.识图验证码 4.语音验证码 这篇博客主要写的就是识图验 ...

  5. OpenCV-Python人脸识别,车辆识别,自定义物体识别,自定义分类器

    本文将使用opencv-python识别自定义物体,能够区分识别到的物体,如果用作人脸识别,则能够区分出不同的人脸id,也就是能够分得清张三,李四,王二麻子 (这方案已经很老了,去学 Tensorfl ...

  6. 计算机视觉物体识别的过程,(物体识别过程.doc

    (物体识别过程 在计算机视觉领域,一个典型的物体识别系统往包含以下几个阶段预处理特征特征选择建模匹配定位 1.2.3预处理 预处理几乎是所有计算机视觉算法的第一步动机是尽可能在不改变图像承载的本质信息 ...

  7. 电容屏物体识别_触摸屏物体识别到底是怎么实现的

    展开全部 从早期对屏上特征图案进行红外背摄的模式识32313133353236313431303231363533e59b9ee7ad9431333433623664别技术,到通过红外触摸框对屏上凸点 ...

  8. C#:图像处理- 文字识别OCR及物体识别

    最近想到做个文字识别的模块,其实文字识别例如车牌识别已经非常成熟的技术,学过图像处理的自己都可以写个算法来处理图像,不过懒人也有懒办法,一是用第三方专业做OCR的sdk,比如Tesseract和Asp ...

  9. python数据挖掘视频_python+opencv实时视频目标检测

    python+opencv实时视频目标检测 opencv环境 1.访问Python Extension Packages for Windows,下载python对应版本的opencv. 比如小编下载 ...

  10. python识别物体大小_Python-OpenCV —— 物体识别(TrainCascadeClassification)

    在上次教程Python-OpenCV -- Machine Learning讲述了如何建立模型,进行训练,然后利用模型对新获得的照片进行预测并给出预测值,本期教程针对某个特定的物体进行检测,将其标记出 ...

最新文章

  1. 关于 SAP 标准教程编号的说明
  2. 初识OR Mapping
  3. asp.net 中textbox如何自动换行
  4. Spring中的ModelAndView
  5. Codeforces Round #639 (Div. 2)(AB)
  6. oracle磁盘组故障组的概念,ASM中理解的问题大家帮忙!!(asm的外部冗余,为什么也有故障组呢?)...
  7. HDU 4407 Sum(容斥原理+状态压缩)
  8. 因DataValueField设置不当引起的DropDownList的SelectedItem的取不到所选值的问题
  9. 【已解决】关于SQL2008 “不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了‘阻止保存要求重新创建表的更改’” 解决方案...
  10. 树莓派 不稳定 ssh经常断 解决
  11. COM编程入门 第三部分(网文补充)
  12. 一个对象对应多个对象如何在一个界面里实现新增_谈MDM主数据管理系统设计和实现关键点...
  13. 用vscode创建一个c项目_vscode怎么创建C语言项目
  14. 个人的Directx9研究总结 (1)
  15. c语言常量指什么作用,c语言字符常量是什么
  16. 【Unity】Transform—用代码设置父子关系
  17. 思维导图的10种类型有哪些?思维导图结构详解
  18. raw图片python医学影像的格式转换
  19. 点击超链接弹出QQ对话窗口
  20. MySQL复习记录(二):MySQL基础知识与基本操作

热门文章

  1. 【Java】6.3 类成员
  2. 通俗易懂解释知识图谱
  3. python:dataframe
  4. 你一定不知道的 Linux 使用技巧
  5. Springboot 整合微信小程序实现登录与增删改查
  6. 一天搞定CSS:层级(z-index)--18
  7. 前端开发工程师做些什么?
  8. iis php win安装kangle_Win2008 R2 IIS7.5+PHP5(FastCGI)+MySQL5环境搭建教程
  9. CentOS 6.6编译安装LAMP(Apache2+PHP+Mysql+PHPmyAdmin)
  10. 深究AngularJS——校验(非form表单)