Python 读取图片的库有很多, 如 opencv, skimage, PIL 等等, 但在送入 Caffe 网络前,需要的处理不大一样,不注意的情况下,容易弄混淆. 比如,通道转换,scale 范围,RGB次序等. Caffe 中彩色图片的颜色通道为 BGR, 像素值 scale 范围为 [0, 255].
1. Caffe 自带的图片读取
img = caffe.io.load_image(imagefile)
采用的是 skimage.io.imread()
:
def load_image(filename, color=True):
"""
加载图片,
Load an image converting from grayscale or alpha as needed.
参数:
filename : 图片路径
color : boolean.
默认值 color=True, 表示 RGB 格式加载.
color=False, 表示强度(intensity) 格式, 如果图片是灰度图.
返回值:
image : an image with type np.float32 in range [0, 1]
of size (H x W x 3) in RGB or
of size (H x W x 1) in grayscale.
"""
img = skimage.img_as_float(skimage.io.imread(filename, as_grey=not color)).astype(np.float32)
if img.ndim == 2:
img = img[:, :, np.newaxis]
if color:
img = np.tile(img, (1, 1, 3))
elif img.shape[2] == 4:
img = img[:, :, :3]
return img
可以看出, caffe.io.load_image()
基于 skimage.io.imread()
库读取图片, 得到的是 RGB 格式,像素值范围为 [0, 1] (float) 的. 因此,图片在送入网络前,采用以下处理:
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2, 0, 1)) # 如,由 227x227x3 变换为 3x227x227
transformer.set_mean('data', meandata) # 减均值
# transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))
transformer.set_raw_scale('data', 255) # 像素值由 [0, 1] 缩放到 [0, 255] 范围
transformer.set_channel_swap('data', (2, 1, 0)) # 由 RGB 格式变换到 BGR 格式
2. Opencv 图片读取
import cv2
img = cv2.imread(imagefile)
cv2.imread()
读取图片的格式是 BGR, 像素值范围为 [0, 255].
相比于 caffe.io.load_image()
的图片读取,不需要再进行像素值范围缩放到 [0, 255], 通道变换也不需要再进行由 RGB 到 BGR 格式的转换. 即只需:
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2, 0, 1)) # 如,由 227x227x3 变换为 3x227x227
transformer.set_mean('data', meandata) # 减均值
# transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))
3. PIL 图片处理
from PIL import Image
img = Image.open(imagefile)
PIL 对于 PNG, BMP, JPG 彩色图像格式的图片,Image.open()
均返回 RGB 图片. PIL 对于 PNG, BMP, JPG 灰度图像格式的图片,Image.open()
返回 L.
相比于 caffe.io.load_image()
的图片读取,不需要再进行像素值范围缩放到 [0, 255], 但是,通道变换需要再进行由 RGB 到 BGR 格式的转换.
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2, 0, 1)) # 如,由 H×W×K 转化为K×H×W
transformer.set_mean('data', meandata) # 减均值
# transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))
transformer.set_channel_swap('data', (2, 1, 0)) # 由 RGB 格式变换到 BGR 格式## 目标