YOLOX笔记

目录

1. 样本匹配 正负样本划分过程

2. yoloxwarmcos 学习率

3. 无法开启多gpu训练, 或者多gpu训练卡住?

4. 出现莫名其妙的log: Reducer buckets...



1. 样本匹配 正负样本划分过程

==

说明: gt_centerbbox是在gt_bbox中心点向四周发散的bbox, 中心点到该bbox四边的距离是 center_radius * expanded_strides_per_image

1. is_in_boxes:			[n_gt, n_anchor],	样本中心点是否落在各个gt_bbox里面
2. is_in_boxes_all:		[n_anchor], 		样本中心点是否至少落在1个gt_bbox里面
3. is_in_centers: 		[n_gt, n_anchor], 	样本中心点是否落在各个gt_centerbbox里面
4. is_in_centers_all:	[n_anchor], 		样本中心点是否至少落在1个gt_centerbbox里面
5. is_in_boxes_anchor = is_in_boxes_all | is_in_centers_all,
   [n_anchor], 满足至少落在1个gt_bboxes里面或者1个gt_centerbbox里面 
6.	is_in_boxes_and_center = (
		is_in_boxes[:, is_in_boxes_anchor] & is_in_centers[:, is_in_boxes_anchor]
	), [n_gt, n_anchor] True表示同时落在gt_bboxes和gt_centerbbox里面
(落在gt_centerbbox不是已经表示落在gt_bboxes里面吗?难道是gt_centerbbox可能超出gt_bboxes?)

n_pos = sum(is_in_boxes_anchor)
选出is_in_boxes_anchor==True的那些输出样本
===========以上是先根据feature map上每个像素点的坐标, 选出落在gt_bbox里面的像素点, 数量为n_pos, 再拿到 网络在这些像素点上的预测样本
===========下面进一步在这些预测样本(n_pos个)和gt_bboxes之间, 确定匹配关系, 找出哪些是正样本 哪些是负样本

7. pair_wise_cls_loss:	[n_gt, n_pos],	预测样本和gt_bboxes的两两cls loss, 用sqrt(cls_pred*obj_pred)作为预测得分, 得分越高该loss越小
8. pair_wise_ious_loss:	[n_gt, n_pos],	预测样本和gt_bboxes的两两iou loss, iou越大该loss越小
9.	cost = (
		pair_wise_cls_loss
		+ 3.0 * pair_wise_ious_loss
		+ 100000.0 * (~is_in_boxes_and_center)
	), 第三个表示如果anchor同时不落在gt_bboxes和gt_centerbbox里面则cost为100000
	毕竟如果不落在gt_bboxes和gt_centerbbox里就不可能分配为正样本的
10. Dynamic K();



Dynamic K()算法过程:
==

Dynamic K():
1. matching_matrix:		[n_gt, n_pos], 标记gt与样本的匹配关系, 初始化为全0矩阵
   n_candidate_k = 10
2. topk_ious:			[n_gt, n_candidate_k], 选出与gt的iou在topk【大】的样本(根据pair_wise_ious不是pair_wise_ious_loss)
3. dynamic_ks:			[n_gt], =max(topk_ious.sum(1), 1), 最小为1, 表示每个gt要选几个正样本
(参考如何评价旷视开源的YOLOX,效果超过YOLOv5? - 旷视科技的回答 - 知乎
https://www.zhihu.com/question/473350307/answer/2021031747, 这里说了“然后把这个 10 个预测与 gt 的 iou 加起来求得最终的k”)
4. for idx in range(num_gt): 对每个gt, 从cost[idx]选出cost值是top dynamic_ks[idx]【小】的样本, 这些样本被分配给该gt
5. 如果1个样本被分配给1个以上的gt, 则找出与该样本有最小cost的gt, 把该样本分配给这个gt
   到这里已经是每个gt有1个样本, 每个样本最多被分配给1个gt或者没分配
   分配到gt的样本就是正样本
6. 返回每个正样本的gt索引, gt类别, 以及样本与gt的iou

参考代码: https://github.com/Megvii-BaseDetection/YOLOX/blob/main/yolox/models/yolo_head.py
 

2. yoloxwarmcos 学习率

==

# 假设10个epoch,每个epoch有10个iters,
# warmup_epochs=2, no_aug_epochs=3,
# warmup_lr_start=0, min_lr_ratio=0.05

ys = []
for i in range(10*10):
    v = yolox_warm_cos_lr(
        lr=0.01,
        min_lr_ratio=0.05,
        total_iters=10*10,
        warmup_total_iters=10*2,
        warmup_lr_start=0,
        no_aug_iter=10*3,
        iters=i,
    )
    ys.append(v)

学习率曲线:

结论是:
前2个epochs, 学习率从0->0.01
第3个epochs->第7个epochs, 学习率从0.01->0.01*0.05
最后3个epochs, 学习率保持0.01*0.05=0.0005

另外,
Exp里面,
        self.basic_lr_per_img = 0.01 / 64.0, 
trainer.py里面:
        self.lr_scheduler = self.exp.get_lr_scheduler(
            self.exp.basic_lr_per_img * self.args.batch_size, self.max_iter
        )
所以训练时的最大学习率是:
        lr = self.exp.basic_lr_per_img * self.args.batch_size = 0.01*batch_size / 64.0

3. 无法开启多gpu训练, 或者多gpu训练卡住?

去trainer.py, 检查是不是额外添加了什么代码, 导致各gpu之间不同步 如果是tensorboard logger这种记录变量, 就要确保只在其中一个gpu中执行, 比如在前面加上 if self.rank == 0:..., 完了之后最好再加上 synchronize() 同步一下.

4. 出现莫名其妙的log: Reducer buckets...

具体表现为训练到第2个iter时, 输出(这里我开了2个gpu)
INFO:root:Reducer buckets have been rebuilt in this iteration.
INFO:root:Reducer buckets have been rebuilt in this iteration.

原因是 可能在某个地方设置了logging的level, 比如: 
import logging
logging.basicConfig(level=logging.INFO)
去掉上面两行就行了

...

 

参考资源链接:[YOLOX训练烟火数据集文档:烟、火识别](https://wenku.csdn.net/doc/1jibvkqhwf?utm_source=wenku_answer2doc_content) 在使用YOLOX进行烟火检测时,样本标注和数据集的划分是至关重要的步骤,它将直接影响模型训练的质量和效果。为了帮助你更有效地准备数据和训练模型,建议参考《YOLOX训练烟火数据集文档:烟、火识别》。 首先,关于样本标注,你需要收集和整理包含烟火场景的大量图片。每张图片都需要通过专业的标注工具(如LabelImg或CVAT)来标注目标物,即烟和火。标注时,为每个目标物创建一个矩形框,并记录下该矩形框的四个坐标值(左上角和右下角的x、y坐标)。 对于标签的定义,确保每个标注的图片都有一个对应的标签文件,该文件遵循YOLOX所要求的格式。例如,标签文件应包含目标的类别索引和边界框的中心坐标及其宽高,这些坐标值需要相对于图片的尺寸进行归一化处理。 数据集划分时,通常建议将数据集分为训练集、验证集和测试集。一个典型的划分比例可以是70%的训练集、20%的验证集和10%的测试集。确保这些子集是从整个数据集中随机选取的,以保证模型训练的代表性和泛化能力。 在准备数据集时,还应考虑数据增强技术来扩充样本的多样性,例如旋转、缩放、裁剪等操作,这些操作可以帮助模型更好地泛化到真实世界中的各种情况。 在进行数据集划分和标注后,建议遵循YOLOX的格式要求整理数据,以便训练时模型能够正确读取和解析。按照《YOLOX训练烟火数据集文档:烟、火识别》中的指导,可以确保你的数据集准备和模型训练工作能够顺利进行。 完成上述步骤后,你将拥有一个结构良好、标注准确的烟火检测数据集,进而可以开始使用YOLOX进行模型训练。在整个过程中,保持记录详细的实验笔记和模型性能指标,这将有助于你分析和优化模型。 深入理解YOLOX的训练过程和参数调优,将有助于你更好地掌握如何使用该模型进行烟火检测。为此,推荐进一步阅读《YOLOX训练烟火数据集文档:烟、火识别》,它不仅提供了数据集准备和模型训练的实战指南,还包含了许多实用的建议和技巧。 参考资源链接:[YOLOX训练烟火数据集文档:烟、火识别](https://wenku.csdn.net/doc/1jibvkqhwf?utm_source=wenku_answer2doc_content)
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值