极智AI | 目标检测实现分享三:详解YOLOv3算法实现

本文涉及的产品
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,视频资源包5000点
简介: 大家好,我是极智视界,本文详细介绍一下 YOLOv3 算法的设计与实践。

大家好,我是极智视界,本文详细介绍一下 YOLOv3 算法的设计与实践。

本文是目标检测类算法实现分享的第三篇,前面已经写过两篇,感兴趣的同学可以查阅:

(1) 《【模型训练】目标检测实现分享一:详解 YOLOv1 算法实现》;

(2) 《【模型训练】目标检测实现分享二:听说克莱今天复出了?详解 YOLOv2 算法与克莱检测》;

YOLOv3 是 YOLO 系列的第三个版本,在论文 《YOLOv3:An Incremental Improvement》中提出,性能进一步提升。基于 YOLOv3 的目标检测模型结构在工程应用中可以说非常常见了,下面我们一起来看 YOLOv3 相对于之前的 YOLO 版本主要做了哪些方面的优化。

同样这里不止会讲原理也会讲实践。


1、YOLOv3 原理

老规矩,先来看实验数据:

上图纵轴精度数据是 COCO AP,横轴效率数据在 Nvidia Titan X 上测得,可以看到 YOLOv3 相比 SSD、FRCN、RetinaNet 等检测网络,能更加好的兼顾效率和精度。

再来看一组更细一些的精度数据:

这里的数据比对将检测算法分为 Two-stage 和 One-stage,其中 Two-stage 检测算法以 Faster R-CNN 为代表,一般 Two-stage 的检测算法以精度著称,但由于检测过程 (两阶段:筛选候选区域 + 分类) 较为繁琐,所以前向效率不高,工程应用上比较少见。One-stage 检测算法这里罗列的比较多一些:YOLOv2、SSD、RetinaNet 还有 YOLOv3,One-stage 的算法以效率著称,并随着发展能逐步兼顾精度。纵观整个精度数据比对,可以看到在 COCO 数据集上, backbone 为 ResNeXt-101-FPN 的 RetinaNet 的 AP、AP50、AP75、APs、APm 均为最高,Faster R-CNN w TDM 的 APl 为最高。解释一下这些指标,在 COCO 数据集评价指标中,所有的 AP 默认均为 mAP,即 AP=mAP、AP50=mAP50 ... 递推。其中 AP 表示 IOU 阈值为 .05~0.95 的精度,AP50 表示 IOU 阈值为 .50 的精度,AP75 表示 IOU 阈值为 .75 的精度,APs 表示对于小目标 (area < 32^2) 的检测精度,APm 表示对于中目标 (32^2 < area < 96^2) 的检测精度,APl 表示对于大目标 (area > 96^2) 的检测精度。可以看出 RetinaNet 的 ResNeXt-101-FPN 的特征提取能力十分强悍,YOLOv3 比不过它,且 YOLOv3 也比不过 Faster R-CNN w TDM 在大目标上的检测能力。YOLOv3 的整体检测精度处于中上上水准,且改进了 YOLOv1&YOLOv2 中一直被诟病的小目标检测能力弱的问题,再结合它强大的推理效率,配得上文章中说的YOLOv3 is pretty good!

下面讲 YOLOv3 做了哪些改进。

1.1 Backbone:Darknet-53

YOLOv2 中提出了 Darknet-19 作为 backbone,YOLOv3 在 Darknet-19 的基础上,借鉴 Resnet 的残差结构进一步加深网络深度,能够极大提高 backbone 的特征提取能力,Darknet-53 的结构如下:

不吹不擂,来看一下 Darknet-53 与其他一些主流 backbone 的性能对比数据:

可以看到相比 YOLOv2 的 Darknet-19,Darknet-53 在精度上大幅提升,由于 Darknet-53 的网络更深,前向效率没有 Darknet-19 快。再对比 ResNet 如此深的网络,Darknet-53 在精度上也能与之匹敌,另外前向效率比 ResNet-152 快 2 倍,比 ResNet-101 快 1.5 倍。从这些数据可以看出,Darknet-53 具有十分强的特征提取能力,且能兼顾前向效率。

1.2 Predictions Across Scales

最开始的实验数据说到,YOLOv3 改善了一直被人诟病的小目标检测能力弱的问题,这正是由于它采用了多尺度预测的方式。截了一部分 YOLOv3 的网络结构 (可能太小看不太清),如下:

YOLOv3 网络中有两处 route + upsample 的结构,分别引出了两个 yolo 分支,再加上主分支的 yolo,一共形成了 1个 backbone + 3 个 yolo 检测分支的结构。三个 yolo 分支的 shape 分别为 13 x 13、26 x 26、52 x 52,其中最小的 13 x 13 的 yolo 具有最大的感受野,适合检测大目标;26 x 26 的 yolo 适合检测中等大小的目标;最大的 52 x 52 的 yolo 适合检测小目标。这样就形成了 大、中、小目标检测的全场景覆盖,模型鲁棒性更好。

1.3 Bounding Box Prediction

YOLOv3 中延用了 YOLOv2 提出的 Anchor Boxes k-means 聚类选择及 Bounding Boxes 约束策略。可能有部分人不太理解 Anchor Boxes 和 Bounding Boxes 的区别,这里解释一下:Anchor Boxes 没有位置信息,只有宽高尺度信息,所以在 k-means 聚类的时候只针对宽、高;而 Bounding Boxes 的信息要多一些,包括框的中心点位置信息、宽高、置信度、类别得分。

然后说一下 YOLOv3 中的 Anchor 和 YOLOv2 的区别,我们知道 YOLOv2 中通过 k-means 聚类分析得出 Anchor 数 k = 5 时效果较好,所以选择了 5 个 Anchor 嵌入网络设计;而 YOLOv3 结合前面提到的多尺度预测结构,每个尺度的 yolo 都给它配了 3 个 Anchor,最后一共有 9 个 Anchor,这 9 个 Anchor 在 COCO 中使用聚类选择为:(10 × 13)、(16 × 30)、(33 × 23)、(30 × 61)、(62 × 45)、(59 × 119)、(116 × 90)、(156 × 198)、(373 × 326)。且怎么样分配也有讲究,对于适合检测大目标的 13 x 13 的 yolo feature map 上使用 (116 x 90)、(156 x 198)、(373 x 326) 的 Anchor,对于适合检测小目标的 52 x 52 的 yolo feature map 上使用 (10 x 13)、(16 x 30)、(33 x 23) 的 Anchor,其余 Anchors 用于检测中等大小的目标。

1.4 Loss Fuction

为了更好的收敛和提升精度,YOLOv3 对损失函数也进行了一些改动,其中 x、y、w、h 损失采用 MSE 均方误差,置信度损失采用二分类交叉熵,分类损失采用多类别交叉熵进行计算,整体的损失函数如下:

以上介绍了 YOLOv3 的技术改进,下面进行实践。


2、YOLOv3 实践

这里同样采用 darknet 来训练 YOLOv3,数据集选择 COCO,下面开始。

2.1 COCO 数据集配置

git clone https://github.com/pdollar/coco
cd coco
mkdir images
# download train valdatasets
wget http://images.cocodataset.org/zips/train2014.zip
wget http://images.cocodataset.org/zips/val2014.zip
# unzip .zip
unzip train2014.zip
unzip val2014.zip
cd ..
# download coco metadata
wget https://pjreddie.com/media/files/instances_train-val2014.zip
unzip instances_train-val2014.zip
wget https://pjreddie.com/media/files/coco/labels.tgz
tar zxvf labels.tgz
wget https://pjreddie.com/media/files/coco/5k.part
wget https://pjreddie.com/media/files/coco/trainvalno5k.part
paste <(awk "{print \"$PWD\"}" <5k.part) 5k.part | tr -d '\t' > 5k.txt
paste <(awk "{print \"$PWD\"}" <trainvalno5k.part) trainvalno5k.part | tr -d '\t' > trainvalno5k.txt

数据集搞定。

2.2 训练

在 cfg 目录下创建 yolov3 文件夹,加入 coco.data、coco.names、yolov3.cfg、darknet53.conv.74,并创建 backup 文件夹,形成如下的目录 tree:

其中 backup 为训练中间权重保存目录,coco.names 为类别名称,coco.data 为训练配置文件,差不多长这样:

执行训练指令:

./darknet detector train cfg/yolov3/coco.data cfg/yolov3/yolov3.cfg cfg/yolov3/darknet53.conv.74

其中 darknet53.conv.74 为预训练权重,不要也行,只是一切从头开始。

附上 darknet53.conv.74 下载传送:https://pjreddie.com/media/files/darknet53.conv.74

训练的时间总是很漫长,但是开心的是看到 loss 在慢慢收敛:

2.3 验证

等把模型训练好了,可以拿来验证一下。

这里拿街景视频进行一下 YOLOv3 的目标检测验证,执行验证指令:

./darknet detector demo cfg/yolov3/coco.data cfg/yolov3/yolov3.cfg cfg/yolov3/backup/yolov3.weights data/street.mp4

检测效果如下:

可以看到检测效果还是不错的。


好了,以上详细分享了 YOLOv3 算法原理和实践,希望我的分享能对你的学习有一点帮助。


logo_show.gif

目录
打赏
0
0
0
0
7
分享
相关文章
基于深度学习的路面裂缝检测算法matlab仿真
本项目基于YOLOv2算法实现高效的路面裂缝检测,使用Matlab 2022a开发。完整程序运行效果无水印,核心代码配有详细中文注释及操作视频。通过深度学习技术,将目标检测转化为回归问题,直接预测裂缝位置和类别,大幅提升检测效率与准确性。适用于实时检测任务,确保道路安全维护。 简介涵盖了算法理论、数据集准备、网络训练及检测过程,采用Darknet-19卷积神经网络结构,结合随机梯度下降算法进行训练。
Transformer打破三十年数学猜想!Meta研究者用AI给出反例,算法杀手攻克数学难题
《PatternBoost: Constructions in Mathematics with a Little Help from AI》提出了一种结合传统搜索算法和Transformer神经网络的PatternBoost算法,通过局部搜索和全局优化交替进行,成功应用于组合数学问题。该算法在图论中的Ramsey数研究中找到了更小的反例,推翻了一个30年的猜想,展示了AI在数学研究中的巨大潜力,但也面临可解释性和通用性的挑战。论文地址:https://arxiv.org/abs/2411.00566
80 13
Enhance-A-Video:上海 AI Lab 推出视频生成质量增强算法,显著提升 AI 视频生成的真实度和细节表现
Enhance-A-Video 是由上海人工智能实验室、新加坡国立大学和德克萨斯大学奥斯汀分校联合推出的视频生成质量增强算法,能够显著提升视频的对比度、清晰度和细节真实性。
115 8
Enhance-A-Video:上海 AI Lab 推出视频生成质量增强算法,显著提升 AI 视频生成的真实度和细节表现
淘天算法工程师玩转《黑神话》,多模态大模型如何成为天命AI
淘天集团未来生活实验室的算法工程师们以ARPG游戏《黑神话:悟空》为平台,探索多模态大模型(VLM)在仅需纯视觉输入和复杂动作输出场景中的能力边界。他们提出了一种名为VARP的新框架,该框架由动作规划系统和人类引导的轨迹系统组成,成功在90%的简单和中等难度战斗场景中取得胜利。研究展示了VLMs在传统上由强化学习主导的任务中的潜力,并提供了宝贵的人类操作数据集,为未来研究奠定了基础。
X-AnyLabeling:开源的 AI 图像标注工具,支持多种标注样式,适于目标检测、图像分割等不同场景
X-AnyLabeling是一款集成了多种深度学习算法的图像标注工具,支持图像和视频的多样化标注样式,适用于多种AI训练场景。本文将详细介绍X-AnyLabeling的功能、技术原理以及如何运行该工具。
281 2
X-AnyLabeling:开源的 AI 图像标注工具,支持多种标注样式,适于目标检测、图像分割等不同场景
【AI系统】QNNPack 算法
QNNPACK是Marat Dukhan开发的量化神经网络计算加速库,专为移动端优化,性能卓越。本文介绍QNNPACK的实现,包括间接卷积算法、内存重排和间接缓冲区等关键技术,有效解决了传统Im2Col+GEMM方法存在的空间消耗大、缓存效率低等问题,显著提升了量化神经网络的计算效率。
56 6
【AI系统】QNNPack 算法
【AI系统】Im2Col 算法
Caffe 作为早期的 AI 框架,采用 Im2Col 方法优化卷积计算。Im2Col 将卷积操作转换为矩阵乘法,通过将输入数据重排为连续内存中的矩阵,减少内存访问次数,提高计算效率。该方法首先将输入图像转换为矩阵,然后利用 GEMM 库加速计算,最后将结果转换回原格式。这种方式显著提升了卷积计算的速度,尤其适用于通道数较多的卷积层。
74 5
【AI系统】Im2Col 算法
【AI系统】Winograd 算法
本文详细介绍Winograd优化算法,该算法通过增加加法操作来减少乘法操作,从而加速卷积计算。文章首先回顾Im2Col技术和空间组合优化,然后深入讲解Winograd算法原理及其在一维和二维卷积中的应用,最后讨论算法的局限性和实现步骤。Winograd算法在特定卷积参数下表现优异,但其应用范围受限。
60 2
【AI系统】Winograd 算法
AI+脱口秀,笑点能靠算法创造吗
脱口秀是一种通过幽默诙谐的语言、夸张的表情与动作引发观众笑声的表演艺术。每位演员独具风格,内容涵盖个人情感、家庭琐事及社会热点。尽管我尝试用AI生成脱口秀段子,但AI缺乏真实的情感共鸣和即兴创作能力,生成的内容显得不够自然生动,难以触及人心深处的笑点。例如,AI生成的段子虽然流畅,却少了那份不期而遇的惊喜和激情,无法真正打动观众。 简介:脱口秀是通过幽默语言和夸张表演引发笑声的艺术形式,AI生成的段子虽流畅但缺乏情感共鸣和即兴创作力,难以达到真人表演的效果。
【AI系统】布局转换原理与算法
数据布局转换技术通过优化内存中数据的排布,提升程序执行效率,特别是对于缓存性能的影响显著。本文介绍了数据在内存中的排布方式,包括内存对齐、大小端存储等概念,并详细探讨了张量数据在内存中的排布,如行优先与列优先排布,以及在深度学习中常见的NCHW与NHWC两种数据布局方式。这些布局方式的选择直接影响到程序的性能,尤其是在GPU和CPU上的表现。此外,还讨论了连续与非连续张量的概念及其对性能的影响。
101 3

热门文章

最新文章