物体検出アルゴリズムは画像中でどこに何が写っているかを出力するタスクです。機械学習にて画像認識の勉強をすると、まずはMNISTの手書き文字分類のような画像分類に取り組む方が多いのではないでしょうか。
物体検出は画像分類に加え、どの位置に対象が存在するか出力しないといけないため、初心者からすると少し、手が付けにくい分野かもしれないです。しかし自動運転を始めとした多くの分野で物体検出は使われており、多くの人が興味を持つ技術であるはずです。というか自分がそうです。
上図のように、物体が矩形で囲まれ、その物体が何であるか英文字で書いてあるのが分かると思います。その物体が文字のクラスである確率も表示されているものをよく見るのではないでしょうか。
この矩形のことをバウンディング・ボックスといいます。データとして4つの数字を持ち「x1, y1, x2, y2」これは矩形の左上角座標、右下角座標とすれば矩形が表示できることが分かります。また「x, y, w, h」として画像のある点(中心や左上角)の座標及び、幅、高さでも矩形を表示することができます。
今回は、とりあえず何でもいいので物体検出を体験してみる、という目的の元進めていきます。
内容はこちらの動画を参考にしています。英語の講座ですが、とても評価が高いのでぜひご覧になってはいかがでしょうか。
簡単にアルゴリズム紹介(スライディングウィンドウ)
では物体検出はどのようにして行われているのか、今回は物体検出の中でも代表的なスライディングウィンドウについて説明してみます。
スライディングウィンドウでは図の赤枠のようにウィンドウサイズを決定し、文字通り、この赤枠をスライドさせていきながらその位置毎で画像分類を行い、物体が存在するかどうか、存在する場合、物体のクラスは何か、を判断します。
簡単に説明するとこういうことですが、察しの通り、物体の大小、スライディングのさせ方を考慮するとこの1つ1つの処理は膨大になってしまいます。正直言うとこのままのとおり行うのは非現実的です。実際にはYOLO、Faster R-CNN等を使うようです。お聞きしたことがあるのではないでしょうか。
物体検出を試してみる
ただ物体検出を体験するだけであれば、意外と簡単にできます。
使用するのはTensorFlow object detection APIです。URLのGitHubからresearch->object_detection->colab_tutorials->object_detection_tutorial.ipynbでチュートリアルファイルにたどり着けます。
Anacondaにて仮想環境を作成し、ipynbファイルをjupyter notebookで開くとkernerl errorが起こり、ImportError: DLL load failed while importing win32api
と表示されるかもしれないです。その場合一度jupyter notebookを落として
pip install pywin32==225
を実行してください。ちなみに自分がこの講座を学習した際(2021年1月)にはTensorFlowはpython3.9に未対応であったみたいですのでpython3.8にて仮想環境を作成しています。
またpip install pycocotools
にてもエラーが起きる場合にはC++のバージョンが古い可能性があるのでvisualcppbuildtools_full(google検索で一番上に出てくると思います)をダウンロード、実行してみてください。
またprotosフォルダ内のファイルをpy形式に変換する必要があります。こちらのURLから対象のzipファイルをダウンロード(自分はwindowsなのでwin64のファイルです)、binフォルダ内のprotocアプリケーションファイルのパスをコピーし、Compile protobufs and install the object_detection packageの3行目のprotocを「!”コピーしたパス”」に書き換え、1,2行目は削除、実行すればpyファイルが生成されるはずです。
あとはipynb通りに進めていけばできるはずです。(ダメだったらごめんなさい)
modelは学習済みのものを使用します。本来であれば、転移学習を使用し、自分が何を学習したいのかモデルを作成するはずですが、チュートリアルなのでCOCOデータセットで使用できるものを使用します。object_detectionフォルダ内にあるtest_imagesフォルダ内にある画像に対して物体検出を行うので、物体検出を行ってみたい画像を入れてみると色々試してみることができると思います。
感想
与えられたモデルをそのまま使用するのであれば、一応物体検出ができる、ということが分かりました。しかし、述べた通り、実際には自分が検出したいものに対して物体検出を行うのが当然ですので、訓練データ、テストデータを用意し、転移学習等で学習される必要があります。
訓練データに関しても、インターネットで取得してくる画像、実際にアプリ化した際に取得する画像では画像のサイズ、画素数が違うでしょうし、取得した画像を訓練データにするにはアノテーション作業(画像のここに対象の物体があるよ!と枠づけ、ラベル付けをする作業です)が必要となるため、中々に骨が折れる作業になるな、と機械学習の泥臭さを再認識させられました。(やってないけど)
Udemyの講座では動画に対しても動く物体に対して物体検出をしていたりと、とても面白い内容となっていたので購入してよかったと思います。computer vision系の動画をもう一つ購入してみたので、そちらも終了次第感想を書きたいと思っています。
コメント