加入收藏 | 设为首页 |

雷火app-计算机视觉模型作用欠安,你可能是被相机的Exif信息坑了

海外新闻 时间: 浏览:294 次

晓查 发自 凹非寺

量子位 报导 | 大众号 QbitAI

为何他人用得好好的人脸辨认、方针检测开源模型,到了初学者手中,作用却不忍目睹?其间原因或许许多,有时候这个原因很“愚笨”。

最近一位Medium上的博主Adam Geitgey给初学者指出了一个极端简略而又简略忽视的要害点:相机的Exif信息。

在开发和运用计算机视觉(CV)模型的过程中,由于NumPy、TensorFlow和电脑上的图片查看器在处理Exif上存在着差异,让这个问题变得十分隐秘。

Adam是一位闻名的机器学习课程博主,他的博客内容十分有用,简直篇篇都能收成上千赞,足见其受欢迎的程度。

他在最新的文章中指出了CV模型在处理Exif存在的缺失,以及弥补办法,下面是他文章的主要内容。

Exif信息害死人

一般智能手机或许相机摄影时,假如手持方向发生变化,内部的重力感应器材会告知设备雷火app-计算机视觉模型作用欠安,你可能是被相机的Exif信息坑了,相片终雷火app-计算机视觉模型作用欠安,你可能是被相机的Exif信息坑了究哪个边是向上的。

当咱们在手机、相机或许电脑的Photoshop软件上查看相片时,彻底没有问题,就像这样:

可是目睹并非为实,实践图画的像素数据不会旋转。这是由于图画传感器是对接连的像素信息流进行逐行读取,因而你不管纵向和横向握持相机,图画都是依照一个方向进行存储。

那么摄影设备和电脑为什么就能依照正确的方向显现图片呢?这是由于相片里还保存着一组元数据,称之为Exif,即可交流图雷火app-计算机视觉模型作用欠安,你可能是被相机的Exif信息坑了画文件格局(Exchangeable image file format)。

Exif中包含着相片的像素数、焦距、光圈等信息,其间还有一个方向(Orientation)的数据。

上图中Orientation一雷火app-计算机视觉模型作用欠安,你可能是被相机的Exif信息坑了项的参数是Rotate 90 CW,意思是图画在显现前需求顺时针旋转90度。假如图片查看程序没有履行此操作,你就只能拧着脖子看了。

Exif原先是用在TIFF图画格局上,后来才参加到JPEG图画格局中,而图画数据会集的图片大多是JPEG格局。

一些程序为了坚持向后兼容性,不会去解析Exif数据。大多数用于处理图画数据的Python库(如NumPy、SciPy,TensorFlow,Keras等)便是这样的。

这意味着当你运用这些东西导入图画时,都将取得原始的未旋转图画数据。假如把这些侧躺着或上下颠倒的图画输入到CV模型中,会得到过错的检测成果。

这个问题看起来很愚笨,好像初学者会犯这样的初级过错。但现实并非如此!甚至连Google云上的视觉API Demo也无法正确处理Exif方向问题:

假如咱们把图画旋转到正确的方向再上传,检测的成果与上图比较将彻底改动:

当咱们在电脑上查看图片时彻底没问题,可是一用到模型中就不正常。因而很难发现问题的地点。

这也导致一些开发者在Github上发问,诉苦他们正在运用的开源项目已损坏,或是模型不行精确。可是实践上问题要简略得多,仅仅图片的方向错了!

处理办法

处理以上问题的办法便是,在导入图画时查看它们的Exif数据,在必要时旋转图画。Adam现已写好了一段代码:

importPIL.Image

importPIL.ImageOps

importnumpy asnp

defexif_transpose(img):

ifnotimg:

returnimg

exif_orientation_tag = 274

# Check for EXIF data (only present on some files)

ifhasattr(img, "_getexif") andisin雷火app-计算机视觉模型作用欠安,你可能是被相机的Exif信息坑了stance(img._getexif, dict) andexif_orientation_tag inimg._getexif:

exif_data = img._getexif

orientation = ex雷火app-计算机视觉模型作用欠安,你可能是被相机的Exif信息坑了if_data[exif_orientation_tag]

# Handle EXIF Orientation

iforientation == 1:

# Normal image - nothing to do!

pass

elifori截获芒果果核象甲entation == 2:

# Mirrored left to right

img = img.transpose(PIL.Image.FLIP_LEFT_RIGHT)

eliforientation == 3:

# Rotated 180 degrees

img = img.rotate( 180)

eliforientation == 4:

# Mirrored top to bottom

img = img.rotate( 180).transpose(PIL.Image.FLIP_LEFT_RIGHT)

eliforientation == 5:

# Mirrored along top-left diagonal

img = img.rotate( -90, expand= True).transpose(PIL.Image.FLIP_LEFT_RIGHT)

eliforientation == 6:

# Rotated 90 degrees

img = img.rotate( -90, expand= True)

eliforientation == 7:

# Mirrored along top-right diagonal

img = img.rotate( 90, expand= True).transpose(PIL.Image.FLIP_LEFT_RIGHT)

eliforientation == 8:

# Rotated 270 degrees

img = img.rotate( 90, expand= True)

returnimg

defload_image_file(file, mode='RGB'):

# Load the image with PIL

img = PIL.Image.open(file)

ifhasattr(PIL.ImageOps, 'exif_transpose'):

# Very recent versions of PIL can do exit transpose internally

img = PIL.ImageOps.exif_transpose(img)

else:

# Otherwise, do the exif transpose ourselves

img = exif_transpose(img)

img = img.convert(mode)

returnnp.array(img)

参加以上代码后,就可以正确地将图画导入Keras或TensorFlow了。

假如觉得费事,Adam还把上面的代码打包好了,在GitHub上这个项目叫做image_to_numpy。一行代码就可以完结装置:

pip3 install image_to_numpy

今后,你在自己的Python代码中参加这样几句即可。

importmatplotlib.pyplot asplt

importimage_to_numpy

# Load your image file

img = image_to_numpy.load_image_file( "my_file.jpg")

# Show it on the screen (or whatever you want to do)

plt.imshow(img)

plt.show

传送门

原文链接:

https://medium.com/@ageitgey/the-dumb-reason-your-fancy-computer-vision-app-isnt-working-exif-orientation-73166c7d39da

快速导入旋转图画的image_to_numpy:

https://github.com/ageitgey/image_to_numpy

作者系网易新闻网易号“各有情绪”签约作者

大会启幕!预见智能科技新未来

量子位MEET 2020智能未来大会启幕,将携手优异AI企业、出色科研人员出现一场高质量职业盛会!概况可点击图片:

榜单搜集!三大奖项,确定AI Top玩家

2019我国人工智能年度评选启幕,将评选领航企业、商业打破人物、最具创新力产品3大奖项,并于MEET 2020大会揭榜,欢迎优异的AI公司扫码报名!

量子位 QbitAI 头条号签约作者

'ᴗ' 追寻AI技能和产品新动态

喜爱就点「美观」吧 !