Cloud AutoML Vision ヒューマン ラベリング を使ってみた

最近、深層学習のための学習データや正解データを人力で作成するサービスに興味があります。Amazon Web Servicesには[Amazon SageMaker GroundTruth](https://aws.amazon.com/jp/sagemaker/groundtruth/)というサービスがありますが、Google Cloud Platformにも[Cloud AutoML Vision](https://cloud.google.com/vision/automl/docs/)に[ヒューマンラベリング](https://cloud.google.com/vision/automl/docs/human-labeling)という機能がありましたので使ってみました。

# Cloud AutoML Vision サービスを使う環境を整える

[こちら](https://cloud.google.com/vision/automl/docs/quickstart)の記事に従い、課金やAPIの有効可をしたり、Google Cloud Storageのバケットを作成します。日本語版の記事は2019年5月4日現在、[AutoML Vision UI](https://cloud.google.com/automl/ui/vision)のURLが古いのでご注意ください。

# 人力ラベリングさせたい画像を準備する

今回は[Food-101](https://www.vision.ee.ethz.ch/datasets_extra/food-101/)データセットから画像を111枚ピックアップしました。このデータセットには101種類、各種1000枚の料理画像がありますが、3種類、各種37枚の画像を使います。

```sh
# 4.7GBあり時間がかかります
wget http://data.vision.ee.ethz.ch/cvl/food-101.tar.gz
tar -xvzf food-101.tar.gz
mkdir food-3-human
```

こちらのPythonコードを実行し、ピックアップした画像111枚をfood-3-humanフォルダにコピーします。元のデータセットはラベリングされていますが、全部1フォルダにコピーしたことでラベリングされていないデータセットになりました。

料理3種類はカップケーキ、餃子、ピザを選択しました。このデータセットはステーキとフィレミニョン（ヒレ肉のステーキ）が別の料理として扱われるなど、人間でもラベル付けが困難なケースがあります。また[セビチェ](https://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%93%E3%83%81%E3%82%A7)など日本人には馴染みが薄い料理もあります。今回はテストなので、区別が付きやすく多くの日本人が見た目を想像しやすい料理を主観で選びました。

```python
import shutil
# 抽出するラベル一覧
labels = ['cup_cakes','gyoza','pizza']
# 抽出画像一覧
paths = []
# ラベルに対する追加済み数
counts = {}
for label in labels:
    counts[label] = 0

with open('food-101/meta/train.txt') as f:
    for line in f.readlines():
        line = line.rstrip()
        for label in labels:
            if counts[label] < 37:
                # ラベルごとの登録数を制限する
                if line.startswith(label):
                    # 該当ラベルの画像ならば追加する
                    counts[label] += 1
                    paths.append(line)
# food-3-humanフォルダにコピーする
for path in paths:
    shutil.copy("food-101/images/%s.jpg" % path,"food-3-human/")
```

# データセットを作成する

[AutoML Vision UI](https://cloud.google.com/automl/ui/vision)にアクセスし上部の `NEW DATASET` をクリックします。
![スクリーンショット 2019-05-04 3.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334798/e0d5d727-3b69-c11c-ec11-c96d7697ac5d.png)

`Dataset name` を設定し、`Upload images from your computer` の `SELECT FILES` をクリックし、前の節で作成したfood-3-humanフォルダ以下のファイルをすべて設定します。
`CREATE DATASET` ボタンを押します。
![スクリーンショット 2019-05-04 4.00.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334798/f0495f66-0625-a09d-bcb8-6cb7280a3a1b.png)

# お手本のラベリングを行う

人力ラベリングをお願いする前に、お手本として１種類のラベルに対して最低3つの画像に対してあなた自身がラベリングを行う必要があります。


まずラベルを左下の `Add label` から設定します。英語しか使えません。

![スクリーンショット 2019-05-04 4.05.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334798/4970c41d-71b1-b7b7-7d90-9c33512e3d29.png)

次に１種類3枚の画像を選び、サムネイルをクリックしてラベルを付けます。右側のラベルを選んで `OK` をクリックします。

![スクリーンショット 2019-05-04 4.08.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334798/c60ccc96-33e2-49ee-1441-bceb3d8e2f76.png)

# 人力ラベリングを依頼する

`REQUEST LABELING` をクリックします。これはラベル付けされていない画像が100枚以上無いと表示されません。今回111枚をピックアップした理由はお手本のラベリング3枚が3種類分必要で依頼は最低100枚からで人力ラベリングの[無料枠も100枚](https://cloud.google.com/vision/automl/pricing)だからです。

次に、Request human labelingダイアログが表示されます。 `Describe your overall objective` には "All images are foods" としか書きませんでした。
`Describe each label` に各ラベルの `Description` (ラベル名と同じ)と先ほど私がラベリングした画像を設定します。

![スクリーンショット 2019-05-02 23.10.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334798/c09a9883-26db-8974-8c9f-672cf8f8fffc.png)

`Set your request size` に `Request size` と `Label voting` を設定します。`Label voting`は１画像に対して1人が担当するか3人が担当するかのオプションですが、今回は1人にしました。　`SUBMIT REQUEST` ボタンを押すと人力ラベリングが開始されます。

![set_your_request_size.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334798/26cc41ff-05dd-aa1d-5102-157549655467.png)

人力ラベリング中はこのような表示になります。終わると"AutoML Vision finished processing your dataset"というメールが来ます。１日から5日かかると書いてありますが、今回は13時間で完了しました。

![スクリーンショット 2019-05-02 23.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334798/8e715ce6-8afd-2ae2-f6f4-2feaded7ae90.png)

人力ラベリングの結果です。1画像に対して1人しか担当していませんが、すべて正しいラベル付けを行っていました。
![スクリーンショット 2019-05-03 12.31.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334798/0952fcf6-7e7c-b6b7-3ded-120463b4b73c.png)

[Food-101](https://www.vision.ee.ethz.ch/datasets_extra/food-101/)データセットには画像やラベルが正しくないケースもあったようで、それらはUnlabeledになりました。
![スクリーンショット 2019-05-03 12.36.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334798/e73a47d0-dd39-9a1f-2b29-5852d071e7b4.png)

# ラベリング結果を出力する

本来の使い方はAutoMLを使いクラウド向けまたはエッジ向けに[自動で学習モデルを作る](https://cloud.google.com/vision/automl/docs/train)ことだと思いますが、上部`EXPORT DATA`のクリックでラベリング結果CSVをGoogle Cloud Storageに出力できます。

# まとめ

オリジナルの画像分類課題に取り組むためには、まず大量の画像に対する人力ラベリングが必要で、それにはワーカーの確保や管理、作業画面の作成が必要です。外注するにしても基本契約からなので、手軽に始められることとは言い難いと思います。Cloud AutoML Vision ヒューマン ラベリングは、[1000枚35ドル](https://cloud.google.com/vision/automl/pricing)という金額の妥当性は要検討ですが、手軽に始めたい場合には選択肢のひとつになると思います。