【Colab】環境構築と骨格点検出をやってみる!【CenterNet】

スポンサーリンク
out-code-centernet Google Colaboratory
スポンサーリンク

はじめに

前回の記事で紹介したcolabスクリプトでは物体検知の方のデモしか実行してくれません。

今回はGoogleドライブに環境構築をして、骨格点検出をしてみます!

環境構築

環境構築は前回の記事で紹介したcolabスクリプトとほとんど変わりません。

ノートブックの設定は「GPU」にしてください。設定方法についてはこちら

Googleドライブのマウント

Googleドライブ上に環境を構築するので必須です。

from google.colab import drive
drive.mount('/content/drive')

CenterNetをCloneする

CenterNetレポジトリをクローンします。

ここではGoogleドライブ直下にあるColab Notebooksというディレクトリを指定しています。

%cd /content/drive/My Drive/Colab Notebooks/
!git clone -q --depth 1 'https://github.com/xingyizhou/CenterNet.git'

Modelをダウンロードする

CenterNetの作者が提供しているModelをダウンロードします。

ちなみに2つダウンロードしていますが、骨格点検出で利用するのは下のmulti_pose_dla_3x.pthの方です。

CenterNetのGitページに飛ぶとほかにもいろいろとモデルを提供しているのでよかったら観覧してください。

%cd /content/drive/My Drive/Colab Notebooks/CenterNet/models
!pip install -q gdown
!gdown 'https://drive.google.com/uc?id=1pl_-ael8wERdUREEnaIfqOV_VF2bEVRT'
!gdown 'https://drive.google.com/uc?id=1PO1Ax_GDtjiemEmDVD7oPWwqQkUu28PI'

ここまでのコードについては一度実行した後に、Colabのランタイムを再起動、リセットしても再度実行する必要はありません。

依存パッケージ等のインストール

これ以降の部分についてはColabのランタイムが再起動、リセットされた場合にはもう一度実行する必要があります。

%cd /content/drive/My Drive/Colab Notebooks/CenterNet
!pip install -U torch==1.4 torchvision==0.5 -f https://download.pytorch.org/whl/cu101/torch_stable.html
!pip install -q -r requirements.txt

DCNv2の修理及びビルド

DCNv2という変わったCNNについてはディレクトリ毎にビルドしなおす必要があるらしいです。そしてCenterNetにもともとあるものは壊れているみたいです。

%cd /content/drive/My Drive/Colab Notebooks/CenterNet/src/lib/models/networks
!rm -rf DCNv2
!git clone https://github.com/CharlesShang/DCNv2.git

%cd /content/drive/My Drive/Colab Notebooks/CenterNet/src/lib/models/networks/DCNv2
!chmod u+x make.sh
!./make.sh

PATHを通す

CenterNetのパッケージを読み込むためにパスを通しておきます。

import sys
from os.path import join
sys.path.insert(0, join('/content/drive/My Drive/Colab Notebooks/CenterNet', 'src/lib'))
sys.path.append(join('/content/drive/My Drive/Colab Notebooks/CenterNet', 'src'))
sys.path.append(join('/content/drive/My Drive/Colab Notebooks/CenterNet', 'src/lib/models/networks/DCNv2'))

骨格点検出

ここまでこれば後は簡単です!

次のコードを実行することでretsには辞書型のデータが入ります(1が人のキーとなっています。他は調べてません)。

%cd /content/drive/My Drive/Colab Notebooks/CenterNet/src

from detectors.detector_factory import detector_factory
from opts import opts

MODEL_PATH = '../models/multi_pose_dla_3x.pth' #モデルのパス
TASK = 'multi_pose' #骨格点検出
opt = opts().init('{} --load_model {}'.format(TASK, MODEL_PATH).split(' '))
detector = detector_factory[opt.task](opt)

img = '/content/drive/My Drive/Colab Notebooks/CenterNet/images/sample.jpg'
rets = detector.run(img)['results']

キーの要素は次のような二重配列になっています。

[[x1,y1,x2,y2,score,x3,y3,...,xn,yn][x1,y1,x2,y2,score,x3,y3,...,xn,yn][x1,y1,x2,y2,score,x3,y3,...,xn,yn][x1,y1,x2,y2,score,x3,y3,...,xn,yn]]

ここでx1,y1,x2,y2は物体を囲う最小の矩形、scoreは類似度です。

scoreの後には骨格点の座標が連なっています。

ということで、OpenCVをつかって簡単に骨格点を出力します。

import cv2
from google.colab.patches import cv2_imshow

img = cv2.imread(img, cv2.IMREAD_UNCHANGED)

ret = rets.get(1)

for rret in ret:
  if rret[4] > 0.7:
    print(rret)
    cv2.rectangle(img, (int(rret[0]), int(rret[1])), (int(rret[2]), int(rret[3])), (0, 255, 0, 255), 2)

    num = int((len(rret)-5)/2+1)
    for i in range(num):
      cv2.circle(img, (int(rret[2*(i-1)+5]), int(rret[2*(i-1)+6])), 5, (255, 255, 255), thickness=-1)

cv2_imshow(img)

実行してみた

ということでいつも通りぱくたそさんから適当にとってきた画像を入力画像として与えてみました。

入力画像
出力結果

曲げた足の足首まできれいに骨格点が取れました!

最後に

こちらで動画に対して骨格点検出を行っています。

CenterNetで次やることは自前データの学習かな?

Colabで簡単にできそうだったら、紹介するかもしれません。

コメント

タイトルとURLをコピーしました