SingleShotPoseをColaboratoryで動かしてみた
SingleShotPoseをColaboratoryで動かしてみます。本記事の手順は2019年11月現在のもので、Colaboratoryにインストールされているパッケージのバージョンは次の通りです。これらが更新されると、互換性の関係で新たにエラー等が出ることがあるかもしれません。その際はパッケージのバージョンを落とすか、コードを修正する必要があります。
- scipy 1.3.1
- pytorch 1.3.0
- torchvision 0.4.1
- numpy 1.17.3
- Pillow 4.3.0
インストールされているパッケージのバージョンは次のコマンドで確認できます。
!pip freeze
1.GoogleドライブにSingleShotPoseをダウンロード(初回のみ)
(1)Googleドライブのtopにsingleshotposeフォルダを作ります。
(2)singleshotposeフォルダを開き、右クリックして次を選びノートブックを作成します。「その他」-「Google Colaboratory」
メニューから「ランタイム」-「ランタイプのタイプを変更」で、次を選んで保存を押します。
ランタイムのタイプ :Python3
ハードウェアアクセラレータ:GPU(注)
(注)TPUはディスク領域不足で動かなかったのでGPUをお勧めします。
(3)Googleドライブをマウントします。ノートブックで次を実行します。
from google.colab import drive
drive.mount('/content/drive')
(4)singlshotposeをgitからダウンロードします。
%%bash
cd /content/drive/My\ Drive/singleshotpose
git clone https://github.com/microsoft/singleshotpose
(5)関連データをダウンロードします。学習用データ等も含んでいますのでちょっと時間がかかるかも。
%%bash
cd /content/drive/My\ Drive/singleshotpose/singleshotpose
wget -O LINEMOD.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21135&authkey=AJRHFmZbcjXxTmI"
wget -O backup.tar --no-check-certificate "https://onedrive.live.com/download?cid=0C78B7DE6C569D7B&resid=C78B7DE6C569D7B%21191&authkey=AP183o4PlczZR78"
wget -O backup_multi.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21136&authkey=AFQv01OSbvhGnoM"
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/darknet19_448.conv.23 -P cfg
2.Colaboratoryの初期化(ここから毎回)
(1)Googleドライブの中身をColaboratoryにコピーします。
%%bash
cp -r /content/drive/My\ Drive/singleshotpose/singleshotpose ./
(2)解凍します。解凍はGoogleドライブではなく、Colaboratoryのディスク上で行います。Googleドライブ上で解凍すると、どえらく時間(半日)がかかりますが、Colaboratoryのディスク上では1分程度です。
%%bash
cd singleshotpose
tar xf LINEMOD.tar LINEMOD/ape
tar xf backup.tar backup/ape
tar xf backup_multi.tar -C multi_obj_pose_estimation/
tar xf VOCtrainval_11-May-2012.tar
3.実行
(1)動かしてみます。サルの人形の姿勢検出です。数分かかります。
%%bash
cd singleshotpose
python valid.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --weightfile backup/ape/model_backup.weights
1枚あたりの計算時間は、Colaboratory(GPU)はJetson Nanoと比べて次の通り早くなっています。
get_region_boxes 0.51s -> 0.069s
prediction_time 0.53s -> 0.076s
(2)結果を画面に表示させてみます。
SingleShotPoseのプロジェクトに画面表示させるノートブックがあるので、この中身を使います。scipyのバージョンアップに伴いこのままでは使えないので一部変更します。
- Googleドライブ-singleshot-valid.ipynbを開きます。
- 中身のコードを現在使っているノートブックにコピーします。
- 次の通り変更します。scipy ver1.3.0でのscipy.misc.imresizeの廃止に伴う変更です。
最初のコード(初期化の部分)
scipy.misc.imresizeのかわりにpillow及びnumpyを使います。赤字を追加します。
%matplotlib inline
import os
import time
import torch
from torch.autograd import Variable
from torchvision import datasets, transforms
import scipy.io
import warnings
warnings.filterwarnings("ignore")
import matplotlib.pyplot as plt
import scipy.misc
# insert
import numpy
from PIL import Image
# insert end
from darknet import Darknet
・
・
2番目のコード
変更箇所はコード全体の真ん中より下あたりです。visualizeで検索すると見つけられるので、赤字の通り変更します。
imgは輝度を0~1の浮動小数点で表現している(注1)ので、そのままplt.imshowの0~255の整数の輝度形式に変換すると真っ黒画面になってしまいます。そのため変換時に255倍します。
(注1)コードの中段少し上くらいにあるvalid_datasetを生成している行で、transformを次のように定義しています。
transform=transforms.Compose([transforms.ToTensor(),])
そのためdataset.pyの中のlistDatasetクラスでtorchvisionのToTensor()が呼ばれ、ファイルから読み込んだ画像データの各要素0~255が0.0~1.0に変換されています。
if visualize:
# Visualize
plt.xlim((0, im_width))
plt.ylim((0, im_height))
# insert
# plt.imshow(scipy.misc.imresize(img, (im_height, im_width)))
plt.imshow(numpy.array(Image.fromarray(numpy.uint8(img*255)).resize((im_width,im_height))))
# insert end
# Projections
for edge in edges_corners:
plt.plot(proj_corners_gt[edge, 0], proj_corners_gt[edge, 1], color='g', linewidth=3.0)
plt.plot(proj_corners_pr[edge, 0], proj_corners_pr[edge, 1], color='b', linewidth=3.0)
plt.gca().invert_yaxis()
plt.show()
# Compute 3D distances
上記を変更後、次の通り実行します。
- カレントディレクトリの移動
%cd /content/singleshotpose
- 最初のコード、2番目のコードの順に実行します。
画像が大量に表示されるので、途中で止めてください。
4.まとめ
ColaboratoryでSingleShotPoseを動かしてみました。動かすだけでもパッケージのver等で結構苦労するものですね・・・。
次回はネットワーク構造をYOLOv2-Tinyに変更してみます。
今回のノートブックのpdfを参考に貼り付けておきます。
https://drive.google.com/file/d/1gJyaMQ_sz_R9tUjsX6xMekCqdzLTr8k_/view?usp=sharing
おしまい