目标检测算法Yolo(二)—YoloV1V2原理及源码使用

  1. 一、Yolo原理
    1. 1.评估指标
      1. 1.1 MAP
      2. 1.2 IOU
      3. 1.3 前传耗时
      4. 1.4 FPS
    2. 2. YoloV1
    3. 3. YoloV2
  2. 二. Yolo源码
    1. 1.源码下载和配置环境
    2. 2.源码使用
      1. 2.1 detect.py
      2. 2.2 train.py

简介:
  本类博客用于记录目标检测方法yolo的学习,本篇博客介绍了yolov1,yolov2的原理,和yolo源码的下载和使用


参考资料:

【百万播放】零基础、快速学YOLO目标检测算法!完整学习路线一条龙,无脑通关!【YOLOv5|YOLO算法|目标检测算法】_哔哩哔哩_bilibili

  Yolo属于one-stage的目标检测,优点是速度快,实时检测,缺点是牺牲效果

一、Yolo原理

1.评估指标

1.1 MAP

  查准率:预测对的正样本占所有预测为正样本的比值
  召回率:预测对的正样本占所有正样本的比值
  AP:将该类别预测样本按置信度排序,分别计算查准率和召回率,绘制查准率关于召回率的图像,计算面积
  MAP:将每个类的AP平均
  MAP@0.5:9.5:使用不同的IOU并平均

1.2 IOU

  真实值和预测值并集比上交集 ,越接近1效果越好

1.3 前传耗时

  从输入一张图像到输出结果所耗时间

1.4 FPS

  每秒能处理的图像数量

2. YoloV1

  1. 填充图片并缩放至448*448
  2. 获取每张图片的labels(包括每个目标的x,y,w,h,p)
  3. 设置网络结构
    图片
    其中最后的输出结果为7 * 7 * 30的向量,其含义为将网络分成7*7个格子,每个格子包含两个候选框的信息(x,y,w,h,p)和20个类别的预测概率,共计30个元素
  4. 计算损失函数
    图片

3. YoloV2

改进

  1. 增加了448*448的图片的训练
  2. 删除了全连接层
  3. 根据聚类选择先验框
  4. x,y,w,h改为相对于先验框的偏移量
  5. 特征融合,利于检测小目标

二. Yolo源码

1.源码下载和配置环境

  进入ultralytics/yolov5 at v5.0 (github.com)下载源码,然后使用pip install -r yourpath/requirements.txt下载所需库(可以把requirements中关于toch,tochvision的部分删了自己下载,按照requirements中安装的torch是cpu版本的)

2.源码使用

  更改参数为你对应的

2.1 detect.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
def parse_opt():  
parser = argparse.ArgumentParser()
#指定训练模型 defult选择训练模型
parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model path(s)')
#指定预测对象来源 default可选为:
#file.jpg
#file.mp4
#path/
#path/*/jpg #检测所有jpg文件
#YouTube video地址
parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='file/dir/URL/glob, 0 for webcam')

parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='(optional) dataset.yaml path')
#图片尺寸
parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')
#置信度阈值
parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold')
#交集阈值,大于该值就判定为同一目标,合并框
parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold')
parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image')
#设备
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')
#增强
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')
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')
parser.add_argument('--line-thickness', default=3, type=int, help='bounding box thickness (pixels)')
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')
parser.add_argument('--half', action='store_true', help='use FP16 half-precision inference')
parser.add_argument('--dnn', action='store_true', help='use OpenCV DNN for ONNX inference')
opt = parser.parse_args()
opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1 # expand
print_args(vars(opt))
return opt

2.2 train.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
def parse_opt(known=False):  
parser = argparse.ArgumentParser()
#指定初始化参数,可不填
parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
#指定网络的结构
parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
#指定数据集
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-low.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, -1 for autobatch')
#图片大小
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
#矩阵填充
parser.add_argument('--rect', action='store_true', help='rectangular training')
#是否在已训练的模型上继续训练
parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
#是否只保存最后的模型
parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
parser.add_argument('--noval', action='store_true', help='only validate final epoch')
#锚点 锚框
parser.add_argument('--noautoanchor', action='store_true', help='disable AutoAnchor')
parser.add_argument('--noplots', action='store_true', help='save no plot files')
parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')
parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
parser.add_argument('--cache', type=str, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')
parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
#图片尺寸变换
parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')
parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
#线程数
parser.add_argument('--workers', type=int, default=8, help='max dataloader workers (per RANK in DDP mode)')
parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')
parser.add_argument('--name', default='exp', help='save to project/name')
parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
parser.add_argument('--quad', action='store_true', help='quad dataloader')
parser.add_argument('--cos-lr', action='store_true', help='cosine LR scheduler')
parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')
parser.add_argument('--freeze', nargs='+', type=int, default=[0], help='Freeze layers: backbone=10, first3=0 1 2')
parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')
parser.add_argument('--seed', type=int, default=0, help='Global training seed')
parser.add_argument('--local_rank', type=int, default=-1, help='Automatic DDP Multi-GPU argument, do not modify')

# Weights & Biases arguments
parser.add_argument('--entity', default=None, help='W&B: Entity')
parser.add_argument('--upload_dataset', nargs='?', const=True, default=False, help='W&B: Upload data, "val" option')
parser.add_argument('--bbox_interval', type=int, default=-1, help='W&B: Set bounding-box image logging interval')
parser.add_argument('--artifact_alias', type=str, default='latest', help='W&B: Version of dataset artifact to use')

return parser.parse_known_args()[0] if known else parser.parse_args()

结语:无
  



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 21009200039@stu.xidian.edu.cn

💰

×

Help us with donation