1. 简介
目标检测分为Two stage和One stage,只使用一个网络同时产生候选区域并预测出物体的类别和位置,所以它们通常被叫做单阶段检测算法(One stage)。本篇文章只讲One stage模型,常见的模型有YOLO,SSD。
目标检测发展路程(一)——Two stage_樱缘之梦-CSDN博客
2. 原理
(1)YOLO(You Only Look Once)
YOLO模型已经更新了5个版本,分别是YOLO v1,YOLO v2,YOLO v3,YOLO v4,YOLO v5,模型版本的异同可以参考以下文章(已经有很多比较优秀的文章解释):
总结 | 一文读懂 YOLOv1,v2,v3,v4 发展史 - 知乎
Yolov5 系列1--- Yolo发展史以及Yolov5模型详解_g11d111的博客-CSDN博客_yolov5模型
百度PaddleDetection也出了一个PP-YOLO模型(基于YOLO v3的优化模型,在COCO数据集上的mAP和执行速度要比YOLO v4好)。
(2)SSD
SSD(Single Shot MultiBox Detector)于2016年提出,是经典的单阶段目标检测模型之一。具体算法细节可参考:
目标检测|SSD原理与实现 - 知乎
3. 模型解析
下载地址:GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLiteYOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 development by creating an account on GitHub.https://github.com/ultralytics/yolov5
该地址中已包含简单调用,可作为简单参考。
3.1. 文件内容解析
从上述地址下载文件,解压之后,获得如下文件:
- data:数据文件夹
————hyps:超参数文件
————images:yolo v5测试的两张图片,zidian.jpg,bus.jpg
————各项数据集的yaml文件,里边包括存储路径path、train、val、分类数量(number of classes),分类名称、download(下载路径)等信息
- models:模型文件夹
————hyps:模型文件,包含模型的anchors、backbone、head等参数
————模型配置:不同的yolo v5模型的配置,精度和效果不一样,有smxln五种。
- runs:运行结果文件,运行之后会出现
————detect:测试模型,输出图片并在图片中标注出物体和概率
————train:训练模型,输出内容,模型(最好、最新)权重、混淆矩阵、F1曲线、超参数文件、P曲线、R曲线、PR曲线、结果文件(loss值、P、R)等
- utils:工具文件夹
- detect.py:测试文件
- export.py:
- hubconf.py
- requirement.txt:可以通过pip install requirement进行依赖环境下载。
- train.py:训练文件
- tutorial.ipynb
- val.py
- yolov5s.pt:自行下载的,这个是yolov5轻量级的模型
3.2. 数据集
3.2.1. COCO数据集
COCO的 全称是Common Objects in COntext,是微软团队提供的一个可以用来进行图像识别/图像分割/语义标注的数据集,标注信息包括类别,位置和语义文本。MS COCO数据集中的图像分为训练、验证和测试集。COCO通过在Flickr上搜索80个对象类别和各种场景类型来收集图像,其使用了亚马逊的Mechanical Turk(AMT)。常用的场景有目标实例,目标上的关键点、看图说话,标注内容为json格式。
3.2.2. VOC数据集
PASCAL VOC(Pattern Analysis Statistical modelling,Computational and Learning Visual Object Classes)是一个用于图像分类/识别/分割的数据集。有人类、动物、交通工具,室内四个大类,20个小的目标类别。标注信息以XML格式保存。
3.3. 模型
YOLO v5的模型版本有s、m、l、x、n共5个不同精度的模型,引入了depth_multiple和width_multiple系数来得到不同大小模型,depth_multiple表示channel的缩放系数,就是将配置里面的backbone和head部分有关通道的设置,全部乘以该系数即可。而width_multiple表示BottleneckCSP模块的层缩放系数,将所有的BottleneckCSP模块的number系数乘上该参数就可以最终的层个数。可以发现通过这两个参数就可以实现不同大小不同复杂度的模型设计。比yolov4更加灵活。
4. 应用
4.1. detect(测试)
#不要有中文路径
python detect.py --source ./data/images/bus.jpg --weights yolov5s.pt
可配置参数:
#--weights,模型的权重参数文件
parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path(s)')
#--source 数据资源(图片或视频地址)
parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='file/dir/URL/glob, 0 for webcam')
#--imgsz,--img,--img-size 图像尺寸,默认为640
parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')
#置信度阈值,默认0.25
parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold')
#iou(交并比)阈值,默认0.45
parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold')
#一张图片中最大识别种类的个数,默认为1000
parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image')
#运行设备方式,GPU或者CPU
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
#展示结果图片
parser.add_argument('--view-img', action='store_true', help='show results')
#保存结果文件
parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
#保存置信度
parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
#保存截取过得预测框
parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes')
#不保存图片或视频
parser.add_argument('--nosave', action='store_true', help='do not save images/videos')
#指定分类
parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3')
#未知的NMS
parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
#增强推断
parser.add_argument('--augment', action='store_true', help='augmented inference')
#可视化特征
parser.add_argument('--visualize', action='store_true', help='visualize features')
#更新所有模型
parser.add_argument('--update', action='store_true', help='update all models')
#保存结果在项目里边
parser.add_argument('--project', default=ROOT / 'runs/detect', help='save results to project/name')
#保存结果在name里边
parser.add_argument('--name', default='exp', help='save results to project/name')
#项目存在,则不增加
parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
#bbox(边界框)的边界的厚度(像素)
parser.add_argument('--line-thickness', default=3, type=int, help='bounding box thickness (pixels)')
#隐藏labels
parser.add_argument('--hide-labels', default=False, action='store_true', help='hide labels')
#隐藏置信度
parser.add_argument('--hide-conf', default=False, action='store_true', help='hide confidences')
#使用FP16 half-precision
parser.add_argument('--half', action='store_true', help='use FP16 half-precision inference')
#使用opencv的DNN
parser.add_argument('--dnn', action='store_true', help='use OpenCV DNN for ONNX inference')
4.2. train(训练)
#默认coco数据集
python train.py --weights yolov5s.pt --epochs 5
可配置参数(未展示完全):
#模型的权重参数文件
parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
#模型yaml文件路径
parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
#数据集的yaml文件
parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')
#超参数文件
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch.yaml', help='hyperparameters path')
#训练批次
parser.add_argument('--epochs', type=int, default=300)
#批次大小
parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs')
#图片文件大小
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
4.3. 数据标注
常用工具:Labelimg,支持yolo v5的格式,对真实框数据进行归一化处理
常用工具:Calabeler,支持xml,json,MongoDB格式,数据集在进行yolo v3模型使用时,还需进行边框值归一化处理。
4.4. 使用自己的数据集进行训练
python train.py --weights yolov5s.pt --data ./data/dataset.yaml --cfg ./models/yolov5s.yaml --epochs 50 --batch-size 8 --device 0
(1)数据集文件
如果是本地文件,数据集包含路径,分类数量,分类类别
(2)权重文件
可以自行下载yolov5s.pt文件,这个是精度为s的yolo v5模型。
5. 总结
想要实现其他模型,步骤和现在类似,但是会出现GPU资源不够用和CPU训练较慢的问题,再者,模型的原理细节也值得反复推敲。