关于深度学习:恒源云分享一个技巧CV训练时容易忽视的数据标签问题

47次阅读

共计 1860 个字符,预计需要花费 5 分钟才能阅读完成。

文章起源 | 恒源云社区

原文地址 | 数据标签问题


明天小编逛了一下社区,发现有位小伙伴分享的一个 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 信息。而后再将图片交给标注团队进行打标。

以上即为所有的内容,心愿能帮到有须要的小伙伴。

正文完
 0