Python 備忘録

Python-ver: 3.6.3

Pythonで画像認識② 上半身と下半身認識

本日は画像から上半身と下半身を認識させてみようと思います。

といってもやることは顔認識となんら変わりません。

今回、認識させる画像はこちら。
f:id:sh0122:20171108223627j:plain
画像はこちらから拝借いたしました。
無料の写真: サッカー, 審判員, スポーツ, 一致, ゲーム, アービタ - Pixabayの無料画像 - 1301036

ソース

# -*- coding: utf-8 -*-
import cv2

def body_recognition(file_path):
    """上半身と下半身を検知するメソッド"""
    #画像読み込み グレースケール変換
    image = cv2.imread(file_path)
    image_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

    #カスケード分類機読み込み
    upperbody_cascade = cv2.CascadeClassifier(r'../../opencv-3.3.1/data/haarcascades/haarcascade_upperbody.xml')
    lowerbody_cascade = cv2.CascadeClassifier(r'../../opencv-3.3.1/data/haarcascades/haarcascade_lowerbody.xml')

    #カスケード分類機から上半身、下半身それぞれの矩形を取得
    upperbody_rects = upperbody_cascade.detectMultiScale(image_gray, scaleFactor=1.2, minNeighbors=3, minSize=(10, 10))
    lowerbody_rects = lowerbody_cascade.detectMultiScale(image_gray, scaleFactor=1.2, minNeighbors=3, minSize=(10, 10))

    color = (255, 0, 0) #上半身は青
    for rect in upperbody_rects:
        cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)
        cv2.imwrite('../images/detected.jpg', image)

    color = (0, 0, 255) #下半身は赤
    for rect in lowerbody_rects:
        cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)
        cv2.imwrite('../images/detected.jpg', image)

def main():
    file_path = "../images/soccer.jpg"
    body_recognition(file_path)

if __name__ == '__main__':
    main()

解説

画像ファイルは上半身と下半身に関数を分けようかと思いましたが、一緒の関数に書きました。
ファイルも一緒にしました。

理由は、変更を加えようとすると二回離れたところを修正するので、修正し忘れが発生すること。
後は、検知した画像を見る手間が省けることなどです。

顔認識のところでは、haarcascade_frontalface_default.xmlを使いましたが、今回は一緒に同梱されている
haarcascade_upperbody.xmlとhaarcascade_lowerbody.xmlを使いました。

さらに、detectMultiScaleの引数の値を若干変えています。
minNeighborsというのが精度で、これを上げるとより高い認識をしてくれます。
つまり、色々認識された中でよりそれに近いものだけを認識してくれるようになるみたいです。

上半身や下半身がなかなかうまく認識してくれず、色々変えた結果です。

認識後の画像

f:id:sh0122:20171108223940j:plain

青が上半身、赤が下半身です。

認識してなかったり、足首が認識されていたりちょっと微妙ですね。

精度的にはどうかはわかりませんが、自分はあまりできませんでした。

真正面からとったものはあまり認識してくれず、さらに一人の画像だとあまり認識されませんでした。

カスケード分類機は自分でも作れるようなので、自分でも作ってみたいと思います。