1. 程式人生 > >Caffe中的資料轉換

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()相同,例如:

 

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