2020春节,新型冠状病毒肆虐华夏大地,中华儿女举国防止疫情扩散蔓延,为防止疫情扩散,做好个人防护是每个公民的义务,特别是公共场合,火车站、飞机场和汽车站,人流量大的密集地区,做好人员口罩监控相当有必要,针对网友提供的口罩检测数据集,做了一个公共场合人员是否带口罩得到检测模型,检测模型效果还不错。话不多说,先上图。
本模型的数据集来源于知乎防疫口罩佩戴识别的目标检测模型
本模型是基于keras-yolov3算法开发,yolov3的优势是识别速度快,但是准确率有待提高。
1、VOC数据集处理。
制作VOC数据集
VOC全称Visual Object Classes,出自The PASCAL Visual Object Classes(VOC)Challenge,这个挑战赛从2005年开始到2012年,每年主办方都会提供一些图片样本供挑战者识别分类。
PASCAL VOC官网:http://host.robots.ox.ac.uk/pascal/VOC/
2.1 格式介绍
可以在官网中下载每一年的数据集,也可以自己仿照VOC的格式制作。
其文件格式如下图:
下面是本人对每个文件功能的总结和理解:
我们可以把官方下载的VOC数据集里面的内容删除,只保留各个文件夹;或者按照这个格式建立一个文件夹集。
这个文件夹我们直接放到前面的工程文件keras-yolo3-master中(以便之后的训练不用更改路径)。
2、生成索引
在VOC2007文件夹中新建一个**.py文件**(名字随意)
在py文件中输入以下代码并运行,用以生成索引
之后就会在ImageSets\Main文件夹中生成几个索引文件
{class}_train.txt 保存类别为 class 的训练集的所有索引
{class}_val.txt 保存类别为 class 的验证集的所有索引
{class}_trainval.txt 保存类别为 class 的训练验证集的所有索引
3. YOLO模型训练
3.1 生成训练索引
在工程文件keras-yolo3-master中,修改voc_annotation.py文件
主要是把里面classes的内容改成要训练的对象(要和前面标记的一致,这里我只有三个对象"classes = ["未戴口罩","已戴口罩"]",后两个没加上,图片是老的了)
运行这个py程序,生成三个文件"2007_test.txt", “2007_train.txt”, “2007_val.txt”,把前缀"2007_"去掉,得到 “test.txt”, “train.txt”, “val.txt”。
3.2 修改配置文件
首先要修改一下 model_data 文件夹中的coco_classes.txt和voc_classes.txt,将里面的对象改成自己要训练的对象名称
3.3 执行训练
直接将model_data文件夹中原版的yolo.h5复制,改名为yolo_weights.h5,将其作为预训练权重。
PS: 对于这个预训练权重,其实是迁移学习的方法,有些博文其实是让修改yolo3.cfg文件,然后重新生成权重文件,但是我发现这样的做法最后训练时会出现val_loss:nan的情况,所以我建议直接用原来官方的权重文件yolo.h5。还有一些博文修改了原来train.py的训练代码,不预加载训练权重,重头开始训练,但是我发现由于样本量少,这样训练出来的结果很不稳定,所以我也不推荐。
完成yolo_weights.h5文件之后,在keras-yolo3-master工程文件夹中找到train. py,根据需要,可以更改里面的迭代次数epochs 等参数。如果显存小的话,可以改小batch_size。
之后运行这个python程序,下面是我的运行效果
训练结束后,会生成很多过程的h5文件,最后只需要保留trained_weights_final.h5就行。
训练样本约400多张,最后两种loss都降到15左右。
4. 模型验证
参照前面1.3节内容,可以在yolo. py 中把权重文件的名字改成 trained_weights_final.h5 ,也可以直接把 trained_weights_final.h5名字改成 yolo. h5,总之就是之后要加载新的权重文件。
同样地,则在cmd中的工程文件路径下输入:
python yolo_video.py --image
1 输入图片路径(这里是将图片直接放在工程文件里,所以直接输入名字就行)
效果如下:
附上github的代码链接。https://github.com/huxian123/mask_detecting.git
网友评论