やってみた!

やってみた!

試したことを中心に、書評や興味のあること、思ったこととか

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

github.com

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

 

f:id:akifukka:20191102133804j:plain

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番目のコードの順に実行します。
    画像が大量に表示されるので、途中で止めてください。

    f:id:akifukka:20191102143505j:plain

 

4.まとめ

 ColaboratoryでSingleShotPoseを動かしてみました。動かすだけでもパッケージのver等で結構苦労するものですね・・・。

 次回はネットワーク構造をYOLOv2-Tinyに変更してみます。

今回のノートブックのpdfを参考に貼り付けておきます。

https://drive.google.com/file/d/1gJyaMQ_sz_R9tUjsX6xMekCqdzLTr8k_/view?usp=sharing

おしまい

Jetson Nano カテゴリーの記事一覧へ