YOLOv5 从配置到部署
- YOLOv5
- 一. 简介
- 二. 安装 (Ubuntu)
- 1. 下载源码
- 2. 配置环境
- 3. 下载权重
- 4. 使用GPU(英伟达显卡)
- 三.测试
- 四.数据集
- 1.准备
- 2.标注:
- 3.官方建议
- 五.训练
- 1.准备
- 2.本地训练
- 3.使用Google Colab云训练
- 4.官方建议
- 六.部署
- 1.使用官方detect.py
- 2.使用Cmoon中的Detector.py
YOLOv5
一. 简介
- You only look once!
- 单阶段目标检测(Faster RCNN 双阶段)
- 快速
- 精度较高
- 使用方便
- https://github.com/ultralytics/yolov5
二. 安装 (Ubuntu)
1. 下载源码
git clone git://github.com/ultralytics/yolov5.git
cd yolov5
2. 配置环境
- 有conda环境(推荐)
conda create -n py38 python=3.8
conda activate py38
pip install -r requirements.txt
- 无conda环境(需要Python3.8或3.6)
pip3 install -U -r requirements.txt
3. 下载权重
- 官网下载(能上Github)
- https://github.com/ultralytics/yolov5
- 点击右侧Releases
- 最下方Assets中点击下载相应模型
- Cmoon复制
git clone git://github.com/Cmoon-cyl/ros-module.git
将ros-module/cmoon/src 中的weights文件夹复制到yolov5文件夹
4. 使用GPU(英伟达显卡)
- 安装显卡驱动
- 安装CUDA以及CUDNN
三.测试
python3 detect.py --source 0 --weights weights/yolov5s.pt
四.数据集
1.准备
- 新建dataset文件夹 (名字可自定义)
- 新建images和labels文件夹 (名字不能错)
- images和labels内分别新建train和val文件夹 (名字不能错)
- 将准备的图像按大致8 : 2随机分配,放入images的train和val文件夹内,作为训练集和验证集
- labels文件夹将存放之后生成的txt格式标签
- 如图:
2.标注:
- labelImg(img的i大写,其他小写)
- 安装
pip install labelImg
- 打开
labelImg
- 设置
- 点击“改变存放目录”,选择yolov5/dataset/labels/train
- 点击“打开目录",选择yolov5/dataset/images/train
- 设置标注格式为yolo
- view中勾选自动保存模式和显示类别
- 标注
- w 创建区块,框选标注的物体,输入标签名称
- a/d 切换上一张/下一张
- 选中标签,可拖动或修改大小,右侧“编辑标签”可改变标签名称
- ctrl + d 复制当前标签
- ↑↓←→键 微调标签位置
- ctrl + v 复制上一张图片的标签 (在连续标注相同类别标签时很有用)
- 注意
- 标注后会生成classes.txt文件,里面的顺序应和标注文件内的物体一一对应
- 第一次出现的物体要注意名称不要打错
- 多人合作标注一定要保证classes.txt内的顺序一致
- 标注框应紧贴被标注的物体,不要留有缝隙
- 注意不要漏标
- Roboflow (官方推荐的在线标注网站)
- 网址:https://roboflow.com
- 创建project (命名随意)
- 上传图片(可不分train和val把所有图片都放入)
- 标注
- d 拖拽
- c 画框
- ←/→ 切换上一张/下一张
- 其余操作点击图标
- 分配train/val/test (训练集,验证集,测试集)
- 选择图片预处理
- 选择数据增强
- 导出数据集(选择YOLOv5格式)
- 下载数据集
- 自动导出的目录结构与上面我们自己建的不同,两种结构都可以
- 新建dataset文件夹,将下载的train和val文件夹放入即可
- 将data.yaml放入data文件夹
- 下载的文件内容:
3.官方建议
- 每类图片数量大于1500张 (没那么夸张)
- 每类图片的实例(标注的数量)大于10000 (同上)
- 图片多样性: 不同光照,不同角度最重要
- 标签一致性: 不能有漏标的待检测物体
- 标签准确性: 标签需紧贴被标物体,不留空隙,不能漏标
- 背景图: 在训练集中加入0~10%的背景图(没有任何标注),以减少假阳性/过拟合 (防止将背景的特征误认为是物体的特征)
五.训练
1.准备
- 在data文件夹内修改或创建data.yaml (文件名可自定义)
- train和val 指定训练集和测试集的图片所在文件夹路径
- nc 为训练的classes数量
- names 为标签名,需要和classes.txt顺序一一对应
- 修改models文件夹中对应预训练模型的yaml文件
- 只需修改nc为你训练的classes数量
2.本地训练
cd yolov5
python train.py --img 640 --batch 16 --epochs 300 --data data/data.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt
- 参数说明:
- img 图片大小
- batch batch-size 和显卡性能有关,在能设的范围内越大越好,最好为2的倍数(玄学)
- epochs 训练迭代次数
- data 指定之前修改的data/data.yaml
- cfg 模型结构配置文件
- weights 允许练模型权重
- resume 如果指定–resume则可以继续上次中断的训练
- 训练效果
- 随着训练进度,mAP@.5将从0趋近1
- 观察多少epochs之后mAP开始趋近1,以在下次训练时修改epochs数
- 训练过程中best和last模型会实时保存到runs/train/expn/weights中
3.使用Google Colab云训练
- 创建谷歌账号
- 登录Google Drive
- 上传数据集和yolo源码 (点击“新建”,”上传文件夹”)
- 新建一个.ipynb文件 (点击“新建“,”更多”,”Google Colaboratory”)
- 点击“修改”,”笔记本设置”,”硬件加速器”,”GPU”
- 点击右侧“连接”
- 查看分配到的GPU
!nvidia-smi
- 连接到Google Drive
import os
from google.colab import drive
drive.mount('/content/drive') #输出Mounted at /content/drive
- cd到yolo目录
%ls
%cd /content/drive/MyDrive/colab/yolov5 #路径可能不同,注意要加%,一边cd一遍ls到yolo目录
- 安装依赖
!pip install -qr requirements.txt
!pip install -U pyyaml
- 开始训练
!python train.py --img 640 --batch 16 --epochs 300 --data data/data.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt #注意前面加'!'
- 注意
- 需要科学上网
- 用手机也可以训练
- 网络需要稳定
- 需要时不时检查,防止掉线
- 若中途停止训练可以加上–resume从中断处继续训练
- 训练过程中best和last模型会自动保存在云盘yolo目录的runs/train/expn/weights中
4.官方建议
- 训练小模型或中模型建议使用预训练模型
- 训练大模型建议不用预训练模型,从头开始训练
- 使用P6模型作为预训练模型可以提高精度,但是会减慢速度,P6模型image size为1280
- 初始epochs设为300,如果过拟合减少epochs,欠拟合则增加epochs
- 默认image size 640,如果训练小物体检测可将image size设为1280
- 训练,测试和部署的image size应一致
- 使用硬件所允许最大的batch size
六.部署
1.使用官方detect.py
- 将yolov5/runs/train/expn/weights中的best.pt复制到yolov5/weights文件夹
python detect.py --source 0 --weights weights/best.py
2.使用Cmoon中的Detector.py
- 将yolov5/runs/train/expn/weights中的best.pt复制到cmoon/src/weights文件夹
- 修改Detector类中的模型名称
self.weights = os.path.dirname(__file__) + '/weights/' + 'best.pt'
- 修改最下方device为camera,mode=’realtime’
name = yolo.detect(device='camera', mode='realtime', attributes=None, depth=False, rotate=False)
- 运行即可