Package: annofabapi
annofab-api-python-clientAnnofab Web APIのPythonクライアントライブラリです。Annofab Web API Documentation:https://annofab.com/docs/api/Reference Documentation:https://annofab-api-python-client.readthedocs.io/en/latest/annofab-clihttps://github.com/kurusugawa-computer/annofab-cli「タスクの一括差し戻し」や、「プロジェクト間の差分表示」など、Annofabの画面で実施するには時間がかかる操作を、CLIツールとして提供しています。開発者用ドキュメント:README_for_developer.md注意作者または著作権者は、ソフトウェアに関してなんら責任を負いません。現在、APIは開発途上版です。予告なく互換性のない変更がある可能性をご了承ください。put, post, delete系のメソッドを間違えて実行してしまわないよう、注意してください。特に「プロジェクト削除」や「アノテーション仕様更新」のAPIには十分注意してください。廃止予定現在ありません。FeaturescURLやPostmanなどよりも簡単にAnnofab Web APIにアクセスできます。ログインを意識せずに、APIを利用できます。アクセス過多などで失敗した場合は、リトライされます。「画像を入力データとして登録する」機能など、APIを組み合わせた機能も利用できます。RequirementsPython 3.8+Install$ pip install annofabapihttps://pypi.org/project/annofabapi/Usageインスタンス生成user_id, passwordをコンストラクタ引数に渡す場合# APIアクセス用のインスタンスを生成fromannofabapiimportbuilduser_id="XXXXXX"password="YYYYYY"service=build(user_id,password).netrcに認証情報を記載する場合.netrcファイルに、AnnofabのユーザIDとパスワードを記載します。machine annofab.com
login annofab_user_id
password annofab_passwordfromannofabapiimportbuild_from_netrcservice=build_from_netrc()For Linuxパスは$HOME/.netrc$ chmod 600 $HOME/.netrcでパーミッションを変更するFor Windowsパスは%USERPROFILE%\.netrc環境変数に認証情報を設定する場合環境変数ANNOFAB_USER_ID、ANNOFAB_PASSWORDにユーザIDとパスワードを設定します。fromannofabapiimportbuild_from_envservice=build_from_env().netrcまたは環境変数に認証情報を設定する場合build()を実行すると、環境変数または.netrcファイルから認証情報を読み込みます。fromannofabapiimportbuildservice=build()優先順位は以下の通りです。環境変数.netrcservice.apiのサンプルコードservice.apiには、Web APIに対応するメソッドが定義されています。メソッド名は、Annofab Web APIのOpenAPI specificationに記載されているoperationIdを、スネークケースに変換したものです。各メソッドの戻り値の型はTupple[Content, Response]です。
ResponseはrequestsモジュールのReponseオブジェクトです。
ContentはReponseの中身です。project_id="ZZZZZZ"# `status`が`complete`のタスクを取得するcontent,response=service.api.get_tasks(project_id,query_params={"status":"complete"})print(type(content))# <class 'dict'>print(content)# {'list': [{'project_id': 'ZZZZZZ', 'task_id': '20190317_2', 'phase': 'acceptance', ...print(type(response))# <class 'requests.models.Response'>print(response.headers["Content-Type"])# application/jsonservice.wrapperのサンプルコードservice.wrapperには、server.apiを組み合わせたメソッドが定義されています。# `status`が`complete`のタスクすべてを取得するtasks=service.wrapper.get_all_tasks(project_id,query_params={"status":"complete"})print(type(tasks))# <class 'list'>print(tasks)# [{'project_id': 'ZZZZZZ', 'task_id': '20190317_2', 'phase': 'acceptance', ...# simpleアノテーションzipのダウンロードservice.wrapper.download_annotation_archive(project_id,'output_dir')# 画像ファイルを入力データとして登録するservice.wrapper.put_input_data_from_file(project_id,'sample_input_data_id',f'sample.png')アノテーションzipの読み込みダウンロードしたアノテーションzipを、JSONファイルごとに読み込みます。
zipファイルを展開したディレクトリも読み込み可能です。importzipfilefrompathlibimportPathfromannofabapi.parserimportlazy_parse_simple_annotation_dir,lazy_parse_simple_annotation_zip,SimpleAnnotationZipParser,SimpleAnnotationDirParser,lazy_parse_simple_annotation_zip_by_task# Simpleアノテーションzipの読み込みiter_parser=lazy_parse_simple_annotation_zip(Path("simple-annotation.zip"))forparseriniter_parser:simple_annotation=parser.parse()print(simple_annotation)# Simpleアノテーションzipを展開したディレクトリの読み込みiter_parser=lazy_parse_simple_annotation_dir(Path("simple-annotation-dir"))forparseriniter_parser:simple_annotation=parser.parse()print(simple_annotation)# Simpleアノテーションzipをタスク単位で読み込むtask_iter_parser=lazy_parse_simple_annotation_zip_by_task(Path("simple-annotation.zip"))fortask_parserintask_iter_parser:print(task_parser.task_id)forparserintask_parser.lazy_parse():simple_annotation=parser.parse()print(simple_annotation)# Simpleアノテーションzip内の1個のJSONファイルを読み込みwithzipfile.ZipFile('simple-annotation.zip','r')aszip_file:parser=SimpleAnnotationZipParser(zip_file,"task01/12345678-abcd-1234-abcd-1234abcd5678.json")simple_annotation=parser.parse()print(simple_annotation)# Simpleアノテーションzip内を展開したディレクトリ内の1個のJSONファイルを読み込みparser=SimpleAnnotationDirParser(Path("task01/12345678-abcd-1234-abcd-1234abcd5678.json"))simple_annotation=parser.parse()print(simple_annotation)塗りつぶし画像の読み込みannofabapi.segmentationには、アノテーションZIPに格納されている塗りつぶし画像を扱うための関数が用意されています。
利用する場合は、以下のコマンドを実行してください。$ pip install annofabapi[segmentation]DataClassannofabapi.dataclassに、データ構造用のクラスがあります。
これらのクラスを利用すれば、属性で各値にアクセスできます。fromannofabapi.dataclass.taskimportTaskdict_task,_=service.api.get_task(project_id,task_id)task=Task.from_dict(dict_task)print(task.task_id)print(task.status)備考annofabapiのログを出力する方法（サンプル）importlogginglogging_formatter='%(levelname)-8s:%(asctime)s:%(name)s:%(message)s'logging.basicConfig(format=logging_formatter)logging.getLogger("annofabapi").setLevel(level=logging.DEBUG)