”はやぶさ”の技術ノート

ColaboratoryでChainer使ってYoloを動かす

環境構築

以下のコマンドを打ち込んでChainerをGPUで動かせる環境を構築します。

In [9]:
!apt -y install libcusparse8.0 libnvrtc8.0 libnvtoolsext1
!ln -snf /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so.8.0 /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so
!pip install 'cupy-cuda80' 'chainer'
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  libcusparse8.0 libnvrtc8.0 libnvtoolsext1
0 upgraded, 3 newly installed, 0 to remove and 7 not upgraded.
Need to get 28.9 MB of archives.
After this operation, 71.6 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu artful/multiverse amd64 libcusparse8.0 amd64 8.0.61-1 [22.6 MB]
Get:2 http://archive.ubuntu.com/ubuntu artful/multiverse amd64 libnvrtc8.0 amd64 8.0.61-1 [6,225 kB]
Get:3 http://archive.ubuntu.com/ubuntu artful/multiverse amd64 libnvtoolsext1 amd64 8.0.61-1 [32.2 kB]
Fetched 28.9 MB in 1s (16.2 MB/s)

78Selecting previously unselected package libcusparse8.0:amd64.
(Reading database ... 18396 files and directories currently installed.)
Preparing to unpack .../libcusparse8.0_8.0.61-1_amd64.deb ...
7Progress: [  0%] [..........................................................] 87Progress: [  6%] [###.......................................................] 8Unpacking libcusparse8.0:amd64 (8.0.61-1) ...
7Progress: [ 12%] [#######...................................................] 87Progress: [ 18%] [##########................................................] 8Selecting previously unselected package libnvrtc8.0:amd64.
Preparing to unpack .../libnvrtc8.0_8.0.61-1_amd64.deb ...
7Progress: [ 25%] [##############............................................] 8Unpacking libnvrtc8.0:amd64 (8.0.61-1) ...
7Progress: [ 31%] [##################........................................] 87Progress: [ 37%] [#####################.....................................] 8Selecting previously unselected package libnvtoolsext1:amd64.
Preparing to unpack .../libnvtoolsext1_8.0.61-1_amd64.deb ...
7Progress: [ 43%] [#########################.................................] 8Unpacking libnvtoolsext1:amd64 (8.0.61-1) ...
7Progress: [ 50%] [#############################.............................] 87Progress: [ 56%] [################################..........................] 8Setting up libnvtoolsext1:amd64 (8.0.61-1) ...
7Progress: [ 62%] [####################################......................] 87Progress: [ 68%] [#######################################...................] 8Setting up libcusparse8.0:amd64 (8.0.61-1) ...
7Progress: [ 75%] [###########################################...............] 87Progress: [ 81%] [###############################################...........] 8Setting up libnvrtc8.0:amd64 (8.0.61-1) ...
7Progress: [ 87%] [##################################################........] 87Progress: [ 93%] [######################################################....] 8Processing triggers for libc-bin (2.26-0ubuntu2.1) ...

78Collecting cupy-cuda80
  Downloading https://files.pythonhosted.org/packages/14/dd/af0ab87c5de0fb66eff86653283234a8006602372cf1d2bbbd09b01d306f/cupy_cuda80-4.2.0-cp36-cp36m-manylinux1_x86_64.whl (200.4MB)
    11% |███▋                            | 22.4MB 34.2MB/s eta 0:00:06    100% |████████████████████████████████| 200.4MB 87kB/s 
Collecting chainer
  Downloading https://files.pythonhosted.org/packages/6a/18/0f2910c581682ecfd25e304b231ca73bf2415051301fb28e3d926c7d93ab/chainer-4.2.0.tar.gz (398kB)
    100% |████████████████████████████████| 399kB 14.8MB/s 
Requirement already satisfied: six>=1.9.0 in /usr/local/lib/python3.6/dist-packages (from cupy-cuda80) (1.11.0)
Collecting fastrlock>=0.3 (from cupy-cuda80)
  Downloading https://files.pythonhosted.org/packages/fa/24/767ce4fe23af5a4b3dd229c0e3153a26c0a58331f8f89af324c761663c9c/fastrlock-0.3-cp36-cp36m-manylinux1_x86_64.whl (77kB)
    100% |████████████████████████████████| 81kB 19.9MB/s 
Requirement already satisfied: numpy>=1.9.0 in /usr/local/lib/python3.6/dist-packages (from cupy-cuda80) (1.14.5)
Collecting filelock (from chainer)
  Downloading https://files.pythonhosted.org/packages/2d/ba/db7e0717368958827fa97af0b8acafd983ac3a6ecd679f60f3ccd6e5b16e/filelock-3.0.4.tar.gz
Requirement already satisfied: protobuf>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from chainer) (3.6.0)
Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.0.0->chainer) (39.1.0)
Building wheels for collected packages: chainer, filelock
  Running setup.py bdist_wheel for chainer ... done
  Stored in directory: /content/.cache/pip/wheels/42/2f/12/ff22f332d4333492263af06097fef612fffa59e1f580767942
  Running setup.py bdist_wheel for filelock ... done
  Stored in directory: /content/.cache/pip/wheels/35/ba/67/4cc48738870c3b54f9e3b5d78bf9de130befb70c1d359faf8b
Successfully built chainer filelock
Installing collected packages: fastrlock, cupy-cuda80, filelock, chainer
Successfully installed chainer-4.2.0 cupy-cuda80-4.2.0 fastrlock-0.3 filelock-3.0.4

Chainer動作確認

Chainerが正常にインストール確認するため、以下のコードを実行します。エラー出ないのでOKですね。

まぁインストール時に以下のメッセージも出ているので問題ないでしょう!

Successfully installed chainer-4.2.0 cupy-cuda80-4.2.0 fastrlock-0.3 filelock-3.0.4

In [0]:
import chainer

ChainerCVもインストール

今回はYoloを動かしたいので、”ChainerCV”も以下のコマンドでインストールします。

In [11]:
!pip install chainercv
Collecting chainercv
  Downloading https://files.pythonhosted.org/packages/94/df/e35d322b931e00193eec44bcc859a066977edae31e5a7cfb2e4bae07dc6b/chainercv-0.10.0.tar.gz (163kB)
    100% |████████████████████████████████| 163kB 4.0MB/s 
Requirement already satisfied: chainer>=4.0 in /usr/local/lib/python3.6/dist-packages (from chainercv) (4.2.0)
Requirement already satisfied: Pillow in /usr/local/lib/python3.6/dist-packages (from chainercv) (4.0.0)
Requirement already satisfied: numpy>=1.9.0 in /usr/local/lib/python3.6/dist-packages (from chainer>=4.0->chainercv) (1.14.5)
Requirement already satisfied: filelock in /usr/local/lib/python3.6/dist-packages (from chainer>=4.0->chainercv) (3.0.4)
Requirement already satisfied: protobuf>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from chainer>=4.0->chainercv) (3.6.0)
Requirement already satisfied: six>=1.9.0 in /usr/local/lib/python3.6/dist-packages (from chainer>=4.0->chainercv) (1.11.0)
Requirement already satisfied: olefile in /usr/local/lib/python3.6/dist-packages (from Pillow->chainercv) (0.45.1)
Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.0.0->chainer>=4.0->chainercv) (39.1.0)
Building wheels for collected packages: chainercv
  Running setup.py bdist_wheel for chainercv ... - \ | / - \ | done
  Stored in directory: /content/.cache/pip/wheels/d7/97/d3/1fbd4d4cd7aff64a3420daab1eaf32066e01baa6ec682f8481
Successfully built chainercv
Installing collected packages: chainercv
Successfully installed chainercv-0.10.0

ChainerCV動作確認

ChainerCVが正常にインストール確認するため、以下のコードを実行します。エラー出ないのでOKですね。

In [0]:
import chainer

from chainercv.datasets import voc_bbox_label_names
from chainercv.links import YOLOv2
from chainercv.links import YOLOv3
from chainercv import utils
from chainercv.visualizations import vis_bbox

画像アップロード

以下のコードで試験用の画像ファイルをアップロードする。

In [3]:
from google.colab import files
uploaded = files.upload()
Upload widget is only available when the cell has been executed in the current browser session. Please rerun this cell to enable.
Saving dog.jpg to dog.jpg

画像ファイル確認

ちゃんとアップロードできたか、下記コマンドで確認。うん!ちゃんと保存できてる!

In [4]:
!ls
datalab  dog.jpg

念のため、以下のコードで表示までさせて安心する。アップロードは問題なし!
Yoloといえば、この画像だよね。イヌ可愛い。。

In [6]:
from IPython.display import Image,display_jpeg
display_jpeg(Image('dog.jpg'))

ちなみにココはどこ状態なので、以下のコマンドで確認。…ふーん。”Colaboratory”の一時保存場所は”content”って名前ね。

In [5]:
!pwd
/content

Yolo_ChainerCVを動かす

ChainerCVの公式GithubからYoloのサンプルコードをコピーし、実行します。
公式でdemo.pyという名前だが、分かりにくいので、本稿では『Yolo_Chainer.py』と名付ける。

【ChainerCVの公式Github】
https://github.com/chainer/chainercv/blob/master/examples/yolo/demo.py

In [13]:
import argparse
import matplotlib.pyplot as plt

import chainer

from chainercv.datasets import voc_bbox_label_names
from chainercv.links import YOLOv2
from chainercv.links import YOLOv3
from chainercv import utils
from chainercv.visualizations import vis_bbox


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '--model', choices=('yolo_v2', 'yolo_v3'),
        default='yolo_v2')
    parser.add_argument('--gpu', type=int, default=-1)
    parser.add_argument('--pretrained-model', default='voc0712')
    parser.add_argument('image')
    args = parser.parse_args()

    if args.model == 'yolo_v2':
        model = YOLOv2(
            n_fg_class=len(voc_bbox_label_names),
            pretrained_model=args.pretrained_model)
    elif args.model == 'yolo_v3':
        model = YOLOv3(
            n_fg_class=len(voc_bbox_label_names),
            pretrained_model=args.pretrained_model)

    if args.gpu >= 0:
        chainer.cuda.get_device_from_id(args.gpu).use()
        model.to_gpu()

    img = utils.read_image(args.image, color=True)
    bboxes, labels, scores = model.predict([img])
    bbox, label, score = bboxes[0], labels[0], scores[0]

    vis_bbox(
        img, bbox, label, score, label_names=voc_bbox_label_names)
    plt.show()


if __name__ == '__main__':
    main()
usage: ipykernel_launcher.py [-h] [--model {yolo_v2,yolo_v3}] [--gpu GPU]
                             [--pretrained-model PRETRAINED_MODEL]
                             image
ipykernel_launcher.py: error: unrecognized arguments: -f
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2
/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py:2890: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

エラーレポート

パーサーがあるのでそのままでは実行できないですね。。そりゃそうか。。

方策

解決方法はおそらく以下の2パターン

パターン1

  1. 上記の『Yolo_Chainer.py』をローカルPCで作成
  2. 画像ファイル同様に『Yolo_Chainer.py』をアップロードする
  3. %%bash に切り替えて python Yolo_Chainer.py で実行する

パターン2

コードをパーサー未使用に改良する

【パターン2採用】Yolo_ChainerCV改良

今回はできる限り、Colaboratoryで完結できるようにしたいので、パーサー部分を改造して、Jupyter Notebookでも動くようにする。

仕様

  • YoloV3
  • GPU
  • 学習モデルvoc2007

ColaboratoryでGPU動かすときは、以下の操作を忘れないように!

タブの「ランタイム」→「ランタイプのタイプを変更」→「ハードウェア アクセラレータ」→「GPU」に設定

In [15]:
# import argparse
import matplotlib.pyplot as plt

import chainer

from chainercv.datasets import voc_bbox_label_names
from chainercv.links import YOLOv2
from chainercv.links import YOLOv3
from chainercv import utils
from chainercv.visualizations import vis_bbox


def main():
    '''
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '--model', choices=('yolo_v2', 'yolo_v3'),
        default='yolo_v2')
    parser.add_argument('--gpu', type=int, default=-1)
    parser.add_argument('--pretrained-model', default='voc0712')
    parser.add_argument('image')
    args = parser.parse_args()
    
    if args.model == 'yolo_v2':
        model = YOLOv2(
            n_fg_class=len(voc_bbox_label_names),
            pretrained_model=args.pretrained_model)
    elif args.model == 'yolo_v3':
        model = YOLOv3(
            n_fg_class=len(voc_bbox_label_names),
            pretrained_model=args.pretrained_model)

    if args.gpu >= 0:
        chainer.cuda.get_device_from_id(args.gpu).use()
        model.to_gpu()

    '''

    model = YOLOv3(
            n_fg_class=len(voc_bbox_label_names),
            pretrained_model = 'voc0712')
    
    gpu = 0 # GPU >=0, CPU = -1
    chainer.cuda.get_device_from_id(gpu).use()
    model.to_gpu()
    
    image = 'dog.jpg'
    img = utils.read_image(image, color=True)
    bboxes, labels, scores = model.predict([img])
    bbox, label, score = bboxes[0], labels[0], scores[0]

    vis_bbox(
        img, bbox, label, score, label_names=voc_bbox_label_names)
    plt.show()


if __name__ == '__main__':
    main()
Downloading ...
From: https://chainercv-models.preferred.jp/yolo_v3_voc0712_converted_2018_05_01.npz
To: /content/.chainer/dataset/_dl_cache/79d417010adfc0e1052bb8e5c4851753
  %   Total    Recv       Speed  Time left
  1  219MiB    3MiB    768KiB/s    0:04:48100  219MiB  219MiB   4747KiB/s    0:00:00

おお!!できた!!!

初回はVOC2007の学習モデル読み込むため、少し時間かかりますが、2回目以降はすぐにYoloが実行できます。

注意点

Colaboratoryにロードしたファイルや学習モデル、pipでインストールしたchainerまで時間がたつと削除されます!

それが、Colaboratoryの良いところでもあり、悪いところでもあるので、別ーのツールと上手く使い分けたいですね。

提案

上記の通り、ロードしたファイルは削除されてしまいますが、今回作成したテキスト付pythonコード(本サイトでは『技術ノート』と呼んでいます)は『.ipyndファイル』で(今回は『Yolo_Chainer.ipynd』と名付けました。)はGoogle ドライブに保存できます。

Google ドライブに保存した『Yolo_Chainer.ipynd』をColaboratoryから開き、タブの「ランタイム」→「すべてのセルを実行」とすれば、再びChainerでYoloが動かせます。

つまり、『Yolo_Chainer.ipynd』をインストーラ付きYolo用デモファイルとして活用できます。 ちょっとスマートでしょ?

ColaboratoryとChainerで快適な機械学習ライフを満喫してくださいな(^^)