Windows10 + Anaconda で facenet-pytorchからMTCNNを使用する

Windows10 + Anaconda で facenet-pytorchからMTCNNを使用する

MTCNNによる顔検出・特徴点抽出

MTCNNを使ってこんな感じのことをしたい。



これが、



こうなる。

1. インストール

github_facenet-pytorchのQuick startによるとpipで簡単にインストールできる。
言われたとおりにする。

新しい環境を作って中に入る。

1
2
conda create -n pip-facenet python=3.7
conda activate pip-facenet

1.1. pytorchをインストール

Pytorch公式ページで自分の環境を伝えるとコマンドを教えてくれる。



今回はWindows、pip、Python、CUDA:None(GPUを使わない=CPU)を選択。
表示されたコマンドを打ち込む。

1
pip install torch==1.2.0+cpu torchvision==0.4.0+cpu -f https://download.pytorch.org/whl/torch_stable.html

1.2. facenet-pytorchをインストール

1
pip install facenet-pytorch

おわり。

2. MTCNNを使う

2.1. 画像準備

自動生成した顔を落とせるところでダウンロードしたフリー顔画像でテスト。



これを使う。

2.2. テスト

1
2
3
4
5
6
7
from facenet_pytorch import MTCNN
from PIL import Image

img_path = "test.jpg"
img = Image.open(img_path)
mtcnn = MTCNN()
face = mtcnn(img, save_path="out.jpg")

顔検出テスト、test.jpgから顔部分だけが切り出されてout.jpgとして保存される。
正方形に引き伸ばされている。



デフォルトの引数はこんなかんじ。

1
2
3
4
5
6
7
8
9
10
mtcnn = MTCNN(
image_size=160,
margin=0,
min_face_size=20,
thresholds=[0.6, 0.7, 0.7],
factor=0.709,
post_process=True,
select_largest=True,
keep_all=False,
device=None)
引数詳細
imagesize検出後の切り取り画像サイズ
margin切り取り時の余白
min_face_size検出する最小の顔サイズ
thresholds顔検出時の厳しさ、3つある理由は謎
factor顔検出時に使う謎のパラメータ
post_processTrueだと顔検出前に画像に前処理する
select_largest画像内に顔がたくさんあるとき、Trueだと一番大きい顔、Falseだと一番顔っぽい顔を返す
keep_allTrueだと検出された顔を全て返す
device計算するときのデバイス、NoneだとCPU、GPU使いたいときは’cuda:0’みたいに設定する

2.3. 顔領域の検出

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from facenet_pytorch import MTCNN
from PIL import Image, ImageDraw

img_path = "test1.jpg"
img = Image.open(img_path)
mtcnn = MTCNN()

# 顔領域、顔っぽさ、特徴点のリストを取得、顔が1つなら長さ1
boxes, probs, points = mtcnn.detect(img, landmarks=True)

# PIL Imageに絵を描く
img_draw = img.copy()
draw = ImageDraw.Draw(img_draw)
draw.rectangle(boxes[0].tolist(), width=5)
img_draw.save('out2.png')


2.4. 顔特徴点の抽出

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from facenet_pytorch import MTCNN
from PIL import Image, ImageDraw

img_path = "test1.jpg"
img = Image.open(img_path)
mtcnn = MTCNN()

# 顔領域、顔っぽさ、特徴点のリストを取得、顔が1つなら長さ1
boxes, probs, points = mtcnn.detect(img, landmarks=True)

# PIL Imageに絵を描く
img_draw = img.copy()
draw = ImageDraw.Draw(img_draw)

for p in points[0]:
pointlist = (p - 5).tolist() + (p + 5).tolist()
draw.rectangle(pointlist, width=10)

img_draw.save('out3.png')

img_draw.crop(boxes[0].tolist())

img_draw.save('out4.png')


特徴点抽出



顔検出 + 特徴点抽出

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×