python - 如何加快枕头(python)中的图像加载速度?
问题描述
我想用枕头做一些简单的手写图像识别,它是实时的,所以我需要每秒调用我的函数 5-10 次。我正在加载图像,并且只访问 20^2 像素中的 1 个,所以我真的不需要所有图像。我需要减少图像加载时间。
我从未使用过 python 图像库,并会感谢所有建议。
from PIL import Image
import time
start = time.time()
im = Image.open('ir/IMG-1949.JPG')
width, height = im.size
px = im.load()
print("loading: ", time.time() - start)
期望加载时间:<50ms,实际加载时间:~150ms
解决方案
更新的答案
自从我写了这个答案以来,John Cupitt(的作者pyvips
)已经提出了一些改进和更正以及更公平的代码和时间安排,并在这里分享了它们。请查看他的改进版本,与我的代码并排甚至优先于下面的代码。
原始答案
JPEG 库具有“加载时收缩”功能,可以避免大量 I/O 和解压缩。您可以使用 PIL/Pillow 函数来利用这一点Image.draft()
,而不是像这样读取完整的 4032x3024 像素:
from PIL import Image
im = Image.open('image.jpg')
px = im.load()
在我的 Mac 上需要 297 毫秒,您可以执行以下操作并读取 1008x756 像素,即宽度的 1/4 和高度的 1/4:
im = Image.open('image.jpg')
im.draft('RGB',(1008,756))
px = im.load()
这只需要 75 毫秒,即快 4 倍。
只是为了好玩,我尝试比较各种技术,如下所示:
#!/usr/bin/env python3
import numpy as np
import pyvips
import cv2
from PIL import Image
def usingPIL(f):
im = Image.open(f)
return np.asarray(im)
def usingOpenCV(f):
arr = cv2.imread(f,cv2.IMREAD_UNCHANGED)
return arr
def usingVIPS(f):
image = pyvips.Image.new_from_file(f, access="sequential")
mem_img = image.write_to_memory()
imgnp=np.frombuffer(mem_img, dtype=np.uint8).reshape(image.height, image.width, 3)
return imgnp
def usingPILandShrink(f):
im = Image.open(f)
im.draft('RGB',(1008,756))
return np.asarray(im)
def usingVIPSandShrink(f):
image = pyvips.Image.new_from_file(f, access="sequential", shrink=4)
mem_img = image.write_to_memory()
imgnp=np.frombuffer(mem_img, dtype=np.uint8).reshape(image.height, image.width, 3)
return imgnp
并将其加载ipython
并像这样进行测试:
%timeit usingPIL('image.jpg')
315 ms ± 8.76 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit usingOpenCV('image.jpg')
102 ms ± 1.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit usingVIPS('image.jpg')
69.1 ms ± 31.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit usingPILandShrink('image.jpg')
77.2 ms ± 994 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit usingVIPSandShrink('image.jpg')
42.9 ms ± 332 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
看起来pyVIPS 显然是这里的赢家!
关键词:Python、PIL、Pillow、图像、图像处理、JPEG、加载收缩、加载收缩、草稿模式、读取性能、加速。
推荐阅读
- vim - 有什么方法可以将 .vimrc 应用于特定的 tmux 会话?
- angular - nrwl nx 角度构建 API 端点
- mqtt - 订阅会在 MQTT (Paho) 中发生冲突吗?
- guidewire - 在guidewire pc中为cutom字段进行类型转换时获取ClassCastException
- ethereum - 在以太坊测试网上检查交易成功(混音)
- ios - 我的自定义图像过滤器非常慢。如何在没有 Accelerate 的情况下使其更快?
- certificate - sell32.dll 辞职数字签名
- flutter - 顶部小部件未出现在堆栈上
- python - 找不到用于 kivy-ios 或 python-for-android 的 grpcio 和 firebase-admin 的配方
- c# - 异步 TCP 上的 ManualResetEvent