2018-12-07 14:48:42 u010986080 阅读数 5891
  • YOLO实战视频教程

    YOLO实战视频培训课程概况:本教程无需深度学习经验,是初级教程,无需高配置机器,能上网就能实践,本课程分享图像标注软件的使用,讲述了如何练好自己的模型,并将模型发布到服务或是移到android使用

    5583 人正在学习 去看看 黄彬彬

YOLO 学习总结

1. 前言


YOLOv1 早已过时,但历史总是重要的,为了完整性,还是记录之前学习的基础,以便总结改进算法时能清晰的定位改进点,学习优化的思想。

此外在深度学习之前,目标检测领域最好的算法就是 DPM(Deformable parts models),简单提一下:

  • 利用了 SIFT 特征等,通过滑动窗口(sliding window)在图像中提出目标区域,然后 SVM 分类器来实现识别。
  • 针对目标物体多视角问题,采用多组件(Component)策略
  • 针对目标物体本身的形变,采用基于图结构(Pictorial Structure)的部件模型策略

后来,在深度学习的帮助下,目标检测任务有了一些进步。对于二维目标检测,主要任务为:

  • 识别,识别图片中的目标为何物
  • 定位,确定目标在图片中的位置,输出预测的边界框

结合识别精度和定位精度,在目标检测中用综合评价指标 mAP 描述模型的好坏;此外,在应用中必须考虑 detection 的实时性,模型在做 detection 时的处理器性能有限,不同于训练时可以用较好的显卡;但是往往 mAP 和实时性在一定程度上,存在对立,举个例子,对于同类型的深度神经网络结构,如果深度越深,一般模型最后达到的 mAP 更高,但深度越深,网络参数越多,实时性降低,有时候就需要在 mAP 和 FPS 之间 trade-off 一下,如果能同时的提升这两个指标,那就 nice 了。YOLO 网络出来的时候,精度不能算顶尖的,但是实时性绝对数一数二,对于很多追求实时性的应用是不错的选择,YOLO 在单 Pascal Titan X GPU上达到 45 FPS ,Tiny-yolo 150FPS,在改进的 YOLOv2, YOLOv3 实时性上稍有提升,在精度上有较大提升,成功挤进几个优秀的目标检测算法行列。

基于深度学习的目标检测算法可以分为两类:

  • Two stage Detection,以 RCNN 为代表,第一阶段由 selective search 生成大量 region proposals,即边界框,将取得的这些 proposal 通过 CNN (文中用的 AlexNet)来提取特征。第二阶段,分类器对上一阶段生成的边界框内的子图像分类,当然 RCNN 也有升级版的 Fast RCNN 和 Faster RCNN。
  • Unified Detection,以 YOLO 和 SSD 为代表,YOLO 直接采用 regression 的方法进行 bbox 的检测以及分类,使用一个 end-to-end 的简单网络,直接实现坐标回归与分类,如论文中的原图:

2. YOLO 如何实现


  • input 一幅图像,分成 SxS 个网格(grid cell),每个 grid cell 边长为单位 1,如果某个 object 的中心落在这个 grid cell 中,该 grid cell 就负责预测这个 object

  • 每个 grid cell 要预测 B 个 bboxes,及其置信度(confidence)

# Pr(object) = 1 bbox 包含 object, Pr(object) = 0 bbox 只包含背景
Pr(object) = bbox 的可能性

# ground-truth 和 predicted bbox 框框的交并比
IOU(truth,pred) = 预测框与实际框的 IOU  

# 定义 confidence 如下,因此置信度包含识别和定位两方面
define confidence = Pr(object)*IOU(truth,pred)

补充1:如何判断一个 grid cell 中是否包含 object 呢? 既一个 object 的 ground truth 的中心点坐标在一个grid cell中。

补充2:如果 grid cell 包含 object 中心时, Pr(object) = 1,那么 confidence = IOU(truth,pred)

  • 此外,YOLO 预测出的 bbox 包含 5 个值 (x, y, w, h, c),下图给出 S=3,图像 size 为 448x448 的例子。
(x, y) = bbox 的中心相对于 grid cell 左上角顶点的偏移值 (wrt. grid cell)
(w, h) = bbox 的归一化宽和高 (wrt. image)
c = confidence,等价于 IOU(truth,pred)
  • 每一个 grid cell 要预测出 C 个类别概率值,表示该 grid cell 在包含 object 的条件下属于某个类别的概率,即 Pr(class-i|object),测试时将该条件概率乘上每个 bbox 的 confidence,得到每个 bbox 属于某个类别的 conf.score(class-specific confidence score)。
class specific confidence score = Pr(classi|object)*confidence
				= Pr(classi|object)*Pr(object)*IOU(truth,pred)
                               = Pr(classi|object)*IOU(truth,pred)
  • 将上述所有预测的值 encode 到 tensor
tensor 的数量 = SxSx(B*5+C)

一幅图像 SxS 个 grid cell,每个 grid cell 预测 B 个 bbox,每个 bbox 包含 5 个值 (x,y,w,h,c),这样就有 SxSxB*5 个值;

另外,每个 grid cell 预测 C 个概率值,这样一幅图像就有 SxSxC 个值概率值;

如下图是 S=3,B=2,C=3 的时候

3. YOLO 网络结构


YOLO 的网络结构看起来比较简单,就像最基础的 CNN结构,卷积层,max 池化层,激活层,最后全连接层。

┌────────────┬────────────────────────┬───────────────────┐
│    Name    │        Filters         │ Output Dimension  │
├────────────┼────────────────────────┼───────────────────┤
│ Conv 17 x 7 x 64, stride=2224 x 224 x 64    │
│ Max Pool 12 x 2, stride=2112 x 112 x 64    │
│ Conv 23 x 3 x 192112 x 112 x 192   │
│ Max Pool 22 x 2, stride=256 x 56 x 192     │
│ Conv 31 x 1 x 12856 x 56 x 128     │
│ Conv 43 x 3 x 25656 x 56 x 256     │
│ Conv 51 x 1 x 25656 x 56 x 256     │
│ Conv 61 x 1 x 51256 x 56 x 512     │
│ Max Pool 32 x 2, stride=228 x 28 x 512     │
│ Conv 71 x 1 x 25628 x 28 x 256     │
│ Conv 83 x 3 x 51228 x 28 x 512     │
│ Conv 91 x 1 x 25628 x 28 x 256     │
│ Conv 103 x 3 x 51228 x 28 x 512     │
│ Conv 111 x 1 x 25628 x 28 x 256     │
│ Conv 123 x 3 x 51228 x 28 x 512     │
│ Conv 131 x 1 x 25628 x 28 x 256     │
│ Conv 143 x 3 x 51228 x 28 x 512     │
│ Conv 151 x 1 x 51228 x 28 x 512     │
│ Conv 163 x 3 x 102428 x 28 x 1024    │
│ Max Pool 42 x 2, stride=214 x 14 x 1024    │
│ Conv 171 x 1 x 51214 x 14 x 512     │
│ Conv 183 x 3 x 102414 x 14 x 1024    │
│ Conv 191 x 1 x 51214 x 14 x 512     │
│ Conv 203 x 3 x 102414 x 14 x 1024    │
│ Conv 213 x 3 x 102414 x 14 x 1024    │
│ Conv 223 x 3 x 1024, stride=27 x 7 x 1024      │
│ Conv 233 x 3 x 10247 x 7 x 1024      │
│ Conv 243 x 3 x 10247 x 7 x 1024      │
│ FC 1-4096              │
│ FC 2-7 x 7 x 30 (1470) │
└────────────┴────────────────────────┴───────────────────┘

对于这个网络结构,需注意到的一些点

  • 为什么最后的输出 size 为 7x7x30 ?因为文中 设置 S=7,B=2,C=20。SxSx(B*5+C)。那么我们需要调整到一个不同的 grid size 时,或者说我们的数据集 class 数量改变时,这时就需要调整 layer 的维度。
  • 这个是 YOLO 的 full 版本,如果想追求更高的检测速度,可以适当减少 conv 层 filter 的数量,或者删掉某些 conv 层,不建议对靠前的 conv 层进行操作,可能会丢掉很多 feature,调整了网络结构后,一定要计算最后的输出是否满足 SxSx(B*5+C)
  • 结构中的 1x1 和 3x3 的 conv. 层,启发来至于 GoogLeNet(Inception)。1x1 卷积的作用
  • 最后一层使用线性激活函数(现在还不太明白为什么最后一层用 f(x)=x 的线性激活?),其他层用 leaky RELU 激活函数。
// darknet activations.h 源码中定义的这两个激活函数
static inline float linear_activate(float x){return x;}
static inline float leaky_activate(float x){return (x>0) ? x : .1*x;}

4. YOLO 损失函数


在理解 YOLO 损失函数之前先思考,目标检测的任务是识别和定位,因此损失函数的设计也是围绕定位误差识别误差来展开,YOLO 模型输出的预测值是 bbox 的坐标 (x, y, w, h) 及置信度(confidence)和对应类别 (class),其中

(x, y, w, h, confidence) 对应定位预测,更细分的话 (x, y, w, h)对应坐标预测
(class) 对应类别预测

YOLO 中采用 sum-squared error 来计算总的 loss,具体如下:

  • part 1,坐标预测产生的 loss。

    其中 ? obj 定义如下:

    ? obj = 1,grid cell i 中包含一个 object 的中心,该 grid cell 中第 j 个预测的 bbox 负责这个 object

    ? obj = 0,otherwise (grid cell i 不包含 object,或者 包含 object,但没有没有预测的 bbox)

    取较大的权重,λ noobj = 5(具体要根据数据集),因为有很多 grid cell 中没有 object,在 part3 中会计算 confidence 的 loss,累计起来可能导致,没有 object 的 grid cells 产生的 loss,比有 object 的 grid cells 产生的 loss 对梯度贡献更大,造成网络不稳定发散。

YOLO 预测每个 grid cell 时可能有多个 bbox。 在训练时,YOLO 只希望一个 bbox 负责 grid cell 对应的 object。 如何只取一个?计算该 grid cell 对应的所有预测的 bbox 与 ground-truth 计算IOU,获得最大 IOU 的那个预测 bbox 成为责任重大的那一个 。为何 w, h 时带根号,文中解释是为了强调 在 large box 产生小的偏差 比 在 small box 产生的偏差 影响要小

  • part 2part 3,confidence 预测产生的 loss。

    其中 ? obj 定义如下:

    ? obj = 1,grid cell i 对应预测的 bbox 中包含 object

    ? obj = 0,otherwise

    ? noobj,与之相反,当 bbox 不包含 object 时,预测的 confidence=0

    因为大部分 bbox 可能没有 object,造成 part2, part3 两部分的 loss 不平衡,因此在 part3 中增加一个更小的权重 λ noobj = 0.5(具体要根据数据集),part2 中则保持正常权重 1

  • part 4, 类别预测产生的 loss。

    ? obj = 1,有 object 中心落在 grid cell i 中

    ? obj = 0,otherwise

    注意这部分并没有惩罚 gridcell 中没有 object 的情况

5. YOLO 训练


这部分后面补充 YOLOv2,YOLOv3 的训练链接在这,训练 YOLOv1 已经没有太多意义。

6. YOLO detection 过程


这部分参考一个很好的 YOLO ppt

以 S = 7,B =2,C=20 为例,既 grid cell 7x7,每个 grid cell 预测 2 个 bboxes,一共有 20 个 classes.

  • 首先直接看 YOLO 模型的输出,如下图,最后输出 7x7x30,grid cell 是 7x7,然后每个 grid cell 要对应 30 个值,前面 10 个 对应 2 个 bboxes 的(x, y, w, h, c),后面 20 个对应 20 个类别的条件概率,将 置信度 与条件概率得到 confidence score。每一个 bbox 对应 20x1 的 confidence score.
  • 遍历所有的 grid cell 就可以的到,如下图。
  • 对预测的 bbox 进行筛选。

    将 score 小于 某个阈值的置0。

    然后根据 score 进行将序排序

    然后用 NMS 进一步筛选掉多余的 bbox.

7. 总结


当时,YOLO 算法与其他 state-of-the-art 的对比

当 R-CNN,Fast R-CNN,Faster R-CNN 等算法一统江湖的时候,要想突出重围,不一定要全面压制,例如 YOLO 系列和 SSD 系列等在实时性上实现了压制,虽然精度上略逊一筹,同样得到了众多目标检测研究者或工作者的青睐。此外,能够看到一个系列的算法一步步优化,很 nice,例如 R-CNN 发展到了 Faster R-CNN,Mask R-CNN等,YOLO 到了 YOLO v3,最重要的还是学习算法优化的思想,多思考。

后面想补充的博客:

  1. R-CNN 系列
  2. SSD 系列,算法原理及实现
  3. YOLOv2, YOLOv3,算法原理以及实现
  4. 深度学习框架

links


others

2017-02-18 21:20:36 JacobKong 阅读数 3601
  • YOLO实战视频教程

    YOLO实战视频培训课程概况:本教程无需深度学习经验,是初级教程,无需高配置机器,能上网就能实践,本课程分享图像标注软件的使用,讲述了如何练好自己的模型,并将模型发布到服务或是移到android使用

    5583 人正在学习 去看看 黄彬彬

Abstract

  • 之前的物体检测的方法是使用分类器来进行检测。
  • 相反,本论文将对象检测作为空间分离的边界框和相关类概率的回归问题。
  • 本论文的YOLO模型能达到45fps的实时图像处理效果。
  • Fast YOLO:小型的网络版本,可达到155fps。
  • 与目前的检测系统相比,YOLO会产生更多的定位错误,但是会更少的去在背景中产生false positive。

Introduction

  • DPM: use a sliding window approach where the classifier is run at evenly spaced locations over the entire image.

  • R-CNN: use region proposal methods to first generate potential bounding boxes in an image and then run a classifier on these proposed boxes. 具有slowhard to optimize的缺点。

  • 本论文将目标检测问题重新组织成single regression problem. 从图像像素转为bounding box coordinatesclass probabilities.

  • YOLO框架:

    • A single convolutional network simultaneously predicts multiple bounding boxes and class probabilities for those boxes.
    • YOLO trains on full images and directly optimizes detection performance.
  • YOLO模型的优势:

    • First, YOLO is extremely fast.
    • regression problem.
    • no batch processing on a Titan X.
    • Second, YOLO reasons globally about the image when making predictions.
    • YOLO makes less than half the number of background errors compared to Fast R-CNN.
    • Third, YOLO learns generalizable representations of objects.
  • YOLO在准确性方面依旧落后与其他先进的检测系统,但是可以快速的标注图片中的物体,特别是小物体。

Unified Detection

  • 本论文将物体检测中单独的组件统一到一个单一的神经网络中。网络利用整个图像的各个特征来预测每一个BB。而且同时为一张图片中所有的类预测所用的BB。

  • YOLO可以end-to-end来训练,而且能在保持高平均准确率的同时达到实时要求

  • 系统将输入图片分为SS的网格单元。如果物体的中心落入某个格子,那么这个格子将会用来检测这个物体。

  • 每个网格单元会预测B个bounding box以及这些框的置信值。

  • 每个bounding box会有5个预测值:x,y,w,h和置信值confidence,confidence=Pr(Object)IOUtruthpred.

  • 每个网格单元也预测C个条件类概率,Pr(Classi|Object)在一个网格单元包含一个物体的前提下,它属于某个类的概率。我们只为每个网格单元预测一组类概率,而不考虑框B的数量。

  • 在测试的时候,通过如下公式来给出对某一个box来说某一类的confidence score:

    Pr(Classi|Object)Pr(Object)IOUtruthpred=Pr(Classi)IOUtruthpred

  • Model示例:

    每个grid cell预测B个bounding boxes,每个框的confidence和C个类概率。

Network Design

  • YOLO网络结构图:

  • 起初的卷积层用来从图像中提取特征。

  • 全连接层用来预测输出的概率和坐标。

  • 24个卷积层,之后跟着2个全连接层

  • 最终输出是7 x 7 x 30的张量。

  • Fast YOLO和YOLO之间所有的训练和测试参数一样。

  • 在ImageNet上进行卷积层的预训练。

Training

  • 在ImageNet上预训练卷积层。预训练前20层卷积层,之后跟随者一个average-pooling layer和一个fully connected layer.

  • 将预训练的模型用来检测,论文Ren et al.显示给与训练好的模型添加卷积和连接层能够提高性能。所以添加了额外的4个卷积层和2个全连接层,其权值随机初始化。

  • 将像素从224x224提升到448x448。

  • 最后一层同时预测class probabilities和bounding box coordinates. 其中涉及到BB的长宽规范化。

  • 由于sum-squared error的缺点,增加边界框坐标预测的损失,并减少对不包含对象的框的置信度预测的损失。

  • large boxes中的偏差matter less than 与small boxes中的偏差。

  • YOLO为每一个网格单元预测多个BB,但是在测试期间,我们只想每一个物体有一个BB预测框来做响应,我们选择具有最高IOU的BB来作为响应框。

  • 总的loss function:

  • 135 epochs

  • batch size:64

  • 动量:0.9

  • decay:0.0005

  • 为防止过拟合,我们使用dropout和extensive data augmentation技术。

Inference

  • 在测试图像中预测检测只需要一个网络评估,与一般的classifier-based methods不同。
  • Non-maximal suppression可以用来修复multiple detections。

Comparison to Other Detection Systems

  • 检测流水线往往开始于提取健壮特征集(Haar, SIFT, HOG, convolutional features),然后分类器或者定位器用来识别特征空间的物体,这些分类器或者定位器往往在整个图像上或者在图像的子区域中滑动窗口。
  • 与DPM的比较。
  • 与R-CNN的比较。每个图片值预测98个bounding boxes。
  • 与其他快速检测器的比较。相比于单类检测器,YOLO可以同时检测多种物体。
  • 与Deep MultiBox的比较。YOLO是一个完整的检测系统。
  • 与OverFeat的比较。OverFeat是一个disjoint的系统,OverFeat优化定位,而非检测性能。需要大量的后处理。
  • 与MultiGrasp的比较。执行比目标检测更简单的任务。

2019-01-23 09:08:58 chenleiyfk 阅读数 841
  • YOLO实战视频教程

    YOLO实战视频培训课程概况:本教程无需深度学习经验,是初级教程,无需高配置机器,能上网就能实践,本课程分享图像标注软件的使用,讲述了如何练好自己的模型,并将模型发布到服务或是移到android使用

    5583 人正在学习 去看看 黄彬彬

       这个算是深度学习的一个工程应用吧。

       首先呢,选择一个深度学习的框架,可以从你熟悉的编程语言下手,目前主流的几个框架支持的语言也挺多的,所以语言基本上不再是限制你的因素了,之前的一篇博文https://blog.csdn.net/chenleiyfk/article/details/64930082,可做参考,不过写得有点早了,近一年多的时间变化还是很大的。对于工程应用来说,找一个易于固化且又持续发展的架构,节省开发成本且又易用的,这得根据你自己项目的实际需求来定了。

       其次呢,深度学习嘛,数据集是少不了的了,目前开源的各方面数据集都不少,有的是可以直接使用拿来主义的,但最好的还是使用应用场景下的实际数据,也就是采集实际的数据制作数据集。

       最后,就是将两者结合,进行符合框架要求的数据集格式的制作和神经网络参数的训练测验调优。

 

1、深度学习框架

       这里我选择了darknet-yolo,原因呢主要是对C/C++支持的非常到位,一个纯低层语言实现的黑暗网络,且此网络在近些年来表现不俗。有关它的介绍网络上一大把的,github上的也不少,在此就不过多介绍了。只做个简单总结吧:

       darknet作为一个较为轻型的完全基于C与CUDA的开源深度学习框架,易安装,没有任何依赖项(OpenCV都可以不用),移植性好,支持CPU与GPU两种计算方式。相比于其它的深度学习框架来说,darknet并没有那么强大,不过确实简单啊:a.完全由C语言实现,没有任何依赖项,当然可以使用OpenCV,但只是为了更好的可视化;b.支持CPU(所以没有GPU也不用紧的)与GPU(CUDA/cuDNN,使用GPU当然更好了),个人强烈建议训练时要用GPU哈;c.因为轻型,所以灵活,适合用来研究底层,可以更为方便的从底层对其进行改进与扩展。

       不过对于这个黑暗网络基于主流的如TensorFlow架构也有实现的版本,且不仅限于C语言的,github上搜索下,一定会找到你想要的。我是基于https://github.com/pjreddie/darknethttps://github.com/AlexeyAB/darknet做的,Windows和Linux任你选。这里有打包好的可以直接使用的程式,仅仅需要自己做数据集就可以训练了,再次建议使用GPU,不过只需要你装好驱动即可。下载地址https://download.csdn.net/download/chenleiyfk/10932915。cublas64_80.dll、cudart32_80.dll、cudart64_80.dll、cudnn64_5.dll、cufft64_80.dll、cufftw64_80.dll这些库没有集成进这个训练工具中,因为大了上传不了,谁需要私我就行。

 

       框架选择了,熟悉了,知道基于此框架训练要准备的数据格式了,下面这个数据集其实花费精力不亚于框架的学习啊。

 

2、数据集的制作

      这里看你工程需要了,数据集我是自己制作的,根据监控摄像头拍下的车牌照片,这里建议一定要根据应用场合制作数据集,不然你的效果不会很理想且基本上是达不到实际的工程应用价值的,仅仅是玩玩而已。

       我大致收集了5000余张车牌的照片,另又准备了近万张的图片进行测试,标注是一个很大的工程,只要记住你在教一个小学生,他学的好与坏教材和老师是很关键的因素,当然,其自身能力也很关键哈(黑暗网络本身潜力无限啊)。这里我使用了两个工具用来标注我的照片,https://github.com/tzutalin/labelImghttps://github.com/AlexeyAB/Yolo_mark,前者有源码和相应的发布版,不限操作系统的,后者也不限操作系统,但只有源码,这里有我编译构建好的https://download.csdn.net/download/chenleiyfk/10933121

       labelImg可以制作两种格式的标签voc和yolo,我是做的yolo格式,当然格式之间互相转换的脚本也比比皆是,自己看着网上的改吧改吧就行了,谁需要私我就行。

 

3、darknet-yolo的训练

       工具有了,数据有了,接下来训练darknet-yolo的神经网络权重就行了。对于车牌识别来说,应用环境相对没那么复杂,图像质量都较好,使用yolo-tiny就可以了,网络小速度快,且看下面的步骤(以本人制作的训练工具集为例):

       1. 将准备好的数据和标签放在同一个目录中,并将数据集分为训练和验证两部分,这里主要考虑可以将图片train.txt路径设置好。

       2. 文件*.data配置相关的路径和类别的数目,数目就是要检测多少类目标,路径涉及到训练图片和权重保存等路径。

       3. 文件*.names配置类别的名字,车牌识别车牌、数字、字母、省份简称加上特殊类的。

       4. 文件*.cfg,涉及神经网络的训练参数,

           batch=64  subdivisions=16 根据机子的配置,高配机子subdivisions可调小
           把每个`[yolo]`层下面的classes的值改为识别的类别数  
           把每个`[yolo]`层上面的[convolutional]下面的filters改为filters=(classes + 5)x3 
           但是如果`classes=1` 则`filters=18`. `classes=2` 则 `filters=21`.
       5. 训练和验证

           yolov3-tiny.conv.15为预加载权重
          ./darknet_gpu.exe detector train ./*.data ./*.cfg ./yolov3-tiny.conv.15
          若中途终端可接着训练,在backup中找到完整的最后一个保存的权重参数作为 预加载权重
          ./darknet_gpu.exe detector train ./*.data ./*.cfg ./backup/*.weights
     

         ./darknet_gpu.exe detector recall ./*.data ./*.cfg ./backup/*.weights 或者
         ./darknet_gpu.exe detector test ./*.data ./*.cfg ./backup/*.weights -i 0 -thresh 0.25 *.jpg -ext_output
   
   可以在以上命令后加上 > train.log保存训练时的中间参数
   参数说明:
   IOU: 小数或者百分数      这个是预测出的bbox和实际标注的bbox的交集 除以 他们的并集。显然,这个数值越大,说明预测的结果越好。
   Recall: 小数或者百分数   这个表示平均召回率, 意思是检测出物体的个数除以标注的所有物体个数。这个数值越大,说明检测率越好。

2018-04-19 19:16:06 qq_41185868 阅读数 6490
  • YOLO实战视频教程

    YOLO实战视频培训课程概况:本教程无需深度学习经验,是初级教程,无需高配置机器,能上网就能实践,本课程分享图像标注软件的使用,讲述了如何练好自己的模型,并将模型发布到服务或是移到android使用

    5583 人正在学习 去看看 黄彬彬

YOLO学习

阅读数 17

没有更多推荐了,返回首页