顔の特徴を検出するシンプルなディープラーニング手法を教えます

顔の特徴を検出するシンプルなディープラーニング手法を教えます

著者注: 携帯電話で、人の顔に特殊効果を加えるアプリを見たことがあるかもしれません。これらのアプリは、自撮り動画にかわいくて面白いオブジェクトを追加します。さらに面白いアプリの中には、表情を検出して対応するオブジェクトを自動的に選択するものもあります。この記事では、ディープラーニングを使用した表情検出の方法を紹介し、従来の検出方法についても簡単に紹介します。

以前は、目、鼻、口などの顔とその特徴を検出し、その形状から表情を抽出することさえ非常に困難でしたが、現在では、このタスクはディープラーニングによって「魔法のように」解決され、賢い若者なら誰でも数時間で実行できます。 Leifeng.com AI Technology Review がまとめたジョージア工科大学の学生 Peter Skvarenina 氏の記事では、この実装方法について紹介します。

「伝統的な」アプローチ(CLM)

あなたも私と同じように顔のトラッキング (この記事の場合、ウェブカメラを介して人の顔の動きをアニメキャラクターに同期させる) を行う必要があると仮定すると、これまでこのタスクに最適なアルゴリズムは Cambridge Face Tracker または OpenFace に基づく Local Constraint Model (CLM) であることが分かるでしょう。この方法では、検出タスクを、形状ベクトル特徴 (ASM) の検出、画像テンプレートのプディング (AAM)、および検出の最適化のための事前トレーニング済み線形 SVM の使用という複数のステップに分解します。

まず、キーポイントを大まかに推定し、次に部分的な顔情報を含む事前学習済み画像を使用して SVM 処理を行い、同時にキーポイントの位置を修正します。発生するエラーが要件を下回るまで、このプロセスを数回繰り返します。さらに、この方法では、Viola-Jones 検出器 (Haar カスケード) などを使用して、画像上の顔の位置が推定されていることを前提としていることにも留意する必要があります。しかし、この方法は非常に複雑で、高校生が簡単に実行できるものではありません。全体的な構造は次のとおりです。

ディープラーニング

記事の冒頭で述べた目標、つまりティーンエイジャーが顔検出を行えるようにするために、ディープラーニングの手法を紹介します。ここでは、非常に単純な畳み込みニューラル ネットワーク (CNN) を使用して、顔が含まれる画像から顔の重要な部分を検出します。これを実行するには、まずトレーニング データベースが必要です。ここでは、Kaggle が提供する 15 個のキー ポイントを含む Face Part Recognition Challenge のデータベース、または 76 個のキー ポイント (すごい!) を含むより複雑なデータベース MUCT を使用できます。

明らかに、質の高い画像トレーニング データベースは不可欠です。ここでは、卒業するためにこれらの画像に注釈を付けるために時間と労力を「犠牲にして」くれた「かわいそうな」学部生たちに敬意を表します。そのおかげで、私たちはこれらの興味深い実験を実施することができます。

Kaggle データベースに基づくバロック様式の顔と主要なポイントは次のようになります。

このデータベースは、グレースケールの 96 x 96 解像度の画像で構成されており、各目に 5 ポイント、鼻と口に 5 ポイントを含む 15 個のキー ポイントがあります。

どの画像でも、まず、Haar カスケード アーキテクチャに基づく前述の Viola-Jones 検出器を使用して顔を見つける必要があります (この実装をよく見ると、CNN の概念に似ていることがわかります)。さらに一歩進んで、完全畳み込みネットワーク (FCN) を使用して、画像セグメンテーションに深度予測を使用することもできます。

使用する方法に関係なく、OpenCV を使用すると簡単です。

  1. グレースケール画像 = cv2.cvtColor(画像、cv2.COLOR_RGB2GRAY)  
  2. フェイスカスケード =  
  3. cv2.CascadeClassifier('haarcascade_frontalface_default.xml'  
  4.  
  5. 境界ボックス =  
  6. face_cascade.detectMultiScale(グレースケール画像、1.25、6)

上記のコード行を使用すると、画像内の顔をフレームに収めることができます。

次に、返された顔ボックスごとに、対応するサブ画像を抽出し、グレースケール画像にサイズを変更して、96 * 96 に変換します。新しく生成された画像データは、完成した CNN ネットワークの入力になります。 CNN アーキテクチャでは、最も一般的な 5*5 畳み込み層 (実際には 3 つの層で、それぞれに 24、36、48 個の ReLU があります) が使用され、その後に 2 つの 3*3 畳み込み層 (それぞれに 64 個の ReLU があります) が続き、最後に 3 つの完全接続層 (500、90、30 個のユニットを含む) が続きます。過剰適合を回避するために最大プーリングが使用され、平滑化パラメータの数を減らすためにグローバル平均プーリングが使用されます。このアーキテクチャの最終的な出力は 30 個の浮動小数点数であり、これは 15 個のキー ポイントのそれぞれの x、y 座標値に対応します。

Keras の実装プロセスは次のとおりです。

  1. モデル = シーケンシャル()  
  2. モデルを追加します(BatchNormalization(input_shape=(96, 96, 1)))  
  3. model.add (Convolution2D(24, 5, 5, border_mode="同じ",  
  4. 初期化='he_normal'、入力形状=(96, 96, 1)、  
  5. dim_ordering = "tf"))  
  6. model.add(アクティベーション("relu"))  
  7. モデルを追加します(MaxPooling2D(pool_size=(2, 2), strides=(2, 2),  
  8. border_mode = "有効"  
  9. モデルを追加します(Convolution2D(36, 5, 5))
  10. model.add(アクティベーション("relu"))  
  11. モデルを追加します(MaxPooling2D(pool_size=(2, 2), strides=(2, 2),  
  12. border_mode = "有効"  
  13. モデルを追加します(Convolution2D(48, 5, 5))  
  14. model.add(アクティベーション("relu"))  
  15. モデルを追加します(MaxPooling2D(pool_size=(2, 2), strides=(2, 2),  
  16. border_mode = "有効"
  17. モデルを追加します(Convolution2D(64, 3, 3))  
  18. model.add(アクティベーション("relu"))  
  19. モデルを追加します(MaxPooling2D(pool_size=(2, 2), strides=(2, 2),  
  20. border_mode = "有効"  
  21. モデルを追加します(Convolution2D(64, 3, 3))  
  22. model.add(アクティベーション("relu"))  
  23. モデルを追加します(GlobalAveragePooling2D());  
  24. model.add (Dense(500, activation="relu"))  
  25. model.add (Dense(90, activation="relu"))  
  26. モデル.add (密(30))

損失関数と精度メトリックとして、ルート平均二乗伝播 (rmsprop) 最適化と平均二乗誤差 (MSE) を選択することもできます。入力画像に対してバッチ正規化とグローバル平均ポーリングを使用し、HE 正規重み初期化を行うだけで、80%~90% の検証精度が得られ、30 回のトレーニング エポックでエラー < 0.001 を達成できます。

  1. model.compile(オプティマイザー='rmsprop'、損失='mse'、メトリック=  
  2. ['正確さ'])  
  3. チェックポインター = ModelCheckpoint(ファイルパス='face_model.h5',  
  4. verbose=1、save_best_only= True )  
  5. エポック = 30  
  6. hist = model.fit(X_train, y_train, validation_split=0.2,  
  7. シャッフル= True 、エポック=epochs、バッチサイズ=20、コールバック=  
  8. [チェックポインタ]、詳細=1)

キーポイントの位置を予測するには、次のコマンドを実行するだけです。

  1. 特徴 = model.predict(領域、バッチサイズ=1)

OK! これで、顔の特徴を検出する方法がわかりました。

念のため、予測は 15 組の (x, y) 座標であり、次の画像で視覚化できます。

上記の操作でもニーズを満たせない場合は、次の手順を実行することもできます。

  • 精度を維持しながら推論速度を向上させながら、畳み込み層とフィルターの数を減らす方法を試します。
  • 転移学習を使用して畳み込み部分を置き換える(Xception が私のお気に入りです)
  • より詳細なデータベースの使用
  • 堅牢性を向上させるために高度な画像補正を行う

まだ簡単すぎると思うなら、3D 処理を学ぶことをお勧めします。Facebook と NVIDIA が顔認識と追跡を実行する方法を参考にすることができます。

さらに、学んだことを活用して、新しくてエキサイティングなこと(ずっとやりたかったけどやり方がわからなかったこと)を行うことができます。

  • ビデオチャット中に、サングラス、面白い帽子、ひげなど、面白い写真を相手の顔に付けます。
  • 自分の顔や友達の顔、動物、物などの顔を交換します。
  • 新しいヘアスタイル、ジュエリー、メイクアップを使った製品テストをセルフィーライブビデオで実施。
  • 従業員が飲酒により特定の業務を遂行できないかどうかを確認します。
  • 人々のフィードバック表現から現在人気のある表現を抽出します。
  • 生成的敵対的ネットワーク (GAN) を使用して、リアルタイムで顔を漫画に変換し、ネットワークを使用してリアルタイムの顔と漫画のアニメーション表現を同期します。

さて、これで独自のビデオチャット フィルターを作成する方法がわかりました。楽しいフィルターを作ってみましょう。

<<:  人間が理解できる音声を合成するために、機械はどのような「ディープラーニング」を行っているのでしょうか?

>>:  IEEEの論文では、画像強調を実現するための放射状変換を提案している

ブログ    

推薦する

MLOpsの助けにより、AIは開発の黄金期を迎えることになる

12月21日、デロイトコンサルティングが最近発表したレポートでは、企業が一貫した機械学習運用(MLO...

...

最初のRISC-Vラップトップが公開される、またはWindowsシステムが搭載されると思われますが、年末までに利用可能になりますか

チップ業界では、Armとx86が現在の主流のアーキテクチャであり、オープンなRSIC-Vが将来の方向...

OpenAI: LLMはテストを受けていることを感知し、合格するために情報を隠して人間を騙す | 対策も添付

AIはここまでの発展を経て意識を獲得したのでしょうか?数日前、チューリング賞受賞者のベンジオ氏が参加...

PyTorch ガイド: ディープラーニング モデルのトレーニングを高速化する 17 のヒント!

PyTorch でディープラーニング モデルをトレーニングする場合、モデルのトレーニングを高速化す...

企業は従業員がChatGPTを使用することで生じるセキュリティリスクに注意を払う必要がある

ChatGPT のバイラルな成功により、テクノロジー企業間で AI 製品を市場に投入するための激しい...

...

...

5四半期連続で前年同期比で減少: AIはデルの危機を逆転できるか?

企業の時代はなく、時代の企業だけがある!新たなトレンドに直面しても、古い大手企業は反応が遅く、固定観...

Google、金融機関の内部リスク警告の精度を2~4倍に高められるAIマネーロンダリング対策ツールをリリース

Googleは6月27日、生成AIを組み合わせてマネーロンダリング対策ツール「AML AI」をリリー...

...

2020年のコロナウイルスパンデミックが仕事の未来に与える影響

[[323304]] [51CTO.com クイック翻訳] 疫病の影響により、多くの企業従業員がリモ...

AIストレージプラットフォームが機械学習とデータ分析のニーズを満たす方法

機械学習と AI タスクの実行方法や環境内でのデータの収集方法に応じて、組織はどの AI ストレージ...

...

AIはどんどん強くなってきていますが、人間は恐れるべきでしょうか?実は、ロボットに置き換えられるよりも大きな危機があるのです。

人工知能は急速に発展しており、多くの人が脅威を感じています。しかし実際には、取って代わられることを心...