为啥 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 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章