コンテンツへスキップ

クラウド投票、点、ボックスのコンセンサス集約

各項目に対する複数のアノテーターの回答を、投票の割合、DBSCAN による点クラスター、中央値ボックスを使って、Zooniverse のリデューサーと同様に1つのコンセンサスにまとめます。

v2.13.0 で追加

consensus エクスポートは、Zooniverse などの市民科学プロジェクトがボランティアの分類をまとめる方法と同じように、各項目に対する複数のアノテーターの回答を、項目ごとに1つのコンセンサス回答にまとめます。ボランティアプロジェクトの各サブジェクトは複数のボランティアに割り当てられます。たとえば、コロニーの写真に写るペンギンを数えたり、カメラトラップのフレームに写る動物にマークを付けたりします。選択式の質問では、エクスポートは、各回答を与えたアノテーターの数を報告し、各項目に retired か needs_review の印を付けます。点のマークでは、エクスポートは、アノテーターの点をクラスタリングして、物体ごとに1つの点にし、バウンディングボックスでは、物体ごとに中央値のボックスを1つ報告します。市民科学以外のクラウドソーシングのチームも、同じエクスポートを使って、項目ごとの複数のラベルを、項目ごとの1つのラベルにします。Zooniverse の用法にならい、Potato では、ある項目の質問に回答したアノテーターを、その項目の分類者(classifier)と呼びます。

  • 選択式の質問: radio、select、likert、multiselect のスキームには、すべての回答について、件数と割合、最上位の回答、同数の場合のタイ、状態が付きます。
  • 数値の質問: slider と number のスキームには、件数、平均、中央値、標準偏差、最小値、最大値が付きます。
  • 点: image_annotation スキーム内の landmark のマークは、ピクセル単位、または画像に対する割合で指定した半径を使って、DBSCAN でクラスタリングされます。
  • ボックス: image_annotation スキーム内の bbox のマークは、重なりでグループ化され、各グループには、中央値のボックスが付きます。
  • インストール: このエクスポートには、Potato 以外は何も必要ありません。クラスタリングは numpy を使い、Potato はコア依存関係として numpy をインストールします。

コンセンサスと一致度

Potato は、アノテーターがどの程度一致しているかを測り、consensus エクスポートは、項目ごとに1つの回答を出します。reliability エクスポートと /admin/iaa ページは、調査全体にわたる質問ごとの Krippendorff のアルファを報告し、アルファが低いチームは、まずガイドラインやアノテーターのトレーニングを見直します。consensus エクスポートは、項目ごとに機能します。各項目には、その項目のアノテーターが、回答を残せるだけ十分に一致したかどうかを記録する状態が付きます。consensus エクスポートは、アノテーターの正確さにかかわらず、各アノテーターに1票を与えるため、コンセンサスに頼る前に一致度を確認してください。空間ラベルに対する偶然補正済みの一致度については、バウンディングボックスでの一致度の測定を参照してください。

MACE は、すべての票を等しく数える代わりに、各アノテーターの票に重みを付けます。MACE は、radio、likert、select、multiselect のスキームで、各アノテーターの能力スコアを推定し、重み付きの票から各項目のラベルを推論します。クラウドラベルの集約では、能力モデルが重みなしの投票より優れる場合と、回答のばらつきを残すべき場合を扱っています。MACE は、点やボックスのマークを読み込みません。画像上のマークには、consensus エクスポートを使ってください。

設定

次の設定は、ペンギンの数を数えるワークフローを構成します。3択の質問、multiselect の質問、アノテーターが成鳥ごとに点でマークを付け、巣ごとにボックスを描く画像スキームがあります。

yaml
annotation_task_name: "Penguin colony counts"
task_dir: .
data_files: [data/colonies.jsonl]
item_properties: {id_key: id, text_key: image}
output_annotation_dir: annotation_output
num_annotators_per_item: 5
user_config:
  allow_all_users: true
 
annotation_schemes:
  - annotation_type: radio
    name: T0
    description: "Are there penguins in the image?"
    labels: ["Yes", "No", "Unsure"]
  - annotation_type: multiselect
    name: T1
    description: "What else is in the image?"
    labels: [Ice, Water, Rock]
  - annotation_type: image_annotation
    name: T2
    description: "Mark each adult penguin and draw a box round each nest"
    source_field: image
    tools: [landmark, bbox]
    labels:
      - {name: Adult, color: "#00ff00"}
      - {name: Nest, color: "#ff0000"}
 
consensus_aggregation:
  agreement_threshold: 0.8
  min_classifiers: 2
  points:
    eps: 10
    eps_unit: pixels
    min_samples: 2
  boxes:
    iou_threshold: 0.5

スキーム名の T0、T1、T2 は、Zooniverse のタスク ID です。プロジェクトが Zooniverse から来ている場合、potato import は、そのタスク ID をスキーム名として保持し、Potato で作った調査では、任意の名前を使えます。Potato は、各画像を5人のアノテーターに送ります(num_annotators_per_item: 5)。agreement_threshold: 0.8 では、5人のうち4人が同じ回答を与えるまで、項目は retired になりません。min_classifiers: 2 では、1人のアノテーターの回答が、コンセンサスとして数えられることはありません。互いに10ピクセル以内にある2つの点は、クラスターの出発点になり得て、2つのボックスが同じ巣に属するのは、積集合を和集合で割った値(IoU)が0.5以上で重なっている場合だけです。

ピクセル半径でクラスタリングするには、エクスポートが各画像のサイズを必要とします。各項目は、画像と、その画像のピクセル単位の幅と高さを指定します。

json
{"id": "9001", "image": "/media/colony_9001.png", "image_width": 1000, "image_height": 500}

このブロックのキーはすべて、省略可能です。

キーデフォルト--option の名前意味
agreement_threshold0.8agreement_threshold または threshold項目が retired になるために、最上位の回答が必要とする分類者の割合。0より大きく1以下
min_classifiers2min_classifiersneeds_review 以外の状態になるための、最少の分類者数。1以上の整数
schemes対応するすべてのスキームschemes(カンマ区切り)集約するスキーム名。各名前は、設定が宣言しているスキームでなければなりません
points.eps0.02epsクラスターの半径。0より大きく、eps_unit が fraction の場合は1以下
points.eps_unitfractioneps_unitfraction は、x を画像の幅に対する割合、y を高さに対する割合で測り、pixels は、画像のピクセルで測ります
points.min_samples2min_samplesある点がコア点になるために必要な、その点の eps 以内にある点の最少数。この数にはその点自身も含まれます。1以上の整数
boxes.iou_threshold0.5iou_thresholdグループ内の任意の2つのボックス間の最小の IoU。0より大きく1以下

値が範囲外のとき、キーがブロックのリストにないとき、schemes のエントリーが設定の宣言していないスキームを指しているとき、サーバーは起動時に停止し、そのキーを示すメッセージを出力します。python -m potato.validate_cli config.yaml は、調査を始める前に、同じエラーを報告します。

エクスポートコマンド

エクスポートは、設定と、output_annotation_dir に保存されたアノテーションを読み込みます。

bash
python -m potato.export -c config.yaml -f consensus -o consensus_out

このコマンドは、consensus.json と、設定のスキームタイプに対応する CSV ファイルを、consensus_out/ に書き出します。設定を変更せずに、1回の実行だけブロックの1つの設定を上書きするには、--option を渡します。

bash
python -m potato.export -c config.yaml -f consensus -o consensus_out \
    --option agreement_threshold=0.9 --option eps=8 --option eps_unit=pixels

エクスポートは、未知のオプション名で停止し、既知の名前のリストを出力します。設定に対応するタイプのスキームがない場合や、保存されたアノテーションがない場合も、エクスポートは停止して理由を出力します。/admin/api/export の管理者用エクスポート API は、サーバーへのシェルアクセスを持たないチームのために、フォーマット名 consensus で同じエクスポートを提供します。

選択式の質問

各項目と質問について、エクスポートは、分類者と、各回答を与えたアノテーターを数えます。各回答の割合は、その回答の件数を分類者の数で割った値です。単一回答の質問では、割合の合計は1になります。multiselect では、各割合は、その選択肢にチェックを入れた分類者の割合で、割合の合計は1を超えることがあります。consensus_questions.csv は、項目と質問ごとに1行です。次の行は、このページの最後に説明する例のプロジェクトのものです。

csv
instance_id,schema,type,n_classifiers,top_answer,top_count,top_fraction,tied,status,reason
9001,T0,radio,5,Yes,4,0.8,,retired,
9001,T1,multiselect,5,Ice,4,0.8,,needs_review,no agreement on Water (ticked by more than 20% and fewer than 80% of classifiers)
9002,T0,radio,4,Yes,2,0.5,Yes;No,needs_review,"tie between Yes, No"
9002,T1,multiselect,4,Rock,4,1.0,,retired,
9003,T0,radio,1,Yes,1,1.0,,needs_review,"1 classifier, fewer than min_classifiers (2)"
9003,T1,multiselect,1,Ice,1,1.0,,needs_review,"1 classifier, fewer than min_classifiers (2)"

状態は、3つのルールに従います。

  • 分類者が少なすぎる: 分類者が min_classifiers 未満の項目は、needs_review です。
  • 単一回答の質問: radio、select、likert の項目は、最上位の回答の割合が agreement_threshold 以上で、ほかのどの回答も最上位の回答と同数でない場合に、retired になります。
  • multiselect の質問: すべての選択肢が確定しているとき、項目は retired になります。選択肢が確定するのは、分類者の agreement_threshold 以上がその選択肢にチェックを入れたか、それ以上の割合がチェックを入れなかったときです。

画像 9001 では、5人のアノテーターのうち2人が Water にチェックを入れました。したがって、Water の選択肢は、Water にチェックを入れた40%も、チェックを入れなかった60%も、しきい値の 0.8 に届かないため、未確定のままです。回答が同数のとき、top_answer は、スキームがラベルを宣言した順で最初の同数の回答を示し、tied は、同数のすべての回答を、セミコロンで区切って列挙します。reason 列は、項目にレビューが必要な理由を示します。

コンセンサスの状態は報告であり、Potato はその状態に基づいて何も行いません。Zooniverse は、決まった回数の分類のあとにサブジェクトを retire しますが、Potato は、コンセンサスの状態にかかわらず、調査の割り当てルールに従って項目を割り当て続けます。この状態は、さらに多くのアノテーターや裁定に回す項目を選ぶために使ってください。

consensus_votes.csv は、項目、質問、回答ごとに1行で、列は instance_id, schema, answer, count, fraction, n_classifiers です。スキームが宣言するすべての選択肢に行があり、どのアノテーターも選ばなかった選択肢の件数は 0 です。

csv
instance_id,schema,answer,count,fraction,n_classifiers
9001,T0,Yes,4,0.8,5
9001,T0,No,1,0.2,5
9001,T0,Unsure,0,0.0,5
9001,T1,Ice,4,0.8,5
9001,T1,Water,2,0.4,5
9001,T1,Rock,1,0.2,5

選択肢を列挙しているがチェックが1つもない、保存された multiselect のレコードは、票のない分類者として数えられます。そのようなレコードは、n_classifiers に1を加え、どの回答の件数にも何も加えません。その質問のエントリーがないレコードは、分類者として数えられません。

スライダーと数値の質問

consensus_numeric.csv は、項目と質問ごとに1行で、列は instance_id, schema, type, n, mean, median, sd, min, max です。n は、数値の回答を持つアノテーターの数です。sd は、分母が n − 1 の標本標準偏差です。1人のアノテーターしか回答していない場合、sd は空のままです。数値の質問には、状態は付きません。

点のクラスター

DBSCAN(density-based spatial clustering of applications with noise)は、近くにある点をグループ化し、孤立した点をノイズとして除外します。エクスポートは、1つの項目上の1つのラベルの点を、すべてのアノテーターから集め、集めた点を DBSCAN でクラスタリングします。

  • 点自身とその eps 以内にある他の点を合わせた数が min_samples 以上のとき、その点はコア点です。
  • クラスターは、コア点の連結したグループと、いずれかのコア点の eps 以内にあるその他の点です。2つのクラスターに隣接する点は、アノテーションが読み込まれた順で、最初に見つかったクラスターに加わります。
  • 残りのすべての点は、ノイズです。

このルールは、scikit-learn の DBSCAN が実装し、panoptes_aggregation のリデューサー point_reducer_dbscan が呼び出すものです。eps_unit: pixels で、eps と min_samples が同じなら、エクスポートは point_reducer_dbscan と同じクラスターと中心を出します。panoptes_aggregation のデフォルトは、eps が5ピクセル、min_samples が3ですが、Potato のデフォルトは、項目ごとに数人のアノテーターという状況に適しています。画像ごとのボランティアが多い場合は、min_samples を上げてください。

consensus_points.csv は、項目、スキーム、ラベル、クラスターごとに1行です。

csv
instance_id,schema,label,cluster,x,y,x_px,y_px,size,n_annotators,spread,spread_px,var_x,var_y,cov_xy,annotators,label_points,label_annotators,label_noise,n_classifiers,note
9001,T2,Adult,0,0.10025,0.201,100.25,100.5,4,4,0.003897,2.331845,2.916667,4.333333,-1.166667,vol1;vol2;vol3;vol4,8,4,1,4,
9001,T2,Adult,1,0.800667,0.8,800.666667,400.0,3,3,0.004643,3.681787,16.333333,4.0,8.0,vol1;vol2;vol4,8,4,1,4,
9002,T2,Adult,,,,,,,,,,,,,,1,1,1,1,no cluster (every point is noise)

画像 9001 では、4人のアノテーターが、8つの Adult の点を置きました。そのうち7つの点が、それぞれに成鳥1羽ずつの2つのクラスターを作り、8つ目の点はノイズです。列は次のとおりです。

列意味
clusterその項目のラベル内でのクラスター番号。0から
x、yクラスターの中心。所属する点の平均で、画像の幅と高さに対する割合
x_px、y_px同じ中心をピクセルで表したもの。画像サイズが不明の場合は空
sizeクラスター内の点の数
n_annotators、annotatorsクラスター内に点を持つ個別のアノテーターの数と、その名前
spread、spread_px所属する点の、中心からの二乗平均平方根距離。割合とピクセル
var_x、var_y、cov_xyx と y の標本分散、および x と y の共分散。画像サイズがわかっている場合はピクセル単位。値は、Zooniverse のリデューサーの clusters_var_x、clusters_var_y、clusters_var_x_y の列と一致します
label_points、label_annotators、label_noiseその項目のラベル全体の、点の数、アノテーターの数、ノイズの点の数。そのラベルの各行に繰り返されます
n_classifiersその項目で画像スキームを保存したアノテーター
noteラベルにクラスターがない理由

すべての点がノイズであるラベルにも、画像 9002 のように、cluster が空で note を持つ行が1つ付きます。DBSCAN は、1人のアノテーターの2つの点が1つのクラスターに入ることを防ぎません。そのようなクラスターは、size と n_annotators を比べて見つけてください。

画像サイズと Zooniverse のインポート

Potato は、すべてのマークを、画像の幅と高さに対する割合として保存します。そのため、eps_unit: fraction では、エクスポートは、画像サイズなしですべての項目の点をクラスタリングします。1000 × 500 ピクセルの画像では、0.02 の eps は、横に20ピクセル、縦に10ピクセルに相当します。

エクスポートは、ピクセルでの出力と eps_unit: pixels のために、画像サイズを必要とします。エクスポートは、項目の image_width と image_height フィールド(または width と height)からサイズを取得します。これらのフィールドがない場合、ファイルがタスクのメディアディレクトリの下にあれば、エクスポートは画像ファイル自体からサイズを読み取ります。リモートの画像はダウンロードされません。eps_unit: pixels では、サイズが不明な項目上のラベルには、「image size unknown; pixel eps cannot be applied」という注記付きの行が付き、エクスポートは、そのような項目を最大5つまで挙げた警告を出力します。

Zooniverse のサブジェクトは、Zooniverse のサーバーにホストされた画像であり、エクスポートは、それらのサーバー上の画像を開けません。Potato 2.13.0 以降、potato import は、描画タスクを持つプロジェクトの各項目に image_width と image_height を書き込みます。サイズは、Zooniverse が分類とともに記録した画像の寸法、またはサブジェクトのメタデータにある幅と高さから取得されます。そのため、インポートされた描画は、チームが panoptes_aggregation で使ったものと同じ eps を使って、ピクセル単位でクラスタリングされます。--keep-annotators を付けてインポートしてください。このフラグがあると、インポーターは、各ボランティアの分類を、そのボランティア自身の保存済みの作業として書き込み、consensus エクスポートは、各ボランティアを1回ずつ数えます。

bash
potato import -i zooniverse-exports/ -o my-project --keep-annotators
python -m potato.export -c my-project/config.yaml -f consensus -o consensus_out

ログインしていなかったボランティアは anon_<id> として現れ、そのため1人が複数の分類者として数えられることがあります。サイズが記録されていないサブジェクト上のマークは、インポート時に除外され、インポートは、除外したマークの数を数えて警告を出力します。Zooniverse のインポートのセクションに、インポーターが読み込むタスクタイプが一覧されています。

コンセンサスボックス

積集合を和集合で割った値(IoU)は、2つのボックスが共有する面積を、その2つのボックスが合わせて覆う面積で割った値です。エクスポートは、1つの項目上の1つのラベルのボックスを、グループにまとめます。グループは、アノテーターごとに最大1つのボックスを持ち、グループ内のすべてのボックスの組が、少なくとも iou_threshold で重なります。エクスポートは、3つのステップでグループを作ります。

  1. 残っている各ボックスが候補グループの出発点になり、ほかのアノテーターの残っているボックスは、最初のボックスとの IoU が高い順に試されます。ボックスは、そのボックスと、すでにグループにあるすべてのボックスとの IoU がしきい値を満たす場合に、グループに加わります。
  2. 最大の候補グループが保持されます。同数の場合は、最初のボックスとの IoU の合計が大きいグループ、次いで、より早いボックスが優先されます。
  3. 保持されたグループのボックスはプールから外れ、残りのボックスに対してステップが繰り返されます。ほかのどのボックスとも重ならないボックスは、1つのボックスだけのグループになります。

それぞれが3つ目のボックスと重なる2つのボックスは、その2つのボックスが互いに重ならない場合、異なるグループになります。コンセンサスボックスは、メンバーの左、上、右、下の端の中央値です。IoU は、画像を引き伸ばしても変わりません。したがって、グルーピングには画像サイズが不要で、サイズがわかっている場合には、ピクセルの列が埋められます。

consensus_boxes.csv は、項目、スキーム、ラベル、グループごとに1行です。

csv
instance_id,schema,label,group,x,y,width,height,x_px,y_px,width_px,height_px,support,n_classifiers,support_fraction,mean_iou,min_iou,annotators
9001,T2,Nest,0,0.2,0.2,0.1,0.11,200.0,100.0,100.0,55.0,3,4,0.75,0.85617,0.826087,vol1;vol2;vol3
9001,T2,Nest,1,0.6,0.6,0.05,0.1,600.0,300.0,50.0,50.0,1,4,0.25,1.0,1.0,vol4
9003,T2,Nest,0,0.01,0.04,0.03,0.08,10.0,20.0,30.0,40.0,1,1,1.0,1.0,1.0,vol1

x、y、width、height は、コンセンサスボックスを画像に対する割合で示し、_px の列は、同じボックスをピクセルで示します。support はグループ内のアノテーターの数、n_classifiers は、その項目で画像スキームを保存したアノテーターの数、support_fraction は support を n_classifiers で割った値です。mean_iou と min_iou は、各メンバーのボックスをコンセンサスボックスと比較したものです。画像 9001 では、4人のうち3人が最初の巣を、中央値ボックスに対する平均 IoU 0.86 で描き、1人のアノテーターのボックスは、しきい値を満たしてほかのどのボックスとも重ならず、1つだけのグループになります。

このグルーピングは Potato 独自のもので、Zooniverse のボックスのリデューサーを移植したものではありません。panoptes_aggregation の rectangle_reducer は、各ボックスのピクセルでの x、y、幅、高さに対して DBSCAN を実行します。metric_type: IoU を指定した shape_reducer_dbscan は、1 − IoU を距離として DBSCAN を実行するため、重なったボックスの連鎖が、互いに重ならない2つのボックスを結び付けることがあります。したがって、同じ分類に対して、Potato と Zooniverse のボックスのコンセンサスは異なることがあります。

テキストとその他の回答タイプ

consensus エクスポートは、7つのスキームタイプを読み込みます。radio、select、likert、multiselect、slider、number、image_annotation です。自由記述、スパン、その他のスキームタイプは、警告なしにコンセンサスから除外されます。リストをさらに絞るには、schemes を設定します。テキストの回答には数える票がなく、表形式のエクスポートは、並べて読むためや裁定のために、すべてのアノテーターのテキストを保持します。

image_annotation スキーム内では、エクスポートは点とボックスだけを集約します。ポリゴン、ポリライン、楕円、フリーハンドの図形、マスク、キーポイントのセットは、タイプごとに数えられ、エクスポートは、その数を警告で示します。consensus.json は、同じ数を not_aggregated の下に記録します。

出力ファイル

ファイル1行あたり書き出される条件
consensus_questions.csv項目と質問設定に radio、select、likert、multiselect のスキームがある
consensus_votes.csv項目、質問、回答同上
consensus_numeric.csv項目と質問設定に slider または number のスキームがある
consensus_points.csv項目、スキーム、ラベル、点クラスター設定に image_annotation スキームがある
consensus_boxes.csv項目、スキーム、ラベル、ボックスグループ同上
consensus.json上記の結果を入れ子にしたもの。使用した設定、not_aggregated の件数、警告を含みます常に

CSV ファイルの値は、小数点以下6桁に丸められます。annotators や tied のようなリストは、セミコロンで連結されます。consensus.json は、完全な値と、質問ごとの分類者のリストを保持します。

例

bash
python potato/flask_server.py start examples/image/zooniverse-aggregation/config.yaml -p 8000

この例は、Zooniverse のエクスポートからインポートした、作り物のペンギン数え上げワークフローで、4枚のコロニー画像に対する5人のボランティアの保存済みの分類を含んでいます。このページの CSV の行は、この例の consensus エクスポートから得たもので、Potato のチェックアウトから python -m potato.export -c examples/image/zooniverse-aggregation/config.yaml -f consensus -o consensus_out を実行して出力したものです。

関連資料

実装の詳細については、ソースドキュメントを参照してください。