OpenCVとdlibを使用したフェイスメッシュアプ​​リケーション

ソースノード: 1246086

この記事では、 OpenCV & dlib 〜へ 顔を抽出する 与えられた画像から、 両方の面をメッシュします。 つまり、XNUMX つの異なる画像から顔をメッシュ化しようとします。 事前トレーニングされたモデルを使用して、顔からランドマークを抽出します (68 個のランドマークの検出).

フェイスメッシュ - フェイスメッシュアプ​​リケーション

フェイスメッシュ応用の産業応用

Snapchat: Snapchat は、顔に複数のフィルターが適用されている今日の世代にとって楽しいアプリケーションである主要なアプリの XNUMX つです。同様に、この機能を Snapchat または同様のジャンルの他の主要なソフトウェアに追加して、より多くのユーザーを引き付けることもできます。これは、より多くのダウンロードを獲得するのに役立ちます。

拡張現実ソフトウェア: AR/VR は、一部のユースケースでこの特定の機能を使用して、デモンストレーションを行い、よりクリエイティブにすることもできます。

import cv2 import numpy as np import dlib PILからのインポートリクエスト import Image
フェイス メッシュ アプリケーション用の dlib
画像1

  1. ビジュアルスタジオをインストールする (最新バージョン) - こちらを参照してください .
  2. Visual Studio では、次のようにインストールする必要があります。 CMake パッケージ。
  3. Visual Studio からインストールした後、次のコマンドを使用して再度インストールする必要があります。 pip で CMake をインストールします。
  4. ここで最後の部分になります。次の手順で dlib をインストールする必要があります。 pipでdlibをインストールします。

事前トレーニング済みモデルをダウンロードする 形状予測子

https://github.com/tzutalin/dlib-android/raw/master/data/shape_predictor_68_face_landmarks.dat

次に、NumPy 配列からインデックスを抽出する関数を作成します。

# 配列からインデックスを抽出します def extract_index_nparray(nparray):index = None for num in nparray[0]:index = num ブレークリターンインデックス

次に、URL を使用してインターネットからソース画像を読み込み、サイズを変更します。

# URL からソース画像を読み取ります image1 = Image.open(requests.get('https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSx8Pu1tW1uCiZPfj9K1EL6uHxbg3bOKO9XkA&usqp=CAU', stream=True).raw) image1 = image1 .resize((300,300)) 画像1

出力:

フェイスメッシュアプ​​リケーション用のイメージ

 

ここでは、URL を使用してインターネットから宛先画像を読み込み、サイズを変更します。

# 読み込み先画像フォームのURL image2 = Image.open(requests.get('https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTYX1dyl9INRo5cbvDeTILRcZVzfcMsCsE0kg&usqp=CAU', stream=True).raw) image2 = image2 .resize((300,300)) 画像2

出力:

メッシュ アプリケーションの面のサイズを変更する

次に、画像を NumPy 配列に変換し、cv2 を使用してグレースケールに変換します。 ゼロを含むソース画像と同様の空の画像またはマスクを作成します。

# 画像を配列に変換し、グレースケールに変換します img = np.array(image1) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) Mask = np.zeros_like(img_gray) img2 = np.array(image2) img2_gray = cv2。 cvtColor(img2, cv2.COLOR_BGR2GRAY)

ゼロを含む空の画像を作成するには、まず dlib を使用して顔検出器と顔ランドマーク予測子をロードし、次に高さ、幅、チャネルを見つけます。

# 正面顔検出器と形状予測器の初期化 detecter = dlib.get_frontal_face_detector() detector = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") 高さ、幅、チャネル = img2.shape img2_new_face = np.zeros((高さ、幅、チャネル), np.uint8)

フェイスメッシュアプ​​リケーション用の画像の三角測量

画像の三角測量
画像2

まず、画像を検出器に渡す必要があります。その後、そのオブジェクトを使用して、予測器を使用してランドマークを抽出します。 その後、抽出したランドマーク(x、y)をランドマーク(リスト)に格納します。 顔を三角形にメッシュアップしていきます。 このステップは、顔交換の中核です。 ここでは、各三角形を宛先画像の対応する三角形と交換します。 宛先画像の三角形分割は、ソース画像の三角形分割と同じパターンを持つ必要があります。 これは、接続シンボルの接続が同じである必要があることを意味します。 したがって、ソース画像の三角形分割を行った後、その三角形分割から (x と y) のインデックスを取得し、宛先画像上で同じ三角形分割を複製できるようにします。 三角形のインデックスを取得したら、それらをループし、目的の面を三角形化します。

# 顔1
顔 = 顔内の顔の検出器(img_gray): ランドマーク = 予測子(img_gray, face) ランドマークポイント = [] 範囲(0, 68) の n: x = ランドマーク.パート(n).xy = ランドマーク.パート(n) .y landmarks_points.append((x, y)) ポイント = np.array(landmarks_points, np.int32) convexhull = cv2.convexHull(points) cv2.fillConvexPoly(mask, convexhull, 255) face_image_1 = cv2.bitwise_and(img,画像、マスク=マスク) # ドロネー三角形分割 rect = cv2.boundingRect(convexhull) subdiv = cv2.Subdiv2D(rect) subdiv.insert(landmarks_points) 三角形 = subdiv.getTriangleList() 三角形 = np.array(triangles, dtype=np.int32) Indexes_triangles = [] for t in三角形: pt1 = (t[0], t[1]) pt2 = (t[2], t[3]) pt3 = (t[4], t[5]) Index_pt1 = np.where((points = = pt1).all(axis=1))index_pt1 = extract_index_nparray(index_pt1)index_pt2 = np.where((points == pt2).all(axis=1))index_pt2 = extract_index_nparray(index_pt2)index_pt3 = np.where(( Points == pt3).all(axis=1)) Index_pt3 = extract_index_nparray(index_pt3) Index_pt1 が None ではなく、index_pt2 が None でなく、index_pt3 が None でない場合:トライアングル = [index_pt1,index_pt2,index_pt3]indexes_triangles.append(triangle)

三角形分割パターン – Delaunay 三角形分割

すべての三角形を切り取って巻き付けたら、 それらをリンクする必要があります。 それから私たちはしなければなりません 三角形分割パターンを使用して顔を再構築します唯一の違いは、今回はラップされた三角形を配置することです。

# 凸包分割により顔が正常に交換されます img2_face_mask = np.zeros_like(img2_gray) img2_head_mask = cv2.fillConvexPoly(img2_face_mask, convexhull2, 255) img2_face_mask = cv2.bitwise_not(img2_head_mask)

顔を置き換える準備ができました.

そこで、新しい顔と顔のない宛先画像を取得し、それらをリンクします。

img2_head_noface = cv2.bitwise_and(img2, img2,マスク=img2_face_mask) 結果 = cv2.add(img2_head_noface, img2_new_face)

最後に、面が正しく交換されました。次に、ソース イメージが宛先イメージに適合するように色をチェックする必要があります。

Opencv には、と呼ばれる組み込み関数があります。 「シームレスクローン」 この操作は自動的に行われます。 新しい面 (6 番目のステップで作成) を取得する必要があります。 元の宛先画像を取得し、それが顔を切り取るためのマスクであるため、顔の中央を取得する必要があります。

XNUMX つの顔のシームレスなクローンの作成

(x, y, w, h) = cv2.boundingRect(convexhull2) center_face2 = (int((x + x + w) / 2), int((y + y + h) / 2)) Seamlessclone = cv2.simlessClone (結果、img2、img2_head_mask、center_face2、cv2.NORMAL_CLONE)

最後に、出力された NumPy 画像を Pillow の Image オブジェクトに変換して視覚化します。

# 配列を画像に変換 Image.fromarray(simlessclone)

出力:

XNUMX つの顔のシームレスなクローンの作成

まとめ

まず、顔のランドマーク用の事前トレーニング済みモデルをダウンロードし、作業する画像をインターネットからダウンロードすることから始めました。 次に、CV2 と Dlib を使用して画像を前処理し、さまざまな機能を使用して、宛先画像の顔をソース画像と交換するという最終段階に到達しました。

このプロジェクトは、コンピューター ビジョンのさまざまな概念を学習し、理解するために使用できます。 このプロジェクトは、Snapchat などの拡張現実アプリケーションを構築するために使用できます。

さて、これで私からのまとめです!

残念

私の記事を読んでいただきありがとうございます 🙂

コンピューター ビジョンを使用した Face メッシュ アプリケーションのこの段階的な学習が気に入っていただければ幸いです。 次の記事では、flask-web アプリについて取り上げたいと思います。 それまで 幸せな学習!

これがレポです この記事に。

ここから、Analytics Vidhya -Blogathon で公開されている私の他の記事にアクセスできます ( )

LinkedIn で私とつながることができる場所で行き詰まった場合は、これを参照してください

私について

皆さんこんにちは、私は現在仕事中です in TCS 以前はデータ サイエンス アソシエイト アナリストとして働いていました in ゾルバコンサルティングインド。 フルタイムの仕事に加えて、私は同じ分野、つまりデータ サイエンスと、コンピューター ビジョン、機械学習、深層学習などの人工知能の他のサブセットに大きな興味を持っています。どのようなプロジェクトでもお気軽に協力してください。上記のドメイン (LinkedIn).

画像ソース

  1. 画像1: https://th.bing.com/th/id/R.17820239375ad0f8b4088a3d321a72aa?rik=cuc2p43UgbwIoA&riu=http%3a%2f%2fwww.learnopencv.com%2fwp-content%2fuploads%2f2017%2f06%2finstall-dlib-on-windows.jpg&ehk=3TU7GRqxkV7eHDMWY92oO3Gunn3QuNVYoktdQNS0QyM%3d&risl=&pid=ImgRaw&r=0
  2. 画像2: https://www.researchgate.net/profile/Marcelo-Amaral-2/publication/331984027/figure/download/fig1/AS:[メール保護]/The-dual-2-complex-for-the-triangulation-level-1-with-XNUMX-tetrahedrons-highlighting-the.ppm

この記事に示されているメディアは Analytics Vidhya が所有するものではなく、著者の裁量で使用されています。

出典: https://www.analyticsvidhya.com/blog/2021/10/face-mesh-application-using-opencv-and-dlib/

タイムスタンプ:

より多くの 分析Vidhya