小目标检测的奇淫技巧

小目标检测文章总结:https://blog.csdn.net/wq604887956/article/details/83053927

Kaggle实战目标检测奇淫技巧合集:

https://mp.weixin.qq.com/s?__biz=MzIwMTE1NjQxMQ==&mid=2247487104&idx=1&sn=a41a6e37be1e169b316d67765d2d9eae&chksm=96f37cd4a184f5c2abb99b5e050642df5e82f172beb19a06c562b91b610f9ed624eb46a2ec81&mpshare=1&scene=23&srcid=#rd

 

 

转自:https://www.cnblogs.com/E-Dreamer-Blogs/p/11442927.html

小目标难检测原因

主要原因

(1)小目标在原图中尺寸比较小,通用目标检测模型中,一般的基础骨干神经网络(VGG系列和Resnet系列)都有几次下采样处理,导致小目标在特征图的尺寸基本上只有个位数的像素大小,导致设计的目标检测分类器对小目标的分类效果差。

(2)小目标在原图中尺寸比较小,通用目标检测模型中,一般的基础骨干神经网络(VGG系列和Resnet系列)都有几次下采样处理,如果分类和回归操作在经过几层下采样处理的 特征层进行,小目标特征的感受野映射回原图将可能大于小目标在原图的尺寸,造成检测效果差。

其他原因

(1)小目标在原图中的数量较少,检测器提取的特征较少,导致小目标的检测效果差。

(2)神经网络在学习中被大目标主导,小目标在整个学习过程被忽视,导致导致小目标的检测效果差。

Tricks

(1) data-augmentation.简单粗暴,比如将图像放大,利用 image pyramid多尺度检测,最后将检测结果融合.缺点是操作复杂,计算量大,实际情况中不实用;

(2) 特征融合方法:FPN这些,多尺度feature map预测,feature stride可以从更小的开始;

(3)合适的训练方法:CVPR2018的SNIP以及SNIPER;

(4)设置更小更稠密的anchor,设计anchor match strategy等,参考S3FD;

(5)利用GAN将小物体放大再检测,CVPR2018有这样的论文;

(6)利用context信息,简历object和context的联系,比如relation network;

(7)有密集遮挡,如何把location 和Classification 做的更好,参考IoU loss, repulsion loss等.

(8)卷积神经网络设计时尽量度采用步长为1,尽可能保留多的目标特征。

 

感谢张俊怡,本文转自:https://cloud.tencent.com/developer/article/1414911

摘要概述

小目标问题在物体检测和语义分割等视觉任务中一直是存在的一个难点,小目标的检测精度通常只有大目标的一半。

MS COCO instance segmentation challenge

CVPR2019论文: Augmentation for small object detection 提到了一些应对小目标检测的方法,笔者结合这篇论文以及查阅其它资料,对小目标检测相关技巧在本文进行了部分总结。

小目标的定义:在MS COCO数据集中,面积小于 32*32 的物体被认为是小物体。

MS COCO Metrics

在COCO数据集中,小目标的数量更多,具体为: 41% of objects are small (area < 322) 34% are medium (322 < area < 962) 24% are large (area > 962) area的计算方法:像素点的个数。 MS COCO Metrics 详细介绍参考:https://blog.csdn.net/wangdongwei0/article/details/83033340

小目标难以检测的原因:分辨率低,图像模糊,携带的信息少。由此所导致特征表达能力弱,也就是在提取特征的过程中,能提取到的特征非常少,这不利于我们对小目标的检测。

现有的比较流行的方法是如何解决小目标检测问题的?

1、由于小目标面积太小,可以放大图片后再做检测,也就是在尺度上做文章,如FPN(Feature Pyramid Networks for Object Detection),SNIP(An Analysis of Scale Invariance in Object Detection – SNIP)。

Feature-Fused SSD: Fast Detection for Small Objects, Detecting Small Objects Using a Channel-Aware Deconvolutional Network 也是在多尺度上做文章的论文。

FPN

2、在Anchor上做文章(Faster Rcnn,SSD, FPN都有各自的anchor设计),anchor在设置方面需要考虑三个因素:

anchor的密度:由检测所用feature map的stride决定,这个值与前景阈值密切相关。

anchor的范围:RetinaNet中是anchor范围是32~512,这里应根据任务检测目标的范围确定,按需调整anchor范围,或目标变化范围太大如MS COCO,这时候应采用多尺度测试。

anchor的形状数量:RetinaNet每个位置预测三尺度三比例共9个形状的anchor,这样可以增加anchor的密度,但stride决定这些形状都是同样的滑窗步进,需考虑步进会不会太大,如RetinaNet框架前景阈值是0.5时,一般anchor大小是stride的4倍左右。

该部分anchor内容参考于:https://zhuanlan.zhihu.com/p/55824651

3、在ROI Pooling上做文章,文章SINet: A Scale-Insensitive Convolutional Neural Network for Fast Vehicle Detection 认为小目标在pooling之后会导致物体结构失真,于是提出了新的Context-Aware RoI Pooling方法。

Context-Aware RoI Pooling

4、用生成对抗网络(GAN)来做小目标检测:Perceptual Generative Adversarial Networks for Small Object Detection。

Perceptual Generative Adversarial network

进一步从量化的角度来分析(参考CVPR2019论文:Augmentation for small object detection ):

COCO上的统计图

1、从COCO上的统计图可以发现,小目标的个数多,占到了41.43%,但是含有小目标的图片只有51.82%,大目标所占比例为24.24%,但是含有大目标的图像却有82.28%。这说明有一半的图像是不含小目标的,大部分的小目标都集中在一些少量的图片中。这就导致在训练的过程中,模型有一半的时间是学习不到小目标的特性的。

此外,对于小目标,平均能够匹配的anchor数量为1个,平均最大的IoU为0.29,这说明很多情况下,有些小目标是没有对应的anchor或者对应的anchor非常少的,即使有对应的anchor,他们的IoU也比较小,平均最大的IoU也才0.29。

anchor示意图

如上图,左上角是一个anchor示意图,右上角是一个小目标所对应的anchor,一共有只有三个anchor能够与小目标配对,且配对的IoU也不高。左下角是一个大目标对应的anchor,可以发现有非常多的anchor能够与其匹配。匹配的anchor数量越多,则此目标被检出的概率也就越大。

实现方法: 1、Oversampling :我们通过在训练期间对这些图像进行过采样来解决包含小对象的相对较少图像的问题(多用这类图片)。在实验中,我们改变了过采样率和研究不仅对小物体检测而且对检测中大物体的过采样效果

2、Copy-Pasting Strategies:将小物体在图片中复制多分,在保证不影响其他物体的基础上,增加小物体在图片中出现的次数(把小目标扣下来贴到原图中去),提升被anchor包含的概率。

如上图右下角,本来只有一个小目标,对应的anchor数量为3个,现在将其复制三份,则在图中就出现了四个小目标,对应的anchor数量也就变成了12个,大大增加了这个小目标被检出的概率。从而让模型在训练的过程中,也能够有机会得到更多的小目标训练样本。

具体的实现方式如下图:图中网球和飞碟都是小物体,本来图中只有一个网球,一个飞碟,通过人工复制的方式,在图像中复制多份。同时要保证复制后的小物体不能够覆盖该原来存在的目标。

Copy pasting the small objects

参考代码:https://github.com/zhpmatrix/VisDrone2018/tree/master/DataAug_Patching 该部分参考文章:https://zhuanlan.zhihu.com/p/57760020

网上有人说可以试一下lucid data dreaming Lucid Data Dreaming for Multiple Object Tracking,这是一种在视频跟踪/分割里面比较有效的数据增强手段,据说对于小目标物体检测也很有效。

Lucid Data Dreaming for Multiple Object Tracking

参考代码:https://github.com/ankhoreva/LucidDataDreaming

其他

基于无人机拍摄图片的检测目前也是个热门研究点(难点是目标小,密度大)。 相关论文: The Unmanned Aerial Vehicle Benchmark: Object Detection and Tracking(数据集) Drone-based Object Counting by Spatially Regularized Regional Proposal Network Simultaneously Detecting and Counting Dense Vehicles from Drone Images Vision Meets Drones: A Challenge(数据集)

参考文献

1:https://zhuanlan.zhihu.com/p/55824651 2:https://zhuanlan.zhihu.com/p/57760020 3:https://www.zhihu.com/question/269877902/answer/548594081 4:https://zhuanlan.zhihu.com/p/60033229 5:https://arxiv.org/abs/1902.07296 6:http://openaccess.thecvf.com/content_cvpr_2017/papers/Li_Perceptual_Generative_Adversarial_CVPR_2017_paper.pdf 7:http://openaccess.thecvf.com/content_cvpr_2017/papers/Lin_Feature_Pyramid_Networks_CVPR_2017_paper.pdf

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享

 

 

欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响?

转自:https://www.zhihu.com/question/269698662

1. 为什么类别不平衡会影响模型输出?

 大部分模型的默认阈值为输出值的中位数。比如逻辑回归的输出范围为[0,1],当某个样本的输出大于0.5就会被划分为正例,反之为反例。在数据的类别不平衡时,采用默认的分类阈值可能会导致输出全部为反例,产生虚假的高准确度,导致分类失败。因此很多答主提到了几点:1. 可以选择调整阈值,使得模型对于较少的类别更为敏感 2. 选择合适的评估标准,比如ROC或者F1,而不是准确度(accuracy)。举个简单的例子,Sklearn的决策树有一个参数是class_weight,就是用来调整分类阈值的,文档中的公式:  # 权重与样本数中每个类别的数量为负相关,越少见的类别权重越大 n_samples / (n_classes * np.bincount(y))  所以遇到不平衡数据,用集成学习+阈值调整可以作为第一步尝试。

 2. 采样法和类别不平衡有什么关系?  

而通过采样(sampling)来调整数据的不平衡,是另一种解决途径,并且可以和阈值调整同时使用。但采样法不是单纯的从数据角度改变了模型阈值,还改变了模型优化收敛等一系列过程,在此不赘述。  而采样法最受人诟病的就是可能会改变原始数据的分布,从而带来偏差。这个说法是否正确呢?让我们带着疑问来分析一下不同的采样方法有什么区别,该怎么使用。有鉴于总被人批评答题公式太多,今天就以可视化和实验为主。  3. 如何直观理解采样法?  我们使用的第一个实验数据是Cardio(Cardiotocogrpahy dataset),原始数据大小为  :也就是1831条数据,每条数据有21个特征。其中正例176个(9.6122%),反例1655个(90.3878%),属于典型的类别不平衡问题。  先来看一张可视化图,因为原始数据是21维不易展示,所以我们使用T-SNE把数据嵌入到2维空间。图中红色代表正例,蓝色代表反例(建议在电脑端阅读)。数据重叠会加深颜色,甚至造成颜色混合。左上、左下、右上和右下依次是:  原始数据(Original):未经过任何采样处理(  ) 欠采样(Undersampling):从反例中随机选择176个数据,与正例合并(  ) 过采样(Oversampling):从正例中反复抽取并生成1655个数据(势必会重复),并与反例合并(  ) SMOTE:也是一种过采样方法。SMOTE通过找到正例中数据的近邻,来合成新的1655-176=1479个“新正例”,并与原始数据合并(  )。此处应注意SMOTE并不是简单的重复,而是一种基于原始数据的生成。另外一个相似的算法是ADASYN,此处省略。  不同采样方法在2维空间上的展示(使用T-SNE进行嵌入到2维空间后) 所以可以很直观地从图中看出:  1. 过采样(右上)只是单纯的重复了正例,因此会过分强调已有的正例。如果其中部分点标记错误或者是噪音,那么错误也容易被成倍的放大。因此最大的风险就是对正例过拟合。  2. 欠采样(左下)抛弃了大部分反例数据,从而弱化了中间部分反例的影响,可能会造成偏差很大的模型。当然,如果数据不平衡但两个类别基数都很大,或许影响不大。同时,数据总是宝贵的,抛弃数据是很奢侈的,因此另一种常见的做法是反复做欠采样,生成  个新的子样本。其中每个样本的正例都使用这176个数据,而反例则从1655个数据中不重复采样。最终对这9个样本分别训练,并集成结果。这样数据达到了有效利用,但也存在风险:  训练多个模型造成了过大的开销,合并模型结果需要额外步骤,有可能造成其他错误 正例被反复使用,和过采样一样,很容易造成模型的过拟合 3. SMOTE(右下)可以看出和过采样(右上)有了明显的不同,因为不单纯是重复正例了,而是在局部区域通过K-近邻生成了新的正例。相较于简单的过采样, SMOTE:  降低了过拟合风险。K近邻在局部合成数据可以被理解为一种集成学习,降低了方差。但或许也错误的加强了局部的偶然性,从而增加了过拟合风险。但一般来看,优点大于风险 也可以理解为一种过采样的soft version,对于噪音的抵抗性更强 缺点也有,比如运算开销加大,同时可能会生成一些“可疑的点”,如下图所示  4. 采样法归纳总结  让我们把实验所中归纳出的经验性性质总结一下,实验细节和结果在文末:  采样方法一般比直接调整阈值的效果要好。 使用采样方法(过采样和欠采样)一般可以提升模型的泛化能力,但有一定的过拟合的风险,应搭配使用正则化模型 过采样的结果较为稳定,作为一种升级版的过采样,SMOTE也是不错的处理方式,大部分时候和过采样的效果相似 过采样大部分时候比欠采样的效果好,但很难一概而论哪种方法最好,还是需要根据数据的特性(如分布)具体讨论 实验结果在(L2正则的逻辑回归、随机森林、xgboost)一致,因此和采样法搭配使用的模型最好可以很好的处理过拟合 但是不是过采样就是万能药?未必。首先,它不可避免的带来更大的运算开销,其次当数据中噪音过大时,结果反而可能会更差因为噪音也被重复使用。当然,除此以外还有更严谨的统计学理论说明采样的力量,以及如何正确采样,此处按下不表。我的一个不成熟的经验是:使用过采样(或SMOTE)+强正则模型(如XGBoost)可能比较适合不平衡的数据。拿到一个新的数据时,可以不妨直接先试试这个方法,作为基准(Baseline)。  多说两句的话,很多方法都可以结合起来,比如过采样和欠采样是可以结合起来的。一个比较成熟的算法就是用SMOTE过采样,再利用Tomek's link再控制新的样本空间。有兴趣的朋友可以移步4. Combination of over- and under-sampling,这个例子的作者开发了imbalanced-learn(Welcome to imbalanced-learn documentation!),是一个Python上处理数据不平衡的工具库,这个答案中的实验代码都是基于这个工具库。  实验细节:从实际的模型表现上进行一个对比  此处我们默认使用了逻辑回归(L2正则化),同时使用随机森林进行了验证,结果相似。因为节省空间略去。 我们使用了10折交叉验证,评估标准是F1(  )和ROC曲线下的面积 我们评估了 (1) 原始数据 (2) 阈值偏移 (3) 过采样 (4) 欠采样 (5) 构建多个欠采样样本集成 (6) SMOTE的结果。 共使用了5个数据集,具体结果如下: Cardio数据集:Cardiotocogrpahy dataset  Data: cardio | shape: (1831, 21) | F1 Threshold Moving:       0.829987896832 Original:               0.805920420913 Oversampling:           0.963759891658 Undersampling:          0.938725868726 Undersampling Ensemble: 0.821234363304 SMOTE:                  0.971714100029  Data: cardio | shape: (1831, 21) | ROC Threshold Moving:       0.992879432167 Original:               0.991171853188 Oversampling:           0.992246339935 Undersampling:          0.992405698663 Undersampling Ensemble: 0.992896183665 SMOTE:                  0.993895382919 Letter数据集:Letter Recognition dataset  Data: letter | shape: (1600, 32) | F1 Threshold Moving:       0.257964355223 Original:               0.2322000222 Oversampling:           0.80419404639 Undersampling:          0.762522610875 Undersampling Ensemble: 0.265496694535 SMOTE:                  0.94066718832  Data: letter | shape: (1600, 32) | ROC Threshold Moving:       0.778733333333 Original:               0.775133333333 Oversampling:           0.853071111111 Undersampling:          0.798 Undersampling Ensemble: 0.7762 SMOTE:                  0.961724444444 Mnist数据集:mnist dataset - ODDS  Data: mnist | shape: (7603, 100) | F1 Threshold Moving:       0.809942609314 Original:               0.843460421197 Oversampling:           0.963745254804 Undersampling:          0.939662842407 Undersampling Ensemble: 0.795183545913 SMOTE:                  0.972652248517  Data: mnist | shape: (7603, 100) | ROC Threshold Moving:       0.985425233631 Original:               0.985211857272 Oversampling:           0.991881775625 Undersampling:          0.976346938776 Undersampling Ensemble: 0.977791067047 SMOTE:                  0.99455044033 Ionosphere数据集:Ionosphere dataset  Data: ionosphere | shape: (351, 33) | F1 Threshold Moving:       0.755263843708 Original:               0.77205596336 Oversampling:           0.858191681928 Undersampling:          0.787040254432 Undersampling Ensemble: 0.757907605743 SMOTE:                  0.849245387823  Data: ionosphere | shape: (351, 33) | ROC Threshold Moving:       0.8816344887 Original:               0.88384133982 Oversampling:           0.946363011452 Undersampling:          0.881254109139 Undersampling Ensemble: 0.87103349549 SMOTE:                  0.953137058851 Pima数据集:Pima Indians Diabetes dataset  Data: pima | shape: (768, 8) | F1 Threshold Moving:       0.684815686152 Original:               0.614437063812 Oversampling:           0.744106797407 Undersampling:          0.762079698321 Undersampling Ensemble: 0.667769584397 SMOTE:                  0.749990784595  Data: pima | shape: (768, 8) | ROC Threshold Moving:       0.824891737892 Original:               0.824757834758 Oversampling:           0.83276 Undersampling:          0.825577308626 Undersampling Ensemble: 0.82011965812 SMOTE:                  0.84188

 对于样本不平衡的监督学习,的确很头疼,其实欠采样和过采样本身都没有增加更多的信息。我自己之前踩过一些坑,分享如下:  尝试半监督学习的方法; 无法一蹴而就让模型或者算法达到理想结果的时候,注意积累样本; 数据增强,尤其是处理图片数据的时候。 尝试一些无监督学习的方法; 欠采样的时候可以训练多个模型,最后尝试模型投票的方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值