Dlibを使用して顔検出 python

f:id:hanamichi_sukusuku:20210303201544p:plain

実行結果

f:id:hanamichi_sukusuku:20210303201612p:plain

captureディレクトリの画像データから顔検出して、faceディレクトリに検出した顔画像データを保存している。

 

DlibとはC++言語で書かれた汎用目的のクロスプラットフォームのライブラリで機械学習、画像処理、データマイニングなど幅広い分野の処理が可能。今回は顔検出に利用するが、opencvを用いた方法よりも誤検出が少ないのが特徴。

 

Dlibの顔検出に使用するインスタンス生成

detector = dlib.get_frontal_face_detector()

get_frontal_face_detector()を実行することでインスタンスを生成できる。

 

captureディレクトリに用意した画像ファイル名を全て取得し、顔検出を行う

files = glob.glob(indir+"/*")
for f in files:
 print(f)
 get_face(f)

get_face()関数に画像ファイル名を渡すことで、その画像から顔検出を行う。

 

get_face()関数、dlibのインスタンスを利用して顔検出を実行

f:id:hanamichi_sukusuku:20210303203516p:plain

golbal fidで保存するファイル名の変数をグローバル変数にする。今回は1000を定義しているので処理を行うごとにファイル名が1増えていく。

cv2.imread()で画像データ読み込み。

if flag_resize: では扱う画像データがデジカメなどの大きいものを使用する場合サイズをリサイズするための記述。今回はflag_resizeにFalseを定義しているので実行されない。

detector(img, 1)ではdlibのインスタンスを利用して顔の輪郭の座標を取得している。第一引数には顔検出する画像データ、第二引数には検出する最小領域のパラメーターを指定。デフォルトは0で、この場合80✖️80を最小領域として検出を行う。1の場合は40✖️40、2の場合は20✖️20となる。

pprint.pprintを使用すると、要素ごとに改行して見やすく表示してくれる。

dlibのインスタンスを利用して取得した座標データ(dets)の要素には左端からの座標、一番上からの座標、右側の座標、一番下からの座標が格納されており、left()、top()...とすることでそれぞれの値を取得できる。

img[y1:y2, x1:x2]それぞれ検出した顔の座標を元の画像から切り抜く。

try~except文でtryに例外が起きるかもしれないが実行したい処理、exceptに例外時の処理を記述。tryでは画像を50✖️50の画像データに変換している。exceptではcontinueで処理を飛ばしている。

最後にcv2.imwrite()が検出した画像データを保存し、次のファイル名に使用する変数fidの値を1加えて終了。