写点什么

恒源云 _ 分享一个技巧!CV 训练时容易忽视的数据标签问题

作者:恒源云
  • 2021 年 12 月 02 日
  • 本文字数:1465 字

    阅读完需:约 5 分钟

恒源云_分享一个技巧!CV训练时容易忽视的数据标签问题

文章来源 | 恒源云社区


原文地址 | 数据标签问题




今天小编逛了一下社区,发现有位小伙伴分享的一个 CV 训练小技巧很有点内容,所以,小编立马马不停蹄的搬运过来给有兴趣的小伙伴们看一看。

以下内容是原文内容:

在训练检测模型时,面对万以上量级的数据,可能很多朋友只是随机抽样个几千张图看一下,而并不会仔细检查每一张图片 anno 是否正确。这时候可能会忽视一种常见的标签错位问题,本文将简要介绍该问题,希望对大家有所帮助。


这种问题一般出现在手机拍摄的图片中,表象是:当你用 PIL 库读取图像时,会发现有些图像与检测框错位,直观上如果将图片旋转 90 or 180 or 270 度,正好可以和标签框对应上。


如果你的训练集有大量这种图,很可能导致训练结果不佳。


造成这种现象的原因是手机拍摄的图片很多都带了 exif 信息,其中包含了摄像头旋转角度信息。如果你用 windows 自带的看图软件打开图片,会发现图片会被旋转。opencv 加载图片也是如此,会根据 exif 信息自动旋转(90、180、270 度)。


同理,如果标注数据的工具读取该图片的时候根据 exif 信息做了旋转,eg:labelme,那么 anno 显然对应于旋转后的图片。


但是 PIL 库加载图片并不会自动处理 exif 信息,而很多开源模型在加载数据集时采用的都是 PIL 库,从而影响训练效果。为了避免出现标签错位问题,通常有如下几种方法:

1、所以使用 pil 读图需要注意该问题。尽量用 cv2 读取,实在要用 pil,先 cv2 读取再转成 pil。

2、对 pil 读取的图片做 exif 信息检查 (在此之前 img 不可以调用 convert(‘RGB’)操作,会丢失 exif 信息。


def apply_exif_orientation(image, file):    try:        exif = image._getexif()    except AttributeError:        exif = None
if exif is None: return image
exif = { PIL.ExifTags.TAGS[k]: v for k, v in exif.items() if k in PIL.ExifTags.TAGS }
orientation = exif.get('Orientation', None)
if orientation == 1: # do nothing return image elif orientation == 2: # left-to-right mirror print('left-to-right mirror : {}'.format(file)) return PIL.ImageOps.mirror(image) elif orientation == 3: # rotate 180 print('rotate 180 : {}'.format(file)) return image.transpose(PIL.Image.ROTATE_180) elif orientation == 4: # top-to-bottom mirror print('top-to-bottom mirror : {}'.format(file)) return PIL.ImageOps.flip(image) elif orientation == 5: # top-to-left mirror print('top-to-left mirror : {}'.format(file)) return PIL.ImageOps.mirror(image.transpose(PIL.Image.ROTATE_270)) elif orientation == 6: # rotate 270 print('rotate 270 : {}'.format(file)) return image.transpose(PIL.Image.ROTATE_270) elif orientation == 7: # top-to-right mirror print('top-to-right mirror : {}'.format(file)) return PIL.ImageOps.mirror(image.transpose(PIL.Image.ROTATE_90)) elif orientation == 8: # rotate 90 print('rotate 90 : {}'.format(file)) return image.transpose(PIL.Image.ROTATE_90) else: return image
复制代码

3、统一用 cv2 等库对图片进行处理,去掉 exif 信息。然后再将图片交给标注团队进行打标。


以上即为所有的内容,希望能帮到有需要的小伙伴。

用户头像

恒源云

关注

专注人工智能云GPU服务器训练平台 2020.12.25 加入

还未添加个人简介

评论

发布
暂无评论
恒源云_分享一个技巧!CV训练时容易忽视的数据标签问题