物体検出は、Computer Visionの広い領域に属する技術である。画像や映像に存在する物体を識別し、追跡することを扱っている。物体検出は、顔検出、車両検出、歩行者カウント、自動運転車、セキュリティシステムなど、複数のアプリケーションを持っています。
物体検出の主な目的は次の2つです。
- 画像に存在するすべての物体を識別すること
- 注目する物体をフィルタリングする
この記事では、PythonでImageAIライブラリの助けを借りて物体検出を実行する方法を紹介します。
オブジェクト検出のためのディープラーニング
ディープラーニング技術は、様々な物体検出の問題に対して、最先端の技術であることが証明されている。以下は、物体検出のために一般的に使用されている深層学習アプローチの一部である。
- 画像AI
- シングルショット検出器
- YOLO (一度しか見ない)
- 領域ベースの畳み込みニューラルネットワーク
この記事の続きでは、ImageAIとは一体何なのか、そしてそれを使ってどのように物体検出を行うのかを見ていきます。
イメージAI
ImageAIは、開発者が数行のまっすぐなコードを使用して自己完結型の深層学習とコンピュータビジョン機能を持つアプリケーションとシステムを構築するために構築されたPythonライブラリです。ImageAIは、RetinaNet、YOLOv3、およびTinyYOLOv3のような最先端の深層学習アルゴリズムのほぼすべてのPython実装を含んでいます。
ImageAIは、オフラインで動作するいくつかのAPIを利用しています。インターネットに接続していなくても呼び出せるオブジェクト検出、ビデオ検出、オブジェクト追跡のAPIがあります。ImageAIは、事前に学習されたモデルを使用し、簡単にカスタマイズすることができます。
ImageAIライブラリの ObjectDetection
クラスには、事前に学習されたモデルを用いて、任意の画像や画像群に対して物体検出を行うための関数が含まれています。ImageAIを使えば、80種類の日常的な物体を検出・認識することができる。
環境設定
このチュートリアルのパートでは、ImageAIのインストール作業を行っていきます。
ImageAIを使用するには、いくつかの依存関係をインストールする必要があります。まず、Pythonがコンピュータにインストールされていることが必要です。Pythonの公式ウェブサイトからPython 3をダウンロードしてインストールします。
Pythonがインストールできたら、pip
を使用して以下の依存関係をインストールします。
TensorFlow
$ pip install tensorflow
OpenCV
$ pip install opencv-python
Keras
$ pip install keras
画像AI
$ pip install imageAI
TinyYOLOv3モデルファイルをダウンロードします。このファイルには、物体検出に使用される分類モデルが含まれています。
ImageAIによる物体検出の実行
それでは、実際にImageAIライブラリの使い方を見ていきましょう。ImageAIを使って初めて物体検出モデルを構築する方法を順を追って説明します。
ステップ1
最初の作業は、必要なフォルダーを作成することです。このチュートリアルでは、以下のフォルダーが必要です。
- Object detection: ルートフォルダ
- models: 事前に学習されたモデルが格納されています。
- input: オブジェクト検出を行う画像ファイルが格納されます。
- output: 検出されたオブジェクトを含む画像ファイルが格納されます。
フォルダを作成した後、Object detection
フォルダには以下のサブフォルダが必要です。
├── input
├── models
└── output
3 directories, 0 files
ステップ2
Pythonのコードを書くのに適したテキストエディタを開き、新しいファイル detector.py
を作成します。
ステップ3
ImageAIライブラリからObjectDetection
クラスをインポートします。
from imageai.Detection import ObjectDetection
ステップ4
imageAIライブラリと ObjectDetection
クラスをインポートしたので、次に ObjectDetection
クラスのインスタンスを作成します。
detector = ObjectDetection()
ステップ5
入力画像、出力画像、モデルからのパスを指定しましょう。
model_path = "./models/yolo-tiny.h5"
input_path = "./input/test45.jpg"
output_path = "./output/newimage.jpg"
ステップ6
ObjectDetectionクラスをインスタンス化した後、このクラスから様々な関数を呼び出すことができます。このクラスには、事前に学習されたモデルを呼び出すための以下の関数が含まれています。setModelTypeAsRetinaNet()
, setModelTypeAsYOLOv3()
, そして setModelTypeAsTinyYOLOv3()
.
このチュートリアルでは、事前に学習した TinyYOLOv3
モデルを使うので、モデルをロードするために setModelTypeAsTinyYOLOv3()
関数を使うことにします。
detector.setModelTypeAsTinyYOLOv3()
ステップ7
次に、関数 setModelPath()
を呼び出します。この関数は、事前に学習したモデルへのパスを文字列で受け取ります。
detector.setModelPath(model_path)
ステップ8
このステップでは、detector
のインスタンスから loadModel()
という関数を呼び出します。setModelPath()` クラスメソッドで指定したパスからモデルをロードします。
detector.loadModel()
ステップ9
画像内のオブジェクトを検出するには、前のセクションで作成した detector
オブジェクトを使用して detectObjectsFromImage
関数を呼び出す必要があります。
この関数は2つの引数を必要とします。input_imageと
output_image_pathです。input_image
は検出する画像があるパスで、 output_image_path
は検出したオブジェクトがある画像を保存するパスです。この関数は、イメージから検出されたすべてのオブジェクトの名前とパーセント確率を含む辞書を返します。
detection = detector.detectObjectsFromImage(input_image=input_path, output_image_path=output_path)
ステップ10
辞書の各項目をトラバースすることで、アクセスすることができます。
for eachItem in detection:
print(eachItem["name"] , " : ", eachItem["percentage_probability"])
オブジェクト検出のための完全なコード
画像検出の完全なコードは以下の通りです。
from imageai.Detection import ObjectDetection
detector = ObjectDetection()
model_path = "./models/yolo-tiny.h5"
input_path = "./input/test45.jpg"
output_path = "./output/newimage.jpg"
detector.setModelTypeAsTinyYOLOv3()
detector.setModelPath(model_path)
detector.loadModel()
detection = detector.detectObjectsFromImage(input_image=input_path, output_image_path=output_path)
for eachItem in detection:
print(eachItem["name"] , " : ", eachItem["percentage_probability"])
出力では、以下のように検出された各オブジェクトの名前とその確率が表示されます。
出力
car : 54.72719073295593
car : 58.94589424133301
car : 62.59384751319885
car : 74.07448291778564
car : 91.10507369041443
car : 97.26507663726807
car : 97.55765795707703
person : 53.6459743976593
person : 56.59831762313843
person : 72.28181958198547
オリジナル画像。
元の画像(test45)は次のような画像でした。
オブジェクトを検出した画像。
オブジェクト検出後の画像は以下のようになります。
ImageAIが車と人物を識別していることが分かります。
結論
物体検出は、最も一般的なコンピュータビジョンのタスクの1つです。この記事では、PythonでImageAIライブラリを使用して物体検出を行う方法を、例を挙げて説明します。
参考文献
- https://imageai.readthedocs.io/en/latest/detection/index.html