【从零开始学习YOLOv3】8. YOLOv3中Loss部分计算

YOLOv1是一个anchor-free的,从YOLOv2开始引入了Anchor,在VOC2007数据集上将mAP提升了10个百分点。YOLOv3也继续使用了Anchor,本文主要讲ultralytics版YOLOv3的Loss部分的计算, 实际上这部分loss和原版差距非常大,并且可以通过arc指定loss的构建方式, 如果想看原版的loss可以在下方release的v6中下载源码。

Github地址: https://github.com/ultralytics/yolov3

Github release: https://github.com/ultralytics/yolov3/releases

1. Anchor

Faster R-CNN中Anchor的大小和比例是由人手工设计的,可能并不贴合数据集,有可能会给模型性能带来负面影响。YOLOv2和YOLOv3则是通过聚类算法得到最适合的k个框。聚类距离是通过IoU来定义,IoU越大,边框距离越近。
d ( b o x , c e n t r o i d ) = 1 − I o U ( b o x , c e n t r o i d ) d(box,centroid)=1-IoU(box,centroid) d(box,centroid)=1IoU(box,centroid)
Anchor越多,平均IoU会越大,效果越好,但是会带来计算量上的负担,下图是YOLOv2论文中的聚类数量和平均IoU的关系图,在YOLOv2中选择了5个anchor作为精度和速度的平衡。

YOLOv2中聚类Anchor数量和IoU的关系图

2. 偏移公式

在Faster RCNN中,中心坐标的偏移公式是:

{ x = ( t x × w a ) + x a y = ( t y × h a ) + y a \left\{ \begin{aligned} x=&(t_x\times w_a)+x_a\\ y=&(t_y\times h_a)+y_a \end{aligned} \right. { x=y=(tx×wa)+xa(ty×ha)+ya

其中 x a x_a xa y a y_a ya 代表中心坐标, w a w_a wa h a h_a ha代表宽和高, t x t_x tx t y t_y ty是模型预测的Anchor相对于Ground Truth的偏移量,通过计算得到的x,y就是最终预测框的中心坐标。

而在YOLOv2和YOLOv3中,对偏移量进行了限制,如果不限制偏移量,那么边框的中心可以在图像任何位置,可能导致训练的不稳定。
{ b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p h e t h σ ( t o ) = P r ( o b j e c t ) × I O U ( b , o b j e c t ) \left\{ \begin{aligned} b_x&=\sigma(t_x)+c_x\\ b_y&=\sigma(t_y)+c_y\\ b_w&=p_we^{t_w}\\ b_h&=p_he^{t_h}\\ \sigma(t_o)&=Pr(object)\times IOU(b,object) \end{aligned} \right. bxbybwbhσ(to)=σ(tx)+cx=σ(ty)+cy=pwetw=pheth=Pr(object)×IOU(b,object)

公式对应的意义

对照上图进行理解:

### 将YOLO模型转换为其他版本或格式 #### YOLO不同版本之间的转换 YOLO的不同版本(如YOLOv3YOLOv4、YOLOv5等)主要区别在于网络架构和配置文件。为了将一个版本的YOLO模型迁移到另一个版本,通常需要调整以下个方面: - **权重文件**:YOLO各版本之间可能有不同的层结构和参数数量,因此直接迁移权重通常是不可行的。可以考虑重新训练新版本的模型,使用旧版模型作为预训练模型来初始化权重[^1]。 - **配置文件**:每个YOLO版本都有特定的`.cfg`配置文件定义了网络架构和其他超参数设置。当从一个版本切换到另一个版本时,需修改这些配置文件以适应新版的要求。 #### YOLO与其他框架/工具链的互操作性 对于希望利用YOLO之外的其他深度学习平台或工具的情况,可以通过以下种方式实现YOLO模型向其他格式的转换: - **ONNX (Open Neural Network Exchange)**:这是一种开放的标准交换格式,支持多种机器学习库间的模型共享。通过PyTorch或TensorFlow导出YOLO模型至ONNX格式后,可以在多个平台上部署该模型[^2]。 ```python import torch.onnx as onnx from models import * # 假设这是加载YOLO模型的地方 model = Darknet('yolov3.cfg', img_size=(416, 416)).cuda() dummy_input = torch.randn(1, 3, 416, 416).cuda() onnx.export(model, dummy_input, 'yolov3.onnx', verbose=True, opset_version=11) ``` - **Core ML / TensorFlow Lite**:如果目标是在移动设备上运行YOLO,则可将其转化为适用于iOS(Core ML) 或 Android(TensorFlow Lite) 的轻量化模型形式。这同样涉及到先将原始YOLO模型保存成中间表示(比如ONNX),再进一步编译为目标平台所需的二进制格式。 #### 数据标注格式转换 除了模型本身的转换外,在某些情况下还需要处理数据集标签格式的变化。例如,要将在YOLO格式中标记的对象位置信息应用于Pascal VOC标准下的项目中,就需要编写专门的脚本来完成这种转变。此过程涉及解析源格式并按照目的格式重组相关信息。 ```bash # 使用命令行调用Python脚本进行批量转换 $ python yolo_to_voc.py --input_dir ./annotations_yolo \ --output_dir ./annotations_voc \ --images_dir ./images ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*pprp*

如果有帮助可以打赏一杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值