iiif-prezi3を使って、動画にアノテーションを付与する
概要 iiif-prezi3を使って、動画にアノテーションを付与する方法に関する備忘録です。
アノテーションの付与 Amazon Rekognitionのlabel detectionを用います。
https://docs.aws.amazon.com/rekognition/latest/dg/labels.html?pg=ln&sec=ft
以下などでサンプルコードが公開されています。
https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/labels-detecting-labels-video.html
特に、GetLabelDetectionにおける集計をSEGMENTSにすることで、StartTimestampMillisとEndTimestampMillisを得ることができます。
ただし、以下の点に注意が必要です。
SEGMENTS による集計の場合、境界ボックス付きの検出されたインスタンスに関する情報は返されません。
使用するデータ 『県政ニュース 第1巻』(県立長野図書館)を使用します。
https://www.ro-da.jp/shinshu-dcommons/library/02FT0102974177
マニフェストファイルへの反映 以下の記事などを参考に、マニフェストファイルが作成済みであるとします。
以下のようなスクリプトにより、マニフェストファイルにvttファイルを追加します。
from iiif_prezi3 import Manifest, AnnotationPage, Annotation, ResourceItem, config, HomepageItem, KeyValueString #| export class IiifClient: def load_manifest(self, manifest_path): with open(manifest_path, "r") as f: manifest_json = json.load(f) manifest = Manifest(**manifest_json) return manifest def add_label_segment(self, manifest_path): manifest = self.load_manifest(manifest_path) label_path = f"{self.input_dir}/output_label_seg.json" with open(label_path, "r") as f: label_seg = json.load(f) canvas = manifest.items[0] labels = label_seg["Labels"] anno_page_id = f"{canvas.id}/page1" anno_page = AnnotationPage(id=anno_page_id) canvas.annotations.append(anno_page) for i in range(len(labels)): label = labels[i] start = label["StartTimestamp"] / 1000 end = label["EndTimestamp"] / 1000 name = label["Label"]["Name"] anno_id = f"{anno_page_id}/a{i}" anno = Annotation( id=anno_id, motivation="tagging", target=canvas.id + "#t=" + str(start) + "," + str(end), body={ "type": "TextualBody", "value": name, "format": "text/plain", } ) anno_page.add_item( anno ) output_path = f"{self.input_dir}/manifest_label_seg.json" with open(output_path, "w") as f: f.write(manifest.json(indent=2)) return output_path 以下のようなマニフェストファイルが作成されます。
...
2024年10月9日 · 更新: 2024年10月9日 · 2 分 · Nakamura