YOLOV5训练自己目标检测模型和cpu检测
让我们了解一下我们想要实现的效果。我们将利用数据训练一个检测模型,并使用pyqt5框架进行封装。该系统将具备图像识别能力,并能够分别完成以下功能:首先进行图像检测;其次实施烟雾及火灾探测;最后通过摄像头实时监控并完成相关检测任务。
代码下载的位置位于 GitHub repository of ultralytics/yolov5: YOLOv5 model implemented in PyTorch framework, converted to ONNX format, integrated into CoreML workflow, and then exported as a TFLite model.
配置环境
配置anaconda虚拟环境
anaconda安装完成之后请切换到国内的源来提高下载速度 ,命令如下:
conda config --remove-key channels
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple
首先创建python3.8的虚拟环境,请在命令行中执行下列操作:
conda create -n py14 python==3.8.5
conda activate py14
查看环境:
conda env list and conda info --envs
克隆环境:
codna create -n 新环境 --clone 旧环境
pytorch:CPU和GPU版本的安装
经过实证研究发现,在CPU与GPU环境下YOLOv5均能正常运行。然而,在仅依赖CPU进行模型训练时效率令人担忧。因此建议具备条件的朋友安装GPU版本的PyTorch;无条件用户最好通过 rented servers 来获取所需计算资源,并访问[Previous PyTorch Versions | PyTorch](https://pytorch.org/get-started/previous-versions/ "Previous PyTorch Versions | PyTorch)获取详细信息
# CPU Only
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cpuonly -c pytorch # cpu
# CUDA 10.2
conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=10.2 -c pytorch
# CUDA 11.1
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge # GPU
需要注意以下几点:
- 在安装前必须先更新显卡驱动程序,在官网上获取与型号匹配的驱进步行安装
- 30系显卡仅限于使用CUDA 11版本
- 建议创建一个虚拟环境以避免各深度学习框架之间的冲突
安装完毕之后,我们来测试一下GPU是否
import torch
print(torch.__version__)
print(torch.cuda.is_available())
pycocotools的安装:
pip install pycocotools-windows
其他包的安装:
此外大家还需自行安装一些必要的软件包其中包括如OpenCV、Matplotlib等工具库值得注意的是这些工具库的安装过程相对简单只需通过pip命令就能轻松完成接下来的操作步骤请按照以下步骤进行操作
pip install -r requirements.txt
pip install pyqt5
pip install labelme
测试一下
在yolov5目录下运行相应的代码,在代码完成后会产生相关信息,并在runs目录中获取检测结果。
python detect.py --source data/images/bus.jpg --weights pretrained/yolov5s.pt
依据官方发布的指示,在这里提供的检测代码具有很强的功能性,并能够实现对各种图像与视频流进行检测的具体操作步骤如下:
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 或
pip install labelimg -i https://mirror.baidu.com/pypi/simple
安装命令运行后,在终端界面中直接运行labelimg软件即可启动数据自动标注流程。接着,在终端界面中直接运行labelimg软件即可启动数据自动标注流程。注:当标记完成时会生成一批txt文本文件。这些生成的txt文本文件即为目标检测所需的数据标注文档,请查看以下信息:每个txt文本中的每一行代表一个目标物体,在该行内容中以空格分隔的数据依次表示该物体的目标类别ID号、归一化后的中心点x坐标位置、中心点y坐标位置以及该物体的目标框宽度与高度参数值等信息内容。
修改数据集配置文件:
标记完成的数据请按照下面的格式进行放置,方便程序进行索引。
这个配置文件便于我们后续的训练工作使用。为此需要在data目录中创建一个名为mask_data.yaml的文件。如图所示:
# Custom data for safety helmet
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: C:/score/images/train # 训练集位置
val: C:/score/images/val # 验证机位置
# number of classes
nc: 2 # 数据集类别
# class names
names: ['fire', 'smoke'] # 目标类名称
模型训练
模型基本训练
位于models目录中创建一个命名为mask_yolov5s.yaml的模型配置文件,并在其内部内容前添加注释以指示具体修改位置(例如,在原有yolov5s.yaml基础上进行参数调整)。同时准备好数据集配置文件、模型配置文件以及预训练权重文件,并按照以下步骤进行操作:首先启动相关软件环境;然后依次读取各配置文件并设置相应参数;最后运行指定的训练或推理命令即可完成任务。
python train.py --data mask_data.yaml --cfg mask_yolov5s.yaml --weights pretrained/yolov5s.pt --epoch 100 --batch-size 4 --device cpu
python train.py --data mask_data.yaml --cfg mask_yolov5s.yaml --weights pretrained/yolov5s.pt --epoch 100 --batch-size 16 --device 0
当训练代码成功执行时,在命令行界面会显示相关信息,并且随后就可以放心地等待模型完成训练。
用户可以在train/runs/exp3目录中获取到训练生成的模型和日志记录文件。此外,在该目录中还包含不同性能指标的相关图表。一般会访问这些文件。
模型评估
其中mAP是目标检测中使用的主要评价指标,在0到1之间的数值表示模型性能的表现程度;数值越趋近于1,则说明模型性能越好。
在实际应用中,我们通常会关注两个关键指标:召回率(Recall)与精确率(Precision),这两个指标分别用p和r表示。它们都是衡量模型性能的重要标准,在0到1之间取值。数值越接近1表示模型性能越好;数值越接近0则表示性能较差。为了全面评估目标检测系统的性能表现,我们通常采用均值-方差(Mean Average Precision, mAP)这一综合指标来进行进一步评估。通过设定不同置信度的阈值,在不同阈值下计算出对应的p与r值。需要注意的是,在大多数情况下p与r呈负相关关系,在图表中表现为一条曲线(如图所示)。这条曲线下的面积即为AP(Average Precision)指标,在目标检测任务中每个目标都可以对应一个AP指标。将所有目标的AP指标进行算术平均,则可获得整体模型的表现评估指标——mAP(Mean Average Precision)。例如,在本文场景中我们可以分别计算火点火源及烟雾目标的mAP指标,并取其平均值得出整体模型性能评估指标
有关更专业的定义大家可以在知乎或上自行了解。以我们本次训练的模型为例,在模型训练完成后,在验证集上我们会获取到三个指标:召回率、准确率以及均值平均密度。
假如在你的目录中找不到所需曲线
python val.py --data data/mask_data.yaml --weights runs/train/exp_yolov5s/weights/best.pt --img 640
模型使用:
模型的所有功能被整合到detect.py目录中,请按照指示完成检测操作
# 检测摄像头
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时将能够获得一张检测结果图像。
