2016年11月29日 更新

Pythonで学ぶOpenCV②〜特徴抽出の理論、実装〜

Pythonで学ぶOpenCVの第2回目、特徴抽出についてご紹介します。

8,325 view お気に入り 0
さて。今回はOpenCVの便利なパッケージを用いて、特徴抽出をしてみたいと思います。

OpenCVをインストールしたときに"haar-cascade"なるものがダウンロードされていると思います。今回はこれを使って簡単に顔認識をやってみたいと思います。このリンクを参考にしています。
まずは特徴抽出の理論についてです。

重要になるのはhaar-like特徴量と呼ばれるものです。

haar-like特徴量とは画像における特徴量として、「照明条件の変動やノイズの影響を受けやすい各画素の明度値をそのまま用いるのではなく、近接する2 つの矩形領域の明度差を求めることで得られる特徴量である」(http://manji602.hatenablog.com/entry/20111214/1323834770)だそうです。

OpenCVの公式ページには以下のような図がありました。
 (1403)

物体を認識するため、このように近くのピクセルとの関係を見るわけですね。

そしてたくさんの画像についてそこに顔が含まれるか、含まれていないかを学習させ、haar-cascadeという分類器を作るようです。

顔が含まれているか含まれていないか、というチェックの部分もすべての要素に対して同じ重みでチェックするわけではなく、38ものステージをふんでチェックが行われているようです。
次にこれをプログラムしていきます。第1回目と同じようにvimを使ってやっていきましょう!

まずは必要なパッケージをインポートします。
#coding UTF-8
import bumpy as np
import cv
import cv2
from PIL import Image
sample01.py
次に、get_face(picture_name)という関数を定義することにします。pictureの名前からその画像の中に入っている人の顔を識別するようにします。これは def get_face(picture_name):とすると関数を定義することが可能です。以下に関数を書きます。
 (1408)

def get_face(picture_name):
     cascade_path = "opt/local/share/OpenCV/haarcascade/haarcascade_frontalface_alt.xml"
     image = cv2.imread(str(picture_name))
     color = (255,0,0)
     gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)
     facerect = cascade.detectMultiScale(gray, scaleFactor=1.1, 
                      minNeighbors =1,minSize=(1,1))
     if len(facerect) > 0:
         for rect in facerect:
               cv2.rectangle(image, 
                tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]),color,thickness=2)
     else:
             print("no face")
    cv2.mshow("detected.jpg",image)
    cv2.waitKey()
    cv2.destroyAllWindows()
sample02.py

補足

  • cascade_path:
  • 以下のようにFinderで"cascade"と検索すると、沢山の項目がでてくると思います。これをターミナルにドラッグ&ドロップするとそのPathがすぐ得られます。これをcascade_pathに記録してください。

  • color:
  • 囲う色を決めます。この場合青です。

  • facerect:
  • cascadeによって識別された情報が入る。変数についてはそこまで気にする必要ないようです。

 (1410)

これによって識別することが可能です。すべてのコードをまとめると以下のようになります。
import numpy as np
import cv
import cv2
from PIL import Image

def get_face(picture_name):
     cascade_path = "opt/local/share/OpenCV/haarcascade/haarcascade_frontalface_alt.xml"
     image = cv2.imread(str(picture_name))
     color = (255,0,0)
     gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)
     facerect = cascade.detectMultiScale(gray, scaleFactor=1.1, 
                      minNeighbors =1,minSize=(1,1))
     if len(facerect) > 0:
         for rect in facerect:
               cv2.rectangle(image, 
                tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]),color,thickness=2)
     else:
             print("no face")
    cv2.mshow("detected.jpg",image)
    cv2.waitKey()
    cv2.destroyAllWindows()

if __name__="main"
      get_face("picture.jpg")
sample03.py
これを実行すると、以下のようになります。
17 件

関連する記事 こんな記事も人気です♪

Pythonで画像処理② Data Augmentation (画像の水増し)

Pythonで画像処理② Data Augmentation (画像の水増し)

画像の水増し、Data Augmentationと呼ばれる方法になりますが、学習に使う画像に変形を加えたり、ノイズを加えたり、明るさを変えたりといった処理を行う方法を紹介します。学習画像に様々な処理を行うことで認識がロバストになるというメリットがあります。
Mochizuki | 91,917 view
LP-tech2周年記念#人気記事のまとめ#第5位〜第1位

LP-tech2周年記念#人気記事のまとめ#第5位〜第1位

LP-techが始まってから2周年を迎えました。ここまでLP-techを続けることができたのも読者の皆様のおかげだと思っています。そこで、LP-techの感謝祭ということで、人気の記事を第20位から第1位までをご紹介します。今回は第5位〜第1位までです。
LP-tech2周年記念#人気記事のまとめ#第15位〜第11位

LP-tech2周年記念#人気記事のまとめ#第15位〜第11位

LP-techが始まってから2周年を迎えました。ここまでLP-techを続けることができたのも読者の皆様のおかげだと思っています。そこで、LP-techの感謝祭ということで、人気の記事を第20位から第1位までをご紹介します。今回は第15位〜第11位までです。
医用画像位置合わせの基礎⑥ 〜アフィン変換とは?〜

医用画像位置合わせの基礎⑥ 〜アフィン変換とは?〜

今回は、画像位置合わせに用いられるアフィン変換をご紹介します。
木田智士 | 18,343 view
画像の再構成理論〜概要、まとめ〜

画像の再構成理論〜概要、まとめ〜

今回は、以前4回にわたって記事として投稿した画像の再構成理論の概要について述べ、それのまとめをしたいと思います。

この記事のキーワード

この記事のキュレーター

エルピクセル編集部 エルピクセル編集部