1. 程式人生 > >caffe for windows 下使用caffemodel 實現cifar10的影象分類

caffe for windows 下使用caffemodel 實現cifar10的影象分類

在上一篇的部落格中,已經訓練出來了迭代了4000次的caffemodel模型,那麼怎樣使用這個模型來應用於實際的影象分類中呢?其實也是很簡單的,因為前輩已經寫好了.cpp檔案,我們只需要生成.cpp檔案對應的.exe然後呼叫即可。還有,如果已經配置好了matcaffe,也可以使用matlab來實現影象分類。

一、c++實現影象分類

在tools資料夾下面,有classification檔案,該程式碼即實現影象分類。 可以在Solution下新建一個cuda project,匯入tools資料夾中的classification.cpp檔案,配置環境。編譯,通過之後會看到bin\資料夾下面有一個classification.exe。

我們看看原始碼中,介紹怎樣使用這個可執行檔案classification的。
  if (argc != 6) {
    std::cerr << "Usage: " << argv[0]
              << " deploy.prototxt network.caffemodel"
              << " mean.binaryproto labels.txt img.jpg" << std::endl;
    return 1;
  }

  caffe::GlobalInit(&argc, &argv);

  string model_file   = argv[1];
  string trained_file = argv[2];
  string mean_file    = argv[3];
  string label_file   = argv[4];
  Classifier classifier(model_file, trained_file, mean_file, label_file);

  string file = argv[5];
上面是classification.cpp檔案中main函式的前幾行程式碼,我們可以看到我們需要網路結構的deploy.prototxt檔案,需要caffemodel模型檔案,均值檔案,標籤檔案和待分類的圖片。獲取它們的路徑。將路徑作為引數即可。(本示例中全部使用的絕對路徑,當然相對路徑也是可以的,而且更簡潔方便) 新建一個.bat,輸入以下內容儲存。
classification.exe H:\happynearcaffe\caffe-windows-master\caffe-windows-master\examples\cifar10\cifar10_quick.prototxt H:\happynearcaffe\caffe-windows-master\caffe-windows-master\examples\cifar10\cifar10_quick_iter_4000.caffemodel H:\happynearcaffe\caffe-windows-master\caffe-windows-master\examples\cifar10\mean.binaryproto H:\happynearcaffe\caffe-windows-master\caffe-windows-master\examples\cifar10\synset_words.txt H:\happynearcaffe\caffe-windows-master\caffe-windows-master\examples\cifar10\dog2.jpg
pause
從上面的.bat的內容中也可以看到,我所要進行分類的是一幅dog圖片,這裡一定要注意,因為我一次只預測一幅影象,所以batchsize應當設定為1.(應當在網路結構中修改過來)。待分類影象dog的原始大小為32*32,它的原始影象為:
synset_words.txt是標籤檔案,告訴我們分類的cifar10的10類中每一類的具體名字是什麼。截圖如下:
然後執行classification.bat檔案,看看輸出的top5結果吧。
從上面可以看到,預測出來的結果為:75%的概率是dog,10%的概率是truck......還算精確地了。

二、matlab實現影象分類

首先將當前目錄設定在caffe-windows-master\matlab\demo下,然後新建一個classification_cifar.m檔案,加入以下程式碼:
% Add caffe/matlab to you Matlab search PATH to use matcaffe
if exist('../+caffe', 'dir')
  addpath('..');
else
  error('Please run this demo from caffe/matlab/demo');
end

% Set caffe mode
if exist('use_gpu', 'var') && use_gpu
  caffe.set_mode_gpu();
  gpu_id = 0;  % we will use the first gpu in this demo
  caffe.set_device(gpu_id);
else
  caffe.set_mode_cpu();
end
model_dir = '../../examples/cifar10/';
net_model = [model_dir 'cifar10_quick.prototxt'];
net_weights = [model_dir 'cifar10_quick_iter_4000.caffemodel'];
phase = 'test'; % run with phase test (so that dropout isn't applied)
if ~exist(net_weights, 'file')
  error('Please download CaffeNet from Model Zoo before you run this demo');
end

% Initialize a network
net = caffe.Net(net_model, net_weights, phase);

if nargin < 1
  % For demo purposes we will use the cat image
  fprintf('using caffe/examples/images/dogs.jpg as input image\n');
  im = imread('../../examples/images/dog2.jpg');
end
input_data = {prepare_image(im)};
scores = net.forward(input_data);
scores = scores{1};
scores = mean(scores, 2);  % take average scores over 10 crops

[~, maxlabel] = max(scores);

% call caffe.reset_all() to reset caffe
caffe.reset_all();

其中用到了對影象預處理的prepare_image函式,所以加入以下程式碼預處理圖片:
function im_data = prepare_image(im)
d = load('./cifar10_mean.mat');
mean_data = d.image_mean;
IMAGE_DIM = 32;
im_data = im(:, :, [3, 2, 1]);  % permute channels from RGB to BGR
im_data = permute(im_data, [2, 1, 3]);  % flip width and height
im_data = single(im_data);  % convert from uint8 to single
im_data = imresize(im_data, [IMAGE_DIM IMAGE_DIM], 'bilinear');  % resize im_data
im_data = im_data - mean_data;  % subtract mean_data (already in W x H x C, BGR)
end
這裡有一個cifar10_mean.mat的均值檔案,我們在使用C++進行圖片分類的時候均值檔案從leveldb中生成的.binaryproto檔案,所以要想得到cifar10_mean.mat的均值檔案,我們需要將而知檔案轉成.mat。在caffe-windows-master\matlab\+caffe資料夾下新建一個read_mean.m檔案(本來就有的,就直接將裡面的內容註釋掉也可以),然後新新增matlab程式碼:
%   Read binary proto file to mat
clear
clc
mean_file = 'H:\Gastric_DB\train_mean.binaryproto';
CHECK(ischar(mean_file), 'mean_file must be a string');
CHECK_FILE_EXIST(mean_file);
image_mean = caffe_('read_mean', mean_file);
將獲得的.mat均值檔案儲存即可。
執行,classification_cifar.m檔案,得到了結果,command window下結果顯示為: 我們看到最大的概率值為0.8661,對應的標籤為6,從synset_words.txt中查詢到,第六個標籤確實為dog,分類結果是合理的。 但是有一點我們發現,c++分類的概率值與matlab分類的概率值是不一樣的,matlab稍微好於C++,在使用的網路結構prototxt,網路模型引數caffemodel和均值、預測圖片一致的情況下,出現這個問題也是正常的,不必大驚小怪,我的猜測是預測影象在預處理環節上可能是不一樣的,所以導致結果的差異。要想知道原因需要自己審讀原始碼,理解影象處理的過程。

三、PS:本篇部落格結束語

本人也是剛剛接觸深度學習,對caffe程式碼的理解程度還不夠,所以部落格基本只介紹執行示例的步驟過程,要想加深對caffe,對深度學習的認識,肯定需要理解caffe的原始碼的。 caffe在windows上執行會出現各種各樣的BUG,有時候挺折磨人的,建議在linux下使用caffe吧,苦海無涯,回頭是岸,可是我回頭也看不到岸了,所以就一直把基於windows下的caffe用下去了。以後估計還是得要轉到linux下。 caffe中國社群也已經成立了喲,大家可以到裡面查資料,說不定你遇到的問題上面已經有了答案了,附帶一下網址: 然後貌似opencv也支援讀取caffemodel檔案了,但是在正式釋出的opencv3.1中沒有這個模組,需要自己新增。把這個環境配置好,肯定是用C++童鞋的福音,深度學習在C++中的視覺化也會更方便。以後有時間會加一下這方面的內容。

相關推薦

caffe for windows 使用caffemodel 實現cifar10影象分類

在上一篇的部落格中,已經訓練出來了迭代了4000次的caffemodel模型,那麼怎樣使用這個模型來應用於實際的影象分類中呢?其實也是很簡單的,因為前輩已經寫好了.cpp檔案,我們只需要生成.cpp檔案對應的.exe然後呼叫即可。還有,如果已經配置好了matcaffe,也可

實戰keras——用CNN實現cifar10影象分類

原文:https://blog.csdn.net/zzulp/article/details/76358694  import keras from keras.datasets import cifar10 from keras.models import Sequenti

Windowscaffe用fine-tuning訓練好的caffemodel來進行影象分類

 小菜準備了幾張驗證的圖片存放路徑為caffe根目錄下的 examples/images/, 如果我們想用一個微調訓練好的caffemodel來對這張圖片進行分類,那該怎麼辦呢?下面小菜來詳細介紹一下這一任務的步驟。一般可以同兩種方式進行測試,分別是基於c++介

Nmap for windows 命令行使用

端口掃描 nmap 從事IT方面的工作,無論是開發或運維,當測試某些系統服務端口時,總會遇到TCP或 UDP 兩種協議。眾所周知,TCP 服務端口,可以通過telnet 進行遠程測試,而UDP 端口,一般來說都會使用Nmap,無論是在linux 還是 windows環境下。在windows 下的Nma

windows如何實現ssh免密碼登錄

-c nbsp 免密 win 實現 刪除 left ssh免密碼登錄 生成 windows下如何實現ssh免密碼登錄呢? 步驟如下: 1、設置Git的user name和email: $ git config --global user.name "XXXX" $ git

Windows簡單使用BPG影象壓縮工具進行影象壓縮和解壓縮(附官方編解碼工具程式碼下載地址)

BPG是一種新型的圖片格式。其設計初衷在於當圖片質量或檔案size成為瓶頸時,取代JPEG。其主要特點如下: 高壓縮比。BPG在quality類似的情形下,比JPEG要小得多。相同大小的圖片,使用BMP儲存質量遠高於JPEG 瀏覽器支援:使用一個很小js解碼庫(54KB)

caffe for windows的matlab介面(三):權重和特徵圖的視覺化

模型讀取 讀取bvlc_reference_caffenet 的模型結構以及訓練好的引數,注意此處的模型結構為deploy,而非train時候的。 caffe.set_mode_cpu();%設定CPU模式 model = '../../models/b

caffe for windows的matlab介面(四):權重和特徵圖視覺化的一個例子

模型讀取 參照三,想實現一個自己影象的視覺化過程: 首先我發現自己訓練出的model沒有deploy檔案。查閱了下:“如果要把訓練好的模型拿來測試新的圖片,那必須得要一個deploy.prototxt檔案,這個檔案實際上和test.prototxt檔案差不多

Libcurl ftp Windows使用實現下載刪除

1.下載最新版的libcurl,純淨版的,不要下載簡化版的,簡化版的,可能沒有winbuild檔案所以可能就會沒有Makefile.vc.我的是curl-7.44.0.zip,解壓,進入目錄winbuild,仔細閱讀BUILD.WINDOWS.txt這篇文件 開啟VS2

多執行緒程式設計之建立執行緒(WindowsC++實現)

執行緒概述 理解Windows核心物件 執行緒是系統核心物件之一。在學習執行緒之前,應先了解一下核心物件。核心物件是系統核心分配的一個記憶體塊,該記憶體塊描述的是一個數據結構,其成員負責維護物件的各種資訊。核心物件的資料只能由系統核心來訪問,應用程式無法在記

Windowsgit實現免密登入伺服器

windows本機上: 1. ssh-keygen -t rsa -b 4096 -C “[email protected]” (上面的這個命令我也不是太理解,但是這麼是可以的,記得敲3個回車) 執行完之後(預設情況下)就會在C:\Users\T

WindowsPython+OpenCV+zbar影象識別二維碼識別編譯環境安裝

一、準備檔案 二、安裝 1、python庫的安裝 點選下載下的python-2.7.14.amd64.msi,一路next下去,安裝完成後,配置環境變數,在path裡面加入安裝的python的根目錄,例如本人安裝目錄d:\Python27。

Snmp在Windows實現----WinSNMP程式設計原理

3.3.2 WinSNMP接受響應訊息 還記得前面的SnmpCreateSession函式嗎?它可以說是WinSNMP非同步訊息驅動模式的一個關鍵,讓我們先來看看它的函式原型: HSNMP_SESSION SnmpCreateSession( HWND hWnd,                    //

caffeWindows配置 vs2013+cuda7.5+python2.7/python3.5/matlab

本文預設環境都是x64,本來編譯器應該選最新的vs2015(vc140),但是網上沒找到任何相關資訊,只有人說caffe和vs2015相容性不好,所以只好用vs2013(vc120). 試了一下微軟官方的caffe-windows(https://github.com/Mi

TensorFlow CNN對CIFAR10影象分類2

下載python version import os os.environ['TF_CPP_MIN_LOG_LEVEL']='2' import tensorflow as tf import numpy as np def unpickle(file):

keras CNN對CIFAR10影象分類

from keras.datasets import cifar10 from keras.utils import np_utils from keras.models import Sequential from keras.layers import Conv2D, D

pytorch + visdom 處理cifar10影象分類

執行環境 系統:win10 cpu:i7-6700HQ gpu:gtx965m python : 3.6 pytorch :0.3 資料集使用 Cifar-10 由60000張32*32的 RGB 彩色圖片構成,

TensorFlow實現用於影象分類的卷積神經網路(程式碼詳細註釋)

這裡我們採用cifar10作為我們的實驗資料庫。 首先下載TensorFlow Models庫,以便使用其中提供的CIFAR-10資料的類。 git clone https://github.com/tensorflow/models.git cd mo

詳解tensorflow訓練自己的資料集實現CNN影象分類

利用卷積神經網路訓練影象資料分為以下幾個步驟1.讀取圖片檔案2.產生用於訓練的批次3.定義訓練的模型(包括初始化引數,卷積、池化層等引數、網路)4.訓練1 讀取圖片檔案def get_files(filename): class_train = [] label_trai

基於OpenCV、隨機森林演算法實現影象分類識別系統

開發環境jupyter notebook import cv2 import os import pickle #持久化 imp