YOLOなどに比べて軽量かつ精度も良いということでCenterNetを用いた物体検出・物体検知を実行する方法について紹介していきます
そもそもCenterNetって何?という方やCenterNetの実行方法を知りたい方、一度試そうとしたけど環境周りでつまづいている方などいろんな方がいらっしゃるのではないでしょうか?
こちらの記事では、それらのすべての回答や解決方法を説明していきます!
その前に物体検出とはなんだ?YOLOってなんだ?という方は下記の記事も合わせてご覧ください
私が初めてCenterNetを実行しようとしたときは、CUDAのバージョンやtorch、torchvisionなどのライブラリの条件でエラーが発生してしまい、実行するまで苦労しました・・・
CenterNetの公式ではUbuntu 16.04LST、CUDA 9.0でテストしているようですが、少し古いので自分が使っているUbuntu 18.04 LTS CUDA 10.0でCenterNetを動かせる方法がわかりましたので、実際に私が実行した手順を紹介いたします!
同じようにCUDAなどの環境周り詰まった方はこちらの記事の手順を試してみてください
使えるようになるまでは苦労しましたが、CenterNetは精度と速度のバランスが良い手法でかなりのケースで有効な手法だと思いますので是非マスターしていきましょう!!
CenterNetとは?
冒頭でも説明しましたが、CenterNetはSSDやYOLOと比べると軽量かつ精度も良い手法となっています
下記がCenterNetとYOLOv3などの手法との比較になっており、精度面や速度面で良い結果が得られていることがこのグラフからもわかります

従来とどう違うかをかなり大雑把に説明すると、従来のSSDやYOLOのようにバウンディングボックスを予測するというアプローチではなく、Objectの中心点の推定するというアプローチでObject as Pointというタイトルの論文で2019年に発表されました
https://arxiv.org/pdf/1904.07850.pdfSSDやYOLOではまず大量のバウンディングボックスを出力したうえで、その中から似通ったバウンディングボックスを排除して、一番妥当なバウンディングボックスを残すためのNMSという処理を行います
NMSでは、はじめに出力されたバウンディングボックスどうしで重複する面積部分(IoU)をそれぞれ計算して、重複が多いバウンディングボックスの中からもっとも検知精度が高いものを残すという処理を行います
大量にバウンディングボックスの比較を行うので計算が膨大にかかってしまします
しかし、CenterNetの方法ではObjectの中心をヒートマップの形式で出力し、その中心からの幅と高さを推定するため、NMSの処理を省略することが可能であり、高速化につながっています
またポイントを推定するという方法であるため、2D物体検出だけでなく姿勢推定や3D物体検出などにも応用できるのでとても万能なモデルです
実行環境
私が実行した環境は下記の通りですが、PCについてはこれと同じである必要はありません
- PC
- メモリ 16GB (8GB以上推奨)
- NVIDIA GeForce 1070
- OS
- Ubuntu 18.04LTS
- 言語
- Python 3.6
- ライブラリ
- git
- CUDA 10.0
事前準備
NVIDIAドライバ、CUDA、cuDNNのインストール
NVIDIAドライバ、CUDA、cuDNNなどのインストールは下記の記事を参考に行ってください
Anacondaで作業環境を作成
Pythonのバージョンが3.6となるように環境をつくってください
$ conda create -n centernet python==3.6
$ source activate centernet
ライブラリのインストール
下記のgithubが公式のものになります
適当なディレクトリにてgit cloneを使って、githubからコードをcloneしましょう
$ git clone https://github.com/xingyizhou/CenterNet.git
$ cd CenterNet
必要なライブラリをインストールします
$ pip install -r requirements.txt
$ conda install pytorch=1.1 torchvision
$ cd src/lib/external
$ python setup.py build_ext --inplace
$ cd ../lib/models/networks
$ rm -r DCNv2
$ git clone https://github.com/CharlesShang/DCNv2.git
$ cd DCNv2
$ python setup.py build develop
デフォルトに入っているDCNv2がCUDA 10.0のときは悪さをして一度詰まりました!
モデルファイルのダウンロード
下記からctdet_coco_dla_2x.pthをダウンロードして、CenterNet/modelsに配置してください
次に、下記からmulti_pose_dla_3x.pthをダウンロードして、CenterNet/modelsに配置してください
また、下記からddd_3dop.pthをダウンロードして、CenterNet/modelsに配置してください
CenterNetで物体検出を実行
サンプル画像・動画で物体検出を実行
まずはサンプル画像に対して実行してみましょう
$ cd CenterNet/src
$ python demo.py ctdet --demo ../images/24274813513_0cfd2ce6d0_k.jpg --load_model ../models/ctdet_coco_dla_2x.pth

上記の通り出力されれば成功です!
動画の場合も動画のファイルを–demoの後ろに指定すればOKです
カメラ映像に対してリアルタイムに物体検出を実行
先ほどの画像ファイルパスを指定していたところをwebcamにすればOKです
$ python demo.py ctdet --demo webcam --load_model ../models/ctdet_coco_dla_2x.pth
CenterNetで姿勢推定を実行
サンプル画像・動画で姿勢推定を実行
まずはサンプル画像に対して実行してみましょう
$ cd CenterNet/src
$ python demo.py multi_pose --demo ../images/17790319373_bd19b24cfc_k.jpg --load_model ../models/multi_pose_dla_3x.pth

上記の通り出力されれば成功です!
動画の場合も動画のファイルを–demoの後ろに指定すればOKです
カメラ映像に対してリアルタイムに姿勢推定を実行
先ほどの画像ファイルパスを指定していたところをwebcamにすればOKです
$ python demo.py multi_pose --demo webcam --load_model ../models/multi_pose_dla_3x.pth
CenterNetで3D物体検出を実行
2Dデータの画像から3Dを推定しているため、精度はそこまで良くないですが、目的に合わせて独自に追加学習するなどすれば精度があげられるかもしれません
サンプル画像・動画で3D物体検出を実行
まずはサンプル画像に対して実行してみましょう
$ cd CenterNet/src
$ python demo.py ddd --demo ../images/24274813513_0cfd2ce6d0 --load_model ../models/ddd_3dop.pth

上記の通り出力されれば成功です!
動画の場合も動画のファイルを–demoの後ろに指定すればOKです
カメラ映像に対してリアルタイムに3D物体検出を実行
先ほどの画像ファイルパスを指定していたところをwebcamにすればOKです
$ python demo.py ddd --demo webcam --load_model ../models/ddd_3dop.pth
最後に
本記事では従来のSSD、YOLOに比べて軽量かつ高精度なCenterNetについて紹介しました
今までのモデルに比べると環境周りで詰まる要素がありましたが、無事実行することができました
2Dの物体検知だけでなく、姿勢推定や3D物体検知など応用も幅広いため、問題を解決する一手段として覚えておいて損はないでしょう
前回紹介したHRNetも姿勢推定だけでなくセマンティックセグメンテーション、物体検知、表情解析、画像分類に使用できるようなモデルですのでご興味があればこちらの記事もどうぞ
コメント