Google ColabでYoloV3

TL;TR

GoogleからJupyter Notebook環境の「Colaboratory」が公開されたので、試しにKerasに移植したYoloV3を動作させてみます。

Google Colaboratoryについて

Google製のJupyter Notebook環境です。 複数のユーザーで共有することも可能になってます。
動作環境は下記です。

  • Ubuntu 17.10
  • CPU @ 2.3GHz
  • 13GB RAM
  • GPU NVIDIA Tesla K80
  • アイドル状態が90分続くとインスタンスが停止する
  • 連続使用は最大12時間

YoloV3について

YoloV2との主な違いは

  • Max poolingの廃止
  • Reorg層の廃止
  • ResNet構造と、RetinaNetのようなFeature Pyramid Network構造
  • Focal Lossは利用してない(利用するとmAPが2pt落ちるらしい)

といったところでしょうか。
詳しくは論文を御覧ください。

Google ColaboratoryでYoloV3

1. Notebookの作成

Google Colaboratoryにアクセスし、Python3の新しいノートブックを作成します。

2. GPUの有効化

メニューの「ランタイム -> ランタイムのタイプを変更」を選択し、ハードウェアアクセラレータをGPUに変更します。

3. ローカルファイルのアップロード

Notebookにそのままコードを記述しても良いのですが、手元に利用可能なコードがある場合は、それをアップロードして利用可能です。 (ただし、アップロードしたファイルはインスタンスの停止時に削除されます。。。)

下記のコードを実行すると、「ファイルを選択」ボタンが現れるので、それを押すとファイルのアップロードが可能です。(複数選択可)

from google.colab import files
uploaded = files.upload()

Notebook上でls等のシェルコマンドを実行すると、アップロード状態が確認出来ます。

!ls

libディレクトリを作成し、アップロードしたファイルをlibディレクトリに移動します。

!mkdir lib
!mv *.py lib

4. Google Driveからのファイルのダウンロード

上記のアップロード方法だと転送速度が遅いため、大容量のファイルの場合は時間がかかるため、 容量の大きなファイルはhttpやGoogle Driveからダウンロードした方が良いです。

今回はYoloの学習済みデータ(300MB程度)をGoogle Driveからダウンロードしてみます。

Google Driveへのアップロード

あらかじめ、Google Driveにダウンロードしたいファイルをアップロードし、共有をかけておきます。
共有URLのid=の後ろがファイルIDとなるので、コピーしておきます。

https://drive.google.com/open?id=[FILE_ID]

Google Driveに必要なパッケージをpipでインストール

pipでPyDriveとGoogleDriveDownloaderをインストールします。

!pip install PyDrive googledrivedownloader

Google Driveからのダウンロード

下記を実行すると、ダウンロードが開始され、ファイルが展開されます。
[FILE_ID]の部分は上記で共有をかけたファイルのIDです。

from google_drive_downloader import GoogleDriveDownloader

GoogleDriveDownloader.download_file_from_google_drive(file_id=[FILE_ID],
                                                      dest_path="./tmp.zip",
                                                      unzip=True)
!rm tmp.zip
!ls

4. YoloV3を動かしてみる。

YoloV3のロード

ソースコードと学習済みweightの準備が出来たので、YoloV3を動かしてみます。
Kerasに移植したYoloV3のモデルを構築し、学習済みのweightをロードします。

from lib.YoloV3 import YoloV3
yolo = YoloV3(classes=62, darknet_weights="model/yolov3-fashion.weight")
model = yolo.model()

画像のアップロード

評価する画像をアップロードします。 アップロード方法はソースコードをアップロードした時と同じ方法でアップロード出来ます。

uploaded = files.upload()
!ls

画像の読み込み

アップロードした画像を読み込んで、416×416にリサイズし、RGB値を0〜1に変換します。

from lib import ImageUtil
from keras.preprocessing.image import img_to_array
import numpy as np
size = 416
image = ImageUtil.load_image("test.jpg", target_size=(size, size))
input_image = img_to_array(image)
input_image = np.expand_dims(input_image, axis=0)
input_image = input_image / 255.0

下記のコードでアップロードした画像も確認出来ます。

image

予測

YoloV3を使って物体認識してみます。
認識結果はBounding Box化し、NMSなどの処理をしてjsonにします。

# 予測
ret = model.predict(input_image)
# 認識結果のテンソルをNMS等の処理をした後JSONに変換
boxes = yolo.parse_result(ret)
boxes

予測結果のプロット

認識位置の確認のため、出力を画像にプロットしてみます。

import PIL.ImageDraw
def draw_rectangle(draw, coordinates, color, width=1):
      for i in range(width):
          rect_start = (coordinates[0][0] - i, coordinates[0][1] - i)
          rect_end = (coordinates[1][0] + i, coordinates[1][1] + i)
          draw.rectangle((rect_start, rect_end), outline=color)

def draw_boudingbox(image, boxes, labels=None):
      colors = [(43, 206, 72), (255, 204, 153), (128, 128, 128), (148, 255, 181), (143, 124, 0), (157, 204, 0),
                (194, 0, 136), (0, 51, 128), (255, 164, 5), (255, 168, 187), (66, 102, 0), (255, 0, 16),
                (94, 241, 242),
                (0, 153, 143), (224, 255, 102), (116, 10, 255), (153, 0, 0), (255, 255, 128), (255, 255, 0),
                (255, 80, 5)]

      draw = PIL.ImageDraw.Draw(image)
      for box in boxes:
          xmin = box["xmin"]
          ymin = box["ymin"]
          xmax = box["xmax"]
          ymax = box["ymax"]
          idx_class = int(box["class"])
          color = idx_class % len(colors)
          draw_rectangle(draw, ((xmin, ymin), (xmax, ymax)), colors[color], 3)
          if labels:
              draw.text((xmin, ymin - 12), labels[idx_class], colors[color])
      return image

debug = image.copy()
draw_boudingbox(debug, boxes)


いい感じに認識出来ていることが分かります。

まとめ

使ってみての感想ですが、ファイルのやり取りにやや難があるもののGoogle Colaboratoryを利用すれば環境構築無しに、ディープラーニング環境を利用でき、共同編集も可能なので、研究開発用には良い選択肢になりそうです。

弊社のサービス「UNICON」では、YoloV3と同等の物体認識エンジンを利用しています。
ご興味のある方は是非お試しください。


さて、AIQでは、私達と東京か札幌で一緒に働ける仲間を募集しています。
詳しくはこちら

私達と一緒にを様々な業界の未来を変えていきませんか?