戦闘| DLIBは最速のスピードに顔認識の開発を使用する方法を学びますか?

GitHubのプロジェクト住所:
戦闘| DLIBは最速のスピードに顔認識の開発を使用する方法を学びますか?
https://github.com/xiaosongshine/dlib_face_recognition

1.背景

DLIBは、C ++開発に基づいて、深い学習オープンソースのツールであり、またTensorFlow PyTorchと同様の機能で、Pythonの開発・インタフェースをサポートしています。非常に良い顔の特徴抽出をサポートするためDLIBのためにしかし、そこに使用する開発者のための訓練を受けた顔の特徴抽出モデルがたくさんあるので、顔認識DLIBの男の顔のプロジェクト開発の開発に適しています。
上記認識の開発は、主に顔照合を参照して、2枚の顔画像を入力することで、代わって、0又は1の出力を比較するシステムが同一人物かどうかを決定します。一般的な顔認識は、単に顔の特徴1. 2.モデリングと(実際には、やはり1に分割することができる顔アライメント、等を含む)、顔の特徴検証モデルを開発するために分割することができます。DLIBの開発を使用している場合、我々は直接訓練された顔の特徴抽出モデルを使用することができ、主な仕事は、人の顔を確認する方法になります。
フェイス検証は、実際の類似度を計算して、同じ人が別の人が比較的小さくなり、大きな類似性になります。これは、ユークリッド距離やコサイン類似度算出した類似度を用いてもよいです。角度のコサイン類似度が算出され、それは、ユークリッド距離の二乗差を指します。2つの機能(距離)との間の類似性を表すために使用することができます。

構築する2.環境

インストールは、私のブログの記事を参照することができます:[深い学習ツール]・ミニマインストールDLIBの顔認識ライブラリ、注意すべき点については、以下の言った::
Windows10をインストールするためのこのブログの記事を、他のプラットフォームでは、インストールする手順を実行することができます
Minicondaをインストール

DLIBライブラリをインストールするには、conda命令を使用し、アナコンダはMinicondaを使用することができ、私はMiniconda、簡単な小さなメモリを使用しました。
推奨清華ソース、ダウンロード、インストール、適切なプラットフォームのバージョンを選択します。Pythonの== 3.6
インストールDLIB

注意一定要以管理员身份进入CMD,执行(如果是Linux Mac 就使用 sudo)

conda install -c conda-forge dlib
需要imageio 库,可以使用下述命令安装
conda install imageio

3.开发实战

1.实现人脸检测标记

face_test.py
import dlib
from imageio import imread
import glob
detector = dlib.get_frontal_face_detector()
win = dlib.image_window()
path = "f1.jpg"
img = imread(path)
dets = detector(img)
print('检测到了 %d 个人脸' % len(dets))
for i, d in enumerate(dets):
print('- %d:Left %d Top %d Right %d Bottom %d' % (i, d.left(), d.top(), d.right(), d.bottom()))
win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
dlib.hit_enter_to_continue()

代码很简单,通过imread读取照片,然后进行检测,输出结果为dets的list,有几张人脸就会有几个item, 每个item都有.left(), .top(), .right(), .bottom()四个元素,代表人脸框的四个边界位置。最后通过win.add_overlay(dets)可以将标记的框显示在原图上。
原始照片
戦闘| DLIBは最速のスピードに顔認識の開発を使用する方法を学びますか?

输出照片
戦闘| DLIBは最速のスピードに顔認識の開発を使用する方法を学びますか?

其实我们就可以使用这个功能做一个简单的应用,用来检测图片或者视频中人脸的个数。

2.人脸特征点提取

在实战1的基础上添加人脸特征提取功能。

import dlib
from imageio import imread
import glob
detector = dlib.get_frontal_face_detector()
win = dlib.image_window()
predictor_path = 'shape_predictor_68_face_landmarks.dat'
predictor = dlib.shape_predictor(predictor_path)
path = "f2.jpg"
img = imread(path)
dets = detector(img)
print('检测到了 %d 个人脸' % len(dets))
for i, d in enumerate(dets):
print('- %d: Left %d Top %d Right %d Bottom %d' % (i, d.left(), d.top(), d.right(), d.bottom()))
shape = predictor(img, d)
# 第 0 个点和第 1 个点的坐标
print('Part 0: {}, Part 1: {}'.format(shape.part(0), shape.part(1)))
win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
win.add_overlay(shape)
dlib.hit_enter_to_continue()

这段代码就是在test.py基础上加入了shape_predictor功能,使之可以在检测出人脸基础上,找到人脸的68个特征点。反映在图中就是蓝色的线。
原始图片
戦闘| DLIBは最速のスピードに顔認識の開発を使用する方法を学びますか?

输出图片
戦闘| DLIBは最速のスピードに顔認識の開発を使用する方法を学びますか?

注意运行这段代码需要这个文件predictor_path = 'shape_predictor_68_face_landmarks.dat',我会放在我的github中,方便大家下载使用。

3.人脸识别验证

在第二步的基础上,我们再进一步,实现将人脸提取为特征向量,从而我们就可以对特征向量进行比对来实现人脸的验证,这里采用的是对比欧式距离的方法。

face_recognition.py
import dlib
from imageio import imread
import glob
import numpy as np
detector = dlib.get_frontal_face_detector()
predictor_path = 'shape_predictor_68_face_landmarks.dat'
predictor = dlib.shape_predictor(predictor_path)
face_rec_model_path = 'dlib_face_recognition_resnet_model_v1.dat'
facerec = dlib.face_recognition_model_v1(face_rec_model_path)
def get_feature(path):
img = imread(path)
dets = detector(img)
print('检测到了 %d 个人脸' % len(dets))
# 这里假设每张图只有一个人脸
shape = predictor(img, dets[0])
face_vector = facerec.compute_face_descriptor(img, shape)
return(face_vector)
def distance(a,b):
a,b = np.array(a), np.array(b)
sub = np.sum((a-b)**2)
add = (np.sum(a**2)+np.sum(b**2))/2.
return sub/add
path_lists1 = ["f1.jpg","f2.jpg"]
path_lists2 = ["赵丽颖照片.jpg","赵丽颖测试.jpg"]
feature_lists1 = [get_feature(path) for path in path_lists1]
feature_lists2 = [get_feature(path) for path in path_lists2]
print("feature 1 shape",feature_lists1[0].shape)
out1 = distance(feature_lists1[0],feature_lists1[1])
out2 = distance(feature_lists2[0],feature_lists2[1])
print("diff distance is",out1)
print("same distance is",out2)
out1 = distance(feature_lists1[0],feature_lists1[1])
out2 = distance(feature_lists2[0],feature_lists2[1])

输出结果

检测到了 1 个人脸
检测到了 1 个人脸
检测到了 1 个人脸
检测到了 1 个人脸
feature 1 shape (128, 1)
diff distance is 0.254767715912
same distance is 0.0620976363391

各人物の顔が128次元ベクトルを抽出するため、我々は128次元座標(三次元のXYZ、寸法128は、シャフト128から構成されている)として理解することができ、それを見ることができ、我々はそれは、次の2つを計算することで行う必要があり距離機能がこの閾値よりも小さい適切な閾値を同一人物として識別される設定されています。このファイルが正しく=「dlib_face_recognition_resnet_model_v1.dat」をface_rec_model_pathコードを実行するために必要な、私は(自分のgithubのを入れている使用を容易にするために、https://github.com/xiaosongshine/dlib_face_recognitionで)
私たちは、上記の試験結果から見ることができ、異なる距離が同じ人のための0.25、0.06、あなたは間の値にしきい値を設定することができます。私は0.09に設定するためにここにいます、このしきい値はまた、最小と誤認の選択のためのガイドラインを計算するために大量のデータが必要となります。
今、私たちがしきい値0.09を設定し、テスト・システムは、異なる人を区別することができます。次のコードを追加しますface_recognition.py

def classifier(a,b,t = 0.09):
if(distance(a,b)<=t):
 ret = True
else :
 ret = False
return(ret)
print("f1 is 赵丽颖",classifier(feature_lists1[0],feature_lists2[1]))
print("f2 is 赵丽颖",classifier(feature_lists1[1],feature_lists2[1]))
print("赵丽颖照片.jpg is 赵丽颖测试.jpg",classifier(feature_lists2[0],feature_lists2[1]))

出力

f1 is 赵丽颖 False
f2 is 赵丽颖 False
赵丽颖照片.jpg is 赵丽颖测试.jpg True

上記からわかるように、基本的には、コードのしきい値を調整する実用的な最適化基準を継続する必要があるかのように、チューニングが最小誤差を識別するために、適切なしきい値を選択することで、人間の顔の間の機能の区別を満たしています。

人工知能の詳細についてはしたい
,,手紙Vに追加することができます。hcgx0904(備考「人工知能」)
をクリックし、「簡潔ディープラーニング&コンピュータビジョン」、学習を開始します!

おすすめ

転載: blog.51cto.com/14352303/2412881