[Japanese/English]
Tensorflow2 Object Detection APIのハンズオン用資料です。
VoTTでのアノテーションをローカルPCで実施し、学習~推論はColaboratory上で実施します。
以下の内容を含みます。
- 学習用データセット ※アノテーション未実施
- テスト用データセット
- ファインチューニング用モデル(EffientDet D0)
- Colaboratory用スクリプト(環境設定、モデル訓練、推論結果確認)
ディレクトリ構成
│ [Colaboratory]Tensorflow2_ObjectDetectionAPI_Colab_Hands_On.ipynb | ├─01_train_data─┬─000000.jpg │ │ : │ └─000049.jpg │ ├─02_tfrecord │ ├─03_pretrained_model─efficientdet_d0_coco17_tpu-32─┬─pipeline.config │ ├─checkpoint──┬─checkpoint │ │ ├─ckpt-0.data-00000-of-00001 │ │ └─ckpt-0.index │ └─saved_model─┬─saved_model.pb │ └─variables─┬─variables.data-00000-of-00001 │ └─variables.index │ └─04_test_data─┬─000050.jpg │ : └─000099.jpg
Colaboratory用スクリプト(環境設定、モデル訓練、推論結果確認)
学習用データセット ※アノテーション未実施
アノテーション実施済みTFRecord格納先
ファインチューニング用モデル(EffientDet D0)
テスト用データセット
Tensorflow 2.3.0
2時間程度のボリュームの想定です。
- VoTT:アノテーション(約30~60分)
- Colaboratory:Object Detection API設定
- パイプラインコンフィグ修正
- Colaboratory:モデル訓練(約25分)
- Colaboratory:推論
事前準備として以下が必要です。
- このリポジトリのローカル環境へのクローン
- VoTTのインストール
- Googleアカウント(Google Colaboratory、Googleドライブで使用)
VoTTを使用してアノテーションを行い、TFRecord形式で出力します。
VoTTのプロジェクト設定
表示名:Tensorflow2-ObjectDetectionAPI-Colab-Hands-On
セキュリティトークン:Generate New Security Token
ソース接続:「Add Connection」を押下
表示名:Tensorflow2-ObjectDetectionAPI-Colab-Hands-On-TrainData プロバイダー:ローカルファイルシステム フォルダーパス:クローンしたリポジトリの「01_train_data」ディレクトリを指定
ターゲット接続:Add Connection
表示名:Tensorflow2-ObjectDetectionAPI-Colab-Hands-On-TFRecord
プロバイダー:ローカルファイルシステム
フォルダーパス:クローンしたリポジトリの「02_tfrecord」ディレクトリを指定
TFRecordエクスポート
プロバイダー:Tensorflow レコード
アセットの状態:タグ付きアセットのみ
「エクスポート設定を保存」を押下する
アノテーション画面からエクスポートマークを押下し、TFRecordをエクスポートする。
注意事項(詳細確認中)
画像の端の対象をアノテーションする際に、以下のように端から少し隙間を設けてください。
問題の詳細は確認中ですが、隙間を開けずにアノテーションをすると、
VoTTの問題かTensorflowの問題か、モデル学習時に以下のエラーが発生します。
W0921 13:29:32.965700 140050120722176 optimizer_v2.py:1275] Gradients do not exist for variables ['top_bn/gamma:0', 'top_bn/beta:0'] when minimizing the loss. Traceback (most recent call last): File "object_detection/model_main_tf2.py", line 113, in tf.compat.v1.app.run() File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/platform/app.py", line 40, in run _run(main=main, argv=argv, flags_parser=_parse_flags_tolerate_undef) File "/usr/local/lib/python3.6/dist-packages/absl/app.py", line 300, in run _run_main(main, args) File "/usr/local/lib/python3.6/dist-packages/absl/app.py", line 251, in _run_main sys.exit(main(argv)) File "object_detection/model_main_tf2.py", line 110, in main record_summaries=FLAGS.record_summaries) File "/usr/local/lib/python3.6/dist-packages/object_detection/model_lib_v2.py", line 639, in train_loop loss = _dist_train_step(train_input_iter) File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/def_function.py", line 780, in __call__ result = self._call(*args, **kwds) File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/def_function.py", line 807, in _call return self._stateless_fn(*args, **kwds) # pylint: disable=not-callable File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/function.py", line 2829, in __call__ return graph_function._filtered_call(args, kwargs) # pylint: disable=protected-access File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/function.py", line 1848, in _filtered_call cancellation_manager=cancellation_manager) File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/function.py", line 1924, in _call_flat ctx, args, cancellation_manager=cancellation_manager)) File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/function.py", line 550, in call ctx=ctx) File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/execute.py", line 60, in quick_execute inputs, attrs, num_outputs) tensorflow.python.framework.errors_impl.InvalidArgumentError: 2 root error(s) found. (0) Invalid argument: assertion failed: [[0.15956609][0.103383526][0.109880842]...] [[0.23180081][0.133959055][0.132812485]...] [[{{node Assert_1/AssertGuard/else/_35/Assert_1/AssertGuard/Assert}}]] [[MultiDeviceIteratorGetNextFromShard]] [[RemoteCall]] [[IteratorGetNext]] [[Loss/localization_loss_1/write_summary/summary_cond/pivot_t/_4/_111]] (1) Invalid argument: assertion failed: [[0.15956609][0.103383526][0.109880842]...] [[0.23180081][0.133959055][0.132812485]...] [[{{node Assert_1/AssertGuard/else/_35/Assert_1/AssertGuard/Assert}}]] [[MultiDeviceIteratorGetNextFromShard]] [[RemoteCall]] [[IteratorGetNext]]
以降の作業はGoogle Colaboratory上で実施します。※パイプラインコンフィグ修正をのぞく
[Open In Colab]リンクからノートブックを開き、以下の順に実行してください。
- Google Driveマウント
- Tensorflow Object Detection API設定
- Tensorflow2-ObjectDetectionAPI-Colab-Hands-Onリポジトリクローン
「Tensorflow2-ObjectDetectionAPI-Colab-Hands-On/02_tfrecord」に
VoTTからエクスポートしたTFRecordとtf_label_map.pbtxtを格納してください。
格納後、以下を実行してください。
- 学習データ/検証データ 分割
「03_pretrained_model\efficientdet_d0_coco17_tpu-32\pipeline.config」のパイプラインコンフィグを以下のように修正して、
Colaboratory上の「Tensorflow2-ObjectDetectionAPI-Colab-Hands-On/03_pretrained_model」にアップロードしてください。
パイプラインコンフィグ修正箇所
- 3行目(Line 3):クラス数(num_classes)
変更前(Before) : 90
変更後(After) : 1 - 134行目(Line 134):バッチサイズ(batch_size)
変更前(Before) : 128
変更後(After) : 16 - 161行目(Line 161):ファインチューニング用のチェックポイント格納先(fine_tune_checkpoint)
変更前(Before) : "PATH_TO_BE_CONFIGURED"
変更後(After) : "/content/models/research/Tensorflow2-ObjectDetectionAPI-Colab-Hands-On/03_pretrained_model/efficientdet_d0_coco17_tpu-32/checkpoint/ckpt-0" - 167行目(Line 167):ファインチューニング方法(fine_tune_checkpoint_type)
変更前(Before) : "classification"
変更後(After) : "detection" - 168行目(Line 168):Googleカスタム 16ビットbrain浮動小数点の使用有無(use_bfloat16)
変更前(Before) : true
変更後(After) : false - 172行目(Line 172):ラベルマップファイルの格納先(label_map_path)
変更前(Before) : "PATH_TO_BE_CONFIGURED/label_map.txt"
変更後(After) : "/content/models/research/Tensorflow2-ObjectDetectionAPI-Colab-Hands-On/02_tfrecord/tf_label_map.pbtxt" - 174行目(Line 174):学習データの格納先(input_path)
変更前(Before) : "PATH_TO_BE_CONFIGURED/train2017-?????-of-00256.tfrecord"
変更後(After) : "/content/models/research/train_data/??????.tfrecord" - 185行目(Line 185):ラベルマップファイルの格納先(label_map_path)
変更前(Before) : "PATH_TO_BE_CONFIGURED/label_map.txt"
変更後(After) : "/content/models/research/Tensorflow2-ObjectDetectionAPI-Colab-Hands-On/02_tfrecord/tf_label_map.pbtxt" - 189行目(Line 189):バリデーションデータの格納先(input_path)
変更前(Before) : "PATH_TO_BE_CONFIGURED/val2017-?????-of-00032.tfrecord"
変更後(After) : "/content/models/research/val_data/??????.tfrecord"
パイプラインコンフィグ修正箇所 ※余裕のある方向け
パイプラインコンフィグにはデータ拡張設定も記載されています。
初期のパイプラインコンフィグには、以下の水平反転、ランダムスケールクロップのみのデータ拡張が設定されています。
data_augmentation_options { random_horizontal_flip { } } data_augmentation_options { random_scale_crop_and_pad_to_square { output_size: 512 scale_min: 0.10000000149011612 scale_max: 2.0 } }
使用可能なデータ拡張手法は、preprocessor.proto、preprocessor.pyに記載されているため、
必要に応じて追加してみてください。
以下の順に実行してください。
- Googleドライブに保存先ディレクトリを作成
- TensorBoard
- 学習
- saved model形式へエクスポート
以下の順に実行してください。
- モデルロード
- 推論
- 推論結果確認
- pip依存関係解決のため、一時的に以下オプションを付与。
!python -m pip install . --use-deprecated=legacy-resolver
tensorflow/models Issue #10375、Tensorflow2-ObjectDetectionAPI-Colab-Hands-On Issues #2
高橋かずひと(https://twitter.com/KzhtTkhs)
Tensorflow2-ObjectDetectionAPI-Colab-Hands-On is under MIT license.