detectron2的read_image方法

在看代码的时候,看到一行注释:use PIL, to be consistent with evaluation

说是用PIL方法加载,却又看见了BGR这种表述,后面的调用也都是cv2格式:

那我就要看下这里面是怎么实现的了,找到了read_image函数,如下:

def read_image(file_name, format=None):"""Read an image into the given format.Will apply rotation and flipping if the image has such exif information.Args:file_name (str): image file pathformat (str): one of the supported image modes in PIL, or "BGR" or "YUV-BT.601".Returns:image (np.ndarray):an HWC image in the given format, which is 0-255, uint8 forsupported image modes in PIL or "BGR"; float (0-1 for Y) for YUV-BT.601."""with PathManager.open(file_name, "rb") as f:image = Image.open(f)# work around this bug: https://github.com/python-pillow/Pillow/issues/3973image = _apply_exif_orientation(image)return convert_PIL_to_numpy(image, format)

原来是用PIL打开后转成了numpy

然后还注意到image = _apply_exif_orientation(image)这句,不知道为了解决啥,幸好有个注释的issue:

# work around this bug: https://github.com/python-pillow/Pillow/issues/3973
 

看了下,就是说之前某些图片应用 exif_transpose 函数会报错,这里进行了解决。

def _apply_exif_orientation(image):"""Applies the exif orientation correctly.This code exists per the bug:https://github.com/python-pillow/Pillow/issues/3973with the function `ImageOps.exif_transpose`. The Pillow source raises errors withvarious methods, especially `tobytes`Function based on:https://github.com/wkentaro/labelme/blob/v4.5.4/labelme/utils/image.py#L59https://github.com/python-pillow/Pillow/blob/7.1.2/src/PIL/ImageOps.py#L527Args:image (PIL.Image): a PIL imageReturns:(PIL.Image): the PIL image with exif orientation applied, if applicable"""if not hasattr(image, "getexif"):return imagetry:exif = image.getexif()except Exception:  # https://github.com/facebookresearch/detectron2/issues/1885exif = Noneif exif is None:return imageorientation = exif.get(_EXIF_ORIENT)method = {2: Image.FLIP_LEFT_RIGHT,3: Image.ROTATE_180,4: Image.FLIP_TOP_BOTTOM,5: Image.TRANSPOSE,6: Image.ROTATE_270,7: Image.TRANSVERSE,8: Image.ROTATE_90,}.get(orientation)if method is not None:return image.transpose(method)return image

顺便又复习了下exif是干啥的:

在图像处理中,exif_orientation是一个EXIF(Exchangeable Image File Format)标签,它包含了关于图像方向的信息。这个标签对于正确显示图像的方向非常重要,尤其是在从相机导入照片到计算机或其他设备时。如果exif_orientation标签没有被正确处理,图像可能会以错误的方向显示,比如被旋转了90度、180度或270度。

在Python的Pillow库(一个图像处理库,也称为PIL的更新版本)中,exif_orientation的处理可能会导致图像显示不正确。这可能是由于以下原因:

  1. 错误的解析逻辑:Pillow可能没有正确解析EXIF数据中的exif_orientation标签,导致无法正确识别图像的正确方向。

  2. 兼容性问题:随着相机和设备的发展,EXIF标准可能会有新的更新,Pillow可能需要更新以支持这些新的变化。

  3. 错误处理:在处理某些特定的EXIF数据时,Pillow可能没有正确处理异常情况,导致图像方向错误。

  4. 性能问题:修复exif_orientation可能还包括优化代码,以提高处理大量图像时的性能。

  5. 用户反馈:用户在使用Pillow处理图像时遇到了方向问题,通过在GitHub上提出issue,开发者意识到需要修复这个问题以提高用户体验。

以前就出现过,读取的图像总是和原始图像的方向不一致,本质上是有旋转信息但是没应用过去,下次可以用这个来处理。

又是一个小细节,做个笔记,以上。

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

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

相关文章

[R] Why data manipulation is crucial and sensitive?

What does a data scientist really do? Identifying the pattern in cultural consumption, making fancy graph, engage a dialogue between data and the existing literature, refining hypothesis….(done within one months with three to four online meetings with p…

app的启动

前言 本篇文章讲解ios的应用程序的启动 应用程序的加载 点击一个app 首先,我们在手机上点击一个app图标 内核初始化 操作系统收到启动app的消息后,会调用内核代码初始化内存空间,为app创建进程然后操作系统通过系统调用读取并解析app的…

apktool 简单快速 反编译apk获取图片资源

apktool:下载地址:iBotPeaches / Apktool / Downloads — Bitbucket把 myapp.apk 和 apktool_2.9.3.jar 放在同一文件夹,注意不要有中文路径 java -jar apktool_2.9.3.jar d -f myapp.apk -o myapp java -jar: java 执行jar命令 apktool_2.9.3.jar: a…

C语言实现的数组合并与排序程序

引言 在本篇博客中,我们将详细解析一段C语言代码,该代码实现了从用户处接收两个整数数组,将它们合并为一个数组后进行排序,并最终输出排序后的结果。这段代码主要涵盖了数组操作、数据输入、冒泡排序算法以及数据输出等核心编程概…

【涵子来信】——拆机,感想

大家好,我是涵子。 初中的第一个学期结束了,来临寒假。我在寒假做了一件有趣的事情:拆机,修手机。今天我来分享分享这件事情。 拆机 情况介绍 拆机对象: iPhone 6 Plus 情况: 电池健康度100%&#xff08…

按身高和体重排队(100%用例)C卷(JavaPythonC++Node.jsC语言)

某学校举行运动会,学生们按编号 (1 、 2 、 3 … n) 进行标识,现需要按照身高由低到高排列,对身高相同的人,按体重由轻到重排列;对于身高体重都相同的人,维持原有的编号顺序关系。请输出排列后的学生编号。 输入描述: 两个序列,每个序列由n个正整数组成(0 < n <…

Unity-WebGL

问题&#xff1a;提示gzip压缩报错解决&#xff1a;关闭打包的地方压缩&#xff0c;如下图问题&#xff1a;窗口未全屏解决&#xff1a;使用百分比画布替换固定尺寸画布 参考&#xff1a;新版Unity打包Webgl端进行屏幕自适应_unity webgl分辨率自适应-CSDN博客问题&#xff1a;…

GBASE数据库注册例程的权限

要在数据库中注册例程&#xff0c;被授权的用户将 SPL 命令包含在 CREATE FUNCTION 或 CREATE PROCEDURE 语句中。数据库服务器存储内部注册了的 SPL 例程。下列用户具 有在数据库中注册新的例程的资格&#xff1a; • 有 DBA 权限的任何用户可在 CREATE 语句中&#xff0c;使…

Springboot+Redis

首先前提我们要在自己的本机电脑或者服务器上安装一个redis的服务器 Redis配置 添加依赖: <!-- SpringBoot Boot Redis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artif…

MicroPython核心:编译器

MicroPython编译过程包括以下步骤&#xff1a; 词法分析器将MicroPython程序文本流转换为标记。语法解释器将标记转换为抽象语法&#xff08;语法树&#xff09;。根据语法书输出字节码或本地代码。 本文以给MicroPython增加一个简单的语言特性为例来说明这一过程&#xff1a…

Linux Archcraft结合内网穿透实现SSH远程连接

文章目录 1. 本地SSH连接测试2. Archcraft安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接5. 固定SSH公网地址6. SSH固定地址连接7. 结语 Archcraft是一个基于Arch Linux的Linux发行版&#xff0c;它使用最简主义的窗口管理器而不是功能齐全的桌面环境来提供图形化用户界面。…

JVM 内存模型

1 什么是 JVM 内存模型 JVM 需要使用计算机的内存&#xff0c;Java 程序运行中所处理的对象或者算法都会使用 JVM 的内 存空间&#xff0c;JVM 将内存区划分为 5 块&#xff0c;这样的结构称之为 JVM 内存模型。 2 JVM 为什么进行内存区域划分 随着对象数量的增加&#xff…

马哈鱼SQLFlow Lite的python版本

Gudu SQLFlow 是一款用来分析各种数据库的 SQL 语句和存储过程来获取复杂的数据血缘关系并进行可视化的工具。 Gudu SQLFlow Lite version for python 可以让 python 开发者把数据血缘分析和可视化能力快速集成到他们自己的 python 应用中。 Gudu SQLFlow Lite version for p…

Banana Pi BPI-R4开源路由器开发板快速上手用户手册,采用联发科MT7988芯片设计

介绍 Banana Pi BPI-R4 路由器板采用 MediaTek MT7988A (Filogic 880) 四核 ARM Corex-A73 设计&#xff0c;4GB DDR4 RAM&#xff0c;8GB eMMC&#xff0c;板载 128MB SPI-NAND 闪存&#xff0c;还有 2x 10Gbe SFP、4x Gbe 网络端口&#xff0c;带 USB3 .2端口&#xff0c;M.2…

计算机服务器中了halo勒索病毒怎么办,halo勒索病毒解密

在网络技术飞速发展的今天&#xff0c;越来越多的企业依赖数字化办公&#xff0c;为企业的生产生活提供了极大便利&#xff0c;但网络是一把双刃剑&#xff0c;网络安全威胁无处不在。近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器中了ha…

【Java】实现图书管理系统

文章目录 1. 设计背景2. 需求分析3. 设计思路4. 实现4.1 book包4.1.1 Book类4.1.2 BookList类(书架) 4.2 user包4.2.1 User 类4.2.2 AdminUser类&#xff08;管理员用户&#xff09;4.2.3 NormalUser类&#xff08;普通用户&#xff09; 4.3 operation包4.3.1 IOPeration接口4.…

Maven基本使用

Maven简介: Apache Maven 是一个项目管理和构建工具&#xff0c;它基于项目模型(POM)的概念&#xff0c;通过一小段描述信息来管理项目的构建&#xff0c;报告和文档 Maven的作用: (1&#xff09;项目搭建&#xff1b; &#xff08;2&#xff09;依赖管理&#xff1b; &#xf…

[力扣 Hot100]Day16 除自身以外数组的乘积

题目描述 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n…

Mac Monitor:一款为macOS安全研究量身定制的高级独立系统监控工具

关于Mac Monitor Mac Monitor是一款功能强大的高级独立系统安全监控工具&#xff0c;该工具专为macOS安全研究、恶意软件分类和系统故障排除而设计&#xff0c;主要基于Apple Endpoint Security&#xff08;ES&#xff09;实现其功能。 Mac Monitor能够收集各种类型的系统事件…

ASP.NET Core 过滤器 使用依赖项注入

过滤器是 ASP.NET Core 中的特殊组件&#xff0c;允许我们在请求管道的特定阶段控制请求的执行。这些过滤器在中间件执行后以及 MVC 中间件匹配路由并调用特定操作时发挥作用。 简而言之&#xff0c;过滤器提供了一种在操作级别自定义应用程序行为的方法。它们就像检查点&#…