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では、私達と東京か札幌で一緒に働ける仲間を募集しています。
詳しくはこちら。
私達と一緒にを様々な業界の未来を変えていきませんか?