OpenCV模型训练

最近在做鸟类检测的项目,用tensorflow完善之前准备先用opencv进行大致的识别,但是网上的xml效果不太理想,于是准备自己进行模型训练。第一版收集了2w+的正样本和2k+的负样本,在这篇文章时已经把模型训练了出来,其中的过程有些坎坷,遇到了不少问题,一如年初的时候在ubuntu上装各种tensorflow、pytorch等一众软件的包时也是各种碰壁。因此打算写一篇文章把大概过程记录一下。

一开始参考了鸟类检测模型的训练等一些文章到完成了pos.txt和neg.txt后却发现自己电脑中装的opencv没有opencv_createsamples.exe和opencv_traincascade.exe这两个进行训练的应用,后来多番查阅资料发现要找一个opencv4.0前的版本,因为4.0后opencv并不默认内置这两个应用,实际上在看了opencv4.10编译traincascaded.exe 和 createsamplesd.exe后了解到4.0之后opencv默认是把这两个应用给注释掉了,当然一开始在没遇到问题时我没有注意到。于是效仿上述文章尝试进行4.x版本的编译。下载源码进行编译可通过gitee,速度更快,但是资源更新会相对慢一些。opencv码云库和opencv_contrib码云库可进行下载,要注意版本要对应。然后安装Visual Studio和CMake。把之前下的两个包用用cmake编译,安装和编译过程具体参考opencv_contrib安装笔记。但此处要特别注意的是编译过程中很可能会遇到红字,而这时候要看红字报错指向的日志文件,根据文件内容把缺失文件下载好并放在指定位置,部分文件能用迅雷直接进行下载,但是有没有速度则有一定运气成分。接下来有一个关键点就是不要随便下载网上的同名文件,因为不同版本的opencv要求的文件哈希是不同的,网上的帖子下载的文件大概率与所要求的文件哈希不一样,下载文件可在github,如果github没有速度就到gitee下载,不过gitee的版本更新比较慢,有的比较新的版本可能没有及时上传。但是这时就有一个比较困扰的问题就是难以确定opencv版本对应应该下哪个日期的文件,这里给出一个版本进行参考,即opencv3.4.6可对应ffmpeg文件日期为20181103的进行下载。如果想下载别的版本又不确定日期可以到下载的文件所在的文件下运行cmd输入

certutil -hashfile ffmpeg_version.cmake MD5
::此处为确定ffmpeg_version.cmake这一文件哈希的举例

来获取哈希进行对比,我就是下载了很多文件一个个对比来确定版本的,可能有更好的办法。而我用4.x进行编译完成后发现了没有生成那两个应用的选项我才看到网上说4.x版本默认取消了这两个应用。于是我又按照那篇知乎的文章把注释去掉再进行编译,发现有生成这两个exe的选项,但是会生成失败,多次尝试依然没有用。之后为了确保是有这两个exe的版本我干脆选了比较老的3.4.1,但是发现因为版本太老而无法顺利编译。之后又选择了3.4.8、3.4.9等一些版本,遇到了各种各样的如下载资源没速度等问题。多次碰壁后我选择了3.4.6,终于顺利编译生成了exe。

opencv模型训练初上手,我先训练了一次到了两个多小时的时候提前结束,应该是设置的时候没注意到负样本数量较少的缘故。生成的cascade.xml可能由于是提前结束,stages层数较少而文件大小也很小只有16kb,但是感觉已经要比网上的一些xml准确率更高,此处放一张效果图。

OpenCV模型训练_第1张图片

 

识别的目标视频是一只鸟在飞行,那为什么只取有一只鸟的视频截图作为效果示例呢。因为在用之前网上的一些xml进行识别时,发现这段视频中在鸟进行上下飞动的时候大多不是产生了几个误识别就是没有捕获到鸟的形态,而此次自己训练的xml文件的捕捉则相对比较精准。但是在一些复杂场景如一群鸟在稻草附近飞行,则识别效果并不是特别理想,虽然相比之前下载的xml稍微靠谱一些。主要还是因为负样本较少、训练时间较少,而且opencv的识别精度并没有tensorflow那么高。通过之后的完善应该能让识别效果更佳。

你可能感兴趣的:(python,机器学习)