为啥 PIL 经常与 Pytorch 一起使用?

Posted

技术标签:

【中文标题】为啥 PIL 经常与 Pytorch 一起使用?【英文标题】:Why is PIL used so often with Pytorch?为什么 PIL 经常与 Pytorch 一起使用? 【发布时间】:2020-08-04 08:17:34 【问题描述】:

我注意到很多数据加载器使用 PIL 来加载和转换图像,例如torchvision.datasets.folder 中的数据集构建器。

我的问题是:为什么要使用 PIL?在将其转换为张量之前,您需要执行 np.asarray 操作。 OpenCV 似乎直接将其加载为 numpy 数组,而且速度也更快。

我能想到的一个原因是因为 PIL 有一个丰富的转换库,但我觉得其中几个转换可以快速实现。

【问题讨论】:

【参考方案1】:

关于将 OpenCV 添加为可能的后端之一的讨论in torchvision PR。

总而言之,提供了一些原因:

OpenCV2 以 BGR 格式加载图像,这需要包装类在内部处理更改为 RGB 或加载图像的格式后端依赖 这反过来会导致 functional 中的代码重复 torchvision 中的转换,其中许多使用 PIL 操作(因为支持多个后端的转换会非常复杂) OpenCV 将图像加载为np.array,对数组进行转换并不容易 不同的表示方式可能会导致用户难以捕捉到的 bug PyTorch 的 modelzoo 也依赖于 RGB 格式,他们希望轻松支持它 不能很好地使用 Python 的多处理(但这不是问题,因为它是 Python 2 的问题)

老实说,我没有看到这个想法有太大的进展,因为存在使用 OpenCV 并且可以相当顺利地与 PyTorch 集成的 albumentations。

有点离题,但可以通过torchvision.set_image_backend 选择更快的后端到英特尔的accimage。此外,Pillow-SIMD 可以用作 PIL 的替代品(据说它更快,并且由fastai 项目推荐)。

在性能基准方面,它们似乎不太可靠,而且告诉 AFAIK 也不是那么容易。

【讨论】:

【参考方案2】:

回答here和here有一些元素。

TL,DR:由于历史原因,一些基准测试(尽管从不信任基准测试)并且因为 PIL 比 OpenCV 更轻且更易于安装。

【讨论】:

【参考方案3】:

PIL 频繁出现的一个可能原因是,网上有很多示例使用 PIL.Image.open 方法:

%matplotlib inline
from PIL import Image
img = Image.open(r"img.jpg")
# do more ...

如果我们使用matplotlib打开图像,我们不需要使用PIL。

%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread(r"img.jpg")
_ = plt.imshow(img)

Jupyter 笔记本经常需要显示图像,matplotlib.pyplot.imshow 经常用于此目的。

【讨论】:

以上是关于为啥 PIL 经常与 Pytorch 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

pytorch训练模型的一些坑

为啥这种红色只填充一帧 PIL?

pytorch图像基本操作

pytorch图像基本操作

pytorch+numpy+PIL将dat文件读取为图像

为啥 WebRTC 不能与对称 NAT 一起使用?