アバターにマスクとゴーグルを追加する プロジェクトアドレス: https://github.com/Evilran/add-mask-and-goggle 序文 2020年の新型コロナウイルス肺炎が武漢で発生し、感染防止のため誰もがマスクを着用した。友達の輪も例外ではありません。多くのユーザーがアバターにマスクを付けていますが、写真の中でマスクの位置を調整するのに多くの時間がかかります。では、顔認識によってアバターにマスクやゴーグルを自動的に追加するにはどうすればよいでしょうか? このプロジェクトは、顔認識技術を使ってアバターにマスクやゴーグルを自動的に追加し、皆さんにマスクやゴーグルを積極的に着用して、武漢と最前線で戦う医療従事者を応援するよう呼びかけるものです! 依存関係 🐍 始める前に、python3 に次のパッケージをインストールする必要があります。 - numpy == 1.17.4 です
- フラスコ>=1.0.0
- リクエスト==2.22.0
- opencv-python == 4.0.0.21 です
- dlib==19.17.99
Flask はプロジェクト用のシンプルな Web サーバーを提供し、dlib は顔と唇と目 (マスクの位置を提供) を認識するために使用され、opencv ライブラリは顔の唇にマスク マテリアルを追加し、顔の目にゴーグルを追加できます。 Webサーバーを構築する まず、Flask ライブラリをインポートしてメイン ページを構築します。 - FlaskからFlaskをインポート
- フラスコのインポートリクエストから
- Flaskからrender_templateをインポートする
- @app.route('/',メソッド=['GET', 'POST'])
- デフインデックス():
- render_template('index.html') を返します
- ----------------------
- __name__ == '__main__' の場合:
- アプリの実行()
当社のサーバーでは画像ファイルのアップロードのみが許可され、画像はキャッシュされないことに注意してください (ユーザーは他のマスクを選択して再作成できます)。そのため、次のように設定する必要があります。 - アプリ= Flask (__name__)
- # 画像キャッシュをキャンセル
- app.config['SEND_FILE_MAX_AGE_DEFAULT'] = timedelta(秒= 1 )
- ALLOWED_EXTENSIONS =設定(['bmp', 'png', 'jpg', 'jpeg'])
- UPLOAD_FOLDER = r './cache/'
- app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
- def allowed_file(ファイル名):
- ファイル名に「.」を返し、\
- ALLOWED_EXTENSIONS内のfilename.rsplit('.', 1)[1]
当社の Web サーバーには 2 つのルートが含まれています。 - /url /追加
url は貼り付けられた画像のアドレスで、サーバーは自動的に画像をダウンロードします。add はユーザーが手動で画像をアップロードするためのものです (ユーザーが手動で画像をアップロードする必要がある場合は、requests ライブラリを導入する必要はありません)。 ルート追加機能のコードは次のとおりです。 - @app.route('/add',メソッド=['GET', 'POST'])
- デフ検索():
- request.method == 'POST'の場合:
- ファイル= request.files ['画像']
- モード= (int)(request.form['mask'])
- isGoggle =リクエスト.form.get('goggle')
- ファイルと allowed_file(file.filename) の場合:
- パス= os .path.join(app.config['UPLOAD_FOLDER'], file.filename)
- file.save(パス)
- 出力= add (パス、ファイル.ファイル名、モード、isGoggle)
- render_template を返します('index.html'、出力output = output)
- それ以外:
- return render_template('index.html', alert = 'ファイルタイプは画像でなければなりません!' )
- それ以外:
- render_template('index.html') を返します
次に、テンプレート内の index.html ファイルを設定します。詳細なコードについては、Github プロジェクトに移動してください。 顔認識 これで、Web サーバーの設定は完了です。次に、画像を処理するためのバックエンド コードの作成を始めましょう。 dlib および opencv ライブラリをインポートします。 - cv2をインポート
- dlibをインポートする
- numpyをnpとしてインポートする
- インポートOS
トレーニング済みの Dlib 前方顔検出器 detector = dlib.get_frontal_face_detector() を使用して顔を検出し、'models/shapepredictor68facelandmarks.dat' を使用して口の 20 個の特徴点 (40 次元の特徴) の座標を抽出します。 - def get_mouth(画像):
- img_gray = cv2.cvtColor (画像、cv2.COLOR_BGR2GRAY)
- 検出器= dlib.get_frontal_face_detector ()
- 予測子= dlib.shape_predictor ('models/shape_predictor_68_face_landmarks.dat')
- 顔=検出器(img_gray, 0)
- enumerate(faces) の k, d について:
- x = []
- y = []
- # 顔の大きさの高さ
- 高さ= d.bottom () - d.top()
- # 顔のサイズの幅
- 幅= d.right() - d.left()
- 形状=予測子(img_gray, d)
- 唇用#49-68
- iが範囲(48, 68)内にある場合:
- x.append(shape.part(i).x)
- y.append(shape.part(i).y)
- # 顔の大きさに合わせてマスクに対応するリップの面積を拡大
- y_max = (int)(max(y) + 高さ / 3)
- y_min = (int)(min(y) - 高さ / 3)
- x_max = (int)(max(x) + 幅 / 3)
- x_min = (int)(min(x) - 幅 / 3)
- サイズ= ((x_max-x_min),(y_max-y_min))
- x_min、x_max、y_min、y_max、サイズを返す
同じ方法で、顔の目の特徴を抽出します。 - get_eye(画像):
- img_gray = cv2.cvtColor (画像、cv2.COLOR_BGR2GRAY)
- 検出器= dlib.get_frontal_face_detector ()
- 予測子= dlib.shape_predictor ('models/shape_predictor_68_face_landmarks.dat')
- 顔=検出器(img_gray, 0)
- enumerate(faces) の k, d について:
- x = []
- y = []
- 高さ= d.bottom () - d.top()
- 幅= d.right() - d.left()
- 形状=予測子(img_gray, d)
- iが範囲(36, 48)内にある場合:
- x.append(shape.part(i).x)
- y.append(shape.part(i).y)
- y_max = (int)(max(y) + 高さ / 3)
- y_min = (int)(min(y) - 高さ / 3)
- x_max = (int)(max(x) + 幅 / 3)
- x_min = (int)(min(x) - 幅 / 3)
- サイズ= ((x_max-x_min),(y_max-y_min))
- x_min、x_max、y_min、y_max、サイズを返す
唇と目の位置を特定した後、OpenCV を使用して透明な背景マスクとゴーグルのマテリアルを処理し、背景を白に変換します。 - img2 = cv2.imread ('masks/goggle.png', cv2.IMREAD_UNCHANGED)
- img2 = cv2.resize (img2,サイズ)
- アルファチャンネル= img2 [:, :, 3]
- _、マスク= cv2.threshold (alpha_channel、220、255、cv2.THRESH_BINARY)
- 色=画像2 [:, :, :3]
- img2 = cv2.bitwise_not (cv2.bitwise_not(色、マスクマスク= マスク))
次に、画像の融合を実行し、取得した唇と目の位置にマスクとゴーグルを追加します。 - x_min、x_max、y_min、y_max、サイズ= get_eye (img1)
- 行、列、チャネル= img2.shape
- roi = img1 [y_min: y_min + 行、x_min: x_min + 列]
- img2gray = cv2.cvtColor (img2、cv2.COLOR_BGR2GRAY)
- ret、マスク= cv2.threshold (img2gray、254、255、cv2.THRESH_BINARY)
- mask_inv = cv2.bitwise_not (マスク)
- img1_bg = cv2.bitwise_and (roi,roi,マスクマスク= マスク)
- img2_fg = cv2.bitwise_and (img2、img2、マスク= mask_inv )
- dst = cv2.add (img1_bg、img2_fg)を使います。
- img1[y_min: y_min + 行、x_min:x_min + 列] = dst
この時点で、顔認識にマスクとゴーグルを追加するコードが正常に完了しました。 デモ 😷 プロジェクトが完了したら、 Web サーバーを実行するのは、1 つのコマンドと同じくらい簡単です。 - $ python3 サーバー.py
次に、127.0.0.1:5000 (ポート 5000) にアクセスします。 ここでサポートされているモードは 2 つあります。1 つは URL アドレスを入力するモード、もう 1 つは画像を直接アップロードするモードです。 現在、マスクは次のタイプをサポートしています。 例えば: 元の画像: マスクとゴーグルを追加します。 元の画像: マスクを追加します: ありがとう🙏 最前線で戦ってくださっている医療従事者の方々に感謝、そして春節の旅行ラッシュで逆風の中頑張ってくださっている方々に感謝! |