1. 程式人生 > >單通道灰度圖片fine-tune訓練網路與caffe批量分類測試

單通道灰度圖片fine-tune訓練網路與caffe批量分類測試

1. 轉imdb灰度圖資料

一定要加上--gray,否則訓練時報如下錯誤:

GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    --gray \
    $TRAIN_DATA_ROOT \
    $DATA/train.txt \
    $EXAMPLE/train_lmdb

echo "Creating val lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    --gray \
    $VAL_DATA_ROOT \
    $DATA/val.txt \
    $EXAMPLE/val_lmdb

2. fine-tune訓練網路

在上一步生成lmdb的時候有一個引數是--gray,這樣生成的lmdb就是單通道了,然後就是需要修改一下第一個卷基層的名字,這一層會被隨機初始化,通過finetune的方式進行學習

layer {
    bottom: "data"
    top: "conv1"
    name: "myconv1" #修改該層名字
    type: "Convolution"
    convolution_param {
        num_output: 64
        kernel_size: 7
        pad: 3
        stride: 2
        weight_filler {
            type: "msra"
        }
    }
}

3.更改ResNet_50_deploy.prototxt輸入資料為單通道

name: "ResNet-50"
input: "data"
input_dim: 1
input_dim: 1
input_dim: 224
input_dim: 896

(1,1,224,896)分別對應一張圖片,單通道灰度圖,影象高度和影象寬度

4.mean.binaryproto轉換為mean.npy檔案

#!/usr/bin/env python
import numpy as np
import sys
import caffe
root='/home/yangjian/caffe-master/myfile_jian/data/'
mean_proto_path=root+'imagenet_mean.binaryproto'   
mean_npy_path=root+'mean.npy'              

blob=caffe.proto.caffe_pb2.BlobProto()    
data=open(mean_proto_path,'rb').read()     
blob.ParseFromString(data)                 

array=np.array(caffe.io.blobproto_to_array(blob))  
mean_npy=array[0]                          
np.save(mean_npy_path,mean_npy)

5.批量測試灰度圖

  • #單通道灰度圖,不用設定該項
    transformer.set_channel_swap('data', (2,1,0))# caffe中圖片是BGR格式,而原始格式是RGB,所以將圖片由RGB變成BGR
  • img=caffe.io.load_image(imgpath,color=False) ,此句讀入影象並轉化為單通道灰度圖,值為float型,範圍是0~1.0,因為讀入時影象時單通道
#!/usr/bin/env python
#coding=utf-8
import os
import sys
import numpy as np
import cv2

caffe_root='/home/yangjian/caffe-master/' 
sys.path.insert(0, caffe_root + 'python')
import caffe
#使用GPU模式
caffe.set_device(0)  
caffe.set_mode_gpu()
#caffe.set_mode_cpu()
os.chdir(caffe_root)
#儲存分類結果路徑
path_0= "/home/yangjian/caffe-master/myfile_jian/test_result/test_image_result/0_liangshiche"
path_1= "/home/yangjian/caffe-master/myfile_jian/test_result/test_image_result/1_pengche"
path_2= "/home/yangjian/caffe-master/myfile_jian/test_result/test_image_result/2_changche"
path_3= "/home/yangjian/caffe-master/myfile_jian/test_result/test_image_result/3_guangche"
path_4= "/home/yangjian/caffe-master/myfile_jian/test_result/test_image_result/4_keche"
path_5= "/home/yangjian/caffe-master/myfile_jian/test_result/test_image_result/5_pingche"

deploy=caffe_root+'myfile_jian/ResNet_50_deploy.prototxt'     
caffe_model=caffe_root+'myfile_jian/models/ResNet_50_iter_1000.caffemodel'  
mean_file=caffe_root+'myfile_jian/data/mean.npy'    
labels_filename=caffe_root+'myfile_jian/data/word.txt'
 
# 測試圖片存放資料夾
#dir=caffe_root+'myfile_jian/test_image/test_image1'
#dir=caffe_root+'myfile_jian/test_image/image1_50'
dir=caffe_root+'myfile_jian/test_image/11/'

filelist=[]
filenames=os.listdir(dir)
for fn in filenames:
    fullfilename=os.path.join(dir,fn)
    filelist.append(fullfilename)
    
net=caffe.Net(deploy,caffe_model,caffe.TEST)
print net.blobs['data'].data.shape #(1,1,224,896)
#圖片預處理設定
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))#python讀取的圖片檔案格式為H×W×C,需轉化為C×H×W
transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))
transformer.set_raw_scale('data', 255) # python中將圖片儲存為[0, 1],而caffe中將圖片儲存為[0, 255]
#單通道灰度圖,不用該項
#transformer.set_channel_swap('data', (2,1,0))# caffe中圖片是BGR格式,而原始格式是RGB,所以將圖片由RGB變成BGR

for i in range(0,len(filelist)):
    img=filelist[i]
    img_jpg=os.path.basename(img) 
    result_img= cv2.imread(img)
    print '********** Prediction the picture:',filenames[i],'**********'
    #im=caffe.io.load_image(img)#載入RGB圖
    im=caffe.io.load_image(img,color=False)  #載入灰度圖片, 讀取的圖片檔案格式為H×W×C,需注意
    net.blobs['data'].data[...]=transformer.preprocess('data',im) #執行上面的預處理操作,並將圖片載入到blob中 
    out=net.forward()    
    labels=np.loadtxt(labels_filename,str,delimiter='/t')#讀取類別名稱檔案
    prob=net.blobs['prob'].data[0].flatten() #取出最後一層(prob)屬於某個類標的概率值,'prob'為最後一層的名稱   
    #print prob
    index1=prob.argsort()[-1] #獲取最大概率值對應的index 
    index2=prob.argsort()[-2] 
    index3=prob.argsort()[-3]  
    index4=prob.argsort()[-4]
    index5=prob.argsort()[-5] 
    index6=prob.argsort()[-6] 
    
    print labels[index1],'--',prob[index1]
    print labels[index2],'--',prob[index2]
    print labels[index3],'--',prob[index3]
    print labels[index4],'--',prob[index4]
    print labels[index5],'--',prob[index5]
    print labels[index6],'--',prob[index6]
    print '**********the final classification results:',labels[index1],'**********'

    if labels[index1]=='0 liangshiche':
       cv2.imwrite(os.path.join(path_0,img_jpg),result_img)
    if labels[index1]=='1 pengche':
       cv2.imwrite(os.path.join(path_1,img_jpg),result_img)
    if labels[index1]=='2 changche':
       cv2.imwrite(os.path.join(path_2,img_jpg),result_img)
    if labels[index1]=='3 guangche':
       cv2.imwrite(os.path.join(path_3,img_jpg),result_img)
    if labels[index1]=='4 keche':
       cv2.imwrite(os.path.join(path_4,img_jpg),result_img)
    if labels[index1]=='5 pingche':
       cv2.imwrite(os.path.join(path_5,img_jpg),result_img)
    

參考:

(1)單通道灰度圖片怎麼fine-tune

(2)Caffe中把資料轉換成灰度圖

(3)使用caffe的convert_imageset生成lmdb檔案 –gray

(4)訓練影象及測試影象都是灰度圖,影象通道為單通道

(5)Caffe學習——Imagenet分類

(6)caffemodel進行批量測試