僕が初めて書いた比較的まともなコードって多分物体検出なんですよね。物体検出、つまりObject Detectionとはなんぞや、の方のために以下の画像を用意しました。 見たことありませんか?僕毎朝めざましテレビを個人的に見てるんですけどそこでも天気予報の際に物体検出を使っていてびっくりしました。そんなObject Detectionが今回のテーマです。
非常に難しそうに思えるかもしれませんが、単一種類の物体検出ならとても簡単です。cv2というライブラリを使いましょう。今私は単一の、と言いました。これは例えば人の顔であったり、犬の顔であったりします。もう少し深くいうと、人の顔(正面)、人の顔(横顔)などもあります。そしてこれらはカスケードファイルという形で保存されています。これは機械学習でいう所の正解ラベルのようなものです。このカスケードファイルには色々な種類があります。 例えば上のリンクを見てもらうと多種多様なカスケードファイルがあることがわかります。つまり、オリジナルのカスケードファイルを作ればオリジナルの物体検出ができるということです。カスケードの自作は可能ですがどうやら少し難しいようです。機会があれば記事にしたいと思っています。リンクを一応貼っておきます。
- Creating a Cascade of Haar-Like Classifiers: Step by Step
- Tutorial: OpenCV
haartraining (Rapid Object Detection With A Cascade of Boosted Classifiers Based on Haar-like Features) - Creating a haar cascade classifier aka haar training
- Making your own Haar Cascade Intro – OpenCV with Python for Image and Video Analysis 17
物体検出はやっていて楽しいので自分への課題としてFlaskを使った簡単なサービスをできないかなと思っていたりします。しかし、サーバーなどの知識があまりないのですぐにとは行きそうにないです。。。なのはともあれコードを見ましょう。の前に1つだけ注意です。opencvを使うとエラーが頻繁に起こります、実際に次のコード内でもおきています。しかし、ほとんどの原因はPATHです。なのでフルパスで渡すか、今回の場合はwebのurlで作動しなかったのでwgetコマンドを使ってダウンロードして同じディレクトリ上にファイルを置くことで解決しました。このへんは注意してください。また、Pythonの仕様かMacの仕様かはわかりませんがplt.imshowにおいて画像の色が反転してしまうのでRGBを変更するコマンドを忘れないように注意してください。 ポイントとしては物体検出で使う次の2つのパラメータについてです。 これらについてまとめると
- scaleFactorは小さいほど検出が正確になる
- minNeighborsは大きいほど検出が正確になる