YOLOv3 : 物体の位置と種類を検出する機械学習モデル

Kazuki Kyakuno
axinc
Published in
10 min readJan 10, 2020

ailia SDKで使用できる機械学習モデルである「YOLOv3」のご紹介です。エッジ向け推論フレームワークであるailia SDKailia MODELSに公開されている機械学習モデルを使用することで、簡単にAIの機能をアプリケーションに実装することができます。

YOLOv3の概要

YOLOv3は入力された画像から物体の位置と種類を検出するAIモデルです。入力された画像に対して、80種類のカテゴリと、物体のバウンディングボックスを計算することができます。

YOLOv3の認識のサンプル動画です。車やトラック、人やハンドバックを検出することができています。

応用例としては、店舗における来店人数の確認や、レストランにおける満席率の調査、交通量調査や、放置自転車の検出、危険領域への立ち入り検出などに使用可能です。

YOLOv3は2018年4月に発表されました。

認識可能カテゴリ

YOLOv3はMS-COCOというデータセットで学習されており、下記の80カテゴリを識別可能です。

coco_category=[ “person”, “bicycle”, “car”, “motorcycle”, “airplane”, “bus”, “train”, “truck”, “boat”, “traffic light”, “fire hydrant”, “stop sign”, “parking meter”, “bench”, “bird”, “cat”, “dog”, “horse”, “sheep”, “cow”, “elephant”, “bear”, “zebra”, “giraffe”, “backpack”, “umbrella”, “handbag”, “tie”, “suitcase”, “frisbee”, “skis”, “snowboard”, “sports ball”, “kite”, “baseball bat”, “baseball glove”, “skateboard”, “surfboard”, “tennis racket”, “bottle”, “wine glass”, “cup”, “fork”, “knife”, “spoon”, “bowl”, “banana”, “apple”, “sandwich”, “orange”, “broccoli”, “carrot”, “hot dog”, “pizza”, “donut”, “cake”, “chair”, “couch”, “potted plant”, “bed”, “dining table”, “toilet”, “tv”, “laptop”, “mouse”, “remote”, “keyboard”, “cell phone”, “microwave”, “oven”, “toaster”, “sink”, “refrigerator”, “book”, “clock”, “vase”, “scissors”, “teddy bear”, “hair drier”, “toothbrush”]

Tinyモデル

YOLOv3には認識精度の高い通常モデルと、認識精度が若干劣る代わりに高速に動作するtinyモデルがあります。通常モデルのYOLOv3–416のmAP(認識精度)は55.3、tinyモデルのmAPは33.1となります。FLOPS(演算量)はそれぞれ、65.86 Bn、5.56 Bnです。

ailia SDKからの使用

ailia SDKではバージョン1.2.1以降のDetector APIで両方のモデルに対応しています。ailia SDKを使用することで、Windows、Mac、iOS、Android、LinuxでPythonやUnityからYOLOv3を使用することができます。

ailia SDKとPythonを使用してYOLOv3を実行するサンプルです。

下記のコマンドで任意の動画に対してYOLOv3を適用可能です。

python3 yolov3-tiny.py -v input.mp4

実行例です。

ailia SDKでPythonからYOLOv3を使用する場合、ailia.Detectorを使用してモデルの読み込みを行ったあと、compute APIで画像を与え、get_object_count APIで検出した物体の数を取得、get_object Aでバウンディングボックスとカテゴリを取得します。

ailia SDKとUnityを使用してYOLOv3を実行するサンプルです。

ailia SDKでUnityからYOLOv3を使用する場合、AiliaDetectorModelクラスを使用してモデルの読み込みを行った後、ComputeFromImage APIで画像を与え、検出した物体のリストを取得、バウンディングボックスとカテゴリを取得します。

ailia SDKのUnity PackageにはYOLOv3を使用するシーンが含まれており、そのまま、Windows、Mac、Linux、iOS、Androidのアプリケーションに出力可能です。

独自のデータセットでの学習

ここからは、独自のデータセットで学習したYOLOv3をailia SDKを使用して実行する方法について解説します。

YOLOv3はDarknetというフレームワークで開発されています。

Kerasでの実装は下記のリポジトリに公開されており、Darknetのモデルをailia SDKで使用できる形に変換したり、独自のデータセットで再学習するにはこちらを使用します。

Darknetで学習したモデルは、keras-yolo3を使用して、下記のコマンドでhdf5ファイルに変換することができます。hdf5からONNXへの変換方法は、次の章を参照してください。

wget https://pjreddie.com/media/files/yolov3.weights
python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
python yolo_video.py [OPTIONS…] — image, for image detection mode, OR
python yolo_video.py [video_path] [output_path (optional)]

独自のデータセットで再学習する場合、keras-yolo3のtrain.pyを使用します。keras-yolo3の学習に必要なアノテーションデータのフォーマットは下記のようになっています。1画像につき1行で、バウンディックスボックスの座標 (x1,y1)-(x2,y2)とカテゴリ番号を記載します。1画像の中に複数のバウンディングボックスが存在する場合は、スペースで区切って並べます。座標はピクセル座標になります。

image_path x1,y1,x2,y2,category x1,y1,x2,y2,category

次に、カテゴリラベルのテキストファイルを作成します。カテゴリ番号0から順番に記載します。顔認識の場合は1カテゴリですので、下記のような内容になります。

face

次のコマンドで学習を行います。

python train.py

作成したアノテーションデータおよびカテゴリラベルへのパスはtrain.pyにハードコーディングされているため、事前に適切なファイル名に書き換える必要があります。

annotation_path = ‘train.txt’ #作成したアノテーションデータに書き換え
log_dir = ‘logs/000/’
classes_path = ‘model_data/voc_classes.txt’ #作成したカテゴリラベルに書き換え
anchors_path = ‘model_data/yolo_anchors.txt’

これで、hdf5ファイルが作成できます。

hdf5からONNXへの変換

ailia SDKで使用するにはhdf5ファイルからONNXへの変換が必要で、keras2onnxの下記のコードを使用します。

keras-yolo3を使用した再学習からONNXへの変換までのサンプルは下記のリポジトリに作成していますのでご覧になってください。FDDBを使用してYOLOv3を使用した顔認識のサンプルとなります。

具体的に、上記リポジトリを使用して、下記の操作でONNXへの変換が可能です。変換には、Keras 2.2.4、Tensorflow 1.13.2、keras2onnx 1.5.1を使用してください。

ax株式会社はAIを実用化する会社として、クロスプラットフォームでGPUを使用した高速な推論を行うことができるailia SDKを開発しています。ax株式会社ではコンサルティングからモデル作成、SDKの提供、AIを利用したアプリ・システム開発、サポートまで、 AIに関するトータルソリューションを提供していますのでお気軽にお問い合わせください。

--

--

Kazuki Kyakuno
axinc
Editor for

CTO — ax Inc. , Managing Director — AXELL