• 【语义分割】数据增强方法(原图与标签同时扩增)


    1、数据增强作用

       避免过拟合

       提升模型的鲁棒性

      提高模型的泛化能力

      避免样本不均衡的问题

    2.、数据增强分类

    可分为两类:在线增强和离线增强。这两者的区别在于离线增强是在训练前对数据集进行处理,往往能得到多倍的数据集,在线增强是在训练时对加载数据进行预处理,不改变训练数据的数量。

    离线增强一般用于小型数据集,在训练数据不足时使用,在线增强一般用于大型数据集。

    3、方法

    比较常用的几何变换方法主要有:翻转,旋转,裁剪,缩放,平移转换,色彩抖动,尺度变换,对比度变换,噪声扰动,旋转变换;

    比较常用的像素变换方法有:加椒盐噪声,高斯噪声,进行高斯模糊,调整HSV对比度,调节亮度,饱和度,直方图均衡化,调整白平衡等。

    使用Augmentor模块增强

    注意:
    原图与标签图的后缀名必须保持一致,否则只标签图不会增强的

    因为我的图像是由labelme标注的,且将其转化为voc的格式,转化后原图为jpg,原图为png,因为需要统一。统一方式如下:批量修改图像后缀名

    1、安装:
    创建一个环境,然后输入安装命令,命令如下

    pip install Augmentor

    conda install Augmentor

    显示安装成功,既可以继续了。

     2、使用:

    语义分割任务需要同时对原始图和掩码图(mask)进行增强,因此,很多现有的深度学习框架中自带的图像增强工具都不能直接使用。但是通过Augmentor可以很方便的实现该功能。下面举例说明。将图像原图以及它们对应的掩码图,分别放在test1文件夹以及test2文件夹中。使用以下代码进行增强

    原始图

    标签图

    1. #导入数据增强工具
    2. import Augmentor
    3. #确定原始图像存储路径以及标签图的文件存储路径,创建Pipeline实例p
    4. p = Augmentor.Pipeline("originalImages")
    5. p.ground_truth("Segmentationimages")

    (1)旋转(rotate)

    probability指定进行操作的概率大小,max_left_rotation, max_right_rotation指定向左向右最大旋转角度,最大值为25。sample表示从给定图像中生成指定数量的增强图像,可指定多个。

    rotate操作默认在对原图像进行旋转之后进行裁剪,输出与原图像同样大小的增强图像。

    1. p.rotate(probability=1, max_left_rotation=25, max_right_rotation=25)
    2. p.sample(1)

    (2)缩放(scale),但貌似只能等比放大

    scale_factor表示缩放比例,只能大于1,且为等比放大。

    p.scale(probability=1, scale_factor=1.3)

    (3)翻转(flip)

    左右翻转、上下翻转、随机翻转

    1. p.flip_random(probability=1) %随机翻转
    2. p.flip_left_right(probability=0.5) %左右翻转
    3. p.flip_top_bottom(probability=0.5) %上下翻转

    (4)随机亮度增强/减弱(random_brightness)

    min_factor, max_factor为变化因子,决定亮度变化的程度,可根据效果指定。

    1. p.random_brightness(probability=1, min_factor=0.7, max_factor=1.2) %随机亮度
    2. p.random_color(probability=1, min_factor=0.0, max_factor=1) %随机颜色
    3. p.random_contrast(probability=1, min_factor=0.7, max_factor=1.2) %随机对比度

    (5)随机透视变形(skew)

    magnitude表示变形程度。隐藏参数skew_type,值为``TILT``, ``TILT_TOP_BOTTOM``, ``TILT_LEFT_RIGHT``,  ``CORNER``,展开源码才可以看到。源码中采用randomly的方式从四种参数中选择,不需指定。

    其中,``TILT_TOP_BOTTOM``表示只在顶部底部方向进行透视变形。

    ``TILT_LEFT_RIGHT``表示只在左右方向进行透视变形。

    ``CORNER``表示只在四角方向进行透视变形。

    ``TILT``包含上述方向的集合,即上下左右和四角的八个方向。
     

    p.skew(probability=1, magnitude=0.8)

    (6)随机剪切(shear)

    剪切变换,max_shear_left,max_shear_right为剪切变换角度

    p.shear(probability=1, max_shear_left=15, max_shear_right=15)

    (7)随机裁剪(random_crop)

    percentage_area表示裁剪面积占原图像面积的比例,centre指定是否从图片中间裁剪,randomise_percentage_area指定是否随机生成裁剪面积比。

    p.crop_random(probability=1, percentage_area=0.8, centre=False, randomise_percentage_area=True)

    (8)随机擦除/遮挡(random_erasing)

    rectangle_area指定随机擦除面积的百分比。当然这个指定的是擦除面积的上限。

    p.random_erasing(probability=1, rectangle_area=0.5)

    (9)小块变形distortion

    p.random_distortion(probability=0.8,grid_width=10,grid_height=10, magnitude=20)

    完整代码:

    1. import Augmentor
    2. # 确定原始图像存储路径以及掩码文件存储路径,需要把“\”改成“/”
    3. p = Augmentor.Pipeline("originalImages")
    4. p.ground_truth("Segmentationimages")
    5. # 图像旋转: 按照概率0.8执行,范围在0-25之间
    6. p.rotate(probability=0.8, max_left_rotation=25, max_right_rotation=25)
    7. # 图像左右互换: 按照概率0.5执行
    8. p.flip_left_right(probability=0.5)
    9. p.flip_top_bottom(probability=0.5)
    10. # 图像放大缩小: 按照概率0.8执行,面积为原始图0.85
    11. p.zoom_random(probability=0.3, percentage_area=0.85)
    12. #scale_factor表示缩放比例,只能大于1,且为等比放大。
    13. p.scale(probability=1, scale_factor=1.3)
    14. #小块变形
    15. p.random_distortion(probability=0.8,grid_width=10,grid_height=10, magnitude=20)
    16. #随机亮度增强/减弱,min_factor, max_factor为变化因子,决定亮度变化的程度,可根据效果指定
    17. p.random_brightness(probability=1, min_factor=0.7, max_factor=1.2)
    18. #随机颜色/对比度增强/减弱
    19. #p.random_color(probability=1, min_factor=0.0, max_factor=1)
    20. p.random_contrast(probability=1, min_factor=0.7, max_factor=1.2)
    21. #随机剪切(shear) max_shear_left,max_shear_right为剪切变换角度 范围0-25
    22. p.shear(probability=1, max_shear_left=10, max_shear_right=10)
    23. #随机裁剪(random_crop)
    24. p.crop_random(probability=1, percentage_area=0.8, randomise_percentage_area=True)
    25. #随机翻转(flip_random)
    26. p.flip_random(probability=1)
    27. # 最终扩充的数据样本数可以更换为1001000
    28. p.sample(10)

    会自动生成一个out结果,效果如下:

     然后自己手动分开即可。

     

  • 相关阅读:
    什么是PWA(Progressive Web App)?它有哪些特点和优势?
    莫能菌素人血清白蛋白纳米粒Monensin-HSA|合成路线
    如何在 uniapp 里面使用 pinia 数据持久化 (pinia-plugin-persistedstate)
    高防云服务器租用怎么选?
    C和指针 第13章 高级指针话题 13.10 编程练习
    实习打怪之路:webpack概念【入口、输出、装载机、插件、模块】(引自官网)
    【Prism系列】Region的用法
    java Spring Boot 将日志写入文件中记录
    吴恩达团队2022机器学习课程,来啦
    简单讲解 glm::mat4
  • 原文地址:https://blog.csdn.net/weixin_45912366/article/details/127855494