顔認識を使用してアバターにマスクとゴーグルを自動的に追加する方法

顔認識を使用してアバターにマスクとゴーグルを自動的に追加する方法

アバターにマスクとゴーグルを追加する

プロジェクトアドレス: 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 ライブラリをインポートしてメイン ページを構築します。

  1. FlaskからFlaskをインポート 
  2. フラスコのインポートリクエストから 
  3. Flaskからrender_templateをインポートする 
  4. @app.route('/',メソッド=['GET', 'POST'])  
  5. デフインデックス():  
  6. render_template('index.html') を返します  
  7. ----------------------  
  8. __name__ == '__main__' の場合:  
  9. アプリの実行()

当社のサーバーでは画像ファイルのアップロードのみが許可され、画像はキャッシュされないことに注意してください (ユーザーは他のマスクを選択して再作成できます)。そのため、次のように設定する必要があります。

  1. アプリ= Flask (__name__)  
  2. # 画像キャッシュをキャンセル 
  3. app.config['SEND_FILE_MAX_AGE_DEFAULT'] = timedelta(= 1 )  
  4. ALLOWED_EXTENSIONS =設定(['bmp', 'png', 'jpg', 'jpeg'])  
  5. UPLOAD_FOLDER = r './cache/'    
  6. app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER  
  7. def allowed_file(ファイル名):  
  8. ファイル名に「.」を返し、\  
  9. ALLOWED_EXTENSIONS内のfilename.rsplit('.', 1)[1]

当社の Web サーバーには 2 つのルートが含まれています。

  1. /url /追加

url は貼り付けられた画像のアドレスで、サーバーは自動的に画像をダウンロードします。add はユーザーが手動で画像をアップロードするためのものです (ユーザーが手動で画像をアップロードする必要がある場合は、requests ライブラリを導入する必要はありません)。

ルート追加機能のコードは次のとおりです。

  1. @app.route('/add',メソッド=['GET', 'POST'])  
  2. デフ検索():  
  3. request.method == 'POST'の場合:  
  4. ファイル= request.files ['画像']  
  5. モード= (int)(request.form['mask'])  
  6. isGoggle =リクエスト.form.get('goggle')  
  7. ファイルと allowed_file(file.filename) の場合:  
  8. パス= os .path.join(app.config['UPLOAD_FOLDER'], file.filename)  
  9. file.save(パス)  
  10. 出力= add (パス、ファイル.ファイル名、モード、isGoggle)  
  11. render_template を返します('index.html'、出力output = output)  
  12. それ以外:  
  13. return render_template('index.html', alert = 'ファイルタイプは画像でなければなりません!' )  
  14. それ以外:  
  15. render_template('index.html') を返します

次に、テンプレート内の index.html ファイルを設定します。詳細なコードについては、Github プロジェクトに移動してください。

顔認識

これで、Web サーバーの設定は完了です。次に、画像を処理するためのバックエンド コードの作成を始めましょう。 dlib および opencv ライブラリをインポートします。

  1. cv2をインポート 
  2. dlibをインポートする 
  3. numpyをnpとしてインポートする 
  4. インポートOS

トレーニング済みの Dlib 前方顔検出器 detector = dlib.get_frontal_face_detector() を使用して顔を検出し、'models/shapepredictor68facelandmarks.dat' を使用して口の 20 個の特徴点 (40 次元の特徴) の座標を抽出します。

  1. def get_mouth(画像):  
  2. img_gray = cv2.cvtColor (画像、cv2.COLOR_BGR2GRAY)  
  3. 検出器= dlib.get_frontal_face_detector ()  
  4. 予測子= dlib.shape_predictor ('models/shape_predictor_68_face_landmarks.dat')  
  5. =検出器(img_gray, 0)  
  6. enumerate(faces) の k, d について:  
  7. x = []  
  8. y = []  
  9. # 顔の大きさの高さ 
  10. 高さ= d.bottom () - d.top()  
  11. # 顔のサイズの幅 
  12. = d.right() - d.left()  
  13. 形状=予測子(img_gray, d)  
  14. 唇用#49-68  
  15. iが範囲(48, 68)内にある場合:  
  16. x.append(shape.part(i).x)  
  17. y.append(shape.part(i).y)
  18.   # 顔の大きさに合わせてマスクに対応するリップの面積を拡大 
  19. y_max = (int)(max(y) + 高さ / 3)  
  20. y_min = (int)(min(y) - 高さ / 3)  
  21. x_max = (int)(max(x) + 幅 / 3)  
  22. x_min = (int)(min(x) - 幅 / 3)  
  23. サイズ= ((x_max-x_min),(y_max-y_min))  
  24. x_min、x_max、y_min、y_max、サイズを返す

同じ方法で、顔の目の特徴を抽出します。

  1. get_eye(画像):  
  2. img_gray = cv2.cvtColor (画像、cv2.COLOR_BGR2GRAY)  
  3. 検出器= dlib.get_frontal_face_detector ()  
  4. 予測子= dlib.shape_predictor ('models/shape_predictor_68_face_landmarks.dat')  
  5. =検出器(img_gray, 0)  
  6. enumerate(faces) の k, d について:  
  7. x = []  
  8. y = []  
  9. 高さ= d.bottom () - d.top()  
  10. = d.right() - d.left()  
  11. 形状=予測子(img_gray, d)  
  12. iが範囲(36, 48)内にある場合:  
  13. x.append(shape.part(i).x)  
  14. y.append(shape.part(i).y)  
  15. y_max = (int)(max(y) + 高さ / 3)  
  16. y_min = (int)(min(y) - 高さ / 3)  
  17. x_max = (int)(max(x) + 幅 / 3)  
  18. x_min = (int)(min(x) - 幅 / 3)  
  19. サイズ= ((x_max-x_min),(y_max-y_min))  
  20. x_min、x_max、y_min、y_max、サイズを返す

唇と目の位置を特定した後、OpenCV を使用して透明な背景マスクとゴーグルのマテリアルを処理し、背景を白に変換します。

  1. img2 = cv2.imread ('masks/goggle.png', cv2.IMREAD_UNCHANGED)  
  2. img2 = cv2.resize (img2,サイズ)  
  3. アルファチャンネル= img2 [:, :, 3]  
  4. _、マスク= cv2.threshold (alpha_channel、220、255、cv2.THRESH_BINARY)  
  5. =画像2 [:, :, :3]  
  6. img2 = cv2.bitwise_not (cv2.bitwise_not(色、マスクマスク= マスク))

次に、画像の融合を実行し、取得した唇と目の位置にマスクとゴーグルを追加します。

  1. x_min、x_max、y_min、y_max、サイズ= get_eye (img1)  
  2. 行、チャネル= img2.shape  
  3. roi = img1 [y_min: y_min + 行、x_min: x_min + 列]  
  4. img2gray = cv2.cvtColor (img2、cv2.COLOR_BGR2GRAY)  
  5. ret、マスク= cv2.threshold (img2gray、254、255、cv2.THRESH_BINARY)  
  6. mask_inv = cv2.bitwise_not (マスク)  
  7. img1_bg = cv2.bitwise_and (roi,roi,マスクマスク= マスク)  
  8. img2_fg = cv2.bitwise_and (img2、img2、マスク= mask_inv )  
  9. dst = cv2.add (img1_bg、img2_fg)を使います。  
  10. img1[y_min: y_min + 行、x_min:x_min + 列] = dst

この時点で、顔認識にマスクとゴーグルを追加するコードが正常に完了しました。

デモ 😷

プロジェクトが完了したら、

Web サーバーを実行するのは、1 つのコマンドと同じくらい簡単です。

  1. $ python3 サーバー.py

次に、127.0.0.1:5000 (ポート 5000) にアクセスします。

ここでサポートされているモードは 2 つあります。1 つは URL アドレスを入力するモード、もう 1 つは画像を直接アップロードするモードです。

現在、マスクは次のタイプをサポートしています。

例えば:

元の画像:

マスクとゴーグルを追加します。

元の画像:

マスクを追加します:

ありがとう🙏

最前線で戦ってくださっている医療従事者の方々に感謝、そして春節の旅行ラッシュで逆風の中頑張ってくださっている方々に感謝!

<<:  AIのための大規模ストレージインフラストラクチャの要件

>>:  適切な AI データ ストレージを選択するための 6 つのガイドライン

ブログ    
ブログ    
ブログ    

推薦する

機械学習 = 「新しいボトルに入った古いワイン」の統計?いいえ!

最近、ディープラーニングと人工知能に関するジョークがソーシャルメディア上で広く流布しており、この2つ...

デジタルトランスフォーメーションにおけるAIビッグモデルの現状と役割を客観的に見る

「デジタル変革における AI ビッグモデルの役割は、『データ中心のビジネス変革の 3 つのパラダイム...

...

5G自動運転はどのようなものになるのでしょうか?韓国のテストではこの結果が出た

自動運転と5Gの産業発展は大きな注目を集めており、韓国企業は最近、両者を組み合わせた効果を模索してい...

国産ディープラーニングフレームワーク「MegEngine」が3月末にオープンソース化

2020 年にどのディープラーニング フレームワークを選択すべきでしょうか?今、新たな選択肢がありま...

「AI+」が世界を変える!さまざまな分野における 5 つの主要な AI トレンド

人工知能は現代世界で最も注目され、最も議論されているトピックであり、20年後には人々の世界観を変える...

学者がインテリジェンス、モデルとデータAI、デジタルトランスフォーメーションについて語る。このAIイベントには技術的な内容が含まれている。

2022年、学者たちは人工知能の将来の発展をどのように見ているのでしょうか?将来、AI はモデル駆...

...

顔認識の時代の準備はできていますか?

[51CTO.comからのオリジナル記事] 近年、生体認証技術はますます成熟し、私たちの生活の中に...

デアデビルが来た!バットセンスAIは、スマートフォンが音を聞いて3D画像を生成できるようにする

英国の科学者たちは、スマートフォンやノートパソコンなどの日常的な物に、デアデビルと同じくらい強力なコ...

人工知能を使ってエッセイを採点するのは信頼できると思いますか?

現在、5Gは世界的な注目を集めていますが、人工知能の開発は依然として力強いままです。各分野における技...

産業オートメーションにおけるコンピュータビジョンの応用と利点

コンピューター ビジョンは、製造および生産プロセスを自動化および最適化して、効率を高め、製品の品質を...

パロアルトネットワークス:AIを使ってAIと戦うことは、ネットワークセキュリティ技術の発展における避けられないトレンドです

「 AI攻撃を阻止するために人力を使うことはできません。AIと戦うにはAIを使わなければなりません。...

電子商取引の製品推奨におけるディープラーニングの応用

[[201999]] 1. 共通アルゴリズムルーチン電子商取引業界では、ユーザーへの商品推奨は常に非...