Google ColabでYOLOv3を使って物体検出してみた


はじめに

Google Colaboratoryで、物体検出システムとして有名なYOLO v3を動かしてみたのでまとめました。

目次

YOLO v3とは

YOLOとは、リアルタイム物体検出システムです。
Darknetという、ニューラルネットワークフレームワークの一部です。
YOLOということばは、「You only look once(一度しか見ない)」の頭文字をとったものです。
YOLO v3は、YOLOのversion3のことです(詳細は、公式ページを参照下さい)。

Google ColabでYOLO v3

環境

今回使用する環境はGoogle Colaboratoryです。
その他、バージョンは以下です。

import platform
import cv2

print("Python " + platform.python_version())
print("OpenCV " + cv2.__version__)
# Python 3.6.9
# OpenCV 4.1.2

準備

画像を表示するのに必要なライブラリをインポートしておきます。

import cv2
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib

YOLOのセットアップ

それでは、Google ColabにYOLO v3をセットアップしていきましょう。
作業ディレクトリを作成し、その中で作業を行うことにします。
なお、このセットアップは最初の一回だけ行えば以後不要です(そのために、作業ディレクトリ配下で作業します)。

import os

os.mkdir(working_dir) # working_dir は作業ディレクトリ
os.chdir(working_dir)

darknetをクローンします。

!git clone https://github.com/pjreddie/darknet

クローンができたら、darknetディレクトリ配下に移動し、makeを実行します。

os.chdir(working_dir + 'darknet')
!make

makeが終わったら、学習済みモデル(のウエイト)をダウンロードします。

!wget https://pjreddie.com/media/files/yolov3.weights

これで、Google ColabへのYOLO v3のセットアップは完了です。

YOLOを動かしてみよう

それでは、YOLOを動かして物体検出をしてみましょう。
すでに用意されているサンプル画像を使用します。
サンプル画像は、 darknet/data 配下にあります。

!./darknet detect cfg/yolov3.cfg yolov3.weights 'data/dog.jpg'

# layer     filters    size              input                output
#     0 conv     32  3 x 3 / 1   608 x 608 x   3   ->   608 x 608 x  32  0.639 BFLOPs
#     1 conv     64  3 x 3 / 2   608 x 608 x  32   ->   304 x 304 x  64  3.407 BFLOPs
#     2 conv     32  1 x 1 / 1   304 x 304 x  64   ->   304 x 304 x  32  0.379 BFLOPs
#     3 conv     64  3 x 3 / 1   304 x 304 x  32   ->   304 x 304 x  64  3.407 BFLOPs
#     4 res    1                 304 x 304 x  64   ->   304 x 304 x  64
#     5 conv    128  3 x 3 / 2   304 x 304 x  64   ->   152 x 152 x 128  3.407 BFLOPs
#     6 conv     64  1 x 1 / 1   152 x 152 x 128   ->   152 x 152 x  64  0.379 BFLOPs
#     7 conv    128  3 x 3 / 1   152 x 152 x  64   ->   152 x 152 x 128  3.407 BFLOPs
#     8 res    5                 152 x 152 x 128   ->   152 x 152 x 128
# .........
#    97 upsample            2x    38 x  38 x 128   ->    76 x  76 x 128
#    98 route  97 36
#    99 conv    128  1 x 1 / 1    76 x  76 x 384   ->    76 x  76 x 128  0.568 BFLOPs
#   100 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
#   101 conv    128  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 128  0.379 BFLOPs
#   102 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
#   103 conv    128  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 128  0.379 BFLOPs
#   104 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
#   105 conv    255  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 255  0.754 BFLOPs
#   106 yolo
# Loading weights from yolov3.weights...Done!
# data/dog.jpg: Predicted in 22.825540 seconds.
# dog: 100%
# truck: 92%
# bicycle: 99%

物体検出が終わりました。
それでは画像を表示して確認してみましょう。
物体検出の結果を描画した画像は、 darknet/predictions.jpg です。

img_in = cv2.imread('data/dog.jpg')
img_out = cv2.imread('predictions.jpg')
plt.figure(figsize=[20,10])
plt.subplot(121);plt.imshow(img_in[:,:,::-1]);plt.axis('off')
plt.subplot(122);plt.imshow(img_out[:,:,::-1]);plt.axis('off')

「犬」「自転車」「車」を検出できています。

その他の画像も確認してみましょう。

!./darknet detect cfg/yolov3.cfg yolov3.weights 'data/horses.jpg'
img_in = cv2.imread('data/horses.jpg')
img_out = cv2.imread('predictions.jpg')
plt.figure(figsize=[20,10])
plt.subplot(121);plt.imshow(img_in[:,:,::-1]);plt.axis('off')
plt.subplot(122);plt.imshow(img_out[:,:,::-1]);plt.axis('off')

!./darknet detect cfg/yolov3.cfg yolov3.weights 'data/person.jpg'
img_in = cv2.imread('data/person.jpg')
img_out = cv2.imread('predictions.jpg')
plt.figure(figsize=[20,10])
plt.subplot(121);plt.imshow(img_in[:,:,::-1]);plt.axis('off')
plt.subplot(122);plt.imshow(img_out[:,:,::-1]);plt.axis('off')

!./darknet detect cfg/yolov3.cfg yolov3.weights 'data/kite.jpg'
img_in = cv2.imread('data/kite.jpg')
img_out = cv2.imread('predictions.jpg')
plt.figure(figsize=[20,10])
plt.subplot(121);plt.imshow(img_in[:,:,::-1]);plt.axis('off')
plt.subplot(122);plt.imshow(img_out[:,:,::-1]);plt.axis('off')

まとめ

今回は、Google Colaboratoryの環境でYOLO v3を動かしてみました。
すでに用意されているサンプル画像で物体検出を行いました。
色々な画像を用意して物体検出してみると面白いと思います。

参考文献