LoginSignup
5
8

More than 5 years have passed since last update.

初心者の為のCaffe Model Zoo【年齢と性別の分類】

Last updated at Posted at 2017-01-05

anaconda環境でのcaffeを動かしたかったが、Makefile.configを変更してもうまく動作せず。いったんバージョン管理を使わない環境での構築手順はメモしておく。
間違っていたら連絡を頂ければありがたいです。

ubuntuでのインストール

一般的な依存関係

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev

14.04

sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

他のバージョンの場合はこちら
http://caffe.berkeleyvision.org/install_apt.html

他のOSの場合はこちら
http://caffe.berkeleyvision.org/installation.html

環境を取得

git clone https://github.com/BVLC/caffe.git

Makefile.config の設定

cd caffe
cp Makefile.config.example Makefile.config
Makefile.config

# USE_CUDNN := 1
↓
USE_CUDNN := 1

#cudaは自分の環境に合わせて修正
CUDA_DIR := /usr/local/cuda-7.0

#anacondaでやりたい場合はここを変えるといけるはずなのだけども、自分の環境ではうまく通らなかった。
ANACONDA_HOME := $(HOME)/anaconda
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
                $(ANACONDA_HOME)/include/python2.7 \
                $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include

PYTHON_LIB := $(ANACONDA_HOME)/lib


コンパイル

cmake .
make -j4 all
make install

再コンパイルしたい場合

make cleanしてmake -j4 all
make clean:アプリケーションを作成する際にできる中間ファイル及び、作成した結果のアプリーション自体も削除します。

python環境設定

pythonコンパイルなど

sudo apt-get install python-dev python-pip python-numpy python-skimage gfortran
sudo pip install -r ~/caffe/python/requirements.txt
make pycaffe

パスを通す

export PYTHONPATH=/home/ubuntu/caffe/build/caffe/python/:$PYTHONPATH

importできたらOK

python
>>>import caffe

パスを設定しておく

.badhrc
export CAFFE_HOME=caffeをインストールした場所
export PATH=${CAFFE_HOME}/bin:${PATH}
export LD_LIBRARY_PATH=${CAFFE_HOME}/lib:${LD_LIBRARY_PATH}
export PYTHONPATH=${CAFFE_HOME}/python:${PYTHONPATH}

※注意
これでもclassify.pyが動かない場合がある。
http://qiita.com/Bonnnou_108/items/41e6dadeff1310b4eb5d

yahooの記事の通りにやると動くはずなのでがエラーになる場合がある
https://techblog.yahoo.co.jp/programming/caffe-intro/

python classify.py --raw_scale 255 ../101_ObjectCategories/airplanes/image_0001.jpg ../result.npy

エラーの内容

ValueError: Mean shape incompatible with input shape

ここを編集
caffe/python/caffe/io.py

if ms != self.inputs[in_][1:]:
    raise ValueError('Mean shape incompatible with input shape.')

if ms != self.inputs[in_][1:]:
    print(self.inputs[in_])
    in_shape = self.inputs[in_][1:]
    m_min, m_max = mean.min(), mean.max()
    normal_mean = (mean - m_min) / (m_max - m_min)
    mean = resize_image(normal_mean.transpose((1,2,0)),in_shape[1:]).transpose((2,0,1)) * (m_max - m_min) + m_min
    #raise ValueError('Mean shape incompatible with input shape.')

Caffe Model Zoo

年齢と性別の分類モデル

emotionデータセット

http://www.ics.uci.edu/~xzhu/face/
http://www.openu.ac.il/home/hassner/Adience/data.html

age_net.caffemodel...年齢分類モデル
deploy_age.prototxt...年齢分類の数字とラベルの紐付け
mean.binaryproto...平均画像用
gender_net.caffemodel...性別分類モデル
deploy_gender.prototxt...性別分類の数字とラベルの紐付け

modelのダウンロード

wget http://www.openu.ac.il/home/hassner/projects/cnn_agegender/cnn_age_gender_models_and_data.0.0.1.zip
unzip cnn_age_gender_models_and_data.0.0.1.zip

import

import os
import numpy as np
import matplotlib.pyplot as plt

caffe_root = './caffe-master/' 
import sys
sys.path.insert(0, caffe_root + 'python')
import caffe

plt.rcParams['figure.figsize'] = (10, 10)
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'

mean imageの読み込み

mean_filename='./mean.binaryproto'
proto_data = open(mean_filename, "rb").read()
a = caffe.io.caffe_pb2.BlobProto.FromString(proto_data)
mean  = caffe.io.blobproto_to_array(a)[0]

ダウンロード.png

age networkの読み込み

age_net_pretrained='./age_net.caffemodel'
age_net_model_file='./deploy_age.prototxt'
age_net = caffe.Classifier(age_net_model_file, age_net_pretrained,
                       mean=mean,
                       channel_swap=(2,1,0),
                       raw_scale=255,
                       image_dims=(256, 256))

gender networkの読み込み

gender_net_pretrained='./gender_net.caffemodel'
gender_net_model_file='./deploy_gender.prototxt'
gender_net = caffe.Classifier(gender_net_model_file, gender_net_pretrained,
                       mean=mean,
                       channel_swap=(2,1,0),
                       raw_scale=255,
                       image_dims=(256, 256))

Labels

age_list=['(0, 2)','(4, 6)','(8, 12)','(15, 20)','(25, 32)','(38, 43)','(48, 53)','(60, 100)']
gender_list=['Male','Female']

imageの読み込みと表示

example_image = './example_image.jpg'
input_image = caffe.io.load_image(example_image)
_ = plt.imshow(input_image)

年齢予想

prediction = age_net.predict([input_image]) 

print 'predicted age:', age_list[prediction[0].argmax()]

出力結果:predicted age: (0, 2)

性別予想

prediction = gender_net.predict([input_image]) 

print 'predicted gender:', gender_list[prediction[0].argmax()]

出力結果:predicted gender: Female

フィルターの視覚化

CNNでは重みのことをフィルターといっている。

def showimage(im):
    if im.ndim == 3:
        im = im[:, :, ::-1]
    plt.set_cmap('jet')
    plt.imshow(im)


def vis_square(data, padsize=1, padval=0):
    data -= data.min()
    data /= data.max()

    # フィルター数を強制的に正方形にする
    n = int(np.ceil(np.sqrt(data.shape[0])))
    padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((0, 0),) * (data.ndim - 3)
    data = np.pad(data, padding, mode='constant', constant_values=(padval, padval))

    # フィルタを画像にタイル張りする
    data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))
    data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])

    showimage(data)

より良い視覚化のために、平均画像なしでジェンダーネットワークを読み込む

age_net = caffe.Classifier(age_net_model_file, age_net_pretrained,
                       channel_swap=(2,1,0),
                       raw_scale=255,
                       image_dims=(256, 256))

prediction = age_net.predict([input_image]) 

画像を入力

inputから始める関数などが出てくることがある。pythonでは外部クラスから参照はできるが参照をしない意味でを使用することがある。

_ = plt.imshow(input_image)

最初のレイヤーフィルタ conv1

filters = age_net.params['conv1'][0].data[:49]
vis_square(filters.transpose(0, 2, 3, 1))

ダウンロード (1).png

最初のレイヤーの出力 conv1

feat = age_net.blobs['conv1'].data[4, :49]
vis_square(feat, padval=1)

ダウンロード (2).png

Flickrの画像を使ってfine-tuning

caffeのあるフォルタに移動

cd ~/caffe

学習済みモデルをダウンロード

scripts/download_model_binary.py models/bvlc_reference_caffenet

Flickrから画像をダウンロード

python examples/finetune_flickr_style/assemble_data.py --workers=1 --images=2000 --seed 831486

bvlc_reference_caffenet.caffemodelを初期値として、Flickrデータでファインチューニング。

./build/tools/caffe train -solver models/finetune_flickr_style/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel

Regression Methods for Localization

山、道、ランナー
スクリーンショット 2017-06-08 19.54.04.png
イメージの理解に向けて
● Object localization
● Object segmentation
● Human pose estimation
スクリーンショット 2017-06-08 19.55.19.png
DNNベースの回帰として公式化
● Deep Neural Net-based Regression
● Object Mask Regression
● Object Bounding Box Regression
● Human Pose Estimation

DNN-based Regression

参考

fine-tuning
http://hirotaka-hachiya.hatenablog.com/entry/2015/02/21/072255

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8