|
|
@ -1,188 +0,0 @@
|
|
|
|
|
|
|
|
|
|
|
|
# 测试一下
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在yolov5(image_recognize)目录下执行下列代码
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
python detect.py --source data/images/bus.jpg --weights pretrained/yolov5s.pt
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
执行完毕之后将会输出下列信息
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20210610111308496](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20210610111308496.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在runs目录下可以找到检测之后的结果
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20210610111426144](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20210610111426144.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
按照官方给出的指令,这里的检测代码功能十分强大,是支持对多种图像和视频流进行检测的,具体的使用方法如下:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
python detect.py --source 0 # webcam
|
|
|
|
|
|
|
|
file.jpg # image
|
|
|
|
|
|
|
|
file.mp4 # video
|
|
|
|
|
|
|
|
path/ # directory
|
|
|
|
|
|
|
|
path/*.jpg # glob
|
|
|
|
|
|
|
|
'https://youtu.be/NUsoVlDFqZg' # YouTube video
|
|
|
|
|
|
|
|
'rtsp://example.com/media.mp4' # RTSP, RTMP, HTTP stream
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 数据处理
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这里改成yolo的标注形式
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
数据标注这里推荐的软件是labelimg,通过pip指令即可安装
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在你的虚拟环境下执行`pip install labelimg -i https://mirror.baidu.com/pypi/simple`命令进行安装,然后在命令行中直接执行labelimg软件即可启动数据标注软件。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20210609172156067](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20210609172156067.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
软件启动后的界面如下:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20210609172557286](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20210609172557286.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 数据标注
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
虽然是yolo的模型训练,但是这里我们还是选择进行voc格式的标注,方便在其他的代码中使用数据集
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**标注的过程是:**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**1.打开图片目录**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20210610004158135](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20210610004158135.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**2.设置标注文件保存的目录并设置自动保存**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20210610004215206](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20210610004215206.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**3.开始标注,画框,标记目标的label,`crtl+s`保存,然后d切换到下一张继续标注,不断重复重复**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20211212201302682](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20211212201302682.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
labelimg的快捷键如下,学会快捷键可以帮助你提高数据标注的效率。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20210609171855504](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20210609171855504.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
标注完成之后你会得到一系列的txt文件,这里的txt文件就是目标检测的标注文件,其中txt文件和图片文件的名称是一一对应的,如下图所示:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20211212170509714](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20211212170509714.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
打开具体的标注文件,你将会看到下面的内容,txt文件中每一行表示一个目标,以空格进行区分,分别表示目标的类别id,归一化处理之后的中心点x坐标、y坐标、目标框的w和h。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20211212170853677](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20211212170853677.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**4.修改数据集配置文件**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
标记完成的数据请按照下面的格式进行放置,方便程序进行索引。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
YOLO_Mask
|
|
|
|
|
|
|
|
└─ score
|
|
|
|
|
|
|
|
├─ images
|
|
|
|
|
|
|
|
│ ├─ test # 下面放测试集图片
|
|
|
|
|
|
|
|
│ ├─ train # 下面放训练集图片
|
|
|
|
|
|
|
|
│ └─ val # 下面放验证集图片
|
|
|
|
|
|
|
|
└─ labels
|
|
|
|
|
|
|
|
├─ test # 下面放测试集标签
|
|
|
|
|
|
|
|
├─ train # 下面放训练集标签
|
|
|
|
|
|
|
|
├─ val # 下面放验证集标签
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这里的配置文件是为了方便我们后期训练使用,我们需要在data目录下创建一个`mask_data.yaml`的文件,如下图所示:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20211212174510070](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20211212174510070.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
到这里,数据集处理部分基本完结撒花了,下面的内容将会是模型训练!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 模型训练
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 模型的基本训练
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在models下建立一个`mask_yolov5s.yaml`的模型配置文件,内容如下:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20211212174749558](C:\Users\chenmingsong\AppData\Roaming\Typora\typora-user-images\image-20211212174749558.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
模型训练之前,请确保代码目录下有以下文件
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20211212174920551](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20211212174920551.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
执行下列代码运行程序即可:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
python train.py --data mask_data.yaml --cfg mask_yolov5s.yaml --weights pretrained/yolov5s.pt --epoch 100 --batch-size 4 --device cpu
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20210610113348751](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20210610113348751.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
训练代码成功执行之后会在命令行中输出下列信息,接下来就是安心等待模型训练结束即可。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20210610112655726](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20210610112655726.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
根据数据集的大小和设备的性能,经过漫长的等待之后模型就训练完了,输出如下:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20210610134412258](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20210610134412258.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在`train/runs/exp3`的目录下可以找到训练得到的模型和日志文件
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20210610145140340](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20210610145140340.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 模型评估
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
可以用一些学术上的评价指标用来表示我们模型的性能,其中目标检测最常用的评价指标是mAP,mAP是介于0到1之间的一个数字,这个数字越接近于1,就表示你的模型的性能更好。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
一般我们会接触到两个指标,分别是召回率recall和精度precision,两个指标p和r都是简单地从一个角度来判断模型的好坏,均是介于0到1之间的数值,其中接近于1表示模型的性能越好,接近于0表示模型的性能越差,为了综合评价目标检测的性能,一般采用均值平均密度map来进一步评估模型的好坏。我们通过设定不同的置信度的阈值,可以得到在模型在不同的阈值下所计算出的p值和r值,一般情况下,p值和r值是负相关的,绘制出来可以得到如下图所示的曲线,其中曲线的面积我们称AP,目标检测模型中每种目标可计算出一个AP值,对所有的AP值求平均则可以得到模型的mAP值,以本文为例,我们可以计算佩戴安全帽和未佩戴安全帽的两个目标的AP值,我们对两组AP值求平均,可以得到整个模型的mAP值,该值越接近1表示模型的性能越好。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
关于更加学术的定义大家可以在知乎或者csdn上自行查阅,以我们本次训练的模型为例,在模型结束之后你会找到三张图像,分别表示我们模型在验证集上的召回率、准确率和均值平均密度。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20211212175851524](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20211212175851524.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
以PR-curve为例,你可以看到我们的模型在验证集上的均值平均密度为0.832。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![PR_curve](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/PR_curve.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果你的目录下没有这样的曲线,可能是因为你的模型训练一半就停止了,没有执行验证的过程,你可以通过下面的命令来生成这些图片。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
python val.py --data data/mask_data.yaml --weights runs/train/exp_yolov5s/weights/best.pt --img 640
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
最后,这里是一张详细的评价指标的解释清单,可以说是最原始的定义了。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![img](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/20200411141530456.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 模型使用
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
模型的使用全部集成在了`detect.py`目录下,你按照下面的指令指你要检测的内容即可
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
# 检测摄像头
|
|
|
|
|
|
|
|
python detect.py --weights runs/train/exp_yolov5s/weights/best.pt --source 0 # webcam
|
|
|
|
|
|
|
|
# 检测图片文件
|
|
|
|
|
|
|
|
python detect.py --weights runs/train/exp_yolov5s/weights/best.pt --source file.jpg # image
|
|
|
|
|
|
|
|
# 检测视频文件
|
|
|
|
|
|
|
|
python detect.py --weights runs/train/exp_yolov5s/weights/best.pt --source file.mp4 # video
|
|
|
|
|
|
|
|
# 检测一个目录下的文件
|
|
|
|
|
|
|
|
python detect.py --weights runs/train/exp_yolov5s/weights/best.pt path/ # directory
|
|
|
|
|
|
|
|
# 检测网络视频
|
|
|
|
|
|
|
|
python detect.py --weights runs/train/exp_yolov5s/weights/best.pt 'https://youtu.be/NUsoVlDFqZg' # YouTube video
|
|
|
|
|
|
|
|
# 检测流媒体
|
|
|
|
|
|
|
|
python detect.py --weights runs/train/exp_yolov5s/weights/best.pt 'rtsp://example.com/media.mp4' # RTSP, RTMP, HTTP stream
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
比如以我们的口罩模型为例,如果我们执行`python detect.py --weights runs/train/exp_yolov5s/weights/best.pt --source data/images/fishman.jpg`的命令便可以得到这样的一张检测结果。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![fishman](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/fishman.jpg)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 构建可视化界面
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
可视化界面的部分在`window.py`文件中,是通过pyqt5完成的界面设计,在启动界面前,你需要将模型替换成你训练好的模型,替换的位置在`window.py`的第60行,修改成你的模型地址即可,如果你有GPU的话,可以将device设置为0,表示使用第0行GPU,这样可以加快模型的识别速度嗷。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![image-20211212194547804](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20211212194547804.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
替换之后直接右键run即可启动图形化界面了
|
|
|
|
|
|
|
|
![image-20211212194914890](https://vehicle4cm.oss-cn-beijing.aliyuncs.com/typoraimgs/image-20211212194914890.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|