问题背景:
书接上会,
python 图像转视频 并保持视频高质量(h264)及 方法综合列举-CSDN博客
图像转换为视频之后,假借与视频后端torchvision_decode,pyslowfast库包含了这一方法的实现,而为视频现成提供的类 Kinetics 便是 最先需要继承的,以此来构造合适的dataloader。
问题描述
在使用 Kinetics 其中的数据增强的同时手动 plt 以观察 效果 ,发现与原图并无变化
解决过程及问题成因:
仔细参看该类中源码
def __init__( self, 。。。省略 # other parameters enable_multi_thread_decode=False, use_offset_sampling=True, inverse_uniform_sampling=False, num_retries=10, # pretrain augmentation repeat_aug=1, # aa_type="rand-m7-n4-mstd0.5-inc1", aa_type="rand-m5-n2",#-inc1", pretrain_jitter_scales_relative=[0.08, 1.0], pretrain_jitter_aspect_relative=[0.75, 1.3333], pretrain_rand_flip=True, pretrain_rand_erase_prob=0.25, pretrain_rand_erase_mode="pixel", pretrain_rand_erase_count=1, pretrain_rand_erase_split=False, rand_aug=False, ):
参数randaug 指定了 是否使用数据增强
而其中列举的方法很多:
[ "AutoContrast", "Equalize", "Invert", "Rotate", "Posterize", "Solarize", "SolarizeAdd", "Color", "Contrast", "Brightness", "Sharpness", "ShearX", "ShearY", "TranslateXRel","TranslateYRel"....手动省略]
大多来源于 ImageOps 和 ImageEnhance,具体使用看很多博客给出的大都相同 且 部分相同内容居然仍要收费,离谱。。。
这里直接给出 其官方文档ImageEnhance 模块 - Pillow (PIL Fork) 10.0.1 文档
不可能有博客比这个官方文档还详细,其中可自行寻找 ImageOps 和 ImageEnhance 的具体参数和使用方法,大家都很聪明只要有 文档 资源 大家都能学会,因此这里不繁琐列举所有例子。
我继而 通过 rand_augment_transform(config_str, hparams)方法 指定我需要的 数据增强方法,因为博主使用无监督方式所以有一定依赖, 在之后发现 有些方法居然 在使用前后 plot 出来的样式没有变化,第一反应是像素级别的变化肉眼无法看出,但是通过选取 更多的 num_layers 来增加变化的类别个数依然没有变化 我开始质疑是不是我自己指定出现问题
尤其是在这些类别中:
"Color": _enhance_level_to_arg, "ColorIncreasing": _enhance_increasing_level_to_arg, "Contrast": _enhance_level_to_arg, "ContrastIncreasing": _enhance_increasing_level_to_arg, "Brightness": _enhance_level_to_arg, "BrightnessIncreasing": _enhance_increasing_level_to_arg, "Sharpness": _enhance_level_to_arg, "SharpnessIncreasing": _enhance_increasing_level_to_arg,
解决方案:
最后发现 在我给出的:参数 :rand-m9-n3-mstd0.5'中
rand-m9-n3-mstd0.5' results in RandAugment with magnitude 9, num_layers 3, magnitude_std 0.5
# rand-m5-n2 m这个 值给我自己是列出的是 5 导致在如
ImageEnhance.Brightness(img).enhance(factor)
中 factor 计算由下函数得出,且 level 为 magnitude 的情况下
def _enhance_level_to_arg(level, _hparams): # range [0.1, 1.9] return ((level / _MAX_LEVEL) * 1.8 + 0.1,) # _MAX_LEVEL = 10
返回的 factor 大小 衡为 1 ,根据文档:一个 enhancement factor 值为0.0时图像为模糊,系数为1.0时为原始图像,系数为2.0时为锐化图像。可知就是不会发生变化
因此在 类别选择中使用如下
"ColorIncreasing", "ContrastIncreasing", "BrightnessIncreasing", "SharpnessIncreasing", 等类别 其 factor 参数 计算方法如下:
def _enhance_increasing_level_to_arg(level, _hparams): level = (level / _MAX_LEVEL) * 0.9 level = 1.0 + _randomly_negate(level) return (level,)
可使其输出值固定发生变化
结论及重点:
本文 详细介绍了使用pyslowfast 使用 Kinetics 构建 dataloader 的时需要用到 自定义数据增强的方法,并且列举了数据增强的库实现方式:PIL 模块 ImageEnhance, ImageOps