ディープラーニングで高性能な手の検出器を簡単に作る方法



![hand_detection.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/e0605bfe-d505-2b40-da97-27213c3abc0b.gif)

# はじめに
　とある目的で、ディープラーニングで手を検出したいなと思いやってみました。最初は1から学習して全然性能が出なくて、絶望していたのですが学習済みモデルを使うことで簡単に高性能な検出器を手に入れることができました。頼るべきはネットの集合知ですね。特に[@KzhtTkhs](https://twitter.com/KzhtTkhs)さんの以下ツイートに助けられました。
　
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">意外と無い不思議🐤<br><br>EgoHand Datasetを利用した以下の実装とかならあります🐤🐤<a href="https://t.co/h6U7ZENZI2">https://t.co/h6U7ZENZI2</a><br><br>ハンドサインまでいれるとまず無いので、いつも自作しています……🐤🐤🐤</p>&mdash; 高橋かずひと@リベロ拝命🐤 (@KzhtTkhs) <a href="https://twitter.com/KzhtTkhs/status/1161907545008513024?ref_src=twsrc%5Etfw">August 15, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

　ネットに助けられたので、簡単に作りかたを記事にまとめてネットの海に放流いたします。

　写真では1つの手ですが、原理的には、複数の手でも検出可能です（両手の検出までは自分でも確認しています）。


# ディープラーニングで高性能な手の検出器を作る方法
　手の検出器を作るために、TensorFlowの「Object Detection API」を便利に使える自作のツール「Object Detection Tools」とObject Detection APIに対応した手を検出するための学習済みのモデルを公開している「handtracking」というリポジトリから必要なファイルをダウンロードして組み合わせるだけです。

<a href="https://github.com/karaage0703/object_detection_tools"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/karaage0703/object_detection_tools.png" width="460px"></a>

<a href="https://github.com/victordibia/handtracking"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/victordibia/handtracking.png" width="460px"></a>

　具体的には、以下の3ステップで実現します。

1. 機械学習環境を構築
2. 物体検出スクリプトとモデルファイルをダウンロード
3. 物体検出スクリプトを実行

　順に説明していきます。

　環境としてはMac環境を想定しています。Linux PCでも基本的にほぼ同じコマンドでOKです。

　また、環境によって`python`を`python3`に`pip`を`sudo pip3`に置き換える必要がありますので、適宜修正下さい。

## 機械学習環境を構築

### 学習環境構築
　Pyenv + Anacondaを使ってセットアップしていきます。以下記事を参考にPyenvのインストールをしておいて下さい。

[pyenv/pyenv-virtualenv/Anacondaを使ってクリーンなPython環境をセットアップ](https://karaage.hatenadiary.jp/entry/2016/04/04/073000)

　Pyenvインストール後は、以下コマンドを実行して物体検出（Object Detection）に必要な環境を用意します。

　最初にAnacondaをセットアッップして

```sh
$ pyenv install anaconda3-5.1.0 
$ pyenv global anaconda3-5.1.0
$ conda create -n od anaconda
$ pyenv global anaconda3-5.1.0/envs/od
```

　TensorFlowとOpenCVをセットアップします。

```sh
$ pip install tensorflow==1.14.0
$ pip install opencv-python
```

## 物体検出スクリプトとモデルファイルをダウンロード
　以下コマンドで、物体検出スクリプト(object_detection.py)と学習済みのモデルファイル(frozen_inference_graph.pb)をダウンロードします。

```sh
$ wget https://raw.githubusercontent.com/karaage0703/object_detection_tools/master/scripts/object_detection.py
$ wget https://raw.githubusercontent.com/victordibia/handtracking/master/model-checkpoint/ssdlitemobilenetv2/frozen_inference_graph.pb
```

　続いて、以下コマンドでラベルファイル(label.txt)を作成します。

```sh
$ echo 'hand' > label.txt
```

　なお、「handtracking」には、複数のネットワークの学習済みモデルがあるので、モデルの速度や比較をしてみると面白いかもしれません。

## 物体検出スクリプトを実行
　以下コマンドで実行しましょう。この記事の最初のように手の検出が可能です。

```sh
$ python object_detection.py -l='label.txt' -m='frozen_inference_graph.pb'
```


# まとめ
　ディープラーニングを使って簡単に手の検出器を作る方法を記事にしました。まだ試していませんが、Jetson Nanoでも動くと思います。試したら追記します。

　Jetson Nanoでの一般的な物体検出の方法に関しては以下記事参照下さい。
[Jetson Nanoでリアルタイムに物体検出をする方法（TensorFlow Object Detection API/NVIDIA TensorRT）](https://qiita.com/karaage0703/items/67050f2418aa6bb3851a)


　「Object Detection API」を使って自前データで1から学習する方法に関しては以下記事を参照下さい。
[TensorFlowの「Object Detection API」で物体検出の自前データを学習する方法](https://qiita.com/karaage0703/items/76ef6b774e3cd69028bb)