caffe:输入图像的灰度和彩色问题

1.cv2.imread()和caffe.io.loadimage的区别

https://blog.csdn.net/lovelyaiq/article/details/70254583

使用opencv和caffe的伙伴们,可能会有一个疑问,那就是对于同时读取图片的cv2.imread()和caffe.io.loadimage两个函数,有什么差别?

1、cv2.imread()接口读图像,读进来直接是BGR 格式数据格式在 0~255,通道格式为(H,W,C),即行,列、通道数(Row, Col, C)。

2、caffe.io.load_image()读进来是RGB格式和 0~1(float)

 因此,cv2.imread()读取的数据,需要进过转换后,才和caffe.io.load_image()相同,例如:

[python] view plain copy

image = caffe.io.load_image(caffe_root + 'examples/images/cat.jpg')  

[python] view plain copy

image1=cv2.imread(caffe_root + 'examples/images/cat.jpg')  
image1=cv2.cvtColor(image1,cv2.COLOR_BGR2RGB)  
image1=image1/255.  

经过转换后,cv2.imread读取的image1和caffe.io.load_image()读取到的image格式相同。

所以在进行特征提取之前要在transformer中设置transformer.set_raw_scale('data',255)(缩放至0~255)

以及transformer.set_channel_swap(‘data’,(2,1,0)(将RGB变换到BGR)。
调用caffe model进行特征提取分类时,要注意区分image用何种方法读进来。

2.均值问题

两种方式:1.net中设置均值;2.使用均值文件

Caffe学习系列(15):计算图片数据的均值:https://www.cnblogs.com/denny402/p/5102328.html

图片减去均值后,再进行训练和测试,会提高速度和精度。因此,一般在各种模型中都会有这个操作。

那么这个均值怎么来的呢,实际上就是计算所有训练样本的平均值,计算出来后,保存为一个均值文件,在以后的测试中,就可以直接使用这个均值来相减,而不需要对测试图片重新计算。

一、二进制格式的均值计算

caffe中使用的均值数据格式是binaryproto, 作者为我们提供了一个计算均值的文件compute_image_mean.cpp,放在caffe根目录下的tools文件夹里面。编译后的可执行体放在 build/tools/ 下面,我们直接调用就可以了

# sudo build/tools/compute_image_mean examples/mnist/mnist_train_lmdb examples/mnist/mean.binaryproto

带两个参数:

第一个参数:examples/mnist/mnist_train_lmdb, 表示需要计算均值的数据,格式为lmdb的训练数据。

第二个参数:examples/mnist/mean.binaryproto, 计算出来的结果保存文件。

二、python格式的均值计算

如果我们要使用python接口,或者我们要进行特征可视化,可能就要用到python格式的均值文件了。首先,我们用lmdb格式的数据,计算出二进制格式的均值,然后,再转换成python格式的均值。

我们可以编写一个python脚本来实现:
复制代码

#!/usr/bin/env python
import numpy as np
import sys,caffe

if len(sys.argv)!=3:
    print "Usage: python convert_mean.py mean.binaryproto mean.npy"
    sys.exit()

blob = caffe.proto.caffe_pb2.BlobProto()
bin_mean = open( sys.argv[1] , 'rb' ).read()
blob.ParseFromString(bin_mean)
arr = np.array( caffe.io.blobproto_to_array(blob) )
npy_mean = arr[0]
np.save( sys.argv[2] , npy_mean )

复制代码

将这个脚本保存为convert_mean.py

调用格式为:

# sudo python convert_mean.py mean.binaryproto mean.npy

其中的 mean.binaryproto 就是经过前面步骤计算出来的二进制均值。

mean.npy就是我们需要的python格式的均值。

计算图像均值是图像预处理中的常见操作,计算机视觉中,深度学习框架输入图片后一般都会进行均值削减,分两种方法,一种是减去均值文件,另一种是生成RGB三个数值。
第一种方法一般参考各自框架的API即可。
第二种方法可以由简单的python代码得到,如下所示:

import os
import cv2
from numpy import *

#img_dir='/home/zzy/ai_challenger_scene_validation_20170908/scene_validation_20170908/'
img_dir='/home/zzy/ai_challenger_scene_train_20170904/scene_train_20170904/'
img_list=os.listdir(img_dir)
img_size=224
sum_r=0
sum_g=0
sum_b=0
count=0

for img_name in img_list:
    img_path=os.path.join(img_dir,img_name)
    img=cv2.imread(img_path)
    img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    img=cv2.resize(img,(img_size,img_size))
    sum_r=sum_r+img[:,:,0].mean()
    sum_g=sum_g+img[:,:,1].mean()
    sum_b=sum_b+img[:,:,2].mean()
    count=count+1

sum_r=sum_r/count
sum_g=sum_g/count
sum_b=sum_b/count
img_mean=[sum_r,sum_g,sum_b]
print img_mean

猜你喜欢

转载自blog.csdn.net/weixin_37251044/article/details/80087300