顔の特徴抽出
この記事では、主にdlibライブラリの顔の特徴認識機能を使用します。
dlibライブラリは、68個の特徴点を使用して顔の特徴をマークし、対応するシーケンスの特徴点を介して対応する顔の特徴を取得します。次の図は、68の特徴点を示しています。たとえば、言及したい
目の特徴を取り、37から46の特徴点を取得します。
対応する部分を直接呼び出すことにより、コードに同様のマッピングを追加します。
Python学习交流Q群:906715085##3
FACIAL_LANDMARKS_68_IDXS = OrderedDict([
("mouth", (48, 68)),
("right_eyebrow", (17, 22)),
("left_eyebrow", (22, 27)),
("right_eye", (36, 42)),
("left_eye", (42, 48)),
("nose", (27, 36)),
("jaw", (0, 17))])FACIAL_LANDMARKS_5_IDXS = OrderedDict([
("right_eye", (2, 3)),
("left_eye", (0, 1)),
("nose", (4))
データの前処理とモデルの読み込み
我们按照输入图像的要求对图像进行变形处理,这里需要转化为灰度图,加载get_frontal_face_detector模型和特征库进行检测。
Python学习交流Q群:906715085###
#加载人脸检测与关键点定位
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args["shape_predictor"])
#读取输入数据,预处理
image = cv2.imread(args["image"])
(h, w) = image.shape[:2]
width=500
r = width / float(w)
dim = (width, int(h * r))
image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#人脸检测rects = detector(gray, 1)
各面のキーポイントを反復処理します
抽出された顔の特徴点を予測し、顔の主要部分を見つけて、それをnp_arrayの形式に変換します。
shape = predictor(gray, rect)
shape = shape_to_np(shape)
各部分をトラバースし、操作用にコピーを作成し、画像上で現在検出されているカテゴリをマークします。
#遍历每一个部分
for (name, (i, j)) in FACIAL_LANDMARKS_68_IDXS.items():
clone = image.copy()
cv2.putText(clone, name, (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
識別された場所に従って、画像上に特徴点を描画します。
for (x, y) in shape[i:j]:
cv2.circle(clone, (x, y), 3, (0, 0, 255), -1)
顔の特徴が抽出されます。
(x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]]))
roi = image[y:y + h, x:x + w]
(h, w) = roi.shape[:2]
width=250
r = width / float(w)
dim = (width, int(h * r))
roi = cv2.resize(roi, dim, interpolation=cv2.INTER_AREA)
最後にそれを表示します。
cv2.imshow("ROI", roi)
cv2.imshow("Image", clone)
cv2.waitKey(0)
最終効果
元の画像
顔検出
すべての顔の特徴
重要な部品の検査