目前在使用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. Typecho的Joe主题开启文章导航目录树

    引言 发现从typora复制过来的markdown代码中的目录导航[toc]语句没生效, 没有像typora或其他markdown编辑器生成导航目录树, 网上搜了下, 发现个解决方法, 在主题设置里插 ...

  2. FUSE,从内核到用户态文件系统的设计之路

    FUSE(Filesystem in Userspace)是一个允许用户在用户态创建自定义文件系统的接口,诞生于 2001 年.FUSE 的出现大大降低了文件系统开发的门槛,使得开发者能够在不修改内核 ...

  3. 读论文-基于序列模式的电子商务推荐系统综述(A Survey of Sequential Pattern Based E-Commerce Recommendation Systems)

    前言 今天读的论文为一篇于2023年10月3日发表在<算法>(Algorithms)的论文,这篇文章综述了基于序列模式的电子商务推荐系统,强调了通过整合用户购买和点击行为的序列模式来提高推 ...

  4. PHP中&&与and、||与or的区别

    https://blog.csdn.net/asty9000/article/details/80652064 在PHP中,&&与and都表示逻辑与,||与or都表示逻辑或,并且它们都 ...

  5. 一次客户演讲PPT 反思

    一 演讲ppt正常 制作流程: 编写演讲纲 与客户确认 确认通过后编写演讲稿 制作PPT 二 过程反思点 写纲前 与客户对接,了解需求及想法,最好音频记录 任务紧张程度.重要性想办法理清楚(领导跟踪情 ...

  6. Web前端入门第 7 问:HTML 标签不闭合、乱闭合、只有闭合标签有没有什么问题?

    HTML 标签语法遵循层级嵌套的树形结构,如果写出来的代码不是树形结构,浏览器会怎么渲染? 注意:以下截图都来源于 Chrome 浏览器,不同浏览器可能会产生不同的渲染结果. 先看正常代码 <s ...

  7. Qt QHeaderView 添加复选框

    QT QTableView 表头添加复选框 最近在做表格,用QTableView,然后有一个需求是给表格添加表头,但是没有一个API能够在表头添加复选框,基本都是来重载QHeaderView,有两种方 ...

  8. ModuleNotFoundError: No module named '_ctypes' when Python3

    前言 运行 python 报错:ModuleNotFoundError: No module named '_ctypes' when using Value from module multipro ...

  9. PLSQL中查询数据的时候查询结果显示中文乱码

    要需要很努力才能看起来毫不费力.....1.在PLSQL中查询数据的时候查询结果显示中文乱码这里写图片描述2.需要在环境变量中新建两个环境变量:第一个:设置 NLS_LANG=SIMPLIFIED C ...

  10. 面试题-MyBatis框架

    前言 MyBatis框架部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,并添加了一些比较重要的问题,希望对大家起到一定 ...