![v2-525f0e3f37e80fc33af7c37102ecb383_1440w.jpg?source=172ae18b](http://img-03.proxy.5ce.com/view/image?&type=2&guid=dc6e025b-ff2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-525f0e3f37e80fc33af7c37102ecb383_1440w.jpg?source=172ae18b)
1、本文pyhton代码参考:DSFD数据增广,RandomBaiduCrop类的代码有重构,其他基本一致
2、标题图是用来数据增广的原图
SSD数据增广
SSD的数据增广堪称经典,论文中,使用数据增广的SSD在VOC2007上提升了8.8%的准确率。SSD做数据增广的初衷是为了减小网络对输入gt size的敏感性,即,不管gt大小如何变化,网络都可以较好检测。
![v2-3ac0c13943df0a75f967d52df1cfa3b6_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=dc6e025b-ff2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-3ac0c13943df0a75f967d52df1cfa3b6_b.jpg)
实现思路
每一张训练图像,随机的进行如下几种选择采样:
- 使用原始的图像
- 随机采样一个patch,与gt之间最小的 jaccard overlap 为:0.1,0.3,0.5,0.7 或 0.9。
- 随机采样一个patch
采样的 patch 是原始图像大小比例是 [0.1,1.0](代码中是 [0.3,1.0]),宽高比在 0.5 到 2之间。当 gt的 中心在采样的 patch 中时,保留该gt,否则删除该gt。
python代码
- 1、 设置7组iou条件[None,min(iou)>0.1, min(iou)>0.3, min(iou)>0.5, min(iou)>0.7, min(iou)>0.9,(None,None)]
- None表示
- (None,None)表示
- 2、对于一张输入图片,随机许选取1组iou条件:
- 如果选择None,返回原图,不进行数据增广
- 如果选择(None,None),返回随机crop,不需要crop出来的区域满足iou条件
- 如果选择其他条件,进入第3步
- 3、循环:如果a,b,c中有任意一个步骤不满足条件则进入下一次循环,至多50次,循环完成都没有生成符合条件图片则返回第2步
- a、对size为weight * height的图片,计算crop size w,h(均比原图小),且h / w < 0.5 or h / w > 2
- b、在图中随机crop w * h的rect,若rect满足step2中的iou条件,则crop rect
- c、对和rect有重叠区域的gt,如果其center在rect中则保留,否则删除该gt,删除后如果rect中还有gt,则返回crop rect、rect中的gt、gt对应label
class
当然,除了以上的主函数,SSD数据增广的整体流程还包括了其他一些操作,例如:修改图片的brightness,contrast,saturation,hue,reordering channels,expand,随机翻转,resize,详见augment.py。
效果展示
![v2-67d3744e0f38d9e60775bc3fed95fd8c_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=dc6e025b-ff2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-67d3744e0f38d9e60775bc3fed95fd8c_b.jpg)
![v2-b12dc1f22f83ef7db22f6e0077c9a976_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=dc6e025b-ff2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-b12dc1f22f83ef7db22f6e0077c9a976_b.jpg)
PyramidBox数据增广
PyramidBox于2018年由baidu发表,文中提出名为Data-anchor-sampling的数据增广方法,该方法与SSD数据增广类似,但Data-anchor-sampling考虑到了gt大小,anchor size和随机裁剪之间的关系,理论上数据增广后可以匹配到更多的positive anchor。
实现思路
anchor尺寸通常不连续,例如[16, 32, 64, 128, 256, 512],但gt尺寸是连续的,即图片中gt的size很多变。为保证随机裁剪后anchor还可以较好的gt,Data-anchor-sampling提出按anchor 尺寸/gt 尺寸resize原图后,再进行随机裁剪。
例如:
- 原图尺寸为240 * 240,图中gt 尺寸为120 *120, 此时和gt最匹配的anchor尺寸为128
- 假设选定anchor 尺寸64,resize ratio= 64/120≈0.5
- 经resize后原图尺寸变为120*120,其中gt尺寸变为60 * 60,此时gt最匹配的anchor尺寸为64
- 之后在resize的基础上进行随机裁剪,不会改变gt尺寸,这样裁剪后的gt仍然可以较好匹配到anchor;反之如果直接在原图上进行随机裁剪,裁剪后gt的size可能会和给定的anchor尺寸相差甚远,不容易匹配到正anchor
python 代码
- 图片resize
- 给定anchor尺寸[16, 32, 64, 128, 256, 512]
- 对图片中的gt计算面积、平均边长(sqrt(面积)
- 随机选取一个gt,假设平均边长为120,找到与其平均边长最近的anchor尺寸,即:128
- 在[16, 32, 64, 128, 256](该list为小于128的anchor尺寸+ 大于128的1个anchor尺寸组成)中随机选取一个anchor尺寸,假设target anchor=64
- 计算resize ratio= 64/120≈0.5
- 利用ratio resize 图片并相应改变gt坐标
- 图片crop
- 在resize后的图片上随机选取1个crop box, 其w=h=crop_size, 保证crop box至少完整覆盖1个gt,获得crop后的image
- 对和crop box有重叠区域的gt,如果其center在crop box中则保留,否则删除该gt
- 输出crop后的image,center在crop box中的gt,gt对应label
class
除了以上的主函数,和SSD数据增广一样,PyramidBox数据增广的整体流程还包括了其他一些操作,例如:修改图片的brightness,contrast,saturation,hue,reordering channels,随机翻转,详见augment.py
效果展示
![v2-5238e7fd7349c19c9f379c38e05cf483_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=dc6e025b-ff2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-5238e7fd7349c19c9f379c38e05cf483_b.jpg)
![v2-a25ad3fc7bb389ea328b4e76fe0878d6_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=dc6e025b-ff2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-a25ad3fc7bb389ea328b4e76fe0878d6_b.jpg)