MTCNNによる顔検出・特徴点抽出
MTCNNを使ってこんな感じのことをしたい。
これが、
こうなる。
- 1. インストール
- 2. MTCNNを使う
- 2.1. 画像準備
- 2.2. テスト
- 2.3. 顔領域の検出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15from 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. インストール
github_facenet-pytorchのQuick startによるとpipで簡単にインストールできる。
言われたとおりにする。
新しい環境を作って中に入る。
1 | conda create -n pip-facenet python=3.7 |
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 | from facenet_pytorch import MTCNN |
顔検出テスト、test.jpg
から顔部分だけが切り出されてout.jpg
として保存される。
正方形に引き伸ばされている。
デフォルトの引数はこんなかんじ。
1 | mtcnn = MTCNN( |
引数 | 詳細 |
---|---|
imagesize | 検出後の切り取り画像サイズ |
margin | 切り取り時の余白 |
min_face_size | 検出する最小の顔サイズ |
thresholds | 顔検出時の厳しさ、3つある理由は謎 |
factor | 顔検出時に使う謎のパラメータ |
post_process | Trueだと顔検出前に画像に前処理する |
select_largest | 画像内に顔がたくさんあるとき、Trueだと一番大きい顔、Falseだと一番顔っぽい顔を返す |
keep_all | Trueだと検出された顔を全て返す |
device | 計算するときのデバイス、NoneだとCPU、GPU使いたいときは’cuda:0’みたいに設定する |
2.3. 顔領域の検出
1 | from facenet_pytorch import MTCNN |
2.4. 顔特徴点の抽出
1 | from facenet_pytorch import MTCNN |
特徴点抽出
顔検出 + 特徴点抽出