yolox

好久没做目标检测,之前一直在做分割问题,目前体验下来目标检测在算法上要求貌似更高一点。所以计划研究下yolo系列最新出的yolox。yolox相对于之前的yolo系列在速度上有了比较大的提升并且移除了anchor的步骤,做到了anchor free。这里吐槽一下yolo1也是anchor free,yolo2引入了anchor,发展到现在又把anchor给移除掉。毕竟anchor有其局限性,我们要先聚类出预置框然后再去学习偏移。聚类这一步就导致了他的局限性,毕竟预先设定好的anchor肯定是有限的,不同的数据集我们可能训练yolo的时候要重新去聚类出最常用的anchor。

yolox做到了一步到位。首先看了yolox的推算源码推算时会有以下几步:

  1. 对要预测的图像进行resize到目标尺寸并且记录下缩放比例。注意resize的时候是保持原来长宽比的,按照长的那边与targetsize进行热size,短的那一部分用0或者1固值填充。
  2. 网络会输出一个batch*predict_nums*85的tensor。其中batch是推算时候的图片数量,如果只是预测一张图片那就是1,predict_nums是初步预测框的数量。85是由4个坐标信息(中心点x,y坐标和预测物体的w,h数值)+1个confidence(预测出来是前景的概率)+80的onehot信息是一个softmax输出对应的80个类型归属的概率。
  3. 坐标信息转换,把中心点信息和宽高信息转化为预测框boxcorner的坐标信息。
  4. 获取每个predictbox对应的80类中的最大概率的类别以及其概率。用概率*confidence做一个初步过滤,将低于我们设定的阈值的predictbox给过滤掉
  5. 将剩下的predictbox进行nms操作,删除重复的预测框。
  6. 将预测的box在除以缩放比例数值,让box能够和原图尺寸匹配对应上。
  7. 最后可以将其可视化操作。这里奇怪的时候在画框的时候又进行了一次置信度的比较(貌似没啥用,因为前面nms之前已经做过了)。

以上就是inference时候的实现了。接下来我们看一下train部分。(网咯设计部分放在最后研究吧),train部分的重点主要看数据增强部分的代码和loss构建部分。

数据增强部分:

原论文使用的是coco2017数据集,数据增强部分我看基线介绍的时候使用randomhorizontalflip,colorjitter和multiscale,弃用了randomResizedcrop的使用因为何mosaic数据增强重叠了。文中强调了对mosaic和mixup的使用

论文中是使用的coco的数据集,数据读取步骤为,读取image,然后找到拥有对应imageid的annotation的id组,将每个annotation的左上角和右下角的坐标获取到(coco原来存储的是左上角坐标和长宽数值,需要转换下)。每个图片对应如下输出:框的数量*位置信息和类别信息。

这里接着进行了一次和图片resize的对齐将框的坐标位置也乘了一次缩放系数。

原论文中调用了两层dataset,首先是如上一层初始的dataset处理,然后将dataset放入了

MosaicDetection中进行了strong数据增强。

在网络设计上,对损失头进行了提前解耦,将位置回归和类别分类的loss损失提前解开

把代码细节全部撸完有点累了,这里写的有点糙,下次再细写

论文里面提到了SimOTA,乍一看有点吓人,实际上看源码是对pred和groundtruth的一种匹配手段。大致思路是训练的时候我知道我的原图像有多少个groundtruth,然后我的3个尺寸的预支grid也是已知道的。我将所有的grid和groundtruth组成一个二维矩阵,通过grid的中心点位置和是否在groundtruth里面或者grid的中心点是否在groundtruth中心点一定范围内(这个方法对应论文中的multipositives),如果在一定范围内则认为对应的pred为有效pred过滤掉一批无用的pred,这个时候那个pred负责哪个ground还没有明确。然后算一下过滤后的pred和groundtruth的iou值也是以矩阵的形式存着,然后根据这个矩阵先进行一批筛选按每个groundtruth匹配固定数值个负责其的pred(代码中10个就是top10个,如何筛选的呢有3个指标组成cost:当期这一对groundtruth和pred的分类损失,当期这一对groundtruth和pred的reg损失当期groundtruth与pred对应celll中心点的位置关系),但是这个时候还有一个问题就是存在一个pred负责多个groundtruth的情况,这个肯定是不能够的是,我们还是按照cost矩阵旋转pred负责下匹配的groundtruth最低的那个作为所负责的groundtruth,这样就实现了找到有效的pred并且给pred匹配一个groundtruth的效果。(个人感觉这种做法貌似也有弊端的,实际训练的时候会出现如果groundtruth过于接近的时候会有groundtruth没有pred负责的情况,至少我在debug前几轮训练的时候经常遇到,可能模型性能慢慢提升上来分配的更清晰了这个问题会好点吧。在进一步讲这个问题也是yolo系列的通病吧,yolo系列最后总是输出特征图,每个特征点上只能对一个groundtruth进行负责,这种结构对于那种离得近的小物体从设计上来说就是不友好的。后面多读写其他论文看有没有大佬能够解决这种问题)。最后在强调下一个pred只能够对应一个groundtruth,而一个groundtruth可以被多个pred所负责。

最后总结下yolox涉及到的点

  • 数据增强技术mosaic和mixup增强,当然一些仿射变换什么的也做了
  • 网络设计上的reg和cls的提前解耦。
  • anchor free,和yolo1类似直接去预测中心点位置和w,h了而不是在anchor基础上去预测偏移值。yolo3的多尺度设计还是保留着的。保证在大物体和小物体上都有效
  • Multi positives,把cell中心点在groundtruth里面和在groundtruth中心点附近的都作为正样本。与yolo3相比yolo3一个groundtruth值对应一个positive看groundtruth的中心点落到哪个cell里面我们把其对应的pred当做了正样本。我们这个方法明显正样本更多了我可以多个pred负责一个groundtruth了。
  • SimOTA,pred和groundtruth的匹配处理。是将label和预测pred的对齐策略。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值