目前在使用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. FolderMove:盘符文件/软件迁移工具,快速给C盘瘦身

    前言 很多朋友安装软件的时候总会直接点击下一步,每次都把软件安装到了C盘.时间长了以后系统C盘就会爆满,只能重做系统处理,有了这个软件就可以随时把C盘文件转移到其他分区 介绍 这款是国外软件,界面介绍 ...

  2. C#中对面向standard2.0、standard2.1的项目进行单元测试

    单元测试项目的目标框架 (TargetFramework或TargetFrameworks) 不能是standard2.0或standard2.1. 这是因为.NET Standard只是一个规范,它 ...

  3. python基础-函数(lambda表达式、函数作参数、内置函数、推导式)和pip

    函数进阶 今日概要: 函数名就是一个变量(扩展) 匿名函数(lambda表达式) 重点内置函数--python内置函数 推导式(一行代码生成数据) 1. 函数名就是变量 def func(): pas ...

  4. 通过fetch_mcp,让Cline能够获取网页内容。

    fetch_mcp介绍 GitHub地址:https://github.com/zcaceres/fetch-mcp 此MCP服务器提供了以多种格式(包括HTML.JSON.纯文本和Markdown) ...

  5. coco数据集详解

    什么是COCO数据集? MS COCO的全称是Microsoft Common Objects in Context,起源于微软于2014年出资标注的Microsoft COCO数据集,与ImageN ...

  6. Golang 入门 : 文件名、关键字与标识符

    Go 的源文件以 .go 为后缀名存储在计算机中,这些文件名均由小写字母组成,如 scanner.go .如果文件名由多个部分组成,则使用下划线 _ 对它们进行分隔,如 scanner_test.go ...

  7. IvorySQL 增量备份与合并增量备份功能解析

    1. 概述 IvorySQL v4 引入了块级增量备份和增量备份合并功能,旨在优化数据库备份与恢复流程.通过 pg_basebackup 工具支持增量备份,显著降低了存储需求和备份时间.同时,pg_c ...

  8. C#实现自己的Json解析器(LALR(1)+miniDFA)

    C#实现自己的Json解析器(LALR(1)+miniDFA) Json是一个用处广泛.文法简单的数据格式.本文介绍如何用bitParser(拥有自己的解析器(C#实现LALR(1)语法解析器和min ...

  9. halcon 入门教程(二)Blob分析(二值化,联通区域,分割区域,提取区域)保姆级教程

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/18781187 有兴趣可以多看其他的halcon教程 halcon 学习教程目录 OK,今天讲h ...

  10. MySQL常用SQL 语句

    --备份数据库 mysqldump -u用户名 -h主机名 -p密码 数据库名 > filename.sql --备份数据库中的某个表 mysqldump -u用户名 -h主机名 -p密码 数据 ...