概述
在优化代码时意外将图片读取的效率提升了60倍。
主要就是在python下把磁盘图片变为numpy数组。
低效方法:PIL和numpy组合
import numpy as np
from PIL import Image
def load_image_into_numpy_array(image):
(im_width, im_height) = image.size
return np.array(image.getdata()).reshape((im_height, im_width, 3)).astype(np.uint8)
image = Image.open( image_abs_path )
image_np = image_handle.load_image_into_numpy_array( image )
在服务器CPU上,800X600的图片读取约600+ms。模型推理一次才100ms,被IO拖了后腿。
高效方法:opencv
import cv2
image_np = cv2.imread( image_abs_path )
opencv读取图片出来就是numpy,效率非常高。cpu上读取800x600的图片不到10ms,效率提升了60+倍。
原因分析
因为平常用PIL很小,所以没有深究。看到资料说numpy实际上有对速度进行优化的。我推测应该是老的方法里面有多次copy操作,导致效率低效。copy的地方可能在reshape和astype。如果这两个地方都有copy,效率很难提高。