yolov5踩坑记录:标签错位(PIL读取图片方向异常)

PIL踩坑记录:读取图片方向异常(yolov5标签错位)

奇怪的现象

今天用 YOLOv5 做项目时,对数据集的标记出现了奇怪的现象,在下述测试用例中可明显看到,标记框偏离了物体,故发文阐述原因和解决方法. ——©️ Sylvan Ding 转载需注明出处

在这里插入图片描述

下载了一份数据集UNIMIB2016,使用 PIL 读取其中一张照片并标记 bbox.

from PIL import Imageimg_name = '20151127_120643.jpg'
img = Image.open(img_name)
img.show()

在这里插入图片描述

from PIL import ImageDraw
from PIL import ImageFontlabel_name = '20151127_120643.txt'
with open(label_name) as file:items = file.readlines()draw = ImageDraw.Draw(img)
for item in items:item = item.split()# convert str to intitem[1:] = list(map(int, item[1:]))# draw bboxdraw.rectangle([item[1], item[2], item[5], item[6]],outline="red", width=20)# add text about order of the pointsfor j, i in enumerate([1, 3, 5, 7]):j = j + 1draw.text([item[i], item[i + 1]], str(j))img.show()# items
# ['pane 2008 404 2713 404 2713 915 2008 915\n',
#  'pizzoccheri 1502 1104 2500 1104 2500 1984 1502 1984\n',
#  'arrosto 634 602 1193 602 1193 1371 634 1371\n',
#  'patate/pure 271 539 708 539 708 1408 271 1408\n']# the lash item, whose form is [cls, x1, y1, x2, y2, x3, y3, x4, y4]
# ['patate/pure', 271, 539, 708, 539, 708, 1408, 271, 1408]

在这里插入图片描述

bbox 正确,但整张图片好似被旋转了一样。接着使用 cv2 进行相同操作,并观察结果。

import cv2
from matplotlib import pyplot as pltimg = cv2.imread(img_name)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)for item in items:item = item.split()# convert str to intitem[1:] = list(map(int, item[1:]))# draw bboxcv2.rectangle( img,(item[1], item[2]),(item[5], item[6]),(0, 255, 0), 30)plt.imshow(img)
plt.show()

在这里插入图片描述

不难发现,draw bbox 中使用的坐标均为 [x1,y1], [x3, y3],即对角坐标(left-top、right-bottom),但 PILcv2 的结果不同。cv2 中 bbox 错位了,而 PIL 中 text 发生了旋转.

😯 为什么会产生这种现象呢?从 EXIT 说起:

什么是EXIF?

EXIF(Exchangeable Image File)是"可交换图像文件"的缩写,当中包含了专门为数码相机的照片而定制的元数据,可以记录数码照片的拍摄参数、缩略图及其他属性信息。Exif 文件实际是JPEG文件的一种,遵从JPEG标准,只是在文件头信息中增加了有关拍摄信息的内容和索引图。

简单来说,Exif 信息就是由数码相机在拍摄过程中采集一系列的信息,然后把信息放置在我们熟知的 JPEG/TIFF 文件的头部,也就是说 Exif信息是镶嵌在 JPEG/TIFF 图像文件格式内的一组拍摄参数,它就好像是傻瓜相机的日期打印功能一样,只不过 Exif信息所记录的资讯更为详尽和完备。

EXIF Orientation tag

EXIF Orientation tag(EXIF方向参数)让你随便照像但都可以看到正确方向的照片而无需手动旋转(前提要图片浏览器支持,Windows 自带的不支持).

在这里插入图片描述

⭐️ 原因解释

造成第一目中“奇怪现象”的原因,我将其归纳为:在标记数据集时,不关注图像的 EXIF Orientation tag,而图像本身是含有 EXIF Orientation tag 的。在 PIL 读取图片时,创建了 Image 对象,其中存有 EXIF Orientation tag,根据该标记,不仅旋转了图像,还旋转了图像的参考系。而 cv2 读取图片时,直接生成 numpy.ndarray 数组,只根据 EXIF Orientation tag 对图像进行了旋转,但并没有旋转图像的参考系

PIL

在这里插入图片描述

在这里插入图片描述

cv2

在这里插入图片描述

在绘制矩形框时,二者依赖的参考系不同,导致标记的错位。而 yolov5 使用的正是 cv2,故读取含 EXIF Orientation tag 的图片时,会造成 labels 和 图片的错位。

原因证实

PIL 的 PIL.ImageOps.exif_transpose(image)方法,可以在读取图片后,清除 Image 对象内的 EXIF Orientation tag,从而让坐标系不受该 tag 的影响.

from PIL import ImageOpsimg = Image.open(img_name)
img = ImageOps.exif_transpose(img)# draw bbox
...

1

可见,清除 EXIF 旋转信息后,PIL 所得结果和 cv2 结果一致!

⭐️ 解决方法

❤️ 当然,如果你有更好的方法欢迎在评论区留言告诉我哦!

from os import listdir
from PIL import Image
import numpy as npimg = './images/'
if __name__ == '__main__':for img_name in listdir(img_path):img = Image.open(img_path + img_name)img_rectified = Image.fromarray(np.asarray(img))img_rectified.save(img_path + img_name)

上述代码对 ./images/文件夹下所有图片进行了“修正”,核心是 img_rectified = Image.fromarray(np.asarray(img)),(1). 将 img 转化为 ndarray,(2). 再将该ndarray转化为Image并保存.

(1)、(2) 等同于去除了图片所有的 EXIF 信息,这样图片就不会再发生“自动旋转”的现象了.

在这里插入图片描述

转载请注明出处:©️ Sylvan Ding

参考文献

  1. PIL thumbnail is rotating my image?
  2. 图片元信息Exif,给你详细讲讲
  3. EXIF 方向参数 Orientation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

理解与理论:人工智能基础问题的悲观与乐观

来源:筑土为坛梅剑华,男,1980年生,湖北秭归人,山西大学哲学社会学院教授,博士生导师,先后赴美国罗格斯大学、匹兹堡大学、奥地利萨尔茨堡大学等访学,研究方向是语言哲学与心灵哲学、…

设计模式系列 - 原型模式

所谓原型模式是指为创建重复对象提供一种新的可能。 介绍 当面对系统资源紧缺的情况下,如果我们在重新创建一个新的完全一样的对象从某种意义上来讲是资源的浪费,因为在新对象的创建过程中,是会有系统资源的消耗,而为了尽可能的节…

图像二值化(Image Binarization):平均值法、双峰法、大津算法(OTSU)

图像二值化(Image Binarization):平均值法、双峰法、大津算法(OTSU) 编程实现图像的二值化,分析不同的阈值对二值化图像的影响。 问题描述 传统的机器视觉通常包括两个步骤:预处理和物体检测…

全球最快AI超级计算机开动,每秒4百亿亿浮点运算!正拼接最大宇宙3D地图

来源:venturebeat宇宙是在不断膨胀的吗?是的!而令宇宙不断膨胀的「罪魁祸首」就是暗能量。作为是宇宙中最神秘的物质,它看不见摸不着,为了捕捉它,人类在地球上建立了许多相关实验,但都成效甚微。…

基于YOLOv5的中式快餐店菜品识别系统

基于YOLOv5的中式快餐店菜品识别系统[金鹰物联智慧食堂项目] 摘要 本文基于YOLOv5v6.1提出了一套适用于中式快餐店的菜品识别自助支付系统,综述了食品识别领域的发展现状,简要介绍了YOLOv5模型的历史背景、发展优势和网络结构。在数据集预处理过程中&am…

谋局科技创新:两院院士大会释放重要信号

来源:经济参考报作者:班娟娟、钟源从坚持把科技自立自强作为国家发展的战略支撑,到加快建设科技强国,实现高水平科技自立自强;从加强原创性、引领性科技攻关,坚决打赢关键核心技术攻坚战,到强化…

图像加减运算

图像的加减运算 原创文章:转载请注明出处 ©️ Sylvan Ding 图像相加 图像相加常常被用来进行图片降噪处理。令 g(x,y)g(x,y)g(x,y) 是无噪声理想图像 f(x,y)f(x,y)f(x,y) 被高斯加性噪声 η(x,y)\eta (x,y)η(x,y) 污染后的图像,即 g(x,y)f(x,y)η…

随机森林是我最喜欢的模型

来源:机器之心TensorFlow 决策森林 (TF-DF) 现已开源,该库集成了众多 SOTA 算法,不需要输入特征,可以处理数值和分类特征,为开发者节省了大量时间。在人工智能发展史上,各类算法可谓层出不穷。近十几年来&a…

拉普拉斯锐化[原理及Python实现](含拉氏标定、拉普拉斯标定)

拉普拉斯锐化 [原理及Python实现](含拉氏标定、拉普拉斯标定) 原创文章;转载请注明出处:©️ Sylvan Ding 锐化处理的主要目的是突出灰度的过度部分。图像锐化的用途多种多样,应用范围从电子印刷和医学成像到工业…

以太坊 方法签名

最近在工作中使用web3j调用合约,发现一个比较头疼的问题?复杂一点的合约参数多了,函数的方法签名老是出错。在这之前调用合约方法一直都是拼接合约的函数签名以及参数。为了能快速的获取每个合约的函数签名,我在思考是否便捷可行解…

训练 GPT-3,为什么原有的深度学习框架吃不消?

来源:AI前线作者:一流科技 CEO 袁进辉近年来,深度学习被广泛应用到各个领域,包括计算机视觉、语言理解、语音识别、广告推荐等。在这些不同领域中,一个共同的特点就是模型规模越来越大,比如 GPT-3 模型的参…

Canny边缘检测原理及其python实现

Canny边缘检测原理及其python实现 转载请注明出处:©️ Sylvan Ding Canny边缘检测算法 多数分割算法均基于灰度值的两个基本性质之一:不连续性和相似性。图像的边缘检测就是基于灰度的不连续性(灰度突变)来实现图像分割的。…

离奇的梦境,能够防范大脑过拟合

来源:混沌巡洋舰 1 )梦让我们对世界的理解不再那么简单化关于为什么大脑进化出夜间做梦?神经科学界提出了各种假说,诸如通过梦来调节情绪,巩固记忆,或梦可以帮助我们选择性的遗忘,对我们应对现实世界的问题…

RGB空间中的彩色图像分割原理及其python实现

RGB空间中的彩色图像分割 ⭐️ 为尊重原创性!转载请注明出处:©️ Sylvan Ding’s Blog 概述 本文论述了基于欧式距离和曼哈顿距离的彩色图像分割算法,并用python实现了各个算法。之后将二者的优势结合,提出了改进后的曼哈顿…

路飞学城Python-Day171

Evernote Export 线性结构:python的列表操作列表是如何存储的:顺序存储的,是一块连续的内存,内存是一堆格子,列表是一串连续的编号32位机器上一个整数占4个字节数组和列表有2点不同,1.数组的元素类型要求是…

HarmonyOS 2面世!是没有退路还是时机成熟?中国操作系统崛起元年或已到来

来源:21Tech(News-21)作者:倪雨晴编辑:张星6月2日晚间,华为鸿蒙操作系统HarmonyOS迎来重要时刻,华为正式发布多款搭载HarmonyOS 2的新产品,包括HUAWEI Mate 40系列新版本、Mate X2新版本、HUAWEI WATCH 3系…

操作系统:线程同步

操作系统:线程同步 使用Linux无名信号量实现了读写者线程的互斥和同步。 实验环境 环境:Linux语言:CCMake:3.17.1GCC:7.5.0IDE:Clion 2020.3.1 实验目标 理解进程同步的两种制约关系:互斥与…

中国工程院2021年院士增选第二轮候选人名单公布

来源:先进制造业中国工程院2021年院士增选进入第二轮评审候选人名单(按候选人姓名拼音排序)未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城…

vsftpd部署流程和常见问题详解

vsftpd部署流程和常见问题详解 ⭐️ 网上关于在云服务器里配置vsftpd的文章鱼龙混杂,没有一篇是可以彻底解决问题的,有些问题虽简单,但也让初学者感到困惑。本文详细说明vsftpd的部署流程和一些常见问题的解决方法,详述用户创建过…

谷歌发布史上最强人类大脑「地图」,1.3亿个突触,在线可视3D神经元「森林」!...

来源:Google AI Blog编辑:yaxin, LQ (新智元)突触,是神经网络的「桥梁」。我们知道,人类大脑有860亿个神经元,因为有了突触,才可以把神经元上的电信号传递到下一个神经元。长久以来&…