はじめに
先日、研究で画像分類タスクの人間データを集める際に、Amazon Mechanical Turk (以下AMT)を使用したのですが、一つにまとまった情報がなかったので、この記事でまとめて共有します。(AMT自体の説明や詳細については、少し古いですがこちらのスライドが参考になるかと思います。)
今回は、AMT側で用意されているテンプレートとCrowdHTMLというAMT用のタグを使用してシンプルな画像分類課題を作成しました。他の課題もテンプレが用意されているので、適宜自分の目的に合わせて作成してください。
また、より複雑な課題をオンラインで実施したい場合は、他のサービスなどを組み合わせる必要があると思います。詳しくは #より複雑な課題を提出したい場合は?で考察しています。
目次
事前準備
- AMTのRequesterアカウントを作成
AMTでは課題に取り組むWorkerと、課題を出すRequesterが存在します。今回は課題を提出することが目的なのでここからRequesterアカウントを作成してください。
また、Workerへの報酬を払うために、プリペイドへの入金、もしくはクレジットカードの登録が必要になります。この辺の設定は課題の提出前でも大丈夫です。 - AWSのアカウントを作成
S3の利用のために必要になります。ここでもクレジットカード等の料金支払い登録が必要です。
AWSのS3に課題用の画像をアップする
AWSのファイルストレージシステムであるS3に、課題に必要な画像をアップロードします。
まず、AMT用のバケットを作成します。
その際、Workerが画像にアクセスできるように、"Block all public access"をオフにします。
また、"Amazon S3" → "[作成したバケット]" → "Permissions"のCORS設定を以下のように編集します。(参照: CORS configuration requirement)
[
{
"AllowedHeaders": [],
"AllowedMethods": [
"GET"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": []
}
]
以上でバケットの設定は完了です。
次に、S3に画像をアップロードしていきます。まず、本課題用のフォルダを作成します。
作成したフォルダに画像をアップロードします。画像のフォルダを一括でアップロードすることもできます。
この際、public-readアクセスの設定を忘れないようにしましょう。
これで画像をアップロードできました。画像のページにいくと、URLが確認できます。別アカウントか、ログインしていない状態でもそのURLにアクセスできるか確認しておきましょう。
課題を提出する際には、画像のURLのリストを作成する必要があります。その手順は #課題をバッチごとに提出 で説明しています。
AMTで課題を作成
AMTで"New Project"を作成します。今回は"Image Classification"のテンプレートを選択しました。
課題の設定を行います。特に重要なのは報酬などについての設定だと思います。以下でいくつかの項目についてまとめています。
-
Reward per assignment
assignment毎の報酬額。"assignment"とは、提出されたタスク1つのことを指し、ここでは「1つの画像を分類する作業」を意味します。 -
Number of assignments per task
あるタスクを何人のワーカーに行ってもらうか。今回の例では、「1画像あたり何人のワーカーに分類してもらうか」という意味です。 -
Time allotted per assignment
1タスクにかかる最大時間。 -
Task expires in
タスクの有効期限。 -
Auto-approve and pay Workers in
RequesterはWorkerが提出したタスクを承認(または拒否)することで報酬が発生(または拒否)するのですが、ここで指定した時間を経過すると自動で承認されます。
HTML/CSSを使ってタスクをデザインしていきます。テンプレの場合は、Crowd HTMLという要素を使ってタスクをデザインすることができます。詳しくはドキュメントを参照してください。
ここで大事なのは画像の指定方法です。<crowd-image-classifier>
タグの要素src
にURLを指定することで画像を表示します。ここではsrc="${image_url}"
と変数を置いています。これは、課題を提出する際に、URLをCSVファイルでまとめて提出するのですが、そのときにURLが格納される変数です。
タスクのデザインをして、プレビューを見て問題なさそうであれば"Finish"を押して完成です。画像は課題の提出の際に確認できます。また、タスクの設定やデザイン等は後で編集できます。
課題をバッチごとに提出
課題を提出する際は、対象となる画像のURLをCSVファイルにまとめて提出します。このURLをいくつかに分割して提出することも可能です。
CSVファイルの中身について説明します。タスクをデザインした時、src="${image_url}"
というように変数を置きました。この変数名をCSVファイルの先頭に置き、その後urlの一覧を1列に並べます。
image_url
https://amt-backet.s3.ap-northeast-1.amazonaws.com/mturk-images/airplane_test_000.jpg
https://amt-backet.s3.ap-northeast-1.amazonaws.com/mturk-images/airplane_test_001.jpg
https://amt-backet.s3.ap-northeast-1.amazonaws.com/mturk-images/airplane_test_002.jpg
**URL変数とCSVファイルについてのtips**
== 記述例 ==
<crowd-image-classifier
src="https://amt-backet.s3-ap-northeast-1.amazonaws.com/mturk-images/${image_url}"
...
>
image_url
airplane_test_000.jpg
airplane_test_001.jpg
airplane_test_002.jpg
**CSVファイル作成コマンド例**
images$ ls -1 > file_list.csv
images$ find . -name "*.jpg" | sort > file_list.csv
課題を提出します。AMTのRequesterページから"New Batch with an Existing Project"を選択すると、作成したタスク一覧が表示されるので、該当タスクの"Publish Batch"をクリックします。
そして、先ほど作成した画像URL一覧のCSVファイルをアップロードします。
プレビューで画像が表示されるかなどを確認し、報酬額等の設定を再度確認した後、"Publish"を押せば課題が提出されます。
結果の確認
AMTのRequesterページから"Manage"を選択すると提出したバッチの一覧を確認できます。タスクがどのくらい進んでいるかも確認できますね。タスクにもよりますが、かなり素早くデータを集めることができると思います。(筆者は数時間程度で4800枚もの画像分類データを集めることができました!)
バッチをクリックするとそのバッチに関する情報が表示され、"Results"を押すと結果が確認できます。
結果のページでは、提出されたタスク(assignment)の承認や結果のフィルターを行うことができます。CSVファイルとして結果をダウンロードすることも可能です。
より複雑な課題を提出したい場合は?
今回は、AMT側で用意されているテンプレートを使用してシンプルな画像分類課題を作成しました。
ただ、このテンプレートやCrowdHTMLは制約も多く、単純な課題しか作成できません。より複雑な課題の人間データを集めたい場合は、サーバーをホストして自分で課題を作るか、他のサービスを使って課題を作成する必要があります。
例えば、PsycoPyで作った課題をオンライン実験用に変換するとか。この手順はラボの後輩@Tiger-0512が記事にしてくれています。(PsycoPyを使用してオンライン実験を始めるまで)
別のサイト等で課題を作成した場合は、その課題のURLをAMTの画面に貼り、Workerに課題のリンクに飛んでもらい、リンク先で課題を解いてもらった後、AMTのページに戻ってsubmitを押してもらうという流れが考えられます。
つまり、AMTで被験者の募集と報酬の支払いを行い、別のページで課題を解いてもらうという方法です。その際、課題のページでWorkerIDを入力してもらえば、AMT側での報酬等のやり取りもスムーズになるかと思います。
尚、筆者はここまでは実践していないので、もしこのような方法を試した方がいれば、共有していただけると幸いです!