Opera Datasetの2DサンプルをColabでテストしてみました。
Google Driveに学習データを入れて、実際に学習・デモまで実施しています。
手順を一から紹介します。
ColabでMMDetectionとOpera Datasetを動かしてみた
Opera Datasetの2DサンプルプログラムをColabでテストしてみました。
(Opera Dataset…自動車走行のデータセット)
MMDetection(物体検出のライブラリ)を使って、学習させています。
サンプルは基本的な「FasterRCNN」の物体検出のアルゴリズムを使っています。
自動車・トラックなど21のクラスを物体検出できました。
Colabで実施した学習の流れを紹介します。
第6回AIエッジコンテストのデータセット
今回のデータセットのOpera Datasetは「第6回AIエッジコンテスト」でも使われています。
データセットのダウンロードに関しても、コンテストのページから可能です。
(SIGNATEに登録すれば、「データ」のタブからダウンロードできます)
2Dに加えて、3DやDepth含めた画像・点群データが入ったデータセットです。
自動車走行の3Dの物体検出までテストが可能となっています。
データセットの詳細はGitlabに
データセットの構造や詳細に関してはGitlabにあります。
まだdemoと書かれているので、Opera Datasetも開発中のデータセットのようです
Opera Datasetの2Dの学習
GitLabの中に「OperaCustomFasterRCNNYoloLoader.ipynb」のサンプルがあります。
Opera Datasetの2D(画像)データを使って、FasterRCNNで学習・デモするものです。
今回はGoogle Colabの環境で上記サンプルプログラムを実施してみました。
個人的に詰まった・気になった点など含めて、一連の流れのメモを残しておきます。
細かい内容に関しては、最後にGistを貼りますのでそちらをご確認下さい。
ColabのGPUを使用します
1000枚~2000枚程度の写真を使って学習をしますので、GPUが必要になります。
ランタイムからGPUを選択してColabを開始します。
(下記はColabの残り時間、GPUがセットされているかの確認です)
1 2 3 4 5 |
# 残り時間の表示 !cat /proc/uptime | awk '{printf("残り時間 : %.2f", 12-$1/60/60)}' # GPUの確認 !nvidia-smi |
学習で数時間かかります。無料のColabだと運が悪いと制限が掛かる場合があります。
下記記事のように筆者は有料のColab Pro環境で動かしています。
GPUバックエンドに接続できませんが出たのでColab Proに課金した話
Google Driveにデータセットを保存・解凍します
予め、データセット(train0~4.zip)をGoogle Driveに保存しています。
Colab上でGoogle Driveをマウントして、unzipで解凍します。
今回筆者はwork→ai_edge_2022というフォルダ内で作業しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 作業用フォルダの作成 from google.colab import drive drive.mount('/content/drive') #!mkdir -p '/content/drive/My Drive/work/ai_edge_2022/' %cd '/content/drive/My Drive/work/ai_edge_2022/' #SIGNATEからデータをダウンロード・解凍 !unzip train_0.zip !unzip train_1.zip !unzip train_2.zip !unzip train_3.zip !unzip train_4.zip |
opera_demoをダウンロード(必要であれば)
必要であればGitlabからopera_demoをコピーしておきます。
※opera_demoの方にはデータセットは入っていません。
1 2 |
#opera_demoをダウンロード・インストール !git clone https://gitlab.com/perceptionengine/deliverables/opera_demo.git |
MMDetectionをダウンロード・インストールします
MMDetection(物体検出のライブラリ)をダウンロード・インストールします。
特に特別なことはしておらず、下記の公式のインストール手順に従ったのみです。
https://github.com/open-mmlab/mmdetection/blob/master/docs/en/get_started.md/#Installation
1 2 3 4 5 6 7 8 9 10 11 12 |
!pip install -U openmim !mim install mmcv-full #!git clone https://github.com/open-mmlab/mmdetection.git %cd mmdetection !pip install -v -e . # "-v" means verbose, or more output # "-e" means installing a project in editable mode, # thus any local modifications made to the code will take effect without reinstallation. !pip install mmdet |
FasterRCNNのcheckpointをダウンロードします
予めCOCOのデータセットで学習済のcheckpointをダウンロードしときます。
これをベースに学習(finetune:ファインチューニング)します。
1 2 3 |
!mkdir checkpoints !wget -c https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth \ -O checkpoints/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth |
Gitlabの手順に従って学習・デモします
アノテーション作成や学習などの流れに関しては、Gitlabの手順通りです。
パスなどを合わせただけで、問題なく動作しました。
学習前と学習後の結果を比べると、物体検出の精度が上がっていることが分かります。
Opera Datasetでの学習前の物体検出
サンプルの1枚(0TyydnMdYWU1YD7nw5uCNGs8_15.jpg)を物体検出した画像です。
Opera Datasetの学習前です。
Opera Datasetでの学習後の物体検出
同じ写真でOpera Datasetの学習後の写真です。
例えば、一番手間に見える車の精度だと0.95→0.99に上がっています。
(奥の自動車の精度も向上、自動車横の物体検出まで出来ています)
サンプルプログラム動かす上でエラー出たところ
「OperaCustomFasterRCNNYoloLoader.ipynb」を動かす上で躓いたことを残しときます。
※あくまで筆者の環境でしか確認していないので、参考までにお願いします。
アノテーションの出力例が表示されない場合がある
GitLabの手順に沿って、アノテーション作成・出力例を確認する箇所があります。
運悪いと何も物体検出するものがない写真に当たって、値が出てこない場合があります。
(ただランダムに抽出している写真の1枚を確認しているため)
特にそのまま気にせず学習を進めても問題ありません。
ただ気になる人は一つ前のアノテーションファイル作成の箇所からやり直せばOKです。
(ROOT_PATH+'train.txt' ,test.txt'を作る箇所です。)
何回か実施していれば、物体検出するものがある写真に当たります。
error: (-215:Assertion failed) !buf.empty() in function 'imdecode_'
学習する際に画像が読み込めないエラーが発生しました。
ただ、全ての写真でエラーが出ているという状況ではありませんでした。
(ビルドのデータセットを作ろうとして、暫くするとエラーがでる)
error: YoloRosaDataset: OpenCV(4.6.0) /io/opencv/modules/imgcodecs/src/loadsave.cpp:816: error: (-215:Assertion failed) !buf.empty() in function 'imdecode_'
エラーの中身を追っていくと、単純に1枚の画像が空の状態でした。
PzHtqS4uoKqJNy6e5y6FXPiA_223.jpg
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/content/drive/MyDrive/work/ai_edge_2022/train/3d_labels/samples/CAM_FRONT/HavlOgYpwQNuWPnzpPti53w5_154.jpg test test /content/drive/MyDrive/work/ai_edge_2022/train/3d_labels/samples/CAM_FRONT/PzHtqS4uoKqJNy6e5y6FXPiA_359.jpg test test /content/drive/MyDrive/work/ai_edge_2022/train/3d_labels/samples/CAM_FRONT/PzHtqS4uoKqJNy6e5y6FXPiA_223.jpg test --------------------------------------------------------------------------- error Traceback (most recent call last) /usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py in build_from_cfg(cfg, registry, default_args) 68 try: ---> 69 return obj_cls(**args) 70 except Exception as e: 6 frames error: OpenCV(4.6.0) /io/opencv/modules/imgcodecs/src/loadsave.cpp:816: error: (-215:Assertion failed) !buf.empty() in function 'imdecode_' During handling of the above exception, another exception occurred: error Traceback (most recent call last) /usr/local/lib/python3.7/dist-packages/mmcv/utils/registry.py in build_from_cfg(cfg, registry, default_args) 70 except Exception as e: 71 # Normal TypeError does not print class name. ---> 72 raise type(e)(f'{obj_cls.__name__}: {e}') 73 74 error: YoloRosaDataset: OpenCV(4.6.0) /io/opencv/modules/imgcodecs/src/loadsave.cpp:816: error: (-215:Assertion failed) !buf.empty() in function 'imdecode_' |
単純にダウンロードしたデータセットのZIPファイルをunzipで解凍しただけです。
なぜか特定の一枚の画像ファイルだけ0kBとなっていました。
(うまく解凍できなかった?アップロード中に壊れた? 何が原因はよく分からず…)
筆者のGoogledrive上で再度解凍したところ再現性はありました。
1 2 3 4 |
!unzip train_0.zip %cd train/3d_labels/samples/CAM_FRONT/ !ls -lSr |
ローカルのWindows・Linuxで解凍したところ、特定のファイル含めて全て開けました。
Google Drive上で壊れていた特定の画像ファイルだけ交換すると、問題なく学習できました。
学習後にサンプル画像にプロットするとメモリエラー
学習後に全サンプル画像にプロットする箇所がありますが、メモリがクラッシュしました。
一度に大量に画像をプロットしようとして、単純にシステムRAMが不足するためでした。
(Colab Proの25GB近くあるハイメモリの環境でも不足します)
1000枚ぐらいだったら一度にプロットできました。
学習後のプロットに関しては途中で止めるか、分割してプロットした方が良さそうです。
Colabのテスト結果(Gist)
綺麗にまとめていませんが、Colabのテスト結果をGitHubのGistのリンク先を貼っておきます。
2回目以降に実施する際に不要な箇所は#でコメントアウトしています。ご注意下さい。
あくまでGitlabのサンプルに追記して確認したレベルです。参考までにお願いします。
まとめ
Opera Datasetの2DサンプルをColabでテストしてみました。
Google Driveにデータセットを入れて、実際に学習・プロットすることまで出来ました。
よろしければ皆さまも試してみて下さい。
今回の記事含めて、第6回AIエッジコンテストの一環でした。
下記にてコンテストでテスト・実施したことのまとめを紹介しています。
コメント