画像・音声処理

【1分でわかる】物体検出の基礎!OpenCVによる物体検出

物体検出といえばYOLOを思い浮かべる人も多いでしょう。

ただ、YOLOは非常に簡単に使用できとても精度が高いのですが、非常に扱いやすいがゆえに物体検出を理解する上ではあまり役に立たないかもしれません。

物体検出ってどんな仕組みで動いてるの?

物体検出について詳しく知りたい

という方のために、今回はOpenCVを用いて物体検出を行ってみましょう。


本ブログを運営しているTech Teacherは、
プログラミング家庭教師サービスを運営しています。
完全マンツーマン・フルオーダーメイド
あなたが必要な指導を提供します。

OpenCVとは

OpenCVはオープンソースのコンピュータビジョン用ライブラリです。主に

  • 画像・動画の読み込み
  • 画像処理
  • 画像認識

などを実施することが可能です。

OpenCV全般に関しては以下の記事でも取り扱っていますので、参考にしてください。

【1分でわかる】初心者でも簡単にOpenCVで画像認識の実装ができるやり方を学ぶ!OpenCVで画像認識をしてみようとお考えの方に向けて、OpenCVを使ってそもそも何ができて、何のためにそのようなことをするのかを解説します。そして初心者でも簡単にPythonで画像認識を実行する手法を見ていきます。実際にコードを示しながら進めているので、一緒に手を動かしながら学べます!...

OpenCVのインストールから全般的な使い方に関しては、以下の記事でも取り扱っていますので、参考にしてください。

Python + OpenCVで画像処理をマスター!使用法・実用例を解説Python初心者の方でOpenCVの使い方について悩んでいる人必見。OpenCVの基礎知識やインストール方法、使い方を網羅しました。OpenCVを使用した画像動画処理について悩んでいる人は参考にしてください。...

OpenCVで物体検出

物体検出といえば「YOLO」や「VisionTransfer」などのニューラルネットワーク系の物体検知モデルが有名です。

一方、OpenCVで物体検知をするためには検出したい物体の特徴量をまとめた「カスケード型分類機」を使用して検出する方法があります。

OpenCVのカスケード型分類器は物体検出に特化したツールで、画像内の特定のパターンを迅速に見つけることができます。主に顔検出などに利用されますが、いかに示すようにいくつかの分類が可能です。

また、独自に分類機を作成することによりそのほかのものも分類できるようになります。これを使用することによりディープラーニングを用いなくても物体検出が可能なため、実装の負荷が軽減されたり動作速度の向上が期待されます。

物体検出手順

では実際にカスケード型分類機を使用して物体検出を行ってみましょう。

カスケード型分類機の入手

事前に特徴量をまとめたカスケード型分類機を入手します。入手はこちらから可能です。分類に使用したい分類機をダウンロードしておきましょう。今回は「haarcascade_frontalface_alt.xml」を使用してみようと思うので、こちらをダウンロードします。

ここで入手できる分類機は以下の17個です。念のため、内容を記入しておきます。

事前準備

実際に画像を検知するファイルを準備します。サイズの変更など、事前準備が必要な場合は以下の記事を参考にして事前処理をしてください。

Python + OpenCVで画像処理をマスター!使用法・実用例を解説Python初心者の方でOpenCVの使い方について悩んでいる人必見。OpenCVの基礎知識やインストール方法、使い方を網羅しました。OpenCVを使用した画像動画処理について悩んでいる人は参考にしてください。...

今回はこちらの画像で物体検出をします。

分類の実行

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の引数ですが、

  1. 検出するファイル
  2. scaleFactor:検出時のスケール縮小量です。値を小さくすると見逃しがなく、計算に時間がかかる。値を大きくすると計算時間が短縮されますが見逃しがある場合があります。初期値は1.1です。
  3. 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分で必要な分だけ受講

    質問のみのお問い合わせも受け付けております。

    まとめ

    今回はCV2による物体検出を見てきました。最近話題となるディープラーニング系の物体検出に比べ精度が落ちるイメージがありますが、軽量なため使用する場面もあると思います。今回の内容でCV2による物体検出を理解いただき、役に立てていただければと思います。