Google Colaboratory上でCaffeモデルを動かして世界のスーパーモデルの年齢と性別を予測する

オープンソースのディープラーニングライブラリ Caffe を Google Colaboratory 上で動かしてみました。 

# Caffe のインストール

Google Colab 上に Caffe はないようなので、次のようにしてインストールします。

```python
!apt install caffe-cpu
```

# Caffe モデルの git clone

計算済みの Caffe モデルを選ぶにあたって、説明の詳しかった AgeGenderDeepLearning を選びました。 Google Colaboratory 上に git clone します。

* https://github.com/GilLevi/AgeGenderDeepLearning

```python
!git clone https://github.com/GilLevi/AgeGenderDeepLearning
```

これは写真に映った人物の年齢と性別を予測するモデルです。このモデルを使って、世界のスーパーモデルの年齢と性別を予測したいと思います。


# Caffe まわりの初期設定

```python
# https://github.com/GilLevi/AgeGenderDeepLearning のコードそのまま
import os
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline


caffe_root = './caffe/' 
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'
```


```python
mean_filename='./AgeGenderDeepLearning/models/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]
```


```python
age_net_pretrained='./AgeGenderDeepLearning/models/age_net.caffemodel' # 変更箇所
age_net_model_file='./AgeGenderDeepLearning/age_net_definitions/deploy.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))
```


```python
gender_net_pretrained='./AgeGenderDeepLearning/models/gender_net.caffemodel' # 変更箇所
gender_net_model_file='./AgeGenderDeepLearning/gender_net_definitions/deploy.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))
```


```python
# https://github.com/GilLevi/AgeGenderDeepLearning のコードそのまま
age_list=['(0, 2)','(4, 6)','(8, 12)','(15, 20)','(25, 32)','(38, 43)','(48, 53)','(60, 100)']
gender_list=['Male','Female']
```

# 世界のスーパーモデルの写真

スーパーモデルの写真はこちらから取得しました。

* https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%A2%E3%83%87%E3%83%AB


```python
# URL によるリソースへのアクセスを提供するライブラリをインポートする。
import urllib.request 
# ウェブ上のリソースを指定する
url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Gisele_B_edit.jpg/300px-Gisele_B_edit.jpg'
# 指定したURLからリソースをダウンロードし、名前をつける。
urllib.request.urlretrieve(url, 'model1.jpg') 
```




    ('model1.jpg', <http.client.HTTPMessage at 0x7f7d928eea58>)



```python
example_image = 'model1.jpg'
input_image = caffe.io.load_image(example_image)
_ = plt.imshow(input_image)
```

    /usr/local/lib/python3.6/dist-packages/skimage/io/_io.py:48: UserWarning: `as_grey` has been deprecated in favor of `as_gray`
      warn('`as_grey` has been deprecated in favor of `as_gray`')



![png](output_8_1.png)

（著作権的に問題になる気がするので、この写真は見せません。）


# 年齢と性別の予測


```python
# https://github.com/GilLevi/AgeGenderDeepLearning のコードそのまま
prediction = age_net.predict([input_image]) 

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

    predicted age: (15, 20)


なるほど。

```python
# https://github.com/GilLevi/AgeGenderDeepLearning のコードそのまま
prediction = gender_net.predict([input_image]) 

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

    predicted gender: Female

なるほど。

# 再度トライ

```python
# URL によるリソースへのアクセスを提供するライブラリをインポートする。
import urllib.request 
# ウェブ上のリソースを指定する
url = 'https://upload.wikimedia.org/wikipedia/commons/f/f3/LindaEvangelista.jpg'
# 指定したURLからリソースをダウンロードし、名前をつける。
urllib.request.urlretrieve(url, 'model2.jpg') 
```




    ('model2.jpg', <http.client.HTTPMessage at 0x7f7d925944a8>)




```python
example_image = 'model2.jpg'
input_image = caffe.io.load_image(example_image)
_ = plt.imshow(input_image)
```

    /usr/local/lib/python3.6/dist-packages/skimage/io/_io.py:48: UserWarning: `as_grey` has been deprecated in favor of `as_gray`
      warn('`as_grey` has been deprecated in favor of `as_gray`')



![png](output_12_1.png)

（著作権的に問題になる気がするので、この写真は見せません。）


```python
# https://github.com/GilLevi/AgeGenderDeepLearning のコードそのまま
prediction = age_net.predict([input_image]) 

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

    predicted age: (60, 100)


なるほど？

```python
# https://github.com/GilLevi/AgeGenderDeepLearning のコードそのまま
prediction = gender_net.predict([input_image]) 

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

    predicted gender: Male

ふーむ？