项目背景
前面我分别用谷歌网络Inception和svm+slidemask进行过客流检测的尝试,效果都一般,这个是由于Inception模型迁移学习后太大,而svm训练本身不容易,而且不稳定,容易误检测。这些都可以归因于two stages做目标检测的缺陷
前面几次的尝试我也有陆续做了部分记录,可以看看,当然效果都挺感人
本次 keras yolo检测主要参考有YOLO基础教程(四):yolo v3 训练自己的数据集,Keras/Tensorflow+python+yolo3训练自己的数据集以及样本标注工具,图片标注工具LabelImg使用教程。其他还有很多零零散散的,包括一些视频和yolo官方网站,就不一一列举了。
keras yolo客流量检测.md
目录 (Table of Contents)
[TOCM]
[TOC]
下载使用yolo官方权重文件测试
yolo介绍
不多说,想知道yolo检测原理的直接看这篇YOLO文章详细解读。yolo是美国某大学的研究生弄出来的一个端到端(end to end)网络,还上了TED做演讲,看看人家研究生,再看看我们哈哈哈。所谓端到端,我理解的在目标检测中也就是不用先分类,再切割图片识别,而是直接对图片预测目标位置和大小,也就是将two stages变成one stage检测。
配置环境
大家可以参考csdn博主王氏小明的YOLO基础教程(一):Python环境搭建与测试,也可以参考我前面的博客
直接yolo检测客流看看效果
不得不说,即使是高清的动物世界视频,yolo官方权重检测出的效果其实也还可以,但是还是有许多误检测。更不要说老师给的如上图所示的av画质视频效果了。当然,yolo检测的速度还是很快的,双GTX 1080 ti gpu下可以达到30fps。从输出看,它的bounding box也比two stages的滑动窗口更能准确表示物体的位置和大小。
用YOLO训练自己的权重文件
先做样本集
可以说,训练深度网络,大概是三分之一的时间做样本,三分之一的时间敲代码,还有三分之一的时间调参数。制作样本,因为班里老师给的是视频,而yolo使用的标注工具是读图片的,所以省去自己写脚本弄,需要先改成每帧或几十帧获取一幅图片放到一个文件夹里面。
1 | //代码落公司电脑了,很简单,百度“python 视频转图片”然后自己调调就好了 |
labelImage标注
按照项目背景中的参考博客,创建好文件夹以后(其实里面部分文件夹似乎没有用,但是你还是按照他的来吧),使用工具LabelImg,里面给的链接已经失效,所以我又在项目背景中列了另外一个,是labelImage的源码,它会教你使用。
在labelImage工具图形界面三步走,标注玩完一百幅图片大概需要半个到一个小时。请尽量将尽可能多的不同的图片放进去标注。你可以选择就标注一个类别head,也可以多加几类其他的,如果你内存够的话。
多建一个分类放负样本
嘣~结果非常好,暂时就先不贴图了,后面再更,包括引入滑动窗口对整张图片做识别。
………………………..
好了,2019年5月13日下午,我又回来了。像我之前所说,同时截出正负样本进行训练,然后用滑动窗口复制出许许多多的测试图放入网络中测试。
test.py生成训练时候的测试集和训练集
test.py
1 | import os |
一步步按教程来
说一下你可能遇到的问题,只有CPU的话直接加参考博客里os设置,我的是GPU,但是依然有问题。训练时候,第一个周期训练有时候是内存超了,然后黑屏或者闪退,这时候你可能需要减少你的训练集大小。改好以后,第一个周期依然很长时间,我第一次大概要20~40分钟,因为里面涉及到读取图片输入问题。然后后面每个周期就大概十几秒,每个step大概就几十ms。
我的权重文件
最后将我自己的权重文件放上来,因为训练时候,输入的样本就100张,然后训练了大概30个周期就收敛完了,loss降到20几,所以效果一般。另外,预测时候的score和IOU设置也不够好,所以最后效果,可以在前面看到,还是有很多问题的。但是总体来说比前面的svm和Inception好很多了。
我训练的权重文件在这,密码是:b2p5
链接失效的话,可以在我blibli账号下留言哈哈。
我的yolo预测文件,使用时候根据需要改变score下限和IOU大小,然后使用detect_video函数或者detect_img函数就好,找出你满意的。步骤大概是:
1 终端python yolo.py或者在ide中打开运行
2 yolo=YOLO()
3 设置对应输入输出路径,调用detect_video函数
1 | # -*- coding: utf-8 -*- |