本仓库Fork自Ultralytics公司出品的yolov5,原仓库地址为:ultralytics/yolov5 ,所有版权均属于原仓库作者所有,请参见原仓库License。本人汉化自用,也方便各位国人使用。
yolov5按大小分为四个模型yolov5s、yolov5m、yolov5l、yolov5x,这四个模型的表现见下图:
上图为基于5000张COCO val2017图像进行推理时,每张图像的平均端到端时间,batch size = 32, GPU:Tesla V100,这个时间包括图像预处理,FP16推理,后处理和NMS(非极大值抑制)。 EfficientDet的数据是从 google/automl 仓库得到的(batch size = 8)。
- 2020年10月29日:v3.1 release
- 2020年8月13日: v3.0 release
- 2020年7月23日: v2.0 release
- 2020年6月26日: v1.0 release
v2.0相对于v1.0是大版本更新,效果提升显著。v3.0使用nn.Hardwish()激活,图片推理速度下降10%,训练时显存占用增加10%(官方说法,我自己实测将近30%),训练时长不变。但是模型mAP会上升,对越小的模型收益越大。
注意:v2.0和v3.0权重通用,但不兼容v1.0,不建议使用v1.0,建议使用最新版本代码。
yolov5官方说Python版本需要≥3.8,但是我自用3.7也可以,但仍然推荐≥3.8。其他依赖都写在了requirements.txt 里面。一键安装的话,打开命令行,cd到yolov5的文件夹里,输入:
$ pip install -r requirements.txt
pip安装慢的,请配置镜像源,下面是清华的镜像源。
$ pip install pip -U
$ pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
想配其他镜像源直接把网址替换即可,以下是国内常用的镜像源:
豆瓣 https://pypi.doubanio.com/simple/
网易 https://mirrors.163.com/pypi/simple/
阿里云 https://mirrors.aliyun.com/pypi/simple/
腾讯云 https://mirrors.cloud.tencent.com/pypi/simple
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
下载 COCO数据集,然后执行下面命令。根据你的显卡情况,使用最大的 --batch-size
,(下列命令中的batch size是16G显存的显卡推荐值).
$ python train.py --data coco.yaml --cfg yolov5s.yaml --weights '' --batch-size 64
yolov5m.yaml 40
yolov5l.yaml 24
yolov5x.yaml 16
四个模型yolov5s/m/l/x使用COCO数据集在单个V100显卡上的训练时间为2/4/6/8天。
yolo格式的标签为txt格式的文件,文件名跟对应的图片名一样,除了后缀改为了.txt。 具体格式如下:
- 每个目标一行,整个图片没有目标的话不需要有txt文件
- 每行的格式为
class_num x_center y_center width height
- 其中
class_num
取值为0
至total_class - 1
,框的四个值x_center
y_center
width
height
是相对于图片分辨率大小正则化的0-1
之间的数,左上角为(0,0)
,右下角为(1,1)
不同于DarkNet版yolo,图片和标签要分开存放。yolov5的代码会根据图片找标签,具体形式的把图片路径/images/*.jpg
替换为/labels/*.txt
,所以要新建两个文件夹,一个名为images
存放图片,一个名为labels
存放标签txt文件,如分训练集、验证集和测试集的话,还要再新建各自的文件夹,如图:
自定义训练需要修改两个.yaml文件,一个是模型文件,一个是数据文件。
- 模型文件:可以根据你选择训练的模型,直接修改
./models
里的yolov5s.yaml
/yolov5m.yaml
/yolov5l.yaml
/yolov5x.yaml
文件,只需要将nc: 80
中的80修改为你数据集的类别数。其他为模型结构不需要改。 - 数据文件:根据
./data
文件夹里的coco数据文件,制作自己的数据文件,在数据文件中定义训练集、验证集、测试集路径;定义总类别数;定义类别名称# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/] train: ../coco128/images/train2017/ val: ../coco128/images/val2017/ test:../coco128/images/test2017/ # number of classes nc: 80 # class names names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']
训练直接运行train.py
即可,后面根据需要加上指令参数,--weights
指定权重,--cfg
指定模型文件,--data
指定数据文件,--batch-size
指定batch大小,--epochs
指定epoch,--device
指定设备。一个简单的训练语句:
# 使用yolov5s模型训练coco128数据集5个epochs,batch size设为16
$ python train.py --batch 16 --epochs 5 --data ./data/coco128.yaml --cfg ./models/yolov5s.yaml --weights ''
有参:
--weights
(☆)指定权重,如果不加此参数会默认使用COCO预训的yolov5s.pt
,--weights ''
则会随机初始化权重--cfg
(☆)指定模型文件--data
(☆)指定数据文件--hyp
指定超参数文件--epochs
(☆)指定epoch数,默认300--batch-size
(☆)指定batch大小,默认16
,官方推荐越大越好,用你GPU能承受最大的batch size
,可简写为--batch
--img-size
指定训练图片大小,默认640
,可简写为--img
--name
指定结果文件名,默认result.txt
--device
(☆)指定训练设备,如--device 0,1,2,3
--local_rank
分布式训练参数,不要自己修改!--logdir
指定训练过程存储路径,默认./runs
--workers
指定dataloader的workers数量,默认8
无参:
--rect
矩形训练--resume
继续训练,默认从最后一次训练继续--nosave
训练中途不存储模型,只存最后一个checkpoint--notest
训练中途不在验证集上测试,训练完毕再测试--noautoanchor
关闭自动锚点检测--evolve
超参数演变--bucket
使用gsutil bucket--cache-images
使用缓存图片训练,速度更快--image-weights
训练中对图片加权重--multi-scale
训练图片大小+/-50%变换--single-cls
单类训练--adam
使用torch.optim.Adam()优化器--sync-bn
使用SyncBatchNorm,只在分布式训练可用
推理支持多种模式,图片、视频、文件夹、rtsp视频流和流媒体都支持。
直接执行detect.py
,指定一下要推理的目录即可,如果没有指定权重,会自动下载默认COCO预训练权重模型。手动下载:Google Drive、国内网盘待上传。
推理结果默认会保存到 ./inference/output
中。
注意:每次推理会清空output文件夹,注意留存推理结果。
# 快速推理,--source 指定检测源,以下任意一种类型都支持:
$ python detect.py --source 0 # 本机默认摄像头
file.jpg # 图片
file.mp4 # 视频
path/ # 文件夹下所有媒体
path/*.jpg # 文件夹下某类型媒体
rtsp://170.93.143.139/rtplive/470011e600ef003a004ee33696235daa # rtsp视频流
http://112.50.243.8/PLTV/88888888/224/3221225900/1.m3u8 # http视频流
使用权重./weights/yolov5s.pt
去推理./inference/images
文件夹下的所有媒体,并且推理置信度设为0.5:
$ python detect.py --source ./inference/images/ --weights ./weights/yolov5s.pt --conf 0.5
自己根据需要加各种指令。
有参:
--source
(必须)指定检测来源--weights
指定权重,不指定的话会使用yolov5sCOCO预训练权重--save-dir
指定输出文件夹,默认./inference/output--img-size
指定推理图片分辨率,默认640,也可使用--img
--conf-thres
指定置信度阈值,默认0.4,也可使用--conf
--iou-thres
指定NMS(非极大值抑制)的IOU阈值,默认0.5--device
指定设备,如--device 0
--device 0,1,2,3
--device cpu
--classes
只检测特定的类,如--classes 0 2 4 6 8
无参:
--view-img
图片形式显示结果--save-txt
输出标签结果(yolo格式)为txt--save-conf
在输出标签结果txt中同样写入每个目标的置信度--agnostic-nms
使用agnostic NMS--augment
增强识别,详情--update
更新所有模型
首先明确,推理是直接检测图片,而测试是需要图片有相应的真实标签的,相当于检测图片后再把推理标签和真实标签做mAP计算。
使用./weights/yolov5x.pt
权重检测./data/coco.yaml
里定义的测试集,测试集图片分辨率resize成672。
$ python test.py --weights ./weights/yolov5x.pt --data ./data/coco.yaml --img 672
有参:
--weights
测试所用权重,默认yolov5sCOCO预训练权重模型--data
测试所用的.yaml文件,默认使用./data/coco128.yaml
--batch-size
测试用的batch大小,默认32,这个大小对结果无影响--img-size
测试集分辨率大小,默认640,测试建议使用更高分辨率--conf-thres
目标置信度阈值,默认0.001--iou-thres
NMS的IOU阈值,默认0.65--task
指定任务模式,train, val, 或者test,测试的话用--task test
--device
指定设备,如--device 0
--device 0,1,2,3
--device cpu
无参:
--save-json
保存结果为json--single-cls
视为只有一类--augment
增强识别---merge
使用Merge NMS--verbose
输出各个类别的mAP--save-txt
输出标签结果(yolo格式)为txt
如有代码bug请去yolov5官方Issue下提。
个人联系方式:[email protected]
遵循yolov5官方LICENSE