返回目录:范文示例
今天小编给各位分享250pp页面升级的知识,文中也会对其通过YOLO界再起波澜!mAP 51.4,149FPS,目标检测,一个就够了和目标检测算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)等多篇文章进行知识讲解,如果文章内容对您有帮助,别忘了关注本站,现在进入正文!
内容导航:
一、YOLO界再起波澜!mAP 51.4,149FPS,目标检测,一个就够了
机器之心发布
作者:百度飞桨团队
百度飞桨团队发布了 PP-YOLOE,与其他 YOLO 系列算法相比,其具有更强的性能、更丰富灵活的配置方案以及更全硬件支持三大优势。
此前,机器之心报道过的 PaddleDetection 项目再次升级,发布了全新进化版 YOLO 模型——PP-YOLOE,并再次以极佳的性能表现刷新业界性能榜单指标,在目标检测领域引起了广泛关注。
论文地址:https://arxiv.org/abs/2203.16250项目地址:https://github.com/PaddlePaddle/PaddleDetection相较于其他 YOLO 系列算法,PP-YOLOE 主要有以下三大优势:
更强性能:PP-YOLOE 的 s/m/l/x 全系列四个尺寸在精度及速度方面均超越其他同体量算法。详细数据如图 1 所示,其中 PP-YOLOE-l 在 COCO test-dev 上精度可达 51.4%,在 V100 上使用 TRT FP16 进行推理,速度可达 149FPS,相较于YOLOX-l[4]精度提升 1.3 AP,速度提升 24.96%;相较于YOLOv5-x[5]精度提升 0.7AP,TRT-FP16 加速 26.8%;相较于PP-YOLOv2[6]精度提升 1.9 AP,速度提升 13.35%。
图 1 PP-YOLOE 各尺寸模型性能与其他模型对比示意图
更丰富灵活的配置方案:PP-YOLOE 不仅提供 4 种固定尺寸,且支持开发者灵活地定制化配置更多尺寸;顺畅支持包括模型量化、剪枝和蒸馏在内丰富的模型优化策略,满足实际产业场景中速度和精度的极致追求;全面高质量支持包括 TensorRT 和 OpenVINO 在内的加速库,还提供一键转出 ONNX 格式,可顺畅对接 ONNX 生态。
更全硬件支持:PP-YOLOE 在结构设计上避免使用 DCN、Matrix NMS 等不易部署的算子,使其可以方便地部署到不同的硬件当中。当前已经完备支持 NVIDIA V100、T4 这样的云端 GPU 架构以及如 Jetson 系列等边缘端 GPU 设备。
PP-YOLOE 关键技术改进点深入解读
PP-YOLOE 相较前几代 YOLO 算法的性能提升主要源于以下三点改进:
1. 新颖、统一的 Backbone 和 Neck 设计,更方便灵活配置多种尺寸。
2. 引入了更高效的标签分配策略 TAL(Task Alignment Learning)的动态匹配策略,解决了目标检测任务中常见的分类回归不均衡难题,提高检测精度。
3. 设计了更简洁的 ET-Head(Efficient Task-aligned Head),以少量的速度损失为代价提升了精度。
图 2 PP-YOLOE 模型结构示意图
下面展开详细介绍。
可扩展的 Backbone 和 Neck
以 ResNet 为代表的残差连接网络和以 DenseNet 为代表的密集连接网络在现代卷积神经网络中被广泛应用。主要是因为残差连接可以作为一种模型集成的方法,解决了梯度消失问题;密集连接融合则具有不同感受野的中间层特征,在目标检测等任务上表现出了良好的性能。综合以上两种结构的特点,飞桨团队设计了 RepResBlock 结构,并用于 PP-YOLOE 的 Backbone 和 Neck 中。
重新设计 Backbone 和 Neck 的初衷之一是在利用密集连接中的特征复用和多感受野融合等优势的同时,避免巨大的内存访问成本 (Memory Access Cost,MAC) 所导致的速度下降等劣势。为此主要通过以下三步核心设计实现:
为了减少内存访问带来的开销,首先借鉴了TreeNet[1]中的 TreeBlock 并将其简化成如上图中的 (a) 所示的形式,在最小化 block 的同时保留了特征复用和多感受野融合的特点。由于直接堆叠简化版的 TreeBlock 仍然会带来巨大的内存访问成本,因此需要对 TreeBlock 中各卷积分支解耦,将 concat 操作替换成 elementwise_add 操作,得到 RepResBlock 来实现重参数化,进一步优化网络结构。训练时网络结构如上图 (b) 所示,在部署时则可以被重参数化为如上图 (c) 所示的形式。这样在训练时既可增强模型的表征能力,在部署时也不会引入额外的计算量。堆叠的 RepResBlock 与 CSP 结构结合组成了 CSPRepResStage。CSP 结构去除了冗余的 3x3 卷积,从而避免了巨大的参数量和计算量,使得模型在推理时更加高效。同时,ESE(Effective Squeeze and Extraction)也被引入 CSPRepResStage 以施加通道注意力,进一步提升特征表示能力。图 3 RepResBlock 和 CSPRepResStage 结构示意图
重新设计 Backbone 和 Neck 的初衷之二是为了更方便地缩放模型尺寸,以适配不同算力的硬件。因此,需要统一 Backbone 和 neck 中的模块:
使用 CSPRepResStage 搭建 Backbone。与 ResNet 类似,PP-YOLOE 使用 3 个堆叠的卷积组成的 stem 结构以及 4 个 CSPRepResStage。在 Neck 方面沿用了 PAN 的结构,由 5 个 CSPRepResStage 组成,与 Backbone 不同的是,Neck 中移除了 ESE 以及 RepResBlock 中的残差连接。最终经过重新设计的 Backbone 和 Neck 相较于 PP-YOLOv2 中的结构精度提升 0.7AP, 速度也大幅提升。
更高效的标签分配策略 TAL (Task Alignment Learning)
标签分配是指在目标检测训练的过程中,将 ground truth 分配给 anchor box 或者 anchor point 以得到正例和负例进行监督学习。目标检测中的标签分配策略通常可以分为静态匹配和动态匹配两种:
静态匹配是指不依赖网络的输出,根据 ground truth 和 anchor 的 IoU 或者位置关系进行匹配,如 ATSS、YOLOv3 中的匹配策略等。动态匹配是根据网络的输出来分配正例,如 SimOTA、TAL 等。TAL 设计了综合分类任务和回归任务的指标对 ground truth 进行分配,并依据这一指标来计算 loss 以及调整 loss 的权重,使得分类和回归任务的学习产生交互,达到了对齐分类和回归任务的效果。由于目标检测任务包含分类和回归两个子任务,但这两个子任务的学习往往不存在交互,因此会导致分类和回归任务在预测上存在不一致的问题。具体表现为一些定位准确、分类置信度不高的预测框,被定位不准确、分类置信度高的预测框抑制。
在之前版本的PP-YOLOv1/v2[6][7]中是使用 IoU Aware 的方式,依据 IoU 和分类预测分数的综合指标作为 NMS 的置信度来缓解这一问题。但分类任务和回归任务的学习依然是相互独立的,为了更好地解决不一致问题,PP-YOLOE 中引入了 TOOD 中的 TAL(Task Alignment Learning)这一标签分配策略来对齐分类和回归任务。
飞桨团队在基线模型上分别对 ATSS、SimOTA 和 TAL 进行了实验探索,可以看到 TAL 得到了最优的精度表现。在引入了 TAL 之后,模型也得到了 0.9AP 的大幅提升。
表 1 不同标签分配策略在 base 模型上的效果
更简洁有效的 ET-Head (Efficient Task-aligned Head)
由于分类和回归任务需要的特征往往不完全相同,为了同时得到任务通用和任务特有的特征,PP-YOLOE 中引入了TOOD[2]中提出的针对分类任务和回归任务对齐的 T-Head (Task-aligned Head),并对其进行了改进。
图 4 ET-Head 结构示意图
ET-Head 具体结构如上图所示,相较于原始的 T-Head 在网络结构上主要进行了以下四点改进:
移除了 T-Head 中耗时的任务交互特征模块;在精度无损的条件下,将通道注意力模块简化成了更加高效的 ESE block;将分类任务对齐模块简化成了 shortcut,进一步提升了速度;针对 T-Head 中复杂且对部署不友好的回归任务对齐模块,通过借鉴 GFL[3]中的积分模块来建模检测框。为了进一步提升模型性能,在损失函数方面,则主要进行了以下两点改进:
采用 VFL(varifocal loss)作为分类 loss,VFL 使用 IACS(IoU-aware classification score)作为 target,使得模型可以学习到 classification score 和 IoU score 的联合分布;采用 DFL(Distribution Focal Loss)来监督积分模块的学习,和 GIoU Loss 相结合共同监督回归任务的学习。经过改进的 ET-Head,使模型取得了 0.5AP 的精度提升,最终模型在 COCO val 上达到了 50.9mAP 的精度,在 V100 上达到了 78.1FPS。
经过以上优化,PP-YOLOE-s/m/l/x 四个模型均在 COCO 2017 test-dev 取得了卓越的表现,具体对比结果如下图所示:
表 2:不同模型在 COCO 2017 test-dev 上的速度和精度比较
PaddleDetection 型产业级特色 PP 系列模型
除了 PP-YOLOE, PaddleDetection 还发布了轻量级 SOTA 目标检测算法 PP-PicoDet[9],成为边缘、低功耗硬件部署的最佳选择。同时在目标检测的基础上,持续拓展了如人体关键点、目标跟踪、人体属性分析、行为识别等高阶任务功能。有需求的用户可以到 Github 了解更多:
项目地址:https://github.com/PaddlePaddle/PaddleDetection
(1)PP-PicoDet[9]:0.7M,250FPS 超轻量目标检测算法,是业界首个 1M 内,且实现精度 mAP(0.5:0.95)超越 30 +的算法,且部署友好,被广泛应用在端侧场景。
图 5 PP-PicoDet 实际效果展示
(2)PP-TinyPose:122FPS、51.8mAP 超轻量关键点算法,精准实现人机交互任务,如手势控制、智能健身、体感游戏等。
图 6 PP-TinyPose 实际效果展示
(3)PP-Tracking:覆盖多类别跟踪、跨镜跟踪、流量统计等功能与应用目标跟踪系统,适用于智慧交通、安防监控等多个场景。
图 7 PP-Tracking 实际效果展示
(4)PP-Human:综合了目标检测、跟踪、关键点检测等核心能力的产业级开源实时行人分析工具,拥有人体属性分析、行为识别与流量计数与轨迹留存三大能力。
图 8 PP-Human 实际应用及效果示意图
面向产业需求的统一设计理念和极致的开发体验
以上提及的所有模型,均具有统一的使用方式及部署策略,不再需要进行模型转化、接口调整,更贴合工业大生产标准化、模块化的需求。
在模型优化方面,基于飞桨模型压缩工具库 PaddleSlim,能够快速实现模型小型化。PaddleDetection 提供剪裁、蒸馏、离线量化和量化训练等模型压缩策略,以及完整教程和 Benchmark。包含YOLOv3[8]、PP-PicoDet[9]、PP-YOLOE 等模型预测速度均有提升。
在部署方面,除了可以通过飞桨原生推理库 Paddle Inference 快速完成在服务端 GPU 或 ARM CPU 等硬件上的高性能加速部署,还可一键导出为 ONNX 格式,顺畅对接 ONNX 生态。
同时还有以下方式可供选择:
移动端 / 边缘端部署:基于飞桨轻量化推理引擎 Paddle Lite,可快速完成 20+ AI 加速芯片的适配,并支持 OpenVino 加速。PaddleDetection 推出的一系列轻量化模型,例如 PP-PicoDet[9], PP-TinyPose 均可以使用 Paddle Lite 部署在 ARM CPU、移动端 GPU、NPU 等嵌入式或 IoT 设备上。服务化部署:基于飞桨服务化部署引擎 Paddle Serving,可以实现高性能、灵活易用的工业级在线推理服务。提供多种异构硬件和多种操作系统环境下推理解决方案。云上飞桨 PaddleCloud:面向飞桨框架及其模型套件的部署工具箱,支持 Docker 化部署和 Kubernetes 集群部署两种方式,满足不同场景与环境的部署需求。以上所有代码实现,均在 PaddleDetection 飞桨目标检测开发套件中开源提供:
飞桨 PaddleDetection 项目地址:
GitHub: https://github.com/PaddlePaddle/PaddleDetectionGitee: https://gitee.com/paddlepaddle/PaddleDetection想了解更多内容,可以参考飞桨官网:
官网地址:https:///PaddlePaddle/Paddle
Gitee: https://gitee.com/paddlepaddle/Paddle
论文引用:
[1] Lu Rao. Treenet: A lightweight one-shot aggregation convolutional network. arXiv preprint arXiv:2109.12342, 2021. 2
[2] Chengjian Feng, Yujie Zhong, Yu Gao, Matthew R Scott, and Weilin Huang. Tood: Task-aligned one-stage object detection. In Proceedings of the IEEE/CVF International Conference on Computer Vision, pages 3510–3519, 2021. 3, 4
[3] Xiang Li, Wenhai Wang, Lijun Wu, Shuo Chen, Xiaolin Hu, Jun Li, Jinhui Tang, and Jian Yang. Generalized focal loss: Learning qualified and distributed bounding boxes for dense obje
[4] Zheng Ge, Songtao Liu, Feng Wang, Zeming Li, and Jian Sun. Yolox: Exceeding yolo series in 2021. arXiv preprint arXiv:2107.08430, 2021. 1, 2, 4, 5
[5] glenn jocher et al. yolov5. https://github.com/ultralytics/yolov5, 2021. 1, 2, 3, 5, 6
[6] Xin Huang, Xinxin Wang, Wenyu Lv, Xiaying Bai, Xiang Long, Kaipeng Deng, Qingqing Dang, Shumin Han, Qiwen Liu, Xiaoguang Hu, Dianhai Yu, Yanjun Ma, and Osamu Yoshie. Pp-yolov2: A practical object detector, 2021. 1, 2, 5
[7] Xiang Long, Kaipeng Deng, Guanzhong Wang, Yang Zhang, Qingqing Dang, Yuan Gao, Hui Shen, Jianguo Ren, Shumin Han, Errui Ding, and Shilei Wen. Pp-yolo: An effective and efficient implementation of object detector. arXiv preprint arXiv:2007.12099, 2020. 1, 5
[8] Joseph Redmon and Ali Farhadi. Yolov3: An incremental improvement. arXiv preprint arXiv:1804.02767, 2018. 1, 2,3
[9]Yu G, Chang Q, Lv W, et al. PP-PicoDet: A Better Real-Time Object Detector on Mobile Devices[J]. arXiv preprint arXiv:2111.00902, 2021.
一、目标检测算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)
深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理。 目标检测可以理解为是物体识别和物体定位的综合 ,不仅仅要识别出物体属于哪个分类,更重要的是得到物体在图片中的具体位置。2014年R-CNN算法被提出,基本奠定了two-stage方式在目标检测领域的应用。它的算法结构如下图
算法步骤如下:
R-CNN较传统的目标检测算法获得了50%的性能提升,在使用VGG-16模型作为物体识别模型情况下,在voc2007数据集上可以取得66%的准确率,已经算还不错的一个成绩了。其最大的问题是速度很慢,内存占用量很大,主要原因有两个
针对R-CNN的部分问题,2015年微软提出了Fast R-CNN算法,它主要优化了两个问题。
R-CNN和fast R-CNN均存在一个问题,那就是 由选择性搜索来生成候选框,这个算法很慢 。而且R-CNN中生成的2000个左右的候选框全部需要经过一次卷积神经网络,也就是需要经过2000次左右的CNN网络,这个是十分耗时的(fast R-CNN已经做了改进,只需要对整图经过一次CNN网络)。这也是导致这两个算法检测速度较慢的最主要原因。
faster R-CNN 针对这个问题, 提出了RPN网络来进行候选框的获取,从而摆脱了选择性搜索算法,也只需要一次卷积层操作,从而大大提高了识别速度 。这个算法十分复杂,我们会详细分析。它的基本结构如下图
主要分为四个步骤:
使用VGG-16卷积模型的网络结构:
卷积层采用的VGG-16模型,先将PxQ的原始图片,缩放裁剪为MxN的图片,然后经过13个conv-relu层,其中会穿插4个max-pooling层。所有的卷积的kernel都是3x3的,padding为1,stride为1。pooling层kernel为2x2, padding为0,stride为2。
MxN的图片,经过卷积层后,变为了(M/16) x (N/16)的feature map了。
faster R-CNN抛弃了R-CNN中的选择性搜索(selective search)方法,使用RPN层来生成候选框,能极大的提升候选框的生成速度。RPN层先经过3x3的卷积运算,然后分为两路。一路用来判断候选框是前景还是背景,它先reshape成一维向量,然后softmax来判断是前景还是背景,然后reshape恢复为二维feature map。另一路用来确定候选框的位置,通过bounding box regression实现,后面再详细讲。两路计算结束后,挑选出前景候选框(因为物体在前景中),并利用计算得到的候选框位置,得到我们感兴趣的特征子图proposal。
卷积层提取原始图像信息,得到了256个feature map,经过RPN层的3x3卷积后,仍然为256个feature map。但是每个点融合了周围3x3的空间信息。对每个feature map上的一个点,生成k个anchor(k默认为9)。anchor分为前景和背景两类(我们先不去管它具体是飞机还是汽车,只用区分它是前景还是背景即可)。anchor有[x,y,w,h]四个坐标偏移量,x,y表示中心点坐标,w和h表示宽度和高度。这样,对于feature map上的每个点,就得到了k个大小形状各不相同的选区region。
对于生成的anchors,我们首先要判断它是前景还是背景。由于感兴趣的物体位于前景中,故经过这一步之后,我们就可以舍弃背景anchors了。大部分的anchors都是属于背景,故这一步可以筛选掉很多无用的anchor,从而减少全连接层的计算量。
对于经过了3x3的卷积后得到的256个feature map,先经过1x1的卷积,变换为18个feature map。然后reshape为一维向量,经过softmax判断是前景还是背景。此处reshape的唯一作用就是让数据可以进行softmax计算。然后输出识别得到的前景anchors。
另一路用来确定候选框的位置,也就是anchors的[x,y,w,h]坐标值。如下图所示,红色代表我们当前的选区,绿色代表真实的选区。虽然我们当前的选取能够大概框选出飞机,但离绿色的真实位置和形状还是有很大差别,故需要对生成的anchors进行调整。这个过程我们称为bounding box regression。
假设红色框的坐标为[x,y,w,h], 绿色框,也就是目标框的坐标为[Gx, Gy,Gw,Gh], 我们要建立一个变换,使得[x,y,w,h]能够变为[Gx, Gy,Gw,Gh]。最简单的思路是,先做平移,使得中心点接近,然后进行缩放,使得w和h接近。如下:
我们要学习的就是dx dy dw dh这四个变换。由于是线性变换,我们可以用线性回归来建模。设定loss和优化方法后,就可以利用深度学习进行训练,并得到模型了。对于空间位置loss,我们一般采用均方差算法,而不是交叉熵(交叉熵使用在分类预测中)。优化方法可以采用自适应梯度下降算法Adam。
得到了前景anchors,并确定了他们的位置和形状后,我们就可以输出前景的特征子图proposal了。步骤如下:
1,得到前景anchors和他们的[x y w h]坐标。
2,按照anchors为前景的不同概率,从大到小排序,选取前pre_nms_topN个anchors,比如前6000个
3,剔除非常小的anchors。
4,通过NMS非极大值抑制,从anchors中找出置信度较高的。这个主要是为了解决选取交叠问题。首先计算每一个选区面积,然后根据他们在softmax中的score(也就是是否为前景的概率)进行排序,将score最大的选区放入队列中。接下来,计算其余选区与当前最大score选区的IOU(IOU为两box交集面积除以两box并集面积,它衡量了两个box之间重叠程度)。去除IOU大于设定阈值的选区。这样就解决了选区重叠问题。
5,选取前post_nms_topN个结果作为最终选区proposal进行输出,比如300个。
经过这一步之后,物体定位应该就基本结束了,剩下的就是物体识别了。
和fast R-CNN中类似,这一层主要解决之前得到的proposal大小形状各不相同,导致没法做全连接。全连接计算只能对确定的shape进行运算,故必须使proposal大小形状变为相同。通过裁剪和缩放的手段,可以解决这个问题,但会带来信息丢失和图片形变问题。我们使用ROI pooling可以有效的解决这个问题。
ROI pooling中,如果目标输出为MxN,则在水平和竖直方向上,将输入proposal划分为MxN份,每一份取最大值,从而得到MxN的输出特征图。
ROI Pooling层后的特征图,通过全连接层与softmax,就可以计算属于哪个具体类别,比如人,狗,飞机,并可以得到cls_prob概率向量。同时再次利用bounding box regression精细调整proposal位置,得到bbox_pred,用于回归更加精确的目标检测框。
这样就完成了faster R-CNN的整个过程了。算法还是相当复杂的,对于每个细节需要反复理解。faster R-CNN使用resNet101模型作为卷积层,在voc2012数据集上可以达到83.8%的准确率,超过yolo ssd和yoloV2。其最大的问题是速度偏慢,每秒只能处理5帧,达不到实时性要求。
针对于two-stage目标检测算法普遍存在的运算速度慢的缺点, yolo创造性的提出了one-stage。也就是将物体分类和物体定位在一个步骤中完成。 yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式, yolo可实现45帧每秒的运算速度,完全能满足实时性要求 (达到24帧每秒,人眼就认为是连续的)。它的网络结构如下图:
主要分为三个部分:卷积层,目标检测层,NMS筛选层。
采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构)
先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7个网格,每个网格要预测两个bounding box的坐标(x,y,w,h)和box内包含物体的置信度confidence,以及物体属于20类别中每一类的概率(yolo的训练数据为voc2012,它是一个20分类的数据集)。所以一个网格对应的参数为(4x2+2+20) = 30。如下图
其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的重合度。它等于两个box面积交集,除以面积并集。值越大则box越接近真实位置。
分类信息: yolo的目标训练集为voc2012,它是一个20分类的目标检测数据集 。常用目标检测数据集如下表:
| Name | # Images (trainval) | # Classes | Last updated |
| --------------- | ------------------- | --------- | ------------ |
| ImageNet | 450k | 200 | 2015 |
| COCO | 120K | 90 | 2014 |
| Pascal VOC | 12k | 20 | 2012 |
| Oxford-IIIT Pet | 7K | 37 | 2012 |
| KITTI Vision | 7K | 3 | |
每个网格还需要预测它属于20分类中每一个类别的概率。分类信息是针对每个网格的,而不是bounding box。故只需要20个,而不是40个。而confidence则是针对bounding box的,它只表示box内是否有物体,而不需要预测物体是20分类中的哪一个,故只需要2个参数。虽然分类信息和confidence都是概率,但表达含义完全不同。
筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box(NMS具体算法可以回顾上面faster R-CNN小节)。这样就得到了最终的最合适的几个box和他们的类别。
yolo的损失函数包含三部分,位置误差,confidence误差,分类误差。具体公式如下:
误差均采用了均方差算法,其实我认为,位置误差应该采用均方差算法,而分类误差应该采用交叉熵。由于物体位置只有4个参数,而类别有20个参数,他们的累加和不同。如果赋予相同的权重,显然不合理。故yolo中位置误差权重为5,类别误差权重为1。由于我们不是特别关心不包含物体的bounding box,故赋予不包含物体的box的置信度confidence误差的权重为0.5,包含物体的权重则为1。
Faster R-CNN准确率mAP较高,漏检率recall较低,但速度较慢。而yolo则相反,速度快,但准确率和漏检率不尽人意。SSD综合了他们的优缺点,对输入300x300的图像,在voc2007数据集上test,能够达到58 帧每秒( Titan X 的 GPU ),72.1%的mAP。
SSD网络结构如下图:
和yolo一样,也分为三部分:卷积层,目标检测层和NMS筛选层
SSD论文采用了VGG16的基础网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。
这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。SSD认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。SSD的特点如下。
每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到 多尺度检测 的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。而yolo中,只在最后一个卷积层上做目标位置和类别的训练和预测。这是SSD相对于yolo能提高准确率的一个关键所在。
如上所示,在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。
和faster R-CNN相似,SSD也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点。以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(SSD中称为default box)。每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。如下图所示:
另外,在训练阶段,SSD将正负样本比例定位1:3。训练集给定了输入图像以及每个物体的真实区域(ground true box),将default box和真实box最接近的选为正样本。然后在剩下的default box中选择任意一个与真实box IOU大于0.5的,作为正样本。而其他的则作为负样本。由于绝大部分的box为负样本,会导致正负失衡,故根据每个box类别概率排序,使正负比例保持在1:3。SSD认为这个策略提高了4%的准确率
另外,SSD采用了数据增强。生成与目标物体真实box间IOU为0.1 0.3 0.5 0.7 0.9的patch,随机选取这些patch参与训练,并对他们进行随机水平翻转等操作。SSD认为这个策略提高了8.8%的准确率。
和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用NMS非极大值抑制,筛掉重叠度较高的。只不过SSD综合了各个不同feature map上的目标检测输出的default box。
SSD基本已经可以满足我们手机端上实时物体检测需求了,TensorFlow在Android上的目标检测官方模型ssd_mobilenet_v1_android_export.pb,就是通过SSD算法实现的。它的基础卷积网络采用的是mobileNet,适合在终端上部署和运行。
针对yolo准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD的特点,提出了yoloV2。它主要还是采用了yolo的网络结构,在其基础上做了一些优化和改进,如下
网络采用DarkNet-19:19层,里面包含了大量3x3卷积,同时借鉴inceptionV1,加入1x1卷积核全局平均池化层。结构如下
yolo和yoloV2只能识别20类物体,为了优化这个问题,提出了yolo9000,可以识别9000类物体。它在yoloV2基础上,进行了imageNet和coco的联合训练。这种方式充分利用imageNet可以识别1000类物体和coco可以进行目标位置检测的优点。当使用imageNet训练时,只更新物体分类相关的参数。而使用coco时,则更新全部所有参数。
YOLOv3可以说出来直接吊打一切图像检测算法。比同期的DSSD(反卷积SSD), FPN(feature pyramid networks)准确率更高或相仿,速度是其1/3.。
YOLOv3的改动主要有如下几点:
不过如果要求更精准的预测边框,采用COCO AP做评估标准的话,YOLO3在精确率上的表现就弱了一些。如下图所示。
当前目标检测模型算法也是层出不穷。在two-stage领域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 算法,将对抗学习引入到目标检测领域。Face++也提出了Light-Head R-CNN,主要探讨了 R-CNN 如何在物体检测中平衡精确度和速度。
one-stage领域也是百花齐放,2017年首尔大学提出 R-SSD 算法,主要解决小尺寸物体检测效果差的问题。清华大学提出了 RON 算法,结合 two stage 名的方法和 one stage 方法的优势,更加关注多尺度对象定位和负空间样本挖掘问题。
目标检测领域的深度学习算法,需要进行目标定位和物体识别,算法相对来说还是很复杂的。当前各种新算法也是层不出穷,但模型之间有很强的延续性,大部分模型算法都是借鉴了前人的思想,站在巨人的肩膀上。我们需要知道经典模型的特点,这些tricks是为了解决什么问题,以及为什么解决了这些问题。这样才能举一反三,万变不离其宗。综合下来,目标检测领域主要的难点如下:
一文读懂目标检测AI算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2
从YOLOv1到v3的进化之路
SSD-Tensorflow超详细解析【一】:加载模型对图片进行测试
YOLO
C#项目参考:
项目实践贴个图。
二、yolo算法是指什么?
YOLO (You Only Look Once),是一个用于目标检测的网络。
目标检测任务包括确定图像中存在某些对象的位置,以及对这些对象进行分类。以前的方法,比如R-CNN和它的变种,使用一个管道在多个步骤中执行这个任务。这可能运行缓慢,也很难优化,因为每个单独的组件都必须单独训练。
特点
YOLO将对象检测重新定义为一个回归问题。它将单个卷积神经网络(CNN)应用于整个图像,将图像分成网格,并预测每个网格的类概率和边界框。
该算法还可以预测边界框中存在对象的概率。如果一个对象的中心落在一个网格单元中,则该网格单元负责检测该对象。每个网格中将有多个边界框。在训练时,我们希望每个对象只有一个边界框。因此,我们根据哪个Box与ground truth box的重叠度最高,从而分配一个Box来负责预测对象。
三、浅谈Yolo
学号:20021210654姓名:潘文欣
原文链接:
【嵌牛导读】
当我们谈起计算机视觉时,首先想到的就是图像分类,没错,图像分类是计算机视觉最基本的任务之一,但是在图像分类的基础上,还有更复杂和有意思的任务,如目标检测,物体定位,图像分割等。其中目标检测是一件比较实际的且具有挑战性的计算机视觉任务,其可以看成图像分类与定位的结合,给定一张图片,目标检测系统要能够识别出图片的目标并给出其位置,由于图片中目标数是不定的,且要给出目标的精确位置,目标检测相比分类任务更复杂。
近几年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN),它们是two-stage的,需要先使用启发式方法(selective search)或者CNN网络(RPN)产生Region Proposal,然后再在Region Proposal上做分类与回归。而另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个CNN网络直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。
【嵌牛鼻子】 计算机视觉 目标检测 YOLO算法
【嵌牛正文】
目标检测算法有很多,本文介绍的是Yolo算法,其全称是You Only Look Once: Unified, Real-Time Object Detection,其中,You Only Look Once说的是只需要一次CNN运算,Unified指的是这是一个统一的框架,提供end-to-end的预测,而Real-Time体现是Yolo算法速度快。
如下图是YOLO的检测系统,整体来看,首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标。相比R-CNN算法,其是一个统一的框架,其速度更快,而且Yolo的训练过程也是end-to-end的。
具体来说,Yolo的CNN网络将输入的图片分割成S S网格,,然后每个单元格负责去检测那些中心点落在该格子内的目标,如下图,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元格会预测B个边界框(bounding box)以及边界框的置信度(confidence score)。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为Pr(object),当该边界框是背景时(即不包含目标),此时Pr(object)=0。而当该边界框包含目标时,Pr(object)=1。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征,记为 。因此置信度可以定义为Pr(object)∗ 。很多人可能将Yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面。边界框的大小与位置可以用4个值来表征:(x,y,w,h),其中(x,y)是边界框的中心坐标,而w和h是边界框的宽与高。还有一点要注意,中心坐标的预测值(x,y)是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,单元格的坐标定义如图6所示。而边界框的w和h预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在[0,1]范围。这样,每个边界框的预测值实际上包含5个元素:(x,y,w,h,c),其中前4个表征边界框的大小与位置,而最后一个值是置信度。
还有分类问题,对于每一个单元格其还要给出预测出C个类别概率值,其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率。但是这些概率值其实是在各个边界框置信度下的条件概率,即 。值得注意的是,不管一个单元格预测多少个边界框,其只预测一组类别概率值,这是Yolo算法的一个缺点,在后来的改进版本中,Yolo9000是把类别概率预测值与边界框是绑定在一起的。同时,我们可以计算出各个边界框类别置信度(class-specific confidence scores): 。边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏。后面会说,一般会根据类别置信度来过滤网络的预测框。
总结一下,每个单元格需要预测(B∗5+C)个值。如果将输入图片划分为S×S网格,那么最终预测值为S×S×(B∗5+C)大小的张量。整个模型的预测值结构如下图所示。对于PASCAL VOC数据,其共有20个类别,如果使用S=7,B=2,那么最终的预测结果就是7×7×30大小的张量。在下面的网络结构中我们会详细讲述每个单元格的预测值的分布位置。
Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层,如下图所示。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数。但是最后一层却采用线性激活函数。
可以看到网络的最后输出为7×7×30大小的张量。这和前面的讨论是一致的。对于每一个单元格,前20个元素是类别概率值,然后2个元素是边界框置信度,两者相乘可以得到类别置信度,最后8个元素是边界框的(x,y,w,h)。
在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用图8中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。整个网络的流程如下图所示:
下面是训练损失函数的分析,Yolo算法将目标检测看成回归问题,所以采用的是均方差损失函数。但是对不同的部分采用了不同的权重值。首先区分定位误差和分类误差。对于定位误差,即边界框坐标预测误差,采用较大的权重 。然后其区分不包含目标的边界框与含有目标的边界框的置信度,对于前者,采用较小的权重值 。其它权重值均设为1。然后采用均方误差,其同等对待大小不同的边界框,但是实际上较小的边界框的坐标误差应该要比较大的边界框要更敏感。为了保证这一点,将网络的边界框的宽与高预测改为对其平方根的预测,即预测值变为 。
另外一点时,由于每个单元格预测多个边界框。但是其对应类别只有一个。那么在训练时,如果该单元格内确实存在目标,那么只选择与ground truth的IOU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标。这样设置的一个结果将会使一个单元格对应的边界框更加专业化,其可以分别适用不同大小,不同高宽比的目标,从而提升模型性能。大家可能会想如果一个单元格内存在多个目标怎么办,其实这时候Yolo算法就只能选择其中一个来训练,这也是Yolo算法的缺点之一。要注意的一点时,对于不存在对应目标的边界框,其误差项就是只有置信度,左标项误差是没法计算的。而只有当一个单元格内确实存在目标时,才计算分类误差项,否则该项也是无法计算的。
综上讨论,最终的损失函数计算如下:
其中第一项是边界框中心坐标的误差项, 指的是第ii个单元格存在目标,且该单元格中的第j个边界框负责预测该目标。第二项是边界框的高与宽的误差项。第三项是包含目标的边界框的置信度误差项。第四项是不包含目标的边界框的置信度误差项。而最后一项是包含目标的单元格的分类误差项, 指的是第i个单元格存在目标。
NMS算法(非极大值抑制算法):选择得分(Confidence Score)最高的作为输出,与该输出重叠的 去掉,不断重复这一过程直到所有备选处理完。
YOLO的NMS算法中, Confidence Score的值如下: , 。 代表着某个对象 存在于第j个边界框的可能性。每个网格有:20个对象的概率*2个边界框的置信度,共40个得分。49个网格共1960个得分。对每种对象分别进行NMS,那么每种对象有1960/20=98个得分。
YOLO算法的NMS步骤如下:
1)设置一个Score的阈值,低于该阈值的候选对象排除掉(将该Score设为0)
2)遍历每一个对象类别
2.1)遍历该对象的98个得分
2.1.1)找到Score最大的那个对象及其边界框,添加到输出列表
2.1.2)对每个Score不为0的候选对象,计算其与上面2.1.1输出对象的边界框的IOU
2.1.3)根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)
2.1.4)如果所有边界框要么在输出列表中,要么Score=0,则该对象类别的NMS完成,返回步骤2处理下一种对象
3)输出列表即为预测的对象
这篇长文详细介绍了Yolo算法的原理及实现,当然Yolo-v1还是有很多问题的,所以后续可以读读Yolo9000算法,看看其如何改进的。
关于250pp页面升级的问题,通过《yolo算法是指什么?》、《浅谈Yolo》等文章的解答希望已经帮助到您了!如您想了解更多关于250pp页面升级的相关信息,请到本站进行查找!