需要結合我之前的博客做參考,相關配置文件在文末有鏈接可以下載
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算法研讀上面,過程中加強這些框架工具的使用。