元のブログ:[Doiテクニカルチーム](http://blog.doiduoyi.com/)
リンクアドレス:[https://blog.doiduoyi.com/authors/1584446358138](https://blog.doiduoyi.com/authors/1584446358138)
当初の意図:優れた土井技術チームの学習経験を記録する
Caffeは現在、より一般的に使用されている深層学習フレームワークです。このフレームワークのインストールは、他の主流のフレームワークほど単純ではありません。pipコマンドを使用して直接インストールできます。より一般的には、コンパイルを使用してインストールされます。したがって、この記事を書いて記録してください。
Ubuntuのバージョンが17.04以上の場合、次の方法でCaffeをインストールできます。Python3バージョンがインストールされていることに注意してください。
apt install caffe-cpu
このバージョンよりも低い場合は、ソースコードを使用してコンパイルする必要があります。作成者のシステムは64ビットのUbuntu 16.04です。次に、Python2を使用したインストール手順について説明します。
まず、依存環境をインストールする必要があります。依存環境はたくさんあり、コンパイル中のエラーを回避するために、それらがインストールされていることを確認する必要があります。以前にインストールしたことがある場合は、コマンドを繰り返しても問題ありません。
apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
apt-get install --no-install-recommends libboost-all-dev
apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
apt-get install libatlas-base-dev
apt-get install python-numpy
apt-get install libhdf5-serial-dev
apt-get install python-dev
apt install python-pip
pip install scikit-image
ソースコードのコンパイルを使用するため、最初にソースコードのクローンを作成してから、公式のコンパイル構成例をコピーする必要があります。
# optディレクトリに切り替えます
cd /opt
# クローンカフェのソースコード
git clone git://github.com/BVLC/caffe.git
# ソースルートディレクトリに切り込みます
cd caffe/
# 公式のコンパイル構成ファイルの例をコピーします
cp Makefile.config.example Makefile.config
# 構成情報の書き込みを開始します
vim Makefile.config
この構成ファイルを次のように変更します。
CPU_ONLY :=1
# Whatever else you find you need goes here.
INCLUDE_DIRS :=$(PYTHON_INCLUDE)/usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS :=$(PYTHON_LIB)/usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
これでコンパイルを開始できます。最初の2つはソースコードのコンパイルで、後の2つはテストのコンパイルです。 -j4
は、4つのスレッドを使用して並行してコンパイルし、コンパイルを高速化することを意味します。
make -j4 pycaffe
make -j4 all
make -j4 test
make -j4 runtest
コマンド vim / etc / profile
を使用して、ファイルの最後に次のコード行を追加します。
export PYTHONPATH=/opt/caffe/python:$PYTHONPATH
インストールが成功したかどうかを簡単にテストできます。正常であれば、caffeのバージョン情報を出力できます。
# python
Python 2.7.12(default, Dec 42017,14:50:18)[GCC 5.4.020160609] on linux2
Type "help","copyright","credits" or "license"for more information.>>>import caffe
>>> caffe.__version__
次の情報が出力されます。
'1.0.0'
カフェをインストールした後、モデルを使用して画像を予測できます。作者はこちら[カフェモデルをダウンロード](https://github.com/shicai/MobileNet-Caffe)。以下のコードでは、modelnetV2モデルを使用しています。
# coding=utf-8from __future__ import print_function
import numpy as np
import caffe
# 画像サイズを変更する
def get_img(img_path, nh, nw):
im = caffe.io.load_image(img_path)
h, w, _ = im.shape
if h < w:
off =(w - h)/2
im = im[:, off:off + h]else:
off =(h - w)/2
im = im[off:off + h,:]
im = caffe.io.resize_image(im,[nh, nw])return im
def eval(image_path, nh, nw):
caffe.set_mode_cpu()
# 荷重モデル
net = caffe.Net("mobilenet_v2_deploy.prototxt","mobilenet_v2.caffemodel", caffe.TEST)
#画像を前処理する方法を設定します
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data',(2,0,1)) # row to col
transformer.set_channel_swap('data',(2,1,0)) # RGB to BGR
transformer.set_raw_scale('data',255) # [0,1] to [0,255]
# 画像の平均を差し引く
img_mean = np.array([103.94,116.78,123.68], dtype=np.float32)
transformer.set_mean('data', img_mean)
# 比率を掛けたもの
transformer.set_input_scale('data',0.017)
# 画像の寸法を変更する
net.blobs['data'].reshape(1,3, nh, nw)
im =get_img(image_path, nh, nw)
net.blobs['data'].data[...]= transformer.preprocess('data', im)
out = net.forward()
# 予測結果を得る
prob = out['prob']
prob = np.squeeze(prob)
idx = np.argsort(-prob)
# 最も可能性の高いラベルを取得する
label = idx[0]
# ラベルファイルの内容を読む
label_names = np.loadtxt('synset.txt', str, delimiter='\t')print('%.5f - %s'%(prob[label], label_names[label]))if __name__ =='__main__':
image_path ="cat.jpg"
nh, nw =224,224eval(image_path, nh, nw)
次の関数は、モデルのニーズに合わせて画像のサイズを変更することです。Python3の場合、分割では /
ではなく //
を使用する必要があります。これはPython3の変更です。
def get_img(img_path, nh, nw):
im = caffe.io.load_image(img_path)
h, w, _ = im.shape
if h < w:
off =(w - h)/2
im = im[:, off:off + h]else:
off =(h - w)/2
im = im[off:off + h,:]
im = caffe.io.resize_image(im,[nh, nw])return im
次のコードは、CPUとロードモデルを指定するための定義ファイルとウェイトファイルです。これら2つのファイルはGitHubからダウンロードされます。
caffe.set_mode_cpu()
net = caffe.Net("mobilenet_v2_deploy.prototxt","mobilenet_v2.caffemodel", caffe.TEST)
次のコードスニペットは、チャネルの順序の変更、各ピクセルからの平均値の減算、各ピクセルの比率の乗算など、画像の前処理方法を定義しています。
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data',(2,0,1)) # row to col
transformer.set_channel_swap('data',(2,1,0)) # RGB to BGR
transformer.set_raw_scale('data',255) # [0,1] to [0,255]
img_mean = np.array([103.94,116.78,123.68], dtype=np.float32)
transformer.set_mean('data', img_mean)
transformer.set_input_scale('data',0.017)
net.blobs['data'].reshape(1,3, nh, nw)
次のコードスニペットは、画像をロードして予測結果を取得するためのものです。 out ['prob']
の出力は、各ラベルの確率です。使用される synset.txt
は、現在GitHubにあるファイルでもあります。このファイルの内容はすべてです。各ラベルに対応する名前。最終的な出力は、確率が最も高いラベルに対応する確率と、このラベルに対応する名前です。
im =get_img(image_path, nh, nw)
net.blobs['data'].data[...]= transformer.preprocess('data', im)
out = net.forward()
prob = out['prob']
prob = np.squeeze(prob)
idx = np.argsort(-prob)
label = idx[0]
label_names = np.loadtxt('synset.txt', str, delimiter='\t')print('%.5f - %s'%(prob[label], label_names[label]))
出力は次のとおりです。
0.25784- ' n02123159 tiger cat'
Recommended Posts