トップページ -> データベース関連技術 -> 顔検出、顔識別 -> ipazc/MTCNN を用いて顔検出を行ってみる
[サイトマップへ], [サイト内検索へ]

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

MTCNN は Multi-task 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


前準備

Python のインストール

virtualenv, virtualenv-wrapper のインストール

git, cmake のインストール

(NVIDIA GPU を使うとき)NVIDIA グラフィックスボード・ドライバ,NVIDIA CUDA ツールキットのインストール

次のページの手順により,インストールを行う

参考Webページ:

(NVIDIA GPU を使うとき)NVIDIA cuDNN のインストール

Windows でのインストール手順の詳細は,別ページで説明している.

インストールの要点:https://developer.nvidia.com/cudnn から cuDNN を入手し,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1 などに展開(解凍)し,パスを通しておくこと


ipazc/MTCNN のインストール

隔離された Python 仮想環境の新規作成と,TensorFlow 1.15(旧バージョン)のインストール

  1. 今から作成する隔離された Python 仮想環境の名前と、Pythonのバージョンを決めておく
  2. Windows で,コマンドプロンプトを実行.
  3. virtualenv隔離された Python 仮想環境新規作成し,有効化

    下の例では,隔離された Python 仮想環境の名前をtf1に設定している

    mkvirtualenv tf1
    lsvirtualenv 
    

    [image]
  4. TenforFlow 1.15 のインストール

    このとき,virtualenv の隔離された Python 仮想環境を有効化する(「tf1」のところは、Python仮想環境の名前)

    ※ 「py」は,Windows のPythonランチャーAnaconda 3 内の Python などを間違って使ってしまわないように,Pythonランチャーを使って Python を起動している.Ubuntu では「py」でなく「python3」コマンドを使う.

    ※ 「py -m pip install」は,Python パッケージをインストールするための操作. Ubuntu では,「py -m pip install」の代わりに「pip3 install ...」のように操作すること.

    workon tf1
    py -m pip install --upgrade pip
    py -m pip install -U tensorflow==1.15
    

    [image]

    GPU版の TensorFlow を使いたいとき

    ※ TensorFlow 1.15 では CPU 版と GPU版が 1つのパッケージに統合されている.

    GPU 版 TensorFlow 1.15 を使うために,https://developer.nvidia.com/cuda-10.0-download-archiveから CUDA 10.0 を入手し,インストールしておくこと

    そして,https://developer.nvidia.com/cudnn から cuDNN を入手し,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0 などに展開(解凍)し,パスを通しておくこと

Python 用 scikit-image opencv-python dlib のインストール

Windows の場合

※ 「pip install ...」は,Python パッケージをインストールするための操作.

workon tf1
pip install -U scikit-image opencv-python dlib 

Ubuntu の場合

workon tf1
pip3 install -U scikit-image opencv-python dlib 

ipazc/MTCNN のインストール

  1. Windows で,コマンドプロンプトを管理者として実行
  2. ipazc/MTCNN のインストール

    このとき,virtualenv の隔離された Python 仮想環境を有効化する(「tf1」のところは、Python仮想環境の名前に変えること)

    workon tf1
    pip install -U mtcnn 
    

    [image]

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

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


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

Python プログラムを動かす.

※ Python プログラムを動かすために, Windows では,「python」コマンドやPythonランチャーである「py」を使う. Ubuntu では「python3」コマンドを使う. あるいは, PyCharmなどにある Python コンソールも便利である.

※ (オプション)もし、virtualenv の隔離された Python 仮想環境にインストールしていて、それを使いたいときは、有効化する

画像で動かしてみる

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

    [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点(左目、右目、鼻、口の左、口の右)の検出結果が表示されるので確認する

    [image]
    (途中省略)
    [image]
  4. 矩形(四角形)を書き、情報を表示する関数 box_label
    import cv2
    import numpy as np
    from mtcnn.mtcnn import MTCNN
    
    bgr = cv2.imread("C:/face-image/126.png")
    
    def box_label(bgr, x1, y1, x2, y2, label): 
        cv2.rectangle(bgr, (x1, y1), (x2, y2), (255, 0, 0), 1, 1)
        cv2.rectangle(bgr, (int(x1), int(y1-25)), (x2, y1), (255,255,255), -1)
        cv2.putText(bgr, label, (x1, int(y1-5)), cv2.FONT_HERSHEY_COMPLEX, 0.7, (0,0,0), 1)
    
    box_label(bgr, 100, 300, 200, 400, "hello")
    cv2.imshow('', bgr)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

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

    [image]
    (途中省略)
    [image]
  5. 顔検出と、5点(左目、右目、鼻、口の左、口の右)の検出結果を、グラフィックスで表示
    import cv2
    import numpy as np
    from mtcnn.mtcnn import MTCNN
    
    def box_label(bgr, x1, y1, x2, y2, label): 
        cv2.rectangle(bgr, (x1, y1), (x2, y2), (255, 0, 0), 1, 1)
        cv2.rectangle(bgr, (int(x1), int(y1-25)), (x2, y1), (255,255,255), -1)
        cv2.putText(bgr, label, (x1, int(y1-5)), cv2.FONT_HERSHEY_COMPLEX, 0.7, (0,0,0), 1)
    
    bgr = cv2.imread("C:/face-image/126.png")
    detector = MTCNN()
    a1 = detector.detect_faces(bgr)
    
    for i, d in enumerate(a1):
        x1, y1 = tuple( d['box'][0:2] )
        x2, y2 = tuple( np.array( d['box'][0:2] ) + np.array( d['box'][2:4] ) )
        box_label(bgr, x1, y1, x2, y2, '{:0.2f}'.format(d['confidence']))
        left_eye = d['keypoints']['left_eye']
        if len(left_eye) == 2:
            cv2.circle(bgr, left_eye, 6, (255,255,255), -1)
        right_eye = d['keypoints']['right_eye']
        if len(right_eye) == 2:
            cv2.circle(bgr, right_eye, 6, (255,255,255), -1)
        nose = d['keypoints']['nose']
        if len(nose) == 2:
            cv2.circle(bgr, nose, 6, (255,255,255), -1)
        mouth_left = d['keypoints']['mouth_left']
        if len(mouth_left) == 2:
            cv2.circle(bgr, mouth_left, 6, (255,255,255), -1)
        mouth_right = d['keypoints']['mouth_right']
        if len(mouth_right) == 2:
            cv2.circle(bgr, mouth_right, 6, (255,255,255), -1)
    
    cv2.imshow('', bgr)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

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

    [image]
    (途中省略)
    [image]

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

  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
    
    def box_label(bgr, x1, y1, x2, y2, label): 
        cv2.rectangle(bgr, (x1, y1), (x2, y2), (255, 0, 0), 1, 1)
        cv2.rectangle(bgr, (int(x1), int(y1-25)), (x2, y1), (255,255,255), -1)
        cv2.putText(bgr, label, (x1, int(y1-5)), cv2.FONT_HERSHEY_COMPLEX, 0.7, (0,0,0), 1)
    
    detector = MTCNN()
    v = cv2.VideoCapture("C:/face-image/sample1.mp4")
    
    while(v.isOpened()):
        r, bgr = v.read()
        if ( r == False ):
            break
        a1 = detector.detect_faces(bgr)
        for i, d in enumerate(a1):
            x1, y1 = tuple( d['box'][0:2] )
            x2, y2 = tuple( np.array( d['box'][0:2] ) + np.array( d['box'][2:4] ) )
            box_label(bgr, x1, y1, x2, y2, '{:0.2f}'.format(d['confidence']))
            left_eye = d['keypoints']['left_eye']
            if len(left_eye) == 2:
                cv2.circle(bgr, left_eye, 6, (255,255,255), -1)
            right_eye = d['keypoints']['right_eye']
            if len(right_eye) == 2:
                cv2.circle(bgr, right_eye, 6, (255,255,255), -1)
            nose = d['keypoints']['nose']
            if len(nose) == 2:
                cv2.circle(bgr, nose, 6, (255,255,255), -1)
            mouth_left = d['keypoints']['mouth_left']
            if len(mouth_left) == 2:
                cv2.circle(bgr, mouth_left, 6, (255,255,255), -1)
            mouth_right = d['keypoints']['mouth_right']
            if len(mouth_right) == 2:
                cv2.circle(bgr, mouth_right, 6, (255,255,255), -1)
        cv2.imshow("", bgr)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break
    

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

    [image]

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

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

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

def box_label(bgr, x1, y1, x2, y2, label): 
    cv2.rectangle(bgr, (x1, y1), (x2, y2), (255, 0, 0), 1, 1)
    cv2.rectangle(bgr, (int(x1), int(y1-25)), (x2, y1), (255,255,255), -1)
    cv2.putText(bgr, label, (x1, int(y1-5)), cv2.FONT_HERSHEY_COMPLEX, 0.7, (0,0,0), 1)

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

while(v.isOpened()):
    r, bgr = v.read()
    if ( r == False ):
        break
    a1 = detector.detect_faces(bgr)
    for i, d in enumerate(a1):
        x1, y1 = tuple( d['box'][0:2] )
        x2, y2 = tuple( np.array( d['box'][0:2] ) + np.array( d['box'][2:4] ) )
        box_label(bgr, x1, y1, x2, y2, '{:0.2f}'.format(d['confidence']))
        left_eye = d['keypoints']['left_eye']
        if len(left_eye) == 2:
            cv2.circle(bgr, left_eye, 6, (255,255,255), -1)
        right_eye = d['keypoints']['right_eye']
        if len(right_eye) == 2:
            cv2.circle(bgr, right_eye, 6, (255,255,255), -1)
        nose = d['keypoints']['nose']
        if len(nose) == 2:
            cv2.circle(bgr, nose, 6, (255,255,255), -1)
        mouth_left = d['keypoints']['mouth_left']
        if len(mouth_left) == 2:
            cv2.circle(bgr, mouth_left, 6, (255,255,255), -1)
        mouth_right = d['keypoints']['mouth_right']
        if len(mouth_right) == 2:
            cv2.circle(bgr, mouth_right, 6, (255,255,255), -1)
    cv2.imshow("", bgr)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break

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

[image]

本サイトは金子邦彦研究室のWebページです.サイトマップは,サイトマップのページをご覧下さい. 本サイト内の検索は,サイト内検索のページをご利用下さい.

問い合わせ先: 金子邦彦(かねこ くにひこ) [image]