diff --git a/src/image_recognition/README.md b/src/image_recognition/README.md index 0c3c04a..e69de29 100644 --- a/src/image_recognition/README.md +++ b/src/image_recognition/README.md @@ -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) - -