LoginSignup
15

More than 5 years have passed since last update.

【Python】dlibで顔の検出をする(Windows)

Posted at

dlibやってみます

Windowsでdlibを用いた顔検出を紹介しているサイトって
意外と少ないんですよね。

※ディスっているわけではなく※
情報量が少なかったり、不確実だったり
実行してもエラーがおきまして…

あと、Windows環境でやりたかったので
検索で[python dlib Windows] で検索して
ヒットしたページ見たら間もなく「Ubuntuをインストールします」って
ズコーーー!

戦闘力20の私でも
ようやく、シンプルに【処理】部分のみに絞った記事が書けるようになりました。
簡単にシンプルに読みやすくしているつもりですので、
初学者の方も是非行ってみてください。
無駄にボリューミーにしますので、
おなかいっぱいになったら残して帰ってください。

まず、今回は
1.デスクトップにdlibというフォルダを作って
2.その中に検出をかけたいjpg形式の画像を入れて
3.同じディレクトリ内に【dlibcode.py】というPythonのファイルを作り、ソースコードエディターでコーディング
します。
ちなみに、私は最近【Visual Studio Code】というエディターにドハマりしてます。
あれ、デバッグめちゃ楽です。今度、記事にします。きっと。

環境はWindowsです。
Anaconda(Python)を使用しています。

フォルダ内こんな感じです。
※画像はフリー素材です
picture1.JPG

コードは以下の通りとなります。

dlibcode.py
import dlib
from skimage import io
import cv2

face_detector = dlib.get_frontal_face_detector()
file_name = "pic1.jpg"    #ここに対象のファイル名を入力私の場合はpic1.jpgです
image = io.imread(file_name)
detected_faces = face_detector(image, 1)

save_image = cv2.imread(file_name, cv2.IMREAD_COLOR)

for i, face_rect in enumerate(detected_faces):
    #ここが処理部分
    cv2.rectangle(save_image, tuple([face_rect.left(),face_rect.top()]), tuple([face_rect.right(),face_rect.bottom()]), (0, 0,255), thickness=2)
    cv2.imwrite('complete_'+file_name, save_image)

これだけです。
エディターを上書きして、保存しておいてください。

次にコマンドプロンプトを起動しましょう。
初めての場合は、condaを使用して以下の2つをインストールする必要があります。

コマンドプロンプトで実施
conda install -c menpo dlib
conda install -c anaconda scikit-image

またOpenCVも使用するので、インストールしてない場合は
以下もインストールしておきます。
管理者権限でコマンドプロンプトに入りなおして実施してください。

openCVをインストールする(管理者権限のコマンドプロンプトで実施)
conda install -y opencv

カレントディレクトリを変更しておきます

コマンドプロンプトで実施
> cd desktop\dlib

実行してみましょう

picture2.JPG

実行後にはフォルダ内に
元のファイル名の頭にcomplete_が追加されたファイルができます。

コマンドプロンプトで実施
> python dlibcode.py

complete_pic1.JPG
実行結果

エラー無くうまくいきましたでしょうか。

dlibcode.py(応用編)
import dlib
from skimage import io
import cv2
import os

##カレントディレクトリを変更したい場合はos.chdir()で対応
#os.chdir("C:\\Users\\god_s\\Desktop\\PythonFolder\\dlib")
#print(os.getcwd()) #getcwd()で変更の確認ができます。

face_detector = dlib.get_frontal_face_detector()
file_name = "pic1.JPG"
image = io.imread(file_name)
detected_faces = face_detector(image, 1)

#何件の顔が検出されたのか、コマンドに表示させます。
print("I found {} faces in the file {}".format(len(detected_faces), file_name))

save_image = cv2.imread(file_name, cv2.IMREAD_COLOR)

for i, face_rect in enumerate(detected_faces):
    #各顔の座標を表示させます
    print("- Face #{} found at Left: {} Top: {} Right: {} Bottom: {}".format(i, face_rect.left(), face_rect.top(), face_rect.right(), face_rect.bottom()))
    cv2.rectangle(save_image, tuple([face_rect.left(),face_rect.top()]), tuple([face_rect.right(),face_rect.bottom()]), (0, 0,255), thickness=2)
    cv2.imwrite('complete_'+file_name, save_image)

画像に対する処理は何も変わりません。
コマンド画面に座標や件数を表示させるコードを追加したので
とてもやさしい仕上がりになっています。

最初のものは、Pythonのソースが入っているディレクトリが
カレントディレクトリになっています。

当然処理により、ソースが入っているフォルダと
実際に処理するフォルダが異なることもあると思いますので
その際は、os.chdir()などで変更してあげてください。

以下、応用すればフォルダ内のすべての画像に実施することもできるはずです。
【Python】フォルダ内のすべての画像に対してOpenCVで顔検出を行う

コード自体とてもシンプルです。
私も、分解してみて、こんなにシンプルだったのかと驚きました。

ちなみに、これ今日(2018年10月02日)出来たことなので
pngファイルとか、そのほかの機能についてはまだ探り切れてません。

新しい発見をし次第、また追加していきたいと思います。

参考にさせていただいた記事
Python + dlibで顔検出を行う

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15