トップページ -> 最新情報技術の実習と研究ツール -> 顔検出、顔識別 -> ipazc/MTCNN を用いて顔検知を行ってみる
[サイトマップへ]  

ipazc/MTCNN を用いて顔検知を行ってみる

MTCNN は Multi-tack CNN (参考 Web ページ: https://github.com/open-face/mtcnn, 原論文: https://kpzhang93.github.io/MTCNN_face_detection_alignment/paper/spl.pdf)

謝辞:MTCNN の考案者、そして、プログラムの作者に感謝します

参考Webページ https://www.github.com/ipazc/mtcnn


前準備

Anaconda, git のインストール

Windows での Anaconda, git のインストール手順は、 別の Web ページに記載しています

Ubuntu での Anaconda のインストール手順は、 別の Web ページに記載しています

隔離された Python 環境の作成.spyder, numpy, OpenCV, Tensorflow のインストール

Windows での 手順は、 「Windows で,隔離された Python 環境 + Keras + TensorFlow + OpenCV + spyder + Dlib 環境を作る(Anaconda を利用)」のページで説明しています.

以下,Windows での Anaconda と git をインストール済み, 隔離された Python 環境(名前は ai)に、spyder, numpy, OpenCV, Tensorflow をインストール済みであるものとして説明を続けます.


ipazc/MTCNN のインストール

  1. Windows のコマンドプロンプトを管理者として実行する.

  2. Python 環境(名前は ai)を有効にする

    ※ 「activate ai 」は Python 環境(名前ai)を有効にするためのコマンド(各自の環境の名前にあわせること

    activate ai 
    

    「Could not find conda environment: ai」というメッセージが出たときは、 隔離された Python 環境の作成(名前は ai) を行う.

  3. ipazc/MTCNN のインストール

    mkdir c:\pytools
    cd c:\pytools
    rmdir /s /q mtcnn
    

    git clone https://github.com/ipazc/mtcnn 
    cd mtcnn
    python setup.py build
    python setup.py install 
    

この Web ページで説明のために使用するビデオ、写真

必要であればダウンロードして使ってください.


ipazc/MTCNN を用いて顔検知を行ってみる

Python プログラムを動かしたい. そのために, IPython シェルのコンソールで、Python 環境(名前は ai)を使う

Anacondaに入っている開発環境 spyder を実行し,右下の ipython コンソールを使うのが簡単.

※ Windows のスタートメニューで、 「spyder」の方ではなく、 「spyder(ai)」を開く。 これで、spyder の中で、Python環境aiが有効になる

※ Windows のスタートメニューで起動できないときは、Windowsのコマンドプロントで次を実行

activate ai
spyder

画像で動かしてみる

  1. C:\face-image のような作業用のディレクトリ(フォルダ)を作る

  2. このディレクトリに、顔写真: 126.png, 127.png をダウンロード

  3. 次の Python プログラムを実行

    https://github.com/ipazc/mtcnn で公開されているプログラムを変更して使用

    import cv2
    import numpy as np
    from mtcnn.mtcnn import MTCNN
    
    img = cv2.imread("C:/face-image/126.png")
    detector = MTCNN()
    print(detector.detect_faces(img))
    
    img = cv2.imread("C:/face-image/127.png")
    detector = MTCNN()
    print(detector.detect_faces(img))
    

    顔検知と、5点(左目、右目、鼻、口の左、口の右)の検知結果が表示されるので確認する

  4. 顔検知と、5点(左目、右目、鼻、口の左、口の右)の検知結果を、グラフィックスで表示
    import cv2
    import numpy as np
    from mtcnn.mtcnn import MTCNN
    
    img1 = cv2.imread("C:/face-image/126.png")
    detector = MTCNN()
    a1 = detector.detect_faces(img1)
    for i, d in enumerate(a1):
        cv2.rectangle(img1, tuple( d['box'][0:2] ), tuple( np.array( d['box'][0:2] ) + np.array( d['box'][2:4] ) ), (255,255,255), 6)
        left_eye = d['keypoints']['left_eye']
        if len(left_eye) == 2:
            cv2.circle(img1, left_eye, 6, (255,255,255), -1)
        right_eye = d['keypoints']['right_eye']
        if len(right_eye) == 2:
            cv2.circle(img1, right_eye, 6, (255,255,255), -1)
        nose = d['keypoints']['nose']
        if len(nose) == 2:
            cv2.circle(img1, nose, 6, (255,255,255), -1)
        mouth_left = d['keypoints']['mouth_left']
        if len(mouth_left) == 2:
            cv2.circle(img1, mouth_left, 6, (255,255,255), -1)
        mouth_right = d['keypoints']['mouth_right']
        if len(mouth_right) == 2:
            cv2.circle(img1, mouth_right, 6, (255,255,255), -1)
    
    cv2.imshow("", img1)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる

ビデオファイルで動かしてみる

  1. C:\face-image のような作業用のディレクトリ(フォルダ)に、mp4 形式ビデオファイル: sample1.mp4 をダウンロード

  2. 次の Python プログラムを実行

    C:/face-image/sample1.mp4」のところは、実際のファイル名に置き換えること

    import cv2
    import numpy as np
    from mtcnn.mtcnn import MTCNN
    
    
    detector = MTCNN()
    v = cv2.VideoCapture("C:/face-image/sample1.mp4")
    
    while(v.isOpened()):
        r, img1 = v.read()
        if ( r == False ):
            break
        a1 = detector.detect_faces(img1)
        for i, d in enumerate(a1):
            cv2.rectangle(img1, tuple( d['box'][0:2] ), tuple( np.array( d['box'][0:2] ) + np.array( d['box'][2:4] ) ), (255,255,255), 6)
            left_eye = d['keypoints']['left_eye']
            if len(left_eye) == 2:
                cv2.circle(img1, left_eye, 6, (255,255,255), -1)
            right_eye = d['keypoints']['right_eye']
            if len(right_eye) == 2:
                cv2.circle(img1, right_eye, 6, (255,255,255), -1)
            nose = d['keypoints']['nose']
            if len(nose) == 2:
                cv2.circle(img1, nose, 6, (255,255,255), -1)
            mouth_left = d['keypoints']['mouth_left']
            if len(mouth_left) == 2:
                cv2.circle(img1, mouth_left, 6, (255,255,255), -1)
            mouth_right = d['keypoints']['mouth_right']
            if len(mouth_right) == 2:
                cv2.circle(img1, mouth_right, 6, (255,255,255), -1)
    
        cv2.imshow("", img1)
    
        if cv2.waitKey(1) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break
    

    ※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる

パソコンの USB カメラで動かしてみる

v = cv2.VideoCapture(0) 」は、USB カメラを使うためのもの。他の部分は、上のプログラムと同じ。

import cv2
import numpy as np
from mtcnn.mtcnn import MTCNN


detector = MTCNN()
v = cv2.VideoCapture(0) 

while(v.isOpened()):
    r, img1 = v.read()
    if ( r == False ):
        break
    a1 = detector.detect_faces(img1)
    for i, d in enumerate(a1):
        cv2.rectangle(img1, tuple( d['box'][0:2] ), tuple( np.array( d['box'][0:2] ) + np.array( d['box'][2:4] ) ), (255,255,255), 6)
        left_eye = d['keypoints']['left_eye']
        if len(left_eye) == 2:
            cv2.circle(img1, left_eye, 6, (255,255,255), -1)
        right_eye = d['keypoints']['right_eye']
        if len(right_eye) == 2:
            cv2.circle(img1, right_eye, 6, (255,255,255), -1)
        nose = d['keypoints']['nose']
        if len(nose) == 2:
            cv2.circle(img1, nose, 6, (255,255,255), -1)
        mouth_left = d['keypoints']['mouth_left']
        if len(mouth_left) == 2:
            cv2.circle(img1, mouth_left, 6, (255,255,255), -1)
        mouth_right = d['keypoints']['mouth_right']
        if len(mouth_right) == 2:
            cv2.circle(img1, mouth_right, 6, (255,255,255), -1)
    cv2.imshow("", img1)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break

※ 途中で止めたいとき,右上の「x」をクリックしない.画面の中をクリックしてから,「q」のキーを押して閉じる