赞
踩
在本次“明厨亮灶”项目中,任务是对厨房监控中的违规行为进行监测,这些违规行为包括未戴厨师帽、未穿工作服以及未戴口罩、吸烟、接打电话、老鼠等。
为了实现这一目标,在模型选型阶段选择了使用PyTorch框架下的YOLOv5模型。YOLOv5是一种基于深度学习的实时目标检测模型,其主要思想是将目标检测问题转化为一个回归问题,通过将图像划分为多个网格并预测每个网格中是否包含目标物体以及其位置和类别来实现目标检测。相比于传统的目标检测方法,YOLOv5具有更快的速度和更高的准确性(关于YOLOv5模型环境配置和模型搭建详见第三节)。
基于项目对于违规行为的检测,需要收集的图片素材包括:未戴厨师帽、未穿厨师服、未带口罩、吸烟、接打电话、老鼠,以及与之相对应的厨师帽、厨师服图片素材。
数据的采集工作分为两部分:对于已经有成熟数据集的老鼠检测、口罩、吸烟检测,选择采用现有的数据集并将其标注信息更改为YOLOv5格式;而对于不太常见的厨师帽、厨师服、接打电话检测的图片素材,选择从百度、谷歌、必应等搜索引擎上自行搜集图片素材并进行人工标注。
这里附上一个常用的开源数据集下载网站,其中整合了很多开源的数据集,可以按需下载,部分可能需要使用vpn。
https://docs.voxel51.com/user_guide/dataset_zoo/datasets.html#dataset-zoo-datasets
图片搜集过程可以使用网络爬虫的方式,这里主要推荐谷歌浏览器中的“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源码,使用过程中针对路径自行修改。
对于需要对图片进行手动标注的情况,本项目使用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模型下载到本地
├── data:主要是存放一些超参数的配置文件(这些文件(yaml文件)是用来配置训练集和测试集还有验证集的路径的,其中还包括目标检测的种类数和种类的名称);还有一些官方提供测试的图片。如果是训练自己的数据集的话,那么就需要修改其中的yaml文件。
├── models:里面主要是一些网络构建的配置文件和函数,其中包含了该项目的四个不同的版本,分别为是s、m、l、x。从名字就可以看出,这几个版本的大小。他们的检测测度分别都是从快到慢,但是精确度分别是从低到高。如果训练自己的数据集的话,就需要修改这里面相对应的yaml文件来训练自己模型。
├── final_model: 存放最终训练完成的.pt文件
├── utils:存放的是工具类的函数,里面有loss函数,metrics函数,plots函数等等。
├── weights:放置训练好的权重参数。
├── Dockerfile: 配置镜像的文件
├── config.yaml: 项目的配置文件
├── detect_original.py:利用训练好的权重参数进行目标检测,可以进行图像、视频和摄像头的检测。源框架下的初始detect.py
├── detect_all.py:三个模型同时启动版本的detect
├── detect_single.py:使用单一模型的版本
├── train.py:训练自己的数据集的函数。
├── client.py:本地调试接口的脚本
├──requirements.txt:这是一个文本文件,里面写着使用yolov5项目的环境依赖包的一些版本,可以利用该文本导入相应版本的包。
├──yolov5l.pt, yolov5s.pt: 预训练的模型,由于训练服务器无法联网需要先下载至本地
其他文件暂时用不到
anaconda的安装:https://blog.csdn.net/wq_ocean_/article/details/103889237?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169266886816800227490479%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=169266886816800227490479&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-2-103889237-null-null.142v93chatgptT3_1&utm_term=anaconda%E5%AE%89%E8%A3%85&spm=1018.2226.3001.4187
环境安装:
在项目路径下运行命令
pip install -r requirements.txt
如遇到部分包无法下载,可以单独使用pip install 对应包名
如遇到网络问题,可以将pip源换为清华源:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
环境安装完成之后可以试运行detect.py文件检查环境是否存在问题
一般为了缩短网络的训练时间,并达到更好的精度,我们一般加载预训练权重进行网络的训练。而yolov5的5.0版本给我们提供了几个预训练权重,我们可以对应我们不同的需求选择不同的版本的预训练权重。通过如下的图可以获得权重的名字和大小信息,可以预料的到,预训练权重越大,训练出来的精度就会相对来说越高,但是其检测的速度就会越慢。预训练权重可以通过这个网址进行下载,本次训练自己的数据集用的预训练权重为yolov5s.pt。
将#2图像处理及标注中得到的文件按照以下格式进行分类
一个小的划分训练集和验证集的程序:
注意更改main方法里的四个路径
预训练模型和数据集都准备好了,就可以开始训练自己的yolov5目标检测模型了,训练目标检测模型需要修改两个yaml文件中的参数。一个是data目录下的相应的yaml文件,一个是model目录文件下的相应的yaml文件。
修改data目录下的相应的yaml文件。找到目录下的voc.yaml文件,将该文件复制一份,将复制的文件重命名,最好和项目相关,这样方便后面操作。我这里修改为kitchen_all.yaml。
注意修改path和names参数,和你的路径保持一致
在截图之后的download部分全部注释掉
由于该项目使用的是yolov5l.pt这个预训练权重,所以要使用models目录下的yolov5l.yaml文件中的相应参数(因为不同的预训练权重对应着不同的网络层数,所以用错预训练权重会报错)。同上修改data目录下的yaml文件一样,我们最好将yolov5s.yaml文件复制一份,然后将其重命名,我将其重命名为yolov5_kitchen_all.yaml
修改新文件中的nc值为需要的检测类别数量即可
在完成上面的步骤后就可以开始模型的训练了,在开始之前需要对数据和预处理模型的位置做一些配置
找到train.py,这也是模型训练的主文件,
修改以下三个参数,从上至下分别为模型预训练权重,模型参数配置,数据来源
分别按照第三步中的路径进行更改default值即可
在项目的外层同目录下创建空文件夹model_out,将这个文件夹及项目一起打包成.zip压缩文件,过后将会把这个压缩文件上传至训练中心训练,并在在训练结束后model_out文件中会接收到训练结果。
将项目中的requirement.txt文件发给开发人员,将会根据这个文件配置对应镜像服务器,方便下面的训练
原子能力平台地址:http://132.121.114.217:19002/#/login
登录之后选择AI中心
在右上方选择控制台
进入之后选择左侧模型中心/算法开发进入下面这个页面,选择创建模型开发
创建完毕之后选择左侧模型训练,选择创建模型训练
根据模型的名称和版本填入空格,算法文件上传4.1中的压缩文件,上传时间可能较久,请耐心等待,若等待时间过长可刷新重新上传,压缩包大小最好在1g以下
运行命令范例:
project参数将最终模型结果放入和项目一起打包的model_out文件夹中
根据分配的cpu和gpu选择自定义资源分配参数,点击开始训练
在训练完成以后:
下载日志,在最后的部分可以看到每种类别的结果
下载模型并保存到本地,我们只需要其中的.pt文件,这个模型将作为后面检测的模型
训练如果出现异常,及时下载日志,不要在线看(大量乱码)
找到utils/plots.py中的check_pil_font方法,修改为:
将两个红框部分修改为下载下来的Arial.ttf的对应目录
3. 出现循环依赖
服务器的环境配置有误,联系上级重新配置镜像环境,注意提供项目中的requirement.txt配置环境,可降低cv2的版本解决
部分特征不明显或者特征过于杂乱的类别模型结果可能较差,
这里提供几种提高结果的优化方向:
Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。
以docker容器化的方式进行模型封装,首先要配置好docker的环境。
建议安装虚拟机,在linux环境下安装docker。
在安装 Docker 之前,首先确保您的系统已更新至最新版本。打开终端,并以管理员身份执行以下命令:
sudo apt update
sudo apt upgrade
在终端中执行以下命令来安装 Docker:
sudo apt install docker.io
启动 Docker 服务:安装完成后,执行以下命令来启动 Docker 服务并将其设置为开机自启动:
sudo systemctl start docker
sudo systemctl enable docker
执行以下命令来验证 Docker 是否正确安装并能正常工作:
docker --version
5.1.2、window安装docker
准备环境
至于为什么使用Windows版,我觉得使用虚拟机太麻烦了,而且下载虚拟机安装各种系统占用空间大,更主要的是我的虚拟机根本安装不下来很烦人,对他印象不好
条件:1.必须运行Windows10版本2004及更高版本或Windows11
2. 在下图的位置开启虚拟化,一般是开启的,最好看一眼,预防万一
管理员的身份启动命令窗口,输入:wsl --install
可能下载的很慢,耐心等待,尽量不要中途中断(保持网络良好),如果看着好久没动了,可以按几下回车试试
安装完成
记得重启一下电脑!!!
再次管理员打开命令窗口,输入下面的命令
wsl --install -d Ubuntu
可能会有点慢 ,长时间没反应就回车一下
输入用户名和密码(我这里输入用户名和密码的时候出了一点意外)
用户名:zhangjingqi
密码:123456(输入密码的时候不会显示,自己把握好就行了)
Docker安装
网址:
https://desktop.docker.com/win/stable/Docker%20Desktop%20Installer.exe
下载完成之后双击运行
下图的意思是添加桌面快捷方式,可以加也可以不加,看个人爱好,然后点击OK
下面提示安装成功,重启电脑,点击蓝色的就好
被迫接受条款
出现下面这个界面表示安装成功了
修改镜像
{
“registry-mirrors” : [
“https://registry.docker-cn.com”,
“http://hub-mirror.c.163.com”,
“https://docker.mirrors.ustc.edu.cn”,
“https://cr.console.aliyun.com”,
“https://mirror.ccs.tencentyun.com”
],
“builder”: {
“gc”: {
“defaultKeepStorage”: “20GB”,
“enabled”: true
}
},
“experimental”: false,
“features”: {
“buildkit”: true
}
}
一直转转转,等一会就可以了,不转了就可以了
这是一个Dockerfile文件,用于构建一个基于Python 3.8.2的镜像。以下是每个步骤的说明:
关于copy命令部分文件不存在的bug说明
因为docker有一个.dockerignore的隐藏文件,copy的时候会自动跳过一些文件与目录。所以把.dockerignore文件相关的命令行注释掉即可。可能被屏蔽的文件有.pt文件、input文件夹、output文件夹
项目接口文档:中国电信视频能力平台技术要求-分析模块(南向)
本项目参照接口文档的5.1.4.3部分
代码部分更详细的介绍参照源文件detect_all.py中的注释
大体可分为以下几个部分:
这段代码读取来自config.yaml的配置并保存至变量中,后面根据这些变量开启服务器或者向数据推送接收端发送数据
config.yaml:
在开始检测之前检查视频流能否正常访问,并发送给taskStatusPushUrl:
在run方法中找到这一部分程序,xyxy是包含四个端点的坐标的列表,conf是该矩形框的置信度,cls是该矩形框的类别,根据接口将这些数据包装进json数据中即可
如果接口中需要传入每一帧的base64大图,可用下面的程序进行转换
在调用这个程序之前需要对im做一些转换使得他的格式符合要求:
接收一个POST请求,从请求中获取图片的相关信息,并执行相应的图片检测操作。下面是对代码功能的详细解析:
@app.route('/picture', methods=['POST'])
装饰器定义了一个POST请求的路由。def picture_detection():
函数用于处理该POST请求。global algCode
语句声明全局变量algCode
,以便在函数内部进行修改。delete_files_in_folder('images/')
函数,用于清空指定文件夹中的文件。这里清空了images/
文件夹。request.get_json()
方法获取POST请求中的JSON数据。imageUrl
) 和分析规则 (analysis_rule
)。AnalysisConfig
对象,与前面的代码段相同。imageUrl
不为空或不为None,说明提供了图片的URL。requests.get()
方法下载图片,并进行异常处理。images/
文件夹中,文件名为随机生成的整数加上.jpg
后缀。algCode
为’chef’,在其后添加后缀’_mouse’。opt.weights
)为特定的文件路径,与前面的代码段相同。opt.device
)为特定的GPU ID。opt.conf_thres
),与前面的代码段相同。picture_main()
函数进行图片检测,传入相应的参数 (opt
和analysis_config
)。接收一个POST请求,从请求中获取任务的相关信息,并执行相应的任务创建操作。
@app.route('/tasks', methods=['POST'])
装饰器定义了一个POST请求的路由。def createTask():
函数用于处理该POST请求。global algCode, cur_task
语句声明全局变量algCode
和cur_task
,以便在函数内部进行修改。algCode
为’chef’,在其后添加后缀’_mouse’。request.get_json()
方法获取POST请求中的JSON数据。task_id
)、类型 (type
)、URL (url
) 和分析规则 (analysis_rule
)。AnalysisConfig
对象,与前面的代码段相同。opt.weights
)为特定的文件路径,与前面的代码段相同。opt.source
) 为提供的URL。opt.nosave
),可能是因为任务的结果需要通过其他方式处理,而不需要保存到文件中。opt.device
)为特定的GPU ID。opt.conf_thres
),与前面的代码段相同。msg
) 字典和任务信息 (task_info
) 字典。task_list
) 中,如果存在则返回错误消息。delete_task_list
),如果存在。requests.Session()
对象,用于发送HTTP请求。thread
),并调用main()
函数来执行具体的任务操作,传入相应的参数 (opt
、session
和 analysis_config
)。msg
) 字典以JSON格式返回。接收一个DELETE请求,并根据提供的任务ID删除相应的任务。
@app.route('/tasks/<taskId>', methods=['DELETE'])
装饰器定义了一个DELETE请求的路由,其中<taskId>
是路由的参数,表示要删除的任务ID。def deleteTask(taskId):
函数用于处理该DELETE请求,并接收任务ID作为参数。res
,用于存储删除任务的结果。task_list
),可能是为了调试或查看任务状态。taskId
) 不在任务列表 (task_list
) 中,表示未找到对应的任务,返回相应的错误消息。res
) 的字段,包括成功删除任务的结果码 (resultCd
) 和相应的成功消息 (msg
)。delete_task_list
) 中。task_list
) 中删除相应的任务。res
) 以JSON格式返回。删除时注意释放资源,可参考的释放资源函数如下:
它接收一个GET请求,并根据提供的任务ID或不提供任务ID来查询相应的任务状态。
@app.route('/tasks/', methods=['GET'])
装饰器定义了一个GET请求的路由,用于查询所有任务的状态。@app.route('/tasks/<taskId>', methods=['GET'])
装饰器定义了一个带有任务ID参数的GET请求的路由,用于查询特定任务的状态。def inquireTask(taskId=None):
函数用于处理这两种GET请求,并接收任务ID作为可选参数。res
,用于存储查询任务状态的结果。taskId
为 None
),表示查询所有任务的状态。res
) 的字段,包括查询结果码 (resultCd
) 为 0,成功消息 (msg
) 为 ‘查询所有任务状态成功’,以及数据字段 (data
) 为空列表。task_list
) 中的每个任务ID,将任务信息添加到结果字典的数据字段中。taskId
),表示查询特定任务的状态。task_list
) 中。res
) 的字段,包括查询结果码 (resultCd
) 为 0,成功消息 (msg
) 为 ‘查询任务{taskId}成功’,以及数据字段 (data
) 包含特定任务的信息。res
) 的字段,包括查询结果码 (resultCd
) 为 1,错误消息 (msg
) 为 ‘该任务不存在’,以及数据字段 (data
) 为空列表。res
) 以JSON格式返回。1、登陆阿里云
2、找到容器镜像服务
3、创建命名空间
4、点击进去,案件文档说明执
5、 push 后就可以在镜像版本查看到
6、 测试
本地测试文件范例:
这个文件模拟一个客户端的行为,比如创建任务,查询任务,删除任务等等,传入url为0则会调用电脑自带摄像头;若电脑没有自带摄像头,或者想测试多任务并发的表现,可以用手机下载IP摄像头app,和电脑连接同一局域网,连接后输入以下网址:
http://admin:admin@192.168.1.111:8081
前面的admin是默认账号名和密码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。