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


最近、深層学習のための学習データや正解データを人力で作成するサービスに興味があります。Amazon Web ServicesにはAmazon SageMaker GroundTruthというサービスがありますが、Google Cloud PlatformにもCloud AutoML Visionヒューマンラベリングという機能がありましたので使ってみました。

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

こちらの記事に従い、課金やAPIの有効可をしたり、Google Cloud Storageのバケットを作成します。日本語版の記事は2019年5月4日現在、AutoML Vision UIのURLが古いのでご注意ください。

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

今回はFood-101データセットから画像を111枚ピックアップしました。このデータセットには101種類、各種1000枚の料理画像がありますが、3種類、各種37枚の画像を使います。

# 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種類はカップケーキ、餃子、ピザを選択しました。このデータセットはステーキとフィレミニョン(ヒレ肉のステーキ)が別の料理として扱われるなど、人間でもラベル付けが困難なケースがあります。またセビチェなど日本人には馴染みが薄い料理もあります。今回はテストなので、区別が付きやすく多くの日本人が見た目を想像しやすい料理を主観で選びました。

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にアクセスし上部の NEW DATASET をクリックします。

Dataset name を設定し、Upload images from your computerSELECT FILES をクリックし、前の節で作成したfood-3-humanフォルダ以下のファイルをすべて設定します。
CREATE DATASET ボタンを押します。

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

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

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

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

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

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

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

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

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

人力ラベリングの結果です。1画像に対して1人しか担当していませんが、すべて正しいラベル付けを行っていました。

Food-101データセットには画像やラベルが正しくないケースもあったようで、それらはUnlabeledになりました。

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

本来の使い方はAutoMLを使いクラウド向けまたはエッジ向けに自動で学習モデルを作ることだと思いますが、上部EXPORT DATAのクリックでラベリング結果CSVをGoogle Cloud Storageに出力できます。

まとめ

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