实现径向变换用于样本增强《Training Neural Networks with Very Little Data-A Draft》

2022-12-30,,,,

背景:

做大规模机器学习算法,特别是神经网络最怕什么——没有数据!!没有数据意味着,机器学不会,人工不智能!通常使用样本增强来扩充数据一直都是解决这个问题的一个好方法。

  最近的一篇论文《Training Neural Networks with Very Little Data-A Draft》提出了一个新的图像样本增强方法:对图像使用径向变换生成不同“副本”,解决样本数量太少难以训练的问题。论文地址:https://arxiv.org/pdf/1708.04347.pdf

  该论文提出将图片的直角坐标按指定中心点转换为极坐标来重构图像,从而在不同中心点位置的情况下得到一张图片的多个增强样本,实际就是选取不同的点做圆心,将图像在圆心处展开。

实现:

  论文提供了伪代码,按照伪代码直接写出Python代码很容易:

  

  但事情并没有那么简单!上面的代码输出的是这个样子:

  

  喵!

  看了网上一些实现,图形也不对。只能再仔细检查了一遍。。然后。。发现论文里的“||  ||”原来是取整。。而且作者的直角坐标原点是图的左下角而我们代码是左上角。。

修改:

  知道了问题所在修改一下代码就ok了。去掉abs(),再交换cos和sin

  

 def RT(img, center=(0, 0)):
     U, V, p = img.shape
     RTimg = img.copy() - img
     m, n = center
     for u in range(U):
         d = 2 * math.pi * u / U
         for v in range(V):
             x = v * math.sin(d)
             y = v * math.cos(d)
             mm = int(math.floor(m + x))
             nn = int(math.floor(n + y))
             if mm>=0 and mm<U and nn>=0 and nn<V:
                 RTimg[u, v, :] = img[mm, nn, :]
     return RTimg

  再跑一次图,center取图上圆心坐标:

  

  完美!

  再来增强一波明星图,最近很火的。。

  

  快跑。。

思考:

  个人理解该方法在取点时,越靠近圆心点越密集,相当于有目标的非均匀采样,中心点附近的样本点在变换后占图像比重更大。如下图中黄色区域,点要比外部更密集。

  

  

  这种做法相当于强化中心点附近区域在模型训练中的贡献,与deepid2中对同一张图片切分不同patch用于训练有异曲同工的效果。相较之下这种方法还会保留部分其他非中心区域的信息,考虑更全面。

  至于实际用于训练的效果,小霸王cpu,数据集还没转完,再议。

  原创,转载请声明。完工跑路

实现径向变换用于样本增强《Training Neural Networks with Very Little Data-A Draft》的相关教程结束。

《实现径向变换用于样本增强《Training Neural Networks with Very Little Data-A Draft》.doc》

下载本文的Word格式文档,以方便收藏与打印。