年齢・性別判定APIを比較しました（その２）

[NextremerのAdventカレンダー](https://qiita.com/advent-calendar/2017/nextremer)１９日目の記事です。


結論を言うと、**年齢判定**も**Face API**が最も良かったです。
※あくまで今回取得した画像に対してです。ご承知おきください。

# お詫び
[Nextremer Advent Calendar 2016](https://qiita.com/advent-calendar/2016/nextremer)で書いた[年齢・性別判定APIを比較しました（その１）](https://qiita.com/usi-isu/items/dd2b59b7423cb933466a)の続きです。

１年越しの記事であり、現時点で各APIがバージョンアップされ使用可能なパラメータや精度が異なる恐れがあります。Instagramの画像やご本人の年齢も異なっており、**本記事の内容は真に受けないでください**。また、[PUX Developers Site](https://pds.polestars.jp/)は[2017/12/28をもってサービス終了](https://pds.polestars.jp/news/?p=152)とのことです。残念です。

# 前回のおさらい
[前回](https://qiita.com/usi-isu/items/dd2b59b7423cb933466a)はInstagramの816枚の画像を用いて、下記４つのAPIによる**性別判定**を行い精度を比較しました。

- Microsoft社: [Face API](https://azure.microsoft.com/ja-jp/services/cognitive-services/face/)
- IBM社: [Visual Recognition](https://www.ibm.com/watson/developercloud/visual-recognition.html)
- PUX社: [顔検出(評価版)](http://www.pux.co.jp/%E8%A3%BD%E5%93%81%E6%83%85%E5%A0%B1/%E7%94%BB%E5%83%8F%E8%AA%8D%E8%AD%98/%E9%A1%94%E8%AA%8D%E8%AD%98/)
- その他：[フリーの年齢・性別モデル](http://www.openu.ac.il/home/hassner/projects/cnn_agegender/)

Instagram画像は下記サイトを参考に性別と生年月日が分かる有名人の画像を用いました。

- [芸能人Instagramランキング](http://www.talentinsta.com)

結果、性別判定は**Face API**が使い易いとお伝えしました。

今回は、これらAPIについて**年齢判定**の精度を比較した記事となります。

# スクリプトの準備
各APIを使うPythonスクリプトを準備しました。
詳しくは[前回](https://qiita.com/usi-isu/items/dd2b59b7423cb933466a#%E6%BA%96%E5%82%99
)をご覧ください。

# データの準備
Instagramから検証用の画像を準備しました。
性別等の内訳は[前回](https://qiita.com/usi-isu/items/dd2b59b7423cb933466a#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%BA%96%E5%82%99)をご覧ください。

## データ内訳
### 実年齢
今回は21歳以上の画像を集めたため、20歳以下は存在しません。

■年齢分布
![スクリーンショット 2017-12-15 18.30.55.png](https://qiita-image-store.s3.amazonaws.com/0/8839/df00d9a8-0ebc-6e61-23c1-38cc336592f1.png)

![スクリーンショット 2017-12-15 18.29.18.png](https://qiita-image-store.s3.amazonaws.com/0/8839/3a46a319-80c7-4514-6353-e24aaab7f439.png)

![スクリーンショット 2017-12-12 18.54.49.png](https://qiita-image-store.s3.amazonaws.com/0/8839/dd2d7355-1766-f9c1-d4d4-3da50174d893.png)

![スクリーンショット 2017-12-15 17.56.09.png](https://qiita-image-store.s3.amazonaws.com/0/8839/47bf4d81-3e56-a2ae-5cd7-5eb2f02406dd.png)

# 検証方法
検証した年齢判定APIは、実数か区間を返す２種類のAPIに分かれます。

## 1)実数の推定
- 被写体が何歳なのか、値を１つ返すAPIです。
 - *FaceAPI*：小数第1位まで
     - 内訳：19.3、25.2、40.4、45.5、、、、
 - *PUX顔検出(評価版)*：整数(５つ刻み)
     - 内訳：8、13、18、23、、、、

- 推定値と真値の差から精度を検証しました。

## 2)区間の推定
- 被写体が何歳なのか、属する区間（最小値と最大値）を１つ返すAPIです。
 - *Visual Recognition*：７区間から１つ
     - 内訳：〜17、18〜24、25〜34、35〜44、45〜54、55〜64、65〜
 - *フリーの年齢・性別モデル*：８区間から１つ
     - 内訳：0〜2、4〜6、8〜12、15〜20、25〜32、38〜43、48〜53、60〜100

- 推定区間（最小値と最大値）と真値の差から精度を検証しました。

# 実験結果（年齢判定）
## 1)実数の推定
### 推定結果
![スクリーンショット 2017-12-18 16.41.34.png](https://qiita-image-store.s3.amazonaws.com/0/8839/6f79fabe-f574-bdaa-519b-41ee8eb6336d.png)

![実数推定.png](https://qiita-image-store.s3.amazonaws.com/0/8839/69b7d2cc-89f9-ef54-477d-ac6179296924.png)

### 実年齢との差分
![スクリーンショット 2017-12-18 16.25.59.png](https://qiita-image-store.s3.amazonaws.com/0/8839/22c539b6-90a5-0d8d-fccc-9f15d031e337.png)

![スクリーンショット 2017-12-18 16.43.21.png](https://qiita-image-store.s3.amazonaws.com/0/8839/8ed7b247-62ed-65bd-9f7e-6331aaf2386f.png)


- FaceAPI: 推定年齢±5歳に実年齢が存在する割合は約35%。全体的に実年齢より低く推定された。
- PUX: 推定年齢±5歳に実年齢が存在する割合は約23%。全体的に実年齢より低く推定され、実年齢との差分が大きい傾向がある。

## 2）区間の推定
### 推定結果(Visual Recognition)
![スクリーンショット 2017-12-18 20.22.34.png](https://qiita-image-store.s3.amazonaws.com/0/8839/253daac5-52e1-56c1-516b-5d81e799c3c5.png)
V0:〜17、V18:18-24、V25:25-34、V35:35-44、V45:45-54、V55:55-64、V65:65〜

![スクリーンショット 2017-12-18 20.20.06.png](https://qiita-image-store.s3.amazonaws.com/0/8839/28cf5a75-fb90-fe77-9717-6f333dc0a8e8.png)

### 推定結果(フリーモデル)

![スクリーンショット 2017-12-18 20.21.32.png](https://qiita-image-store.s3.amazonaws.com/0/8839/27b6b609-e0be-7981-3368-abff3e1c6a0e.png)
F0:0-2、F4:4-6、F8:8-12、F15:15-20、F25:25-32、F38:38-43、F48:48-53、F60:60-100
（推定区間が網羅的でないことに注意してください）

![スクリーンショット 2017-12-18 20.17.08.png](https://qiita-image-store.s3.amazonaws.com/0/8839/d9277a27-a754-f956-e657-f240a4b731ca.png)

### 推定結果（区間の適合率）
![スクリーンショット 2017-12-18 20.55.15.png](https://qiita-image-store.s3.amazonaws.com/0/8839/84ff5040-4b3d-5313-3e4d-ee1db51dfc82.png)

### 実年齢との差分
![スクリーンショット 2017-12-18 20.27.36.png](https://qiita-image-store.s3.amazonaws.com/0/8839/101051b5-5599-17ea-b5f0-0ad82988d1a4.png)
（推定区間の最大値、もしくは最小値からの実年齢との差分を出しています）

![スクリーンショット 2017-12-18 20.27.45.png](https://qiita-image-store.s3.amazonaws.com/0/8839/fc0d97b1-b6b7-f833-1eff-58f8863c1c99.png)

- Visual Recognition: 推定区間±5歳に実年齢が存在する割合は約32%。全体的に実年齢より低く推定された。
- フリーモデル: 推定区間±5歳に実年齢が存在する割合は約28%。全体的に実年齢より低く推定されたが、実年齢との差分が大きい傾向がある。

# 考察

- *Face API*：推定年齢±5歳に実年齢が存在する割合が**35%**と最も高く、差分のグラフも−５歳ほどを中心に狭い正規分布を描いている。
- *Visual Recognition*：推定区間±5歳に実年齢が含まれる割合が**32%**と高く、差分のグラフも-5歳ほどを中心に正規分布を描いている。
- *PUXの顔検出(評価版)*：推定年齢±5歳に実年齢が存在する割合が**23%**で、差分のグラフは０歳ほどを中心にやや広い分布を描いている。
- *その他のフリーの年齢・性別モデル*：推定区間±5歳に実年齢が含まれる割合が**28%**で、差分のグラフは0歳ほどを中心にやや広い正規分布を描いている。

# まとめ

 - **Face API**が最も実年齢と推定年齢の差が少ない

どのAPIも実年齢に比べて推定値が低い結果となりました。これは日本の芸能人のInstagram画像を使ったためだと思われ、普通の写真で試したら結果が異なるかもしれません。

また、フリーのモデルで**黒○徹子さんが推定年齢0〜2歳になり驚きました**。5枚中3枚。お若い。