目前在使用Pytorch训练的深度学习模型算法,大部分由于pillow与torchvision中transforms的优异兼容都会采用Image.open from pillow的方式进行图像数据的读取和crop or resize。

这种方案在纯学术环境下不会暴露其问题,但是用到工业部署环境下就会暴露其致命的问题。由于目前C++工业部署大部分使用的还是opencv框架进行图像数据的处理,但是我们发现opencv读取图像进行resize操作时,其模型的预测精度比pillow前处理版本将下降10%到60%,这巨大的gap不由得引起我们的关注。为什么会造成这种情况。

于是我们对同一种图像分别用两个框架进行读取、resize这两个操作判断其像素间的差异。

import cv2
from PIL import Image
import numpy as np # pillow读取并转换为int8格式数组
pil_img = Image.open("test.jpg").convert("RGB")
pil_arr = np.uint8(np.array(pil_img)) # opencv读取并转换为int8格式数组
cv_img = cv2.imread("test.jpg")
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
cv_arr = np.uint8(np.array(cv_img)) # 计算其读取误差
mean_error = np.mean(np.absolute(pil_arr - cv_arr))

读取平均像素误差

在这里我们就发现这两种框架在读取上就会造成误差,但是opencv和pillow读取有误差已经算是一个常识了,并且在未归一化的前提下只有0.0003像素值的平均误差已经很低了,应该不是造成巨大gap的原因。

归一化后的读取误差可以忽略不计

为了进一步的验证不是读取造成的模型推理精度误差,我们使用opencv读取的图片转换为pillow格式后,用pillow前处理然后推理得到的结果和pillow本身读取推理的结果是一致的。

接下来我们进一步对resize操作进行验证,两个框架均使用同一种resize算法:

# pillow resize
pil_img = pil_img.resize((300, 300), Image.BICUBIC)
pil_arr = np.uint8(np.array(pil_img)) # opencv读取并转换为int8格式数组
cv_img = cv2.resize(cv_img, (300, 300), cv2.INTER_CUBIC)
cv_arr = np.uint8(np.array(cv_img)) # 计算其resize误差
mean_error = np.mean(np.absolute(pil_arr - cv_arr))

resize平均像素误差

77的平均像素误差!要知道像素值的范围也只有0到255,将近三分之一的误差,说明两者在同一种resize的实现逻辑一定有巨大差异,这种误差将在使用opencv部署pillow训练模型的时候造成巨大的精度gap。

后续对此情况进行调研,发现这个问题在2017年的时候,就已经有人在pillow的官方仓库下提出。

pillow仓库问题链接

pillow框架在resize算法实现上和opencv、matlab均有巨大差异,但是pillow并不认为这是他们的问题,所以也一直没有修改。

从开发者的角度上来说,为了工业部署时对精度的良好把控,建议在训练时不要使用pillow框架和torchvision自带的前处理方案,保证训练和部署对数据处理的一致性,避免这种由框架不同导致的巨大gap。

相关解决方案

Opencv与Pillow图片操作差异对深度学习的影响的更多相关文章

  1. 深度学习 + OpenCV,Python实现实时视频目标检测

    使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加入原有的目标检测功能. 在本文中我们将学习如何扩展原有的目标检测项 ...

  2. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...

  3. MXNet设计笔记之:深度学习的编程模式比较

    市面上流行着各式各样的深度学习库,它们风格各异.那么这些函数库的风格在系统优化和用户体验方面又有哪些优势和缺陷呢?本文旨在于比较它们在编程模式方面的差异,讨论这些模式的基本优劣势,以及我们从中可以学到 ...

  4. 深度学习框架PyTorch一书的学习-第五章-常用工具模块

    https://github.com/chenyuntc/pytorch-book/blob/v1.0/chapter5-常用工具/chapter5.ipynb 希望大家直接到上面的网址去查看代码,下 ...

  5. 深度学习基础系列(十一)| Keras中图像增强技术详解

    在深度学习中,数据短缺是我们经常面临的一个问题,虽然现在有不少公开数据集,但跟大公司掌握的海量数据集相比,数量上仍然偏少,而某些特定领域的数据采集更是非常困难.根据之前的学习可知,数据量少带来的最直接 ...

  6. 28款GitHub最流行的开源机器学习项目,推荐GitHub上10 个开源深度学习框架

    20 个顶尖的 Python 机器学习开源项目 机器学习 2015-06-08 22:44:30 发布 您的评价: 0.0 收藏 1收藏 我们在Github上的贡献者和提交者之中检查了用Python语 ...

  7. 玩深度学习选哪块英伟达 GPU?有性价比排名还不够!

    本文來源地址:https://www.leiphone.com/news/201705/uo3MgYrFxgdyTRGR.html 与“传统” AI 算法相比,深度学习(DL)的计算性能要求,可以说完 ...

  8. faceswap深度学习AI实现视频换脸详解

    给大家介绍最近超级火的黑科技应用deepfake,这是一个实现图片和视频换脸的app.前段时间神奇女侠加尔盖朵的脸被换到了爱情动作片上,233333.我们这里将会从github项目faceswap开始 ...

  9. TensorFlow系列专题(三):深度学习简介

    一.深度学习的发展历程 深度学习的起源阶段 深度学习的发展阶段 深度学习的爆发阶段 二.深度学习的应用 自然语言处理 语音识别与合成 图像领域 三.参考文献   一.深度学习的发展历程 作为机器学习最 ...

  10. 推荐GitHub上10 个开源深度学习框架

    推荐GitHub上10 个开源深度学习框架   日前,Google 开源了 TensorFlow(GitHub),此举在深度学习领域影响巨大,因为 Google 在人工智能领域的研发成绩斐然,有着雄厚 ...

随机推荐

  1. 使用 Visual Paradigm 的业务流程模型和符号 (BPMN) 综合指南

    业务流程模型和符号 (BPMN) 是一种用于建模和记录业务流程的标准化图形符号.它被广泛采用,因为它能够提供一种清晰.通用的语言,所有利益相关者(业务分析师.技术开发人员和管理人员)都能理解.Visu ...

  2. Oracle - [03] 存储过程

    一.什么是存储过程 存储过程是一种数据库对象,是一种存储在数据库中的可执行程序,是一些经过编写.编译而存在数据库中的SQL语句集. 二.创建存储过程的语法 create or replace proc ...

  3. ISCSI数据盘的多路径配置

    本文分享自天翼云开发者社区<ISCSI数据盘的多路径配置>,作者:w****n 多路径出现的背景 多路径,就是说,主机到存储可以有多条路径可以选择.主机到存储之间的IO由多条路径可以选择. ...

  4. [第一章]ABAQUS CM插件中文手册

    ABAQUS Composite Modeler User Manual(zh-CN) Dassault Systèmes, 2018 注: 源文档的交叉引用链接,本文无效 有些语句英文表达更易理解, ...

  5. labelImg 工具介绍

    1.什么是labelImg 图片标记工具,生成的xml文件用于人工智能数据 2.怎么使用 打开图片文件夹 使用默认工具tooth 选中图片,快捷键w ,鼠标标记图片 [Ctrl+s] 保存

  6. Vim编辑windows格式文件出现的[noeol][dos]的含义、解决方法及方法解释

    文章目录 前言 [dos] [noeol] 前言 最近想要将保存再windows的文件传到linux上,传进去保存文件之后,用vim打开发现在文件的底下出现了[dos] [noeol]这两个标志.然后 ...

  7. Ollama——大语言模型本地部署的极速利器

    1.概述 Ollama 是一款开源跨平台大模型工具,主要用于在本地便捷部署和运行大型语言模型(LLM),核心目标是降低用户使用大模型的门槛,同时保障数据隐私.核心功能与特点如下: (1)本地部署,隐私 ...

  8. 请求方法:GET 与 POST

    根据 RFC 规范,GET 的语义是从服务器获取指定的资源,GET 请求的参数位置一般是写在 URL 中,URL 规定只能支持 ASCII,所以 GET 请求的参数只允许 ASCII 字符 ,而且浏览 ...

  9. 这是base-还原数字查正确码表再解码

    题目: dict:{0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 1 ...

  10. Oracle DB 关于CONNECT、RESOURCE 和DBA 角色权限

    授予角色的语法: grant <object/system privilege> to <role name>; 一般情况下,在新建数据库用户后,都会习惯性的给用户授权CONN ...