MegaDetector の結果を確認して GBIF に公開する
カメラトラップ画像で MegaDetector を実行し、二人のボランティアと専門家に Potato で種名を付けてもらい、検証を通る Camtrap DP パッケージをエクスポートします。
MegaDetector(Beery et al., 2019)を実行しているカメラトラップのプロジェクトは、このチュートリアルに従って、Potato 2.12.1 で二人のボランティアにすべてのシーケンスの種名を付けてもらい、不一致を専門家に送り、GBIF 向けの Camtrap DP パッケージをエクスポートできます。MegaDetector は、カメラトラップ画像内の動物、人、車両の周りにボックスを描くオープンソースのモデルで、MegaDetector の README は、このモデルが「only finds animals, it doesn't identify them to species level」と述べています。Camtrap DP は、設置、メディア、観察の表を持つ、カメラトラップデータのための TDWG のデータ交換形式で、GBIF は Camtrap DP パッケージを出現記録に変換します。実例では、コロンビアの二台のカメラによる 99 枚の公開画像に MegaDetector を実行し、Camtrap DP バリデーターを通るパッケージで終わります。カメラトラップは、すべてのインポートとエクスポートのオプションを説明しています。
このウォークスルーは Potato 2.12.1 で実行しており、GBIF のセクションの準備スクリプトが 2.12.1 のエクスポートを読み込むため、インストールコマンドは 2.12.1 に固定しています。Potato 2.13.1 はエクスポートと画像レビューを変更しており、以下のセクションでは、各変更がどこに当てはまるかを説明します。
画像と正解キー
画像は、LILA BC の Orinoquía Camera Traps のものです。コロンビアのメタ県にある El Rey Zamuro と Las Unamas の保護区のカメラによる 104,782 枚の画像で、Community Data License Agreement の寛容版(CDLA-Permissive-1.0)の下で公開されています。LILA は、このデータセットの利用者に、カメラトラップデータのための AI プラットフォームの評価である Vélez et al. (2023) を引用するよう求めています。この評価は、空の画像と動物の画像を分ける MegaDetector について高い適合率と再現率を、他の三つのプラットフォームの種の分類については、一般に低から中程度の再現率を見いだしました。テスト実行では、カメラ M04 と N29 から、三枚組の 33 のシーケンス、合計 99 枚の画像を取り、そのうち 23 が動物のシーケンス、10 が空のシーケンスでした。データセットのすべての画像には専門家による種のラベルがあり、それらのラベルが、テスト実行でのレビュアーにとっての正解キーとして使われました。
LILA は、各画像を https://storage.googleapis.com/public-datasets-lila/orinoquia-camera-traps/public/ に続けて、N29/105EK113/04110961.JPG のような画像のパスを付けて配信しています。画像を traps/ というフォルダーに置き、パスは維持してください。そうすれば、各パスの最初のフォルダーがカメラを表します。
MegaDetector の実行
下のコマンドは、MegaDetector をインストールし、初回実行時に MegaDetector 5a(281 MB)をダウンロードして、フォルダーに対する一つの結果ファイルを書き出します。
pip install megadetector
python -m megadetector.detection.run_detector_batch MDV5A traps/ md_output.json \
--recursive --output_relative_filenames --include_image_timestamp --threshold 0.05--output_relative_filenames は traps/ からの相対パスを書き出し、--include_image_timestamp は各画像の EXIF の時刻を datetime フィールドにコピーします。--threshold 0.05 は、MegaDetector の控えめな閾値までの検出を残します。下のインポートはレビュー自身のカットオフを適用するため、後で別のカットオフを試すのに、MegaDetector をもう一度実行する必要はありません。megadetector パッケージ 10.0.28 は、Apple シリコンの Mac で 99 枚の画像を 36 秒で処理し、検出器として md_v5a.0.1.pt を用いた、バッチ出力形式 1.6 を書き出しました。ファイルは、MegaDetector の典型的な閾値 0.2 を detector_metadata に記録しています。その閾値で、MegaDetector は、動物のある 64 枚のうち 63 枚にフラグを付け、空の 35 枚のうち 1 枚にボックスを付け、80 個のボックスを残しました。
データセットのメタデータは、各時刻を +00:00 のオフセットで示していますが、データセット内のパカは 18:00 から 05:00 に、人は 06:00 から 18:00 に活動しています。したがってカメラは UTC より 5 時間遅れの現地時刻を記録しており、下のエクスポートの手順でそのオフセットを加えます。
カメラとシーケンスの追加
MegaDetector の出力は、各画像とそのボックスを挙げますが、カメラやシーケンスは含みません。Potato のインポートは、画像の項目にこれらのフィールドがあれば、location、seq_id、frame_num を読み取ります。下のスクリプトは、各パスの最初のフォルダーからカメラを取り、60 秒を超える間隔があくと新しいシーケンスを始めます。
import json
from collections import defaultdict
from datetime import datetime
results = json.load(open("md_output.json"))
# The first folder in each path is the camera, as in N29/105EK113/04110961.JPG
by_camera = defaultdict(list)
for image in results["images"]:
image["location"] = image["file"].split("/")[0]
by_camera[image["location"]].append(image)
# A new sequence starts when more than 60 seconds pass between two images
for camera, images in by_camera.items():
images.sort(key=lambda im: im["datetime"])
previous, n = None, 0
for image in images:
taken = datetime.strptime(image["datetime"], "%Y:%m:%d %H:%M:%S")
if previous is None or (taken - previous).total_seconds() > 60:
n += 1
frame = 0
image["seq_id"] = f"{camera}-{n:04d}"
image["frame_num"] = frame
frame += 1
previous = taken
json.dump(results, open("md_output_seq.json", "w"), indent=1)
print(len(results["images"]), "images in",
len({im["seq_id"] for im in results["images"]}), "sequences")スクリプトは 99 images in 33 sequences と出力し、33 のシーケンスはデータセット自身のシーケンス ID と一致しました。
結果の Potato へのインポート
カメラトラップのシーケンスは、生態学者が数える単位です。ペッカリーが三つのフレームにわたってカメラの前を歩いても、一回の検出だからです。Potato をインストールし、シーケンスごとに一つの項目でファイルをインポートします。
pip install potato-annotation==2.12.1
potato import -i md_output_seq.json --image-dir traps --md-threshold 0.2 --sequences -o camera-trap-review/Imported 33 item(s), 1 question(s), 0 answer(s) from 0 annotator(s), and 33 model suggestion(s) from MegaDetector batch output.
left out: 19 detections below --md-threshold 0.2
wrote camera-trap-review/data/md_output_seq.jsonl
wrote camera-trap-review/config.yaml
wrote camera-trap-review/README.md各シーケンスは、三つのフレームのギャラリーとして表示される一つの項目になり、生成された設定は、画像をコピーせずに traps/ から配信します。インポートは triage という一つの質問を書き出します。Potato は、シーケンス内で最も確信度の高い検出から回答を事前入力し、0.2 以上の検出があるフレームがない場合は empty を事前入力します。事前入力された回答は、33 のシーケンスすべてで正解キーと一致しました。MegaDetector は種名を付けません。そのためインポートは種の質問を書き出さず、下の設定がそれを追加します。
レビュー用の設定
下の設定は、インポートが書き出した設定に四つの変更を加えます。species 質問は、サイトの種リストにある種を学名で列挙します。Camtrap DP と Darwin Core が記録するのは学名だからです。Potato はそのままだとラベルを各単語の先頭を大文字にして「Pecari Tajacu」と表示するため、humanize_labels: false で名前を書かれたとおりに保ちます。トリアージには unidentified の選択肢を加えます。理由は次のセクションにあります。num_annotators_per_item は、すべてのシーケンスを二人のレビュアーに送り、最初の二人が一致しない場合にそのシーケンスを三人のレビュアーに引き上げます。この設定は完全なもので、2.12.1 で python -m potato.validate_cli config.yaml --strict を通ります。
annotation_task_name: Orinoquia camera traps, sequence review
task_dir: .
output_annotation_dir: annotation_output/
data_files:
- data/md_output_seq.jsonl
item_properties:
id_key: id
text_key: seq_id
user_config:
allow_all_users: true
users: []
media_directory: /data/orinoquia/traps
instance_display:
fields:
- key: frames
type: gallery
label: Sequence
display_options:
layout: grid
columns: 3
show_captions: true
zoomable: true
# Two volunteers review every sequence, and a sequence they disagree on goes to a third reviewer
num_annotators_per_item:
default: 2
adaptive:
enabled: true
disagreement_threshold: 0.5
boost_to: 3
pre_annotation:
enabled: true
field: predictions
allow_modification: true
annotation_schemes:
- annotation_type: radio
name: triage
description: What does this sequence show?
labels: [empty, animal, unidentified, person, vehicle]
sequential_key_binding: true
- annotation_type: multiselect
name: species
description: Which species appear in the sequence?
humanize_labels: false
labels:
- Pecari tajacu
- Tayassu pecari
- Dasyprocta fuliginosa
- Cuniculus paca
- Nasua nasua
- Tapirus terrestris
- Mitu salvini
- Myrmecophaga tridactyla
- Leopardus pardalis
- Bos taurusインポートは --image-dir の完全なパスを media_directory として書き出し、ここでは /data/orinoquia/traps として示しています。十の種は、例にある七つに、オオアリクイ、オセロット、ウシを加えたものです。追加した三つの種は、Orinoquía のデータセットの他の箇所に現れます。十の名前はすべて、GBIF バックボーン分類の受理名と一致しました。
ボランティアによるレビューと専門家の確認
プロジェクトフォルダーからサーバーを起動します。
cd camera-trap-review
potato start config.yaml -p 8000各ボランティアはユーザー名とパスワードで登録し、キー 1 から 5 でトリアージの回答を確認し、種にチェックを付けます。動物が見えるのに種名を付けられないボランティアは、unidentified を選び、何にもチェックを付けません。この選択肢は Potato 2.12.1 では重要です。2.12.1 は、両方のレビュアーが回答を与えた場合にのみ、質問への二つの回答を比較するからです。一人のボランティアが Nasua nasua にチェックを付け、もう一人が何も付けなかったシーケンスには、比較すべき種の回答がなく、二つのトリアージの回答はどちらも animal になります。後述の画像レビューは、最初はこの選択肢なしで実行しました。その実行では、二人のボランティアが 13 枚の画像で意見が分かれ、Potato が三人目のレビュアーに引き上げたのは 13 枚のうち 5 枚だけでした。Potato 2.13.1 は、レビュアーが項目を離れた後の空白を異なる回答として数えるため、引き上げにはこの選択肢はもう必要ありませんが、この選択肢は、ボランティアが動物の名前を付けられなかったと伝える方法として、引き続き役立ちます。
専門家は、二人のボランティアが終了した後に一度ログインします。他のすべてのシーケンスにはすでに二人のレビュアーがいるため、サーバーは専門家に、不一致のものだけを提示します。ボランティアが三人以上いる場合、引き上げられたシーケンスをまだ見ていないボランティアが、専門家より先に三人目の枠を取ることがあります。Potato は自動保存のたびに回答を比較し、ページはクリックの 0.5 秒後に保存します。誤った種にチェックを付けてからチェックを直したボランティアでも、シーケンスは専門家に送られます。そのような訂正は、専門家に余分に一つのシーケンスを負担させます。
テスト実行では、スクリプト化された二人のボランティアが、動物のシーケンスの 15% と 10% で種名を誤りました。誤った回答は、似た種か unidentified でした。最初のボランティアは 6 つのシーケンスで、二人目は 4 つで誤りました。ボランティアは 8 つのシーケンスで意見が分かれ、Potato はその 8 つを三人のレビュアーに引き上げ、専門家は同じ 8 つを受け取りました。ハナグマのシーケンスの一つでは、両方のボランティアが unidentified を選び、そのシーケンスは専門家に届きませんでした。二人のボランティアが同じ間違いをすれば一致してしまうため、一致したシーケンスの無作為標本も確認してください。
パッケージと出現記録のエクスポート
Camtrap DP パッケージと Darwin Core の出現記録の表を、一つのフォルダーにエクスポートします。
python -m potato.export -c config.yaml -f camtrap_dp -o package/ \
--option timezone=-05:00 --option contributor="Your Name" \
--option sampling_design=systematicRandom --option capture_method=activityDetection
python -m potato.export -c config.yaml -f darwin_core -o package/ --option timezone=-05:00最初のコマンドは datapackage.json、deployments.csv、media.csv、observations.csv を書き出し、二つ目は occurrence.csv を書き出しました。timezone=-05:00 は、コロンビアの UTC オフセットをカメラの時刻に加えます。Orinoquía のカメラは 1 km 間隔で設置されており、テスト実行ではその配置に systematicRandom を使いました。ご自身の調査に合う調査設計は、Camtrap DP のリストから選んでください。各シーケンスはイベントレベルの観察を与え、シーケンス ID が eventID に、最初と最後のフレームの時刻が eventStart と eventEnd になります。エクスポートは、カメラ M04 と N29 に座標がないと警告しました。Camtrap DP は、すべての設置に座標を求めます。--option license は付けないでください。このオプションはデータのライセンスだけを書き込み、プロファイルが求める二つのライセンスは、次のセクションのスクリプトが書き込むからです。
Potato 2.12.1 はすべてのレビュアーの回答を書き出すため、二つの表は公開できる状態ではありません。observations.csv には 33 のシーケンスに対して 74 行があり、各ボランティアからシーケンスごとに一行、さらに専門家からの 8 つのシーケンス分が加わっていました。occurrence.csv には、動物の 23 のシーケンスに対して 46 件の出現記録がありました。Darwin Core には学名が必要なため、エクスポートは 8 件の unidentified の回答を除外しました。エクスポートされたままで公開すると、パッケージは各動物を二回か三回数えることになります。camtrap_dp と darwin_core のエクスポートは --option annotator=<user> を無視し、このオプションを読み込むのは megadetector エクスポートだけなので、これは役に立ちません。
Potato 2.13.1 は、両方の表にシーケンスごとに一人のレビュアー分を書き出します。--option annotator=<user> でレビュアーを指定しない限り、ユーザー ID で最初の人が選ばれ、レビュアーが一致しないシーケンスについて警告します。このページの保存されたレビューに対して実行すると、2.13.1 は 33 件の観察と 18 件の出現記録を、すべて最初のボランティアから書き出したため、8 つの係争中のシーケンスについての専門家の回答は表に入りませんでした。したがって 2.13.1 のエクスポートでも、専門家の回答を統合する必要があり、下のスクリプトは 2.12.1 の表に対してそれを行います。2.13.1 では、--option license= と --option media_license= がプロファイルが求める二つのライセンスを書き込み、パッケージは Camtrap DP 1.0.2 プロファイルを使い、--option media_base_url= は Darwin Core の associatedMedia を公開 URL にします。座標は、引き続き手で入れます。
GBIF 向けのパッケージの準備
下のスクリプトは、シーケンスごとに一人のレビュアーの回答を残します。専門家がレビューしたシーケンスでは専門家の回答を、それ以外ではユーザー名の並びが最初のボランティアの回答を残します。専門家が見なかったすべてのシーケンスで二人のボランティアが一致していたためです。Potato は、各 observationID と occurrenceID を、項目、レビュアー、番号をコロンで結んだものとして書き出し、スクリプトはそれらの ID からレビュアーを読み取ります。次にスクリプトは、Potato が持っていない事実を追加します。各カメラの座標は、deployments.csv、occurrence.csv、パッケージの spatial ボックスに入ります。Camtrap DP プロファイルは、ライセンスが一つでも列挙されるなら両方のスコープを求めるため、データのライセンスとメディアのライセンスが datapackage.json に入ります。ローカルのパスは、公開画像の URL に置き換えられます。スクリプトは camera-trap-review/ で実行してください。
import csv
import json
from collections import defaultdict
EXPERT = "expert"
# Each camera's latitude and longitude in decimal degrees (WGS84)
CAMERAS = {"M04": (4.05, -71.95), "N29": (4.05, -71.95)}
# Where the images are public, if they are; "" keeps the local paths
MEDIA_BASE = "https://storage.googleapis.com/public-datasets-lila/orinoquia-camera-traps/public/"
DATA_LICENSE = "CC-BY-4.0"
MEDIA_LICENSE = "CDLA-Permissive-1.0"
def read(path):
with open(path, newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
return reader.fieldnames, list(reader)
def write(path, columns, rows):
with open(path, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=columns)
writer.writeheader()
writer.writerows(rows)
def one_reviewer(rows, id_column):
# Potato writes each ID as <item>:<reviewer>:<n>
reviewers = defaultdict(set)
for row in rows:
item, reviewer, _ = row[id_column].rsplit(":", 2)
reviewers[item].add(reviewer)
# The expert's answer where the expert saw the item, otherwise the first volunteer's
keep = {item: EXPERT if EXPERT in names else min(names) for item, names in reviewers.items()}
return [row for row in rows
if row[id_column].rsplit(":", 2)[1] == keep[row[id_column].rsplit(":", 2)[0]]]
columns, rows = read("package/observations.csv")
kept = one_reviewer(rows, "observationID")
write("package/observations.csv", columns, kept)
print("observations:", len(rows), "->", len(kept))
columns, rows = read("package/occurrence.csv")
kept = one_reviewer(rows, "occurrenceID")
for row in kept:
lat, lon = CAMERAS[row["locationID"]]
row.update(decimalLatitude=lat, decimalLongitude=lon, geodeticDatum="EPSG:4326")
if MEDIA_BASE:
row["associatedMedia"] = row["associatedMedia"].replace("/media/", MEDIA_BASE)
write("package/occurrence.csv", columns, kept)
print("occurrences:", len(rows), "->", len(kept))
columns, rows = read("package/deployments.csv")
for row in rows:
row["latitude"], row["longitude"] = CAMERAS[row["deploymentID"]]
write("package/deployments.csv", columns, rows)
if MEDIA_BASE:
columns, rows = read("package/media.csv")
for row in rows:
row["filePath"], row["filePublic"] = MEDIA_BASE + row["filePath"], "true"
write("package/media.csv", columns, rows)
with open("package/datapackage.json", encoding="utf-8") as f:
package = json.load(f)
lats = [lat for lat, _ in CAMERAS.values()]
lons = [lon for _, lon in CAMERAS.values()]
w, s, e, n = min(lons), min(lats), max(lons), max(lats)
package["spatial"] = {"type": "Polygon", "bbox": [w, s, e, n],
"coordinates": [[[w, s], [e, s], [e, n], [w, n], [w, s]]]}
package["licenses"] = [{"name": DATA_LICENSE, "scope": "data"},
{"name": MEDIA_LICENSE, "scope": "media"}]
# 1.0.2 has the same terms as 1.0, and current frictionless can read its profile
text = json.dumps(package, indent=2).replace("/camtrap-dp/1.0/", "/camtrap-dp/1.0.2/")
with open("package/datapackage.json", "w", encoding="utf-8") as f:
f.write(text)スクリプトは、観察を 74 から 33 に、出現記録を 46 から 22 に減らしました。33 件の観察は、種名が付いた動物 22 件、空 10 件、両方のボランティアが unidentified のままにしたハナグマのシーケンス 1 件で、33 件のうち 32 件が正解キーと一致します。EXPERT は専門家のユーザー名に、CAMERAS は各カメラ自身の座標に置き換えてください。Orinoquía のデータセットはカメラの座標を公開しておらず、テスト実行では、二台のカメラに一つのプレースホルダーの点を使いました。GBIF の IPT マニュアルは、公開データに CC0、CC BY、CC BY-NC を求め、後の二つについてはバージョン 4.0 を推奨しているため、DATA_LICENSE はその三つのライセンスから選んでください。
スクリプトの最後の行は、プロファイルのバージョンを変更します。Potato 2.12.1 は Camtrap DP 1.0 プロファイルの URL を書き込みます。Frictionless 5.17 以降は 1.0 プロファイル内の一つの参照を解決できず、frictionless 5.21 は InvalidAnchor: '#$defs/version' is not a valid anchor というエラーで停止しました。Camtrap DP 1.0.1 は、用語を何も変えずにこの参照を修正しており、1.0.2 が現行のリリースです。Camtrap DP のサイトが示すコマンドでパッケージを検証します。
pip install frictionless
frictionless validate package/datapackage.jsonFrictionless は、準備したパッケージの三つの表すべてを VALID と報告しました。エクスポートされたままのパッケージに同じコマンドを実行すると、プロファイルの URL で失敗し、その後は空の spatial ボックスで失敗しました。GBIF は、camtrapdp R パッケージで Camtrap DP パッケージを読み込み、camtrapdp はデフォルトでイベントレベルの観察から出現記録を作ります。シーケンスのレビューは、イベントレベルの観察を書き出します。camtrapdp のバージョン 0.6.1 は準備したパッケージを読み込み、check_camtrapdp() はエラーを出さず、write_dwc() は 23 件の出現記録を書き出しました。その 23 件のうち 22 件は種名を持ち、1 件は、両方のボランティアが unidentified のままにしたハナグマのシーケンスで、Animalia のみを記録しています。camtrapdp の出力は、23 件すべての basisOfRecord を MachineObservation としていますが、Potato 自身の darwin_core エクスポートは、人が行った同定を HumanObservation として書き出します。パッケージは、GBIF の公開者を通じて、バージョン 3 以降の GBIF IPT にアップロードしてください。テスト実行は検証で止まり、GBIF には何も送信していません。
修正したボックスの保持
プロジェクトがボックスも必要とする場合、たとえば自サイト向けの分類器を学習させるときは、シーケンスではなく単一の画像をレビューします。--sequences なしでインポートすると、各画像は、MegaDetector のボックスがあらかじめ描かれた detections ボックス質問を持つ一つの項目になります。画像用の設定は、species 質問に加えて、ボックスのラベルにも種名を追加します。
画像レビューは、シーケンスレビューと三つの点で異なります。第一に、Potato 2.12.1 には既存のボックスのラベルを変えるコントロールがなく、Potato 2.13.1 は、レビュアーが種のラベルをクリックすると、選択したボックスのラベルを付け替えます。2.12.1 では、ラベルボタンは次に描くボックスのラベルを設定し、MegaDetector のボックスの内側から始まるドラッグはそのボックスを動かします。種名を付けるには、V とクリックで MegaDetector のボックスを選択し、Delete を押し、種を選び、R で新しいボックスを描きます。第二に、各画像はメディアレベルの観察を与えるため、三つのフレームにいる動物は三つの観察になります。第三に、camtrapdp は、datapackage.json に "gbifIngestion": {"observationLevel": "media"} が設定されている場合にのみ、メディアレベルの観察を読み込みます。検証の前にこの設定を追加してください。camtrapdp は、この設定ありでは画像のパッケージを 80 件の出現記録にし、設定なしでは一件も作りませんでした。Potato 2.13.1 は、単一画像のパッケージでは、この設定を自分で書き込みます。
画像の実行では、同じボランティアと専門家を使いました。Potato は 99 枚の画像のうち 13 枚を専門家に引き上げ、エクスポートは 247 件の観察を書き出しました。上のスクリプトはその 247 件を 115 件に絞りました。115 件は、種付きのボックス 79 件、MegaDetector が見逃した画像の種のチェック 1 件、空 35 件です。一つのシーケンスの三つのフレームにいるハナグマは、それらの観察のうちの三つであり、シーケンスレビューはハナグマを一度だけ記録します。
python -m potato.export -c config.yaml -f megadetector -o export/ は、MegaDetector の結果を読み込むツールのために、バッチ出力形式 1.4 の megadetector_reviewed.json を、項目ごとに一人のレビュアーの回答で書き出します。デフォルトのレビュアーはユーザー ID で最初の人で、--option annotator=<user> で別のレビュアーを指定します。
カメラトラップのレビューのための他のツール
AddaxAI は、Windows、Linux、Apple シリコンの Mac 上で、インストール後はインターネット接続なしに、MegaDetector と地域の種モデルを実行し、Camtrap DP と Timelapse の認識ファイルをエクスポートします。AddaxAI は無料ですが、一部の種モデルは非商用ライセンスで、このプログラムは名称変更の前は EcoAssist と呼ばれていました。Timelapse は、画像にタグを付ける Windows のプログラムで、AddaxAI と MegaDetector の認識ファイルをインポートし、ボックスを描きます。MegaDetector の README は、MegaDetector と連携するプラットフォームとして Wildlife Insights、TrapTagger、Agouti、Camelot を挙げており、Wildlife Insights は機械学習でアップロードされた写真の動物を識別します。Potato は、複数のレビュアーがブラウザで同定を分担する場合、各レビュアーの回答を一致度のために保持する場合、画像を自分のサーバーに置いたままにする場合に適しています。カメラトラップと生物音響ツールの比較は、これらのツールを価格とともに並べています。
GBIF への公開における Potato の限界
- GBIF エクスポートでは項目ごとに一人のレビュアー。 Potato 2.13.1 では、
camtrap_dpとdarwin_coreは、すべての項目について一人のレビュアーの回答(ユーザー ID で最初の人、または--option annotatorが指定するレビュアー)を取るため、係争中の項目についての専門家の回答は手で統合します。Potato 2.12.1 は、レビュアーごとに一つの観察を書き出していました。 - 座標は手で。 Camtrap DP は各カメラの座標を必要とします。Potato 2.13.1 は、MegaDetector のエントリに
latitudeとlongitudeが含まれていればそれを読み取り、Potato 2.12.1 はどちらも読み取りませんでした。 - 種モデルはありません。 Potato は検出器も分類器も実行しません。MegaDetector の
classificationsフィールドにある分類器の種は、インポートで事前入力されたラベルになります。 - シーケンスレビューでは個体数はありません。 イベントの観察では
countが空のままです。
次に読むもの
- カメラトラップ - MegaDetector と COCO Camera Traps のすべてのインポートオプションと三つのエクスポートについて
- Potato での生態学 - カメラトラップと生物音響のワークフローを一か所にまとめたもの
- 異質なアノテーターカバレッジ - 適応的な引き上げと、その他の項目ごとの上限について
- クラウドソースラベルの集約 - 不一致を専門家に送る代わりに、複数のボランティアの回答を統合するために
- 形だけ承認された事前ラベルの検出 - レビュアーが MegaDetector のトリアージを見ずに承認したかどうかの確認について
参考文献
- Beery, S., Morris, D., & Yang, S. (2019). Efficient pipeline for camera trap image review. arXiv. https://arxiv.org/abs/1907.06772
- Vélez, J., McShea, W., Shamon, H., Castiblanco-Camacho, P. J., Tabak, M. A., Chalmers, C., Fergus, P., & Fieberg, J. (2023). An evaluation of platforms for processing camera-trap data using artificial intelligence. Methods in Ecology and Evolution, 14(2), 459-477. https://doi.org/10.1111/2041-210X.14044