Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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で顔検出を行う

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away