物体検出といえばYOLOを思い浮かべる人も多いでしょう。
ただ、YOLOは非常に簡単に使用できとても精度が高いのですが、非常に扱いやすいがゆえに物体検出を理解する上ではあまり役に立たないかもしれません。
物体検出ってどんな仕組みで動いてるの?
物体検出について詳しく知りたい
という方のために、今回はOpenCVを用いて物体検出を行ってみましょう。
OpenCVとは
OpenCVはオープンソースのコンピュータビジョン用ライブラリです。主に
- 画像・動画の読み込み
- 画像処理
- 画像認識
などを実施することが可能です。
OpenCV全般に関しては以下の記事でも取り扱っていますので、参考にしてください。
OpenCVのインストールから全般的な使い方に関しては、以下の記事でも取り扱っていますので、参考にしてください。
OpenCVで物体検出
物体検出といえば「YOLO」や「VisionTransfer」などのニューラルネットワーク系の物体検知モデルが有名です。
一方、OpenCVで物体検知をするためには検出したい物体の特徴量をまとめた「カスケード型分類機」を使用して検出する方法があります。
OpenCVのカスケード型分類器は物体検出に特化したツールで、画像内の特定のパターンを迅速に見つけることができます。主に顔検出などに利用されますが、いかに示すようにいくつかの分類が可能です。
また、独自に分類機を作成することによりそのほかのものも分類できるようになります。これを使用することによりディープラーニングを用いなくても物体検出が可能なため、実装の負荷が軽減されたり動作速度の向上が期待されます。
物体検出手順
では実際にカスケード型分類機を使用して物体検出を行ってみましょう。
カスケード型分類機の入手
事前に特徴量をまとめたカスケード型分類機を入手します。入手はこちらから可能です。分類に使用したい分類機をダウンロードしておきましょう。今回は「haarcascade_frontalface_alt.xml」を使用してみようと思うので、こちらをダウンロードします。
ここで入手できる分類機は以下の17個です。念のため、内容を記入しておきます。
事前準備
実際に画像を検知するファイルを準備します。サイズの変更など、事前準備が必要な場合は以下の記事を参考にして事前処理をしてください。
今回はこちらの画像で物体検出をします。
分類の実行
import cv2
import matplotlib
import matplotlib.pyplot as plt
img_face = cv2.imread('./sample.jpg')
clf = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
faces = clf.detectMultiScale(img_face, 1.1, 3)
for (ex,ey,ew,eh) in faces:
cv2.rectangle(img_face , (ex, ey), (ex+ew, ey+eh), (255, 255, 255), 2)
cv2.imshow('Image', img_face)
cv2.waitKey()
実際に画像検知をするプログラムを書きましたので、何をしているか見ていきましょう。
import cv2
import matplotlib
import matplotlib.pyplot as plt
必要なライブラリをインポートしていきます。今回は物体検出で使用するCV2、画像を表示するためにmatplotlibをインポートしました。
img_face = cv2.imread('./sample.jpg')
imreadで物体検出を行うデータを読み込みます。
clf = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
faces = clf.detectMultiScale(img_face, 1.1, 3)
clfに「cv2.CascadeClassifire()」を読み込みます。これでカスケード型分類機を読み込むことができます。引数に先ほどダウンロードしてきた「haarcascade_frontalface_alt.xml」を指定することで、今回は人間の顔を検出することが可能になります。ほかの分類機を指定することにより、検出できるものを変えることができます。
次に実際に認識を行います。さきほど作成したclfに対し、「clf.detectMultiScale()」をしてやることで認識結果を取り出します。
取り出した結果はこのように[[左上の点のx座標, y座標, 幅, 高さ]]という座標で取り出せます。
次にdetectMultiScaleの引数ですが、
- 検出するファイル
- scaleFactor:検出時のスケール縮小量です。値を小さくすると見逃しがなく、計算に時間がかかる。値を大きくすると計算時間が短縮されますが見逃しがある場合があります。初期値は1.1です。
- minNeighbors:検出したエリアがいくつ重複した場合に対象のエリアとみるかを示しています。値が少ないと検出しやすくなりますが誤検出が置くなります。初期値は3です。
for (ex,ey,ew,eh) in faces:
cv2.rectangle(img_face , (ex, ey), (ex+ew, ey+eh), (255, 255, 255), 2)
先ほど取り出した検知エリアごとに、検出元ファイルに検出したエリアを書き込みます。「cv2.rectangle()」で長方形を書き込むことが可能です。
cv2.imshow('Image', img_face)
cv2.waitKey()
最後に検出エリアを書き込んだ検出したいファイルを表示しています。以上が解析の流れになります。
カスケード型分類機の作成
今回は事前学習済みのカスケード型分類機を入手して物体検出を行いましたが、分類機を自分で作成することも可能です。
OpenCVのこちらのページで自分のOS環境に合わせたOpenCVをダウンロード、ダウンロードファイルを適当なフォルダに展開します。
「opencv\build\x64\vc16\bin」の中にある「opencv_traincascade.exe」を使用することにより、新たにカスケード分類機を作成することも可能です。
データサイエンスを学習するならTech Teacherで!
『Tech Teacher』3つの魅力
魅力1. オーダーメイドのカリキュラム
『Tech Teacher』では、決められたカリキュラムがなくオーダーメイドでカリキュラムを組んでいます。「質問だけしたい」「相談相手が欲しい」等のご要望も実現できます。
魅力2. 担当教師によるマンツーマン指導
Tech Teacherでは、完全マンツーマン指導で目標達成までサポートします。
東京大学を始めとする難関大学の理系学生・院生・博士の教師がが1対1で、丁寧に指導しています。
そのため、理解できない箇所は何度も分かるまで説明を受けることができます。
魅力3. 3,960円/30分で必要な分だけ受講
Tech Teacherでは、授業を受けた分だけ後払いの「従量課金制」を採用しているので、必要な分だけ授業を受講することができます。また、初期費用は入会金22,000円のみです。一般的なプログラミングスクールとは異なり、多額な初期費用がかからないため、気軽に学習を始めることができます。
まとめ
・魅力1. 担当教師によるマンツーマン指導
・魅力2. オーダーメイドのカリキュラム
・魅力3. 3,960円/30分で必要な分だけ受講
質問のみのお問い合わせも受け付けております。
『Tech Teacher』3つの魅力
魅力1. オーダーメイドのカリキュラム
『Tech Teacher』では、決められたカリキュラムがなくオーダーメイドでカリキュラムを組んでいます。「質問だけしたい」「相談相手が欲しい」等のご要望も実現できます。
魅力2. 担当教師によるマンツーマン指導
Tech Teacherでは、完全マンツーマン指導で目標達成までサポートします。
東京大学を始めとする難関大学の理系学生・院生・博士の教師がが1対1で、丁寧に指導しています。
そのため、理解できない箇所は何度も分かるまで説明を受けることができます。
魅力3. 3,960円/30分で必要な分だけ受講
Tech Teacherでは、授業を受けた分だけ後払いの「従量課金制」を採用しているので、必要な分だけ授業を受講することができます。また、初期費用は入会金22,000円のみです。一般的なプログラミングスクールとは異なり、多額な初期費用がかからないため、気軽に学習を始めることができます。
まとめ
・魅力1. 担当教師によるマンツーマン指導
・魅力2. オーダーメイドのカリキュラム
・魅力3. 3,960円/30分で必要な分だけ受講
質問のみのお問い合わせも受け付けております。
まとめ
今回はCV2による物体検出を見てきました。最近話題となるディープラーニング系の物体検出に比べ精度が落ちるイメージがありますが、軽量なため使用する場面もあると思います。今回の内容でCV2による物体検出を理解いただき、役に立てていただければと思います。