Caffe基礎(三)- 使用Matlab接口、python接口、c++接口訓練網絡和預測

需要結合我之前的博客做參考,相關配置文件在文末有鏈接可以下載

1.使用Matlab接口訓練自己的數據集(MATLAB2017b)

Caffe源碼編譯後將主目錄下的matlab\+caffe\private\Release文件夾內的caffe_.mexw64拷貝至上一層文件夾內,即matlab\+caffe\private文件夾內

                                                     

                                

同時點擊設置路徑按鈕選項,將主目錄下的matlab文件夾路徑添加至路徑中

     

       

新建train.m文件,輸入

clear;
clc;
caffe.reset_all;
caffe.set_mode_gpu();
gpu_id = 0;  % we will use the first gpu in this demo
caffe.set_device(gpu_id);
solver=caffe.Solver('.\data\mydata\solver.prototxt')
solver.solve()
close all;
hold on;
% iter_ = solver.iter();
% while iter_<10000
%     solver.step(1);%一步一步迭代
%     iter_ = solver.iter();    %得到迭代次數
%     loss=solver.net.blobs('loss').get_data();%取訓練集的loss  
%     if iter_==1
%         loss_init = loss;
%     else if(mod(iter_,1)==0)  %每1次繪製一次損失
%         y_l=[loss_init loss];
%         x_l=[iter_-1, iter_];     
%         plot(x_l, y_l, 'r-');
%         drawnow
%         loss_init = loss;
%         end
%     end
% 
%     if mod(iter_, 100) == 0   %100次取一次accuray
%         accuracy=solver.test_nets.blobs('accuracy').get_data();%取驗證集的accuracy       
%         if iter_/100 == 1
%             accuracy_init = accuracy;
%         else 
%             x_l=[iter_-100, iter_];
%             y_a=[accuracy_init accuracy];
%             plot(x_l, y_a,'g-');
%             drawnow
%             accuracy_init=accuracy;
%         end
%     end
% end

註釋部分代碼可以實現損失率及精度的輸出,具體使用可見博客https://blog.csdn.net/u014114990/article/details/50502125/

點擊train.m文件開始訓練,文件中需要使用的文件均可以在我之前的博客中找到

2.使用Matlab接口預測一張圖片(MATLAB2017b)

新建test_a_image.m,輸入

clear;
clc;
caffe.reset_all;
caffe.set_mode_gpu();
gpu_id = 0;  % we will use the first gpu in this demo
caffe.set_device(gpu_id);
caffe.reset_all();

deploy = '.\data\mydata\deploy.prototxt';      %測試模型結構
caffe_model = '.\data\mydata\full_iter_6000.caffemodel.h5';     %訓練好的模型
net = caffe.Net(deploy, caffe_model, 'test');     %三個參數,分別代表,測試結構,訓練好的測試模型,test
im_data=imread('.\data\mydata\dog009.jpg');         %讀入圖像
%imshow(im_data);
input_data = {prepare_image(im_data)};  %準備數據,需要裁剪時裁剪數據
scores = net.forward(input_data); 

scores = scores{1};
scores = mean(scores, 2);  % take average scores over 10 crops

[~, maxlabel] = max(scores);
scores
maxlabel
figure;plot(scores);%畫出得分情況
axis([0, 999, -0.1, 0.5]);%座標軸範圍
grid on %有網格
fid = fopen('.\data\mydata\synset_words.txt', 'r');
i=0;
while ~feof(fid)
    i=i+1;
    lin = fgetl(fid);
    lin = strtrim(lin);
    if(i==maxlabel)
        fprintf('the label of %d is %s\n',i,lin)
        break
    end
end

訓練時有用到mean.binaryproto,所以預測是也需要每張圖片去減下該mean圖片,可以用prepare_image函數實現,代碼如下:

function crops_data = prepare_image(im) 
% ———————————————————————— 
% caffe/matlab/+caffe/imagenet/ilsvrc_2012_mean.mat contains mean_data that 
% is already in W x H x C with BGR channels 
mean_data = caffe.io.read_mean('.\data\mydata\mean.binaryproto'); %讀入均值文件 
crops_data = single(im) - mean_data; 

運行該文件,結果如下:

                                                                  

對比命令行預測該張圖片方式,結果保持一致

同樣此中用的配置文件可以參考我之前的博客

3.使用python接口訓練自己的數據集

將主目錄下的python/caffe文件夾內的文件複製到C:\Program Files\Anaconda3\Lib\site-packages文件夾下

                                                  

在主目錄下新建train.py文件,

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import caffe
print(caffe.__version__)
caffe.set_mode_gpu()
caffe.set_device(0)

solver = caffe.SGDSolver('.\data\mydata\solver.prototxt')
solver.solve()

運行文件,訓練自己構造的數據集

使用中如果出現pydot的報錯問題時,可以嘗試如下方法解決:

(1)命令 行下pip install graphviz

(2)安裝graphviz-2.38.zip 鏈接:https://pan.baidu.com/s/126zoIOQdKeQKK9ocvFTsHw 
提取碼:b5wf

安裝完畢後,記得添加環境變量,添加完畢後重啓下電腦

                                 

(3)在命令行方式下pip install pydotplus

4.使用python接口預測一張圖片

在主目錄下新建test_a_image.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import numpy as np
import cv2
from glob import glob
import caffe
import multiprocessing

net = caffe.Net('.\data\mydata\deploy.prototxt','.\data\mydata\iter_6000.caffemodel.h5', caffe.TEST)
MEAN_PROTO_PATH = '.\data\mydata\mean.binaryproto'        # 待轉換的pb格式圖像均值文件路徑
MEAN_NPY_PATH = '.\data\mydata\mean.npy'             # 轉換後的numpy格式圖像均值文件路徑

blob = caffe.proto.caffe_pb2.BlobProto()      # 創建protobuf blob
data = open(MEAN_PROTO_PATH, 'rb' ).read()     # 讀入mean.binaryproto文件內容
blob.ParseFromString(data)             # 解析文件內容到blob
array = np.array(caffe.io.blobproto_to_array(blob))# 將blob中的均值轉換成numpy格式,array的shape (mean_number,channel, hight, width)
mean_npy = array[0]      # 一個array中可以有多組均值存在,故需要通過下標選擇其中一組均值
print(mean_npy.shape)
print(net.blobs['data'].data.shape)
#np.save(MEAN_NPY_PATH ,mean_npy)

transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
f1= np.load('.\data\mydata\mean.npy')
transformer.set_mean('data',f1.mean(1).mean(1))

transformer.set_transpose('data', (2, 0, 1))
im = caffe.io.load_image('.\data\mydata\dog009.jpg')
im1 = cv2.imread('.\data\mydata\dog009.jpg')
im2 = im1/255

net.blobs['data'].data[...] = transformer.preprocess('data', im)
out = net.forward()
print(out)

names = []
with open('.\data\mydata\synset_words.txt', 'r+') as f:
    for l in f.readlines():
        names.append(l.split(' ')[0].strip())
print(names)
prob = net.blobs['prob'].data[0].flatten()
print('prob: ', prob)
print('class: ', names[np.argmax(prob)])




gender_net = caffe.Classifier('.\data\mydata\deploy.prototxt', '.\data\mydata\iter_6000.caffemodel.h5')
output = gender_net.predict([im1],oversample = False)
print("caffe.classifier: ",output)
#top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]
#for i in np.arange(top_k.size):
#    print(top_k[i])

運行該文件,結果如下:

(3, 121, 121)
(1, 3, 121, 121)
{'prob': array([[0.5013305 , 0.49866948]], dtype=float32)}
['cat', 'dog']
prob:  [0.5013305  0.49866948]
class:  cat

代碼中最後的三句話:

gender_net = caffe.Classifier('.\data\mydata\deploy.prototxt', '.\data\mydata\iter_6000.caffemodel.h5')
output = gender_net.predict([im1],oversample = False)
print("caffe.classifier: ",output)

也可以用於預測一張圖片,結果爲:

caffe.classifier:  [[0.50133055 0.49866948]]

預測結果和matlab、命令行方式預測結果保持一致

以上對應的M文件及py文件見 鏈接:https://pan.baidu.com/s/1KtCyg76fQS4k5SROaQ8PcA 
提取碼:zkjo

5.打印caffe的網絡結構

在主目錄下的python文件夾中存在draw_net.py文件,同時在該目錄下我放入前面訓練mnist數據集用到的lenet_train_test.prototxt文件,該文件實現了Lenet-5結構。

打開命令行語句,cd到該目錄下,輸入如下語句:

打印出來的網絡結構如下:

 

                         

6.可以使用python文件來生成 prototxt 文件,可以參考博客https://blog.csdn.net/renhanchi/article/details/76472554

7.使用c++接口訓練網絡和預測圖片

前面博客通過命令行方式訓練網絡結構,是使用caffe.exe後跟選項參數方式進行,caffe.exe可以由caffe.bin生成,所以可以借鑑caffe.bin工程來做訓練

              

預測圖片時使用classification.exe後跟參數進行,該exe由classification工程生成,所以可以參考此工程

              

 

 

8.目前主要還是通過prototxt文件構造網絡結構,也有碰到用python直接寫出網絡結構的情況。

這一段時間整理了下tensorflow、keras、caffe的框架和一些基礎代碼實現方式,後續的精力會放在常用網絡結構的瞭解,和一些經典的classification、detection、segmentation算法研讀上面,過程中加強這些框架工具的使用。

 

 

發佈了24 篇原創文章 · 獲贊 24 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章