【opencv和PIL读取图片的速度对比】
opencv
OpenCV: 开源计算机视觉库
项目地址:https://gitcode.com/gh_mirrors/opencv31/opencv
免费下载资源
·
0. 应用场景
在Pytorch代码中,我们构建Dataset类时在‘getitem’方法中需要有读取数据的操作,而模型训练和预测过程中,数据的读取会占用一部分时间。何况数据集中有成千上万张图像,因此读取速度的快慢会影响模型训练和预测时的效率。
在代码中有两种常见的图片数据读取方式:opencv和PIL的Image读取。而opencv读取的数据直接是np.ndarray类型的,而PIL读取的数据是Image的class,还需要np.asarray()转换才行。
下面来检测下两者的读取速度差异:
1. 代码检测
分别读取同样尺寸(500x442)的jpg和png图像100次,如下:
import cv2
from PIL import Image
import os
import time
import numpy as np
if __name__ == '__main__':
# 比较PIL和opencv读取jpg图片到numpy.ndarray的速度
jpg_dir = os.path.join('..', 'data', '2008_000008.jpg')
png_dir = os.path.join('..', 'data', '2008_000008.png')
t_jpg_cv = time.time()
for i in range(100):
img = cv2.imread(jpg_dir) # 默认np.dtype=uint8
print(f"opencv读取jpg图片100次用时:{time.time()-t_jpg_cv:.5f}s")
t_jpg_pil = time.time()
for i in range(100):
img = np.asarray(Image.open(jpg_dir), dtype=np.uint8) # Image读取的图片不是np.ndarray,需要转换
print(f"PIL读取jpg图片100次用时:{time.time() - t_jpg_pil:.5f}s")
t_png_cv = time.time()
for i in range(100):
img = cv2.imread(png_dir)
print(f"opencv读取png图片100次用时:{time.time() - t_png_cv:.5f}s")
t_png_pil = time.time()
for i in range(100):
img = np.asarray(Image.open(png_dir)) # Image读取的图片不是np.ndarray,需要转换
print(f"PIL读取png图片100次用时:{time.time() - t_png_pil:.5f}s")
结果:
因此,结论是,对于将图像(不论是jpg还是png格式)以np.ndarray()方式读入内存,PIL在速度上比opencv更高效。 因此我之后会选用PIL读取图片。
另外,我之前在有的博客里看到有人说PIL读取不如opencv高效,可我实验证明貌似不是这样的。但也有可能是我有些地方考虑不周,希望不吝赐教。
GitHub 加速计划 / opencv31 / opencv
77.38 K
55.71 K
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:2 个月前 )
c3747a68
Added Universal Windows Package build to CI. 5 天前
9b635da5 - 5 天前
更多推荐
已为社区贡献4条内容
所有评论(0)