[YoLoV3目标检测实战] keras+yolov3训练自身的数据集
本文用keras版本的yolov3来训练人脸口罩数据集,从而完成一个简单的目标检测。
首先先上目标检测效果,准备好了吗? go!go!go!
看到 目标检测的效果之后,你心动了吗?心动不如行动,让我们放手去干!撸起袖子加油干!
一、环境要求
- Python: 3.7.4
- Tensorflow-GPU 1.14.0
- Keras: 2.2.4
古人云:“工欲善其事必先利其器”。
我们首先要搭建好GPU的环境。有了GPU的环境,才能跑得快!!!
这里为了方便,就用anaconda的conda命令来搭建环境,执行以下几条命令
conda creat -n tensorflow python=3.7
activate tensorflow
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu==1.14.0
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple keras==2.2.4
验证一下是否可以正常使用gpu加速:
python
import tensorflow as tf
sess = tf.Session()
看到下面的画面,即正常加载gpu了,环境搭建就差不多完成了!
二、数据集
我们既然要做目标检测,怎么能没有数据集呢?数据集是驱动模型的动力,就像这样!
这里利用labelImg
工具来标注图片,生成对应的xml文件,具体详情看图。
标记好的xml会保存你的矩形框位置,以及类别。
接下来,你就是工具人,请疯狂标注你的数据吧。
三、YoLoV3讲解
在正式开始源码之前,还是稍微讲解一下YoLov3。虽然可能一遍看不懂,两遍看不懂,三遍看不懂,只要你不放弃,总会有看懂的一天的。
其实,你要读懂YoLov3,你就要去了解目标检测的发展史,去看one-stage,two-stage算法。去看YoLov3的前辈们。这里我相信你们都看过,没看过也不怕,光脚的不怕穿鞋的!
直接放YoLoV3的网络结构图,让我们稍微看一下YoLov3的网络结构。
YoLoV3网络主要分成两大部分:
-
1.主干网络 DarkNet53
-
2.多尺度预测
1.主干网络DarkNet53
首先是主干网络DarkNet53,结合网络图我们看到它主要是使用了残差块Residual block
,这里残差块
就是进行一次3X3、步长为2的卷积,然后保存该卷积layer,再进行一次1X1的卷积和一次3X3的卷积,并把这个结果加上layer作为最后的结果.
此外,主干网络DarkNet53每一个卷积使用了特有的DarkNetConv2D结构
,这里的DarkNetConv2D
是指每一次卷积的时候进行l2正则化,完成卷积后进行BatchNormalization标准化与LeakyReLU。
2.多尺度预测
在多尺度预测部分,可以从网络结构图中看到yolov3提取了3个特征层
,这3个特征层分别位于中间层、中下层和底层。
这3个特征层会进行5次卷积,处理完一部分用于输出该特征层对应的预测结果
,一部分用于进行反卷积UmSampling2d后与其它特征层进行结合。
输出层的shape分别为(13,13,75),(26,26,75),(52,52,75),最后一个维度为75是因为该图是基于voc数据集的,它的类为20种,即25=(四个坐标+1个置信度+20个类别)。
yolo3针对每一个特征层存在3个先验框,所以最后维度为3x25=75;
至于别的分析,这里就不多说了,直接实战部分了,我知道你们已经迫不及待了!
四、YoLoV3口罩检测实战
写代码,是不可能写代码的!先去github把代码给clone下来,原版的话就是qqwwee
的代码,当然这里也给出我的github,欢迎各位看官光顾!github
接下来,就看我的表演了。
1.快速使用篇
首先,我们需要下载yolov3事先已经训练好的权重,yolov3.weights
。然而由于我们用的keras框架,所以我们需要把它给转换一下,执行如下命令将darknet下的yolov3配置文件转换成keras适用的h5文件
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
python convert.py yolov3-tiny.cfg yolov3-tiny.weights model_data/yolov3-tiny.h5
但是权重文件这玩意,因为这个墙的问题,时快时慢,我知道你们肯定是这样的:
给你们,都给你们,网盘下载去,权重链接 提取码0imy
有了权重之后,我们直接运行一下,看一下效果,
python yolo_video.py --image
在命令行输入图片地址img/street.jpg
,即可预测
怎么样,效果还是不错的。我知道你要说,可是我要训练我自己的数据集呀,我不要官方的。我知道,我知道,不要急。
2.训练自身数据集
首先在第二部分的时候我们已经准备好了数据集,那让我们继续吧。
将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的Annotation中。
将图片文件放在VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中。
之后利用voc2yolo3.py
文件生成对应的txt。
VOCdevkit
-VOC2007
├─ImageSets # 存放数据集列表文件,由voc2yolo3.py文件生成
├─Annotations # 存放数据集中图片文件
├─JPEGImages # 存放图片标签,xml 格式
└─voc2yolo3.py # 用来生成数据集列表文件
运行voc2yolo3.py
之后会在ImageSets/Main生成如下txt文件
在txt里面存放了图片的名称,这里就不放代码了,我知道放了代码你们也不看,直接去我github里面白嫖就行
但是YoLov3处理的并不是这样的文件,所以我们还需要生成YOLOV3所需数据
再运行根目录voc_annotation.py
,运行前需要将voc_annotation
文件中classes改成你自己的classes。
我们就会生成这样的一个文件,2007_train.txt
,这里面 每一行对应其图片位置及其真实框的位置
好了,让我们中场休息一下!!!
接下来,我准备采取yolov3_tiny架构,当然你也可以用yolov3架构。主要是yolov3-tiny收敛快,而我用的笔记本GPU,跑的速度太慢了~~~
在训练前我们可根据自身需要修改model_data里面的yolo_anchors.txt
和tiny_yolo_anchors.txt
,中的先验框的值,这里我们利用kmeans.py
来生成。
k=9,生成yolo_anchors;k=6,生成tiny_yolo_anchors。
接着我们来到model_data里面的voc_classes.txt
文件中需要将classes改成你自己的classes
。
然后来到train.py
中,通过修改anchor_path
,从而选择使用yolov3
训练还是yolov3-tiny
训练
运行train.py
即可开始训练,训练好的模型会存放在logs下。
你以为大功告成了么,不不不,接下来就是炼丹了,慢慢调参!
四、测试
测试一下,就可以开溜了~~~
修改根目录下yolo.py
文件,修改model_path
,anchors_path
,classes_path
替换成·自己的路径`
- 1.单张图片测试
python yolo_video.py --image
,输入图片名称即可
- 2.电脑摄像头实时检测
python yolo_video.py --input
此外对应的yolo.py文件174行改为vid = cv2.VideoCapture(0)
;
- 3.测试本地视频
python yolo_video.py --input
此外对应的yolo.py文件174行改为vid = cv2.VideoCapture(“视频路径+视频名+视频后缀名”);
- 4.测试本地视频并且保存视频效果
python yolo_video.py --output
此外对应的yolo.py文件184行改为out = cv2.VideoWriter(“视频路径+视频名+视频后缀名”, video_FourCC, video_fps, video_size);
好了,应该差不多快结束了,最后再测试一下,你看。
五、注意:
一张图片最多只能识别20个对象的问题:
-
1.训练时,要在yolo3文件夹下面的utils.py里,修改get_random_data()函数,有一个默认参数是max_boxes=20,改成很大的数值就行了。
-
2.检测时,要在yolo3文件夹下面的model.py里,修改yolo_eval()函数,有一个默认参数是max_boxes=20,改成很大的数值就行了。
好了,结束了,欢迎大家留言!!!