最近在学习data augmentation的一些方法,在训练模型时经常碰到训练数据不够的情况,尤其是图像方面的模型,例如CNN。这时候对数据进行增强可以大大扩充训练集的规模,对模型的最终的准确度和泛化能力都有很大的帮助,有时甚至是决定性的作用
今天先学习了下图像方面的增强方法,主要是对图像进行小幅度的旋转,平移,缩放和错切,这4个方面的变换可以组成任意的affine transformation。实际应用时就是把原有数据的不同尺寸的图片缩放到相同尺寸,并添加随机的小幅度旋转,平移和错切来生成大量额外训练数据。
旋转
图片画的不是特别好,请轻吐槽
原有的点(X,Y)和坐标轴夹角 θ θ ,旋转 α α 角度后到达 (X́ ,Ý ) ( X ´ , Y ´ ) , 记(X,Y)的模为L, 那么:L∗cos(θ)=XL∗sin(θ)=YL∗cos(θ+α)=X́ L∗sin(θ+α)=Ý L ∗ c o s ( θ ) = X L ∗ s i n ( θ ) = Y L ∗ c o s ( θ + α ) = X ´ L ∗ s i n ( θ + α ) = Y ´从三角公式可得:
L∗(cos(θ)∗cos(α)−sin(θ)∗sin(α))=X́ L∗(sin(θ)∗cos(α)+cos(θ)∗sin(α))=Ý L ∗ ( c o s ( θ ) ∗ c o s ( α ) − s i n ( θ ) ∗ s i n ( α ) ) = X ´ L ∗ ( s i n ( θ ) ∗ c o s ( α ) + c o s ( θ ) ∗ s i n ( α ) ) = Y ´
代入初始公式:
X∗cos(α)−Y∗sin(α)=X́ Y∗cos(α)+X∗sin(α)=Ý X ∗ c o s ( α ) − Y ∗ s i n ( α ) = X ´ Y ∗ c o s ( α ) + X ∗ s i n ( α ) = Y ´
最终得到:
⎡⎣⎢⎢⎢X́ Ý 1⎤⎦⎥⎥⎥=⎡⎣⎢⎢cos(α)sin(α)0−sin(α)cos(α)0001⎤⎦⎥⎥∗⎡⎣⎢⎢XY1⎤⎦⎥⎥ [ X ´ Y ´ 1 ] = [ c o s ( α ) − s i n ( α ) 0 s i n ( α ) c o s ( α ) 0 0 0 1 ] ∗ [ X Y 1 ]平移
平移比较简单
X+Xt=X́ Y+Yt=Ý X + X t = X ´ Y + Y t = Y ´
写成类似形式
⎡⎣⎢⎢⎢X́ Ý 1⎤⎦⎥⎥⎥=⎡⎣⎢⎢100010XtYt1⎤⎦⎥⎥∗⎡⎣⎢⎢XY1⎤⎦⎥⎥ [ X ´ Y ´ 1 ] = [ 1 0 X t 0 1 Y t 0 0 1 ] ∗ [ X Y 1 ]- 缩放
缩放和平移类似,也比较简单
X∗Xzoom=X́ Y∗Yzoom=Ý X ∗ X z o o m = X ´ Y ∗ Y z o o m = Y ´
写成类似形式
⎡⎣⎢⎢⎢X́ Ý 1⎤⎦⎥⎥⎥=⎡⎣⎢⎢Xzoom000Yzoom0001⎤⎦⎥⎥∗⎡⎣⎢⎢XY1⎤⎦⎥⎥ [ X ´ Y ´ 1 ] = [ X z o o m 0 0 0 Y z o o m 0 0 0 1 ] ∗ [ X Y 1 ]
- 错切
错切可以通过矩形变成平行四边形来理解,错切可以沿着任意一个坐标轴进行,图例是沿着Y轴进行错切
X+sin(θ)∗Y=X́ Y∗cos(θ)=Ý X + s i n ( θ ) ∗ Y = X ´ Y ∗ c o s ( θ ) = Y ´
写成类似形式
⎡⎣⎢⎢⎢X́ Ý 1⎤⎦⎥⎥⎥=⎡⎣⎢⎢100sin(θ)cos(θ)0001⎤⎦⎥⎥∗⎡⎣⎢⎢XY1⎤⎦⎥⎥ [ X ´ Y ´ 1 ] = [ 1 s i n ( θ ) 0 0 c o s ( θ ) 0 0 0 1 ] ∗ [ X Y 1 ]
欢迎大家批评指正!
- 错切