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 格式## 目标
Last modification:February 5th, 2021 at 02:22 pm