1、 数据采集
1.1需求分析
在本次“明厨亮灶”项目中,任务是对厨房监控中的违规行为进行监测,这些违规行为包括未戴厨师帽、未穿工作服以及未戴口罩、吸烟、接打电话、老鼠等。
为了实现这一目标,在模型选型阶段选择了使用PyTorch框架下的YOLOv5模型。YOLOv5是一种基于深度学习的实时目标检测模型,其主要思想是将目标检测问题转化为一个回归问题,通过将图像划分为多个网格并预测每个网格中是否包含目标物体以及其位置和类别来实现目标检测。相比于传统的目标检测方法,YOLOv5具有更快的速度和更高的准确性(关于YOLOv5模型环境配置和模型搭建详见第三节)。
1.2数据采集
基于项目对于违规行为的检测,需要收集的图片素材包括:未戴厨师帽、未穿厨师服、未带口罩、吸烟、接打电话、老鼠,以及与之相对应的厨师帽、厨师服图片素材。
数据的采集工作分为两部分:对于已经有成熟数据集的老鼠检测、口罩、吸烟检测,选择采用现有的数据集并将其标注信息更改为YOLOv5格式;而对于不太常见的厨师帽、厨师服、接打电话检测的图片素材,选择从百度、谷歌、必应等搜索引擎上自行搜集图片素材并进行人工标注。
1.2.1一些开源数据集网站
这里附上一个常用的开源数据集下载网站,其中整合了很多开源的数据集,可以按需下载,部分可能需要使用vpn。
https://docs.voxel51.com/user_guide/dataset_zoo/datasets.html#dataset-zoo-datasets
1.2.2 AIX智能下载器
图片搜集过程可以使用网络爬虫的方式,这里主要推荐谷歌浏览器中的“AIX智能下载器”插件进行图片搜集。该插件可以在谷歌浏览器的插件商店中下载并启用。随后可以在搜索引擎中使用插件进行一键式图片打包并下载。
另外为了增加搜索引擎搜集的图片可用性,可以在键入搜索关键词时,添加一些场景相关的关键词描述,例如:厨师、后厨、餐厅后厨、后厨厨师、戴口罩的厨师、打电话的厨师、抽烟的厨师等,可以避免质量较低、场景契合度较差的图片的干扰,提高训练效果。
最终经过现有数据集和搜集的网络图片的整合后,我们总共持有了图片素材包括:老鼠1200张张、口罩2000张、吸烟1000张、电话1200张、厨房场景1500张。训练图片的数量和质量均对最终训练结果有影响,因此要在保证质量的情况下尽可能地增大训练图片的数量。
2、 图像标注
这一部分主要介绍在获得了足够数量的图片数据后,如何对图像进行标注。首先为了适配选用的YOLOv5模型,标注的格式需要保存为YOLOv5格式,对于现有数据集,若其标注格式不为YOLOv5的,只需将其格式修改为txt格式的YOLOv5标签格式即可,而对于没有标签的图片素材,需要进行手动标注。
2.1现有数据标注格式转化
2.1.1voc(xml)转yolo(txt)
xml格式的标注信息中,box坐标信息是以xyxy格式标注的,也就是GT框的左上角坐标(xmin, ymin)和右下角坐标(xmax, ymax)。YOLOv5中使用的数据标注文件为.txt,GT框坐标信息是以xywh格式标注的,也就是GT框的归一化中心点坐标(x, y)和归一化宽高(width, height),二者的区别如下图所示:
这里给出一份由xml标注格式转化为txt格式的Python源码,使用过程中针对路径自行修改。
2.1.2json转txt
在coco数据集中,coco2017train或coco2017val数据集中标注的目标(类别)位置在 Annotations 文件中以 (x, y, width, height) 来进行表示,x,y表示bbox中心位置,width, height表示bbox的宽和高。而在YOLO训练或者进行验证的时候读取的标注格式是以 (xmin, ymin, xmax, ymax) 来进行表示,xmin, ymin表示bbox左上角位置, xmax, ymax表示bbox右下角位置,并且要求保存为.txt文件格式(名字与image对应)。
这里给出一份由json标注格式转化为txt格式的Python源码,使用过程中针对路径自行修改。
2.2自行手动标注
对于需要对图片进行手动标注的情况,本项目使用labelimg进行图片标注,清华源下载命令如下:
pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple
在预存图片的目录下新建两个文件夹“JPEGImages”、“Annotations”,在“JPEGImages”下存放图片素材,“Annotations”为空文件夹用来存储标注信息,可以准备一个predefined_class.txt来预定义标注的类型名称。
随后使用命令行在JPEGImages上层目录下启动labelimg命令进入labelimg界面:
labelimg JPEGImages predefined_classes.txt
关于界面中案件选项的相关解释Open Dir为待标注图片数据的路径文件夹,这里输入命令的时候就选定了JPEGImages,Change Save Dir为保存类别标签的路径文件夹,这里我们选定了Annotations文件夹。下方的YOLO表示标签的存放格式为适配YOLO模型的标注格式。
随后使用Create RectBox在图片上画出要标注的矩形框。
为了提高标注质量和统一标注标准,针对本项目的标注给定了一些规范:
另外在标注过程中需注意,对于所有的图片标签应该做到应标尽标,特别是对于不穿厨师帽和不穿厨师服两类,虽然作为对照样本数量很多,但如果在一些图片上没有完整标注会影响最终模型的验证准确度。
3、 模型搭建
YOLOv5的代码是开源的,因此可以从github上克隆其源码。
首先打开yolov5的github的官网https://github.com/ultralytics/yolov5/tree/v5.0(这个网站在国外打开是很慢的,而且是有的时候能正常打开,有的时候是进不去的,但是大家第一次打不开的话,一定要多打开几次。)目前yolo已经更新至v7版本,本项目使用的是v5.0版本
下载下来的框架可能和收到的源码不同,因为yolo也一直在更新,不过我们要使用的部分基本没有变化
将yolo模型下载到本地
3.1模型架构
├── data:主要是存放一些超参数的配置文件(这些文件(yaml文件)是用来配置训练集和测试集还有验证集的路径的,其中还包括目标检测的种类数和种类的名称);还有一些官方提供测试的图片。如果是训练自己的数据集的话,那么就需要修改其中的yaml文件。
├── models:里面主要是一些网络构建的配置文件和函数,其中包含了该项目的四个不同的版本,分别为是s、m、l、x。从名字就可以看出,这几个版本的大小。他们的检测测度分别都是从快到慢,但是精确度分别是从低到高。如果训练自己的数据集的话,就需要修改这里面相对应的yaml文件来训练自己模型。
├── final_model: 存放最终训练完成的.pt文件
├── utils:存放的是工具类的函数,里面有loss函数,metrics函数,plots函数等等。
├── weights:放置训练好的权重参数。
├── Dockerfile: 配置镜像的文件
├── config.yaml: 项目的配置文件
├── detect_or