[PYTHON] Caffe Model Zoo pour les débutants [Classification selon l'âge et le sexe]

Je voulais exécuter caffe dans un environnement anaconda, mais cela ne fonctionnait pas même si j'avais changé Makefile.config. Notez la procédure de construction dans un environnement qui n'utilise pas la gestion des versions. Si vous faites une erreur, je vous serais reconnaissant de bien vouloir me contacter.

Installation sur ubuntu

Dépendances générales

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

Cliquez ici pour d'autres versions http://caffe.berkeleyvision.org/install_apt.html

Cliquez ici pour d'autres OS http://caffe.berkeleyvision.org/installation.html

Obtenez l'environnement

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

Paramètres de Makefile.config

cd caffe
cp Makefile.config.example Makefile.config

Makefile.config



# USE_CUDNN := 1
↓
USE_CUDNN := 1

#cuda modifié pour s'adapter à votre environnement
CUDA_DIR := /usr/local/cuda-7.0

#Si je voulais le faire avec anaconda, je devrais pouvoir changer cela, mais cela n'a pas fonctionné dans mon environnement.
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


compiler

cmake .
make -j4 all
make install

Si vous souhaitez recompiler

make clean et make -j4 all make clean: supprime les fichiers intermédiaires créés lors de la création d'une application et l'application résultante elle-même.

préférences python

compilation python etc.

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

Traverser

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

OK si vous pouvez importer

python
>>>import caffe

Définissez le chemin

.badhrc


export CAFFE_HOME=Où vous avez installé caffe
export PATH=${CAFFE_HOME}/bin:${PATH}
export LD_LIBRARY_PATH=${CAFFE_HOME}/lib:${LD_LIBRARY_PATH}
export PYTHONPATH=${CAFFE_HOME}/python:${PYTHONPATH}

※Mise en garde Même avec cela, classify.py peut ne pas fonctionner. http://qiita.com/Bonnnou_108/items/41e6dadeff1310b4eb5d

Si vous suivez l'article Yahoo, cela devrait fonctionner, mais vous pouvez obtenir une erreur. https://techblog.yahoo.co.jp/programming/caffe-intro/

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

Détails de l'erreur

ValueError: Mean shape incompatible with input shape

Modifier ici 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

Modèle de classification de l'âge et du sexe

ensemble de données d'émotion

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

age_net.caffemodel ... modèle de classification par âge deploy_age.prototxt ... Lier les numéros de classification d'âge et les étiquettes mean.binaryproto ... pour une image moyenne gender_net.caffemodel ... Modèle de classification par sexe deploy_gender.prototxt ... Numéro de classification de genre et association d'étiquette

Télécharger le modèle

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'

Charger l'image moyenne

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

Chargement du réseau d'âge

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))

Chargement du réseau de genre

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']

Chargement et affichage de l'image

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

Prévision d'âge

prediction = age_net.predict([input_image]) 

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

Résultat de sortie: âge prédit: (0, 2)

Prédiction de genre

prediction = gender_net.predict([input_image]) 

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

Résultat de sortie: sexe prédit: femme

Visualisation des filtres

Dans CNN, le poids s'appelle un filtre.

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()
    
    #Forcer le nombre de filtres à être carré
    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))
    
    #Filtres en mosaïque sur les images
    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)

Chargez les réseaux de genre sans images moyennes pour une meilleure visualisation

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]) 

Entrez l'image

Les fonctions commençant par input ou _ peuvent apparaître. En python, _ peut être utilisé pour signifier qu'il peut être référencé à partir d'une classe externe mais pas référencé.

_ = plt.imshow(input_image)

Filtre de première couche conv1

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

ダウンロード (1).png

Sortie de la première couche conv1

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

ダウンロード (2).png

Réglage fin avec les images Flickr

Déménager à Forta avec Caffe

cd ~/caffe

Télécharger le modèle entraîné

scripts/download_model_binary.py models/bvlc_reference_caffenet

Télécharger des images depuis Flickr

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

Réglage fin avec les données Flickr avec bvlc_reference_caffenet.caffemodel comme valeur initiale.

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

Regression Methods for Localization

Montagnes, routes, coureurs スクリーンショット 2017-06-08 19.54.04.png Vers la compréhension de l'image ● Object localization ● Object segmentation ● Human pose estimation スクリーンショット 2017-06-08 19.55.19.png Formulé comme une régression basée sur DNN ● Deep Neural Net-based Regression ● Object Mask Regression ● Object Bounding Box Regression ● Human Pose Estimation DNN-based Regression

référence

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

https://bfeba431-a-62cb3a1a-s-sites.googlegroups.com/site/deeplearningcvpr2014/RegressionMethodsforLocalization.pdf?attachauth=ANoY7cpwt94hVCZXGTsfVWXtfKcakWqTiHT9TEYM6tLGdUk2jmlmBHiyEaL3qByRJEeBn-2EtPhanI3uoT58LSiRDl_A6JP51_8jm8LqcbyLZYo2bSMJpvbmCXlP4fMiRtJLT7nXmUu0QERcZEnYd_Ly-kka7TKKUEyk4-ez1iXr5ROM-G_2jjLa21y3y1y6s9sQK3Q0KJVvIHAAmzKn7uonJ4N2Q3f3dLVs7QQyw4MgIDd_ZiYcati9Ktkjq51cvzjLOPMfa7d6&attredirects=0

Recommended Posts

Caffe Model Zoo pour les débutants [Classification selon l'âge et le sexe]
CNN (1) pour la classification des images (pour les débutants)
Exécutez le modèle Caffe sur Google Colaboratory pour prédire l'âge et le sexe des mannequins du monde
Ensemble de données IMDB-WIKI pour estimer l'âge et le sexe à partir d'images faciales
Implémentation et description à l'aide de XGBoost pour les débutants
[Explication pour les débutants] Syntaxe et concept de base de TensorFlow
Chargez le modèle caffe avec Chainer et classez les images
Raisonnement causal et recherche causale par Python (pour les débutants)