点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:计算机视觉life

为何别人用得好好的人脸识别、目标检测开源模型,到了初学者手中,效果却惨不忍睹?其中原因可能很多,有时候这个原因很“愚蠢”。

最近一位Medium上的博主Adam Geitgey给初学者指出了一个极其简单而又容易忽视的关键点:相机的Exif信息。

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

Adam是一位知名的机器学习课程博主,他的博客内容非常实用,几乎篇篇都能收获上千赞,足见其受欢迎的程度。

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

Exif信息害死人

普通智能手机或者相机拍照时,如果手持方向发生变化,内部的重力感应器件会告诉设备,照片究竟哪个边是向上的。

当我们在手机、相机或者电脑的Photoshop软件上查看照片时,完全没有问题,就像这样:

然而眼见并非为实,实际图像的像素数据不会旋转。这是由于图像传感器是对连续的像素信息流进行逐行读取,因此你无论纵向和横向握持相机,图像都是按照一个方向进行存储。

那么拍照设备和电脑为什么就能按照正确的方向显示图片呢?这是因为照片里还保存着一组元数据,称之为Exif,即可交换图像文件格式(Exchangeable image file format)。

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

上图中Orientation一项的参数是Rotate 90 CW,意思是图像在显示前需要顺时针旋转90度。如果图片查看程序没有执行此操作,你就只能拧着脖子看了。

Exif原先是用在TIFF图像格式上,后来才加入到JPEG图像格式中,而图像数据集中的图片大多是JPEG格式。

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

这意味着当你使用这些工具导入图像时,都将获得原始的未旋转图像数据。如果把这些侧躺着或上下颠倒的图像输入到CV模型中,会得到错误的检测结果。

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

如果我们把图像旋转到正确的方向再上传,检测的结果与上图相比将完全改变:

当我们在电脑上查看图片时完全没问题,但是一用到模型中就不正常。因此很难发现问题的所在。

这也导致一些开发者在Github上提问,抱怨他们正在使用的开源项目已损坏,或是模型不够准确。但是实际上问题要简单得多,只是图片的方向错了!

解决方法

解决以上问题的方法就是,在导入图像时检查它们的Exif数据,在必要时旋转图像。Adam已经写好了一段代码:

import PIL.Image
import PIL.ImageOps
import numpy as npdef exif_transpose(img):if not img:return imgexif_orientation_tag = 274# Check for EXIF data (only present on some files)if hasattr(img, "_getexif") and isinstance(img._getexif(), dict) and exif_orientation_tag in img._getexif():exif_data = img._getexif()orientation = exif_data[exif_orientation_tag]# Handle EXIF Orientationif orientation == 1:# Normal image - nothing to do!passelif orientation == 2:# Mirrored left to rightimg = img.transpose(PIL.Image.FLIP_LEFT_RIGHT)elif orientation == 3:# Rotated 180 degreesimg = img.rotate(180)elif orientation == 4:# Mirrored top to bottomimg = img.rotate(180).transpose(PIL.Image.FLIP_LEFT_RIGHT)elif orientation == 5:# Mirrored along top-left diagonalimg = img.rotate(-90, expand=True).transpose(PIL.Image.FLIP_LEFT_RIGHT)elif orientation == 6:# Rotated 90 degreesimg = img.rotate(-90, expand=True)elif orientation == 7:# Mirrored along top-right diagonalimg = img.rotate(90, expand=True).transpose(PIL.Image.FLIP_LEFT_RIGHT)elif orientation == 8:# Rotated 270 degreesimg = img.rotate(90, expand=True)return imgdef load_image_file(file, mode='RGB'):# Load the image with PILimg = PIL.Image.open(file)if hasattr(PIL.ImageOps, 'exif_transpose'):# Very recent versions of PIL can do exit transpose internallyimg = PIL.ImageOps.exif_transpose(img)else:# Otherwise, do the exif transpose ourselvesimg = exif_transpose(img)img = img.convert(mode)return np.array(img)

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

如果觉得麻烦,Adam还把上面的代码打包好了,在GitHub上这个项目叫做image_to_numpy。一行代码就可以完成安装:

pip3 install image_to_numpy

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

import matplotlib.pyplot as plt
import image_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

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

计算机视觉训练模型效果不佳怎么破?相关推荐

  1. 数据太少怎么办?试试自监督学习,CV训练新利器,fast.ai新教程,LeCun点评

    点击我爱计算机视觉标星,更快获取CVML新技术 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 数据少,又没有预训练模型,怎么破? 给你个秘密武器--自监督学习. 数据科学家 Jeremy ...

  2. 10个预训练模型开始你的深度学习(计算机视觉部分)

    2019-09-24 21:04:41 作者:PRANAV DAR 编译:ronghuaiyang 导读 对于希望学习算法或尝试现有框架的人来说,预训练的模型是一个很好的帮助.由于时间限制或计算资源的 ...

  3. AutoML Vision教程:训练模型解决计算机视觉问题,准确率达94.5%

    [新智元导读]只要三张拉面图,就能识别出每碗拉面是在41家不同拉面店中的哪家制作出来.数据科学家Kenji Doi开发了一种拉面专家AI分类器,它能辨别出不同拉面之间的细微差异.这背后,是谷歌Auto ...

  4. 优化模型实验报告_BERT微调效果不佳?试试这种大规模预训练模型新范式

    BERT模型自发布至今已整整两年了,但是其余热仍未消减.从一经问世的轰动,简单应用/微调便可达到某个领域或者任务的SOTA效果:到如今的各种『被吊打』,BERT巨人肩膀上的新宠大致可以分为以下这么几类 ...

  5. BERT微调效果不佳?不如试试这种大规模预训练模型新范式

    BERT模型自发布至今已整整两年了,但是其余热仍未消减.从一经问世的轰动,简单应用/微调便可达到某个领域或者任务的SOTA效果:到如今的各种『被吊打』,BERT巨人肩膀上的新宠大致可以分为以下这么几类 ...

  6. 计算机视觉技术 图像分类_如何训练图像分类器并教您的计算机日语

    计算机视觉技术 图像分类 介绍 (Introduction) Hi. Hello. こんにちは 你好 你好. こんにちは Those squiggly characters you just saw ...

  7. 论文阅读笔记:《自然语言处理中的预训练模型》

    Pre-trained Models for Natural Language Processing: A Survey 写在前面: 随着2018年ELMo.BERT等模型的发布,NLP领域进入了&q ...

  8. NLP创业破局,如何摘取更高处的果实

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 2022年,云从科技.商汤科技先后登陆资本市场,计算机视觉四小龙中的旷视科技.依图科技也在摩拳擦掌.反观NLP领域,相关企业的发展速度. ...

  9. 小白入门计算机视觉系列——ReID(一):什么是ReID?如何做ReID?ReID数据集?ReID评测指标?

    ReID(一):什么是ReID?如何做ReID?ReID数据集?ReID评测指标? 行人重识别(也叫Person ReID),车辆重识别和行人重识别类似,有很多的共同之处,所以以下统称该任务为ReID ...

最新文章

  1. oracle 度量 预警,度量阀值预警总结
  2. 华硕服务器第三届“IT硬件平台搭建大赛”获奖方案
  3. java图形界面猜字游戏,java程序,猜字游戏,希望大神帮忙
  4. 【五校联考3day2】B
  5. 网络协议之:还在用HTTP代理?过时了,快试试SOCKS5
  6. 【绝对有用】Server Tomcat v9.0 Server at localhost failed to start
  7. 8个月打磨,一份送给程序员的「分布式系统」合集
  8. 前端学习(1181):vue语法模板
  9. 损失函数、python实现均方误差、交叉熵误差函数、mini-batch的损失函数
  10. Colidity-- Dominator
  11. ubuntu防火墙问题
  12. oracle 主键自增
  13. python组合数据类型包括_第六周 python组合数据类型
  14. 现代信号处理——参数估计理论(2)——估计子、贝叶斯估计、最大似然估计
  15. 再见,爬虫!直接上手的200数据源合集~
  16. Mac单机多实例Mysql(8.0.16)主从配置
  17. 信息系统安全概述(课程笔记)
  18. 【AI简报20210611期】Arm v9架构来啦、开源实战教你实现文字识别!
  19. win10 系统下安装ubuntu实现双系统爬坑记录
  20. 黑群晖私有云NAS:同步百度云盘数据

热门文章

  1. Python一键转Java?“Google翻译”你别闹
  2. 周志华、宋继强谈如何培养高端AI人才,以及深度学习的局限性和未来
  3. AI黑科技:呵护地球,我们是认真的
  4. 10行代码实现目标检测,请收下这份教程
  5. 天哪,路由器都能跑Docker了!
  6. 企业微服务中台落地实践和思想之我见
  7. 十分钟了解算法面经:百度,寒武纪,作业帮,科大讯飞等常面问题
  8. 盘点深度学习中的各种数据增强技巧
  9. 爷青回!GAN生成的超级马里奥关卡,可以永不通关的那种!
  10. 相机居然能存储气味,未来智能家居会是什么样? | CCF C³