[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集

一、环境要求

    Python: 3.7.4
    Tensorflow-GPU 1.14.0
    Keras: 2.2.4

 

我们首先要搭建好GPU的环境。有了GPU的环境,才能跑得快!!!

这里在ubuntu18.04系统上搭建环境,执行以下命令

sudo pip3 install  tensorflow-gpu==1.14.0

sudo pip3 install 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目标检测实战] keras+yolov3训练自身口罩检测数据集_第1张图片

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目标检测实战] keras+yolov3训练自身口罩检测数据集_第2张图片

至于别的分析,这里就不多说了,直接实战部分了!

四、YoLoV3口罩检测实战

写代码,是不可能写代码的!先去github把代码给clone下来,原版的话就是qqwwee的代码,当然这里也给出我的github,欢迎各位看官光顾!github

[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集_第3张图片

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,即可预测

[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集_第4张图片

怎么样,效果还是不错的。我知道你要说,可是我要训练我自己的数据集呀,我不要官方的。不要急。

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

[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集_第5张图片

在txt里面存放了图片的名称,这里就不放代码了,我知道放了代码你们也不看,直接去我github里面白嫖就行

但是YoLov3处理的并不是这样的文件,所以我们还需要生成YOLOV3所需数据

再运行根目录voc_annotation.py,运行前需要将voc_annotation文件中classes改成你自己的classes。

[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集_第6张图片

我们就会生成这样的一个文件,2007_train.txt,这里面 每一行对应其图片位置及其真实框的位置

[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集_第7张图片

 

接下来,我准备采取yolov3_tiny架构,当然你也可以用yolov3架构。主要是yolov3-tiny收敛快,而我用的笔记本GPU,跑的速度太慢了~~~

在训练前我们可根据自身需要修改model_data里面的yolo_anchors.txttiny_yolo_anchors.txt,中的先验框的值,这里我们利用kmeans.py来生成。

k=9,生成yolo_anchors;k=6,生成tiny_yolo_anchors。

[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集_第8张图片

接着我们来到model_data里面的voc_classes.txt文件中需要将classes改成你自己的classes。

[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集_第9张图片

然后来到train.py中,通过修改anchor_path,从而选择使用yolov3训练还是yolov3-tiny训练

[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集_第10张图片

运行train.py 即可开始训练,训练好的模型会存放在logs下。

你以为大功告成了么,不不不,接下来就是炼丹了,慢慢调参!

 

四、测试

修改根目录下yolo.py文件,修改model_path,anchors_path,classes_path替换成·自己的路径`

[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集_第11张图片

    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);

好了,最后再测试一下看。

[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集_第12张图片

[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集_第13张图片

五、注意:

一张图片最多只能识别20个对象的问题:

    1.训练时,要在yolo3文件夹下面的utils.py里,修改get_random_data()函数,有一个默认参数是max_boxes=20,改成很大的数值就行了。

    2.检测时,要在yolo3文件夹下面的model.py里,修改yolo_eval()函数,有一个默认参数是max_boxes=20,改成很大的数值就行了。

github github
 

你可能感兴趣的:(深度学习,tensorflow)