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

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

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

以前は、目、鼻、口などの顔とその特徴を検出し、その形状から表情を抽出することさえ非常に困難でしたが、現在では、このタスクはディープラーニングによって「魔法のように」解決され、賢い若者なら誰でも数時間で実行できます。 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の論文では、画像強調を実現するための放射状変換を提案している

ブログ    
ブログ    

推薦する

...

図解された Raft コンセンサス アルゴリズム: ログを複製する方法は?

[[402526]]ラフトログフォーマットRaft アルゴリズムでは、分散一貫性を実現するために必...

...

...

3つのシナリオは、人工知能が新しい小売業に力を与える方法を示しています

1950年代以降、人工知能は長年にわたり浮き沈みを経験し、ビジネスシーンで継続的に試されてきました。...

2024 年のテクノロジー トレンド - 企業は今から準備を始める必要があります。

2023 年の主流のテクノロジートレンドが人工知能、より具体的には生成 AI に重点を置くことは間...

...

科学者らが世界最小の「カニ」遠隔操作歩行ロボットを公開。ノミよりも小さい

最近、米国ノースウェスタン大学のエンジニアたちが、小さくてかわいいカニの形をした、史上最小の遠隔操作...

人工知能が再び警告を発する!研究者は懸念している:将来、研究者が全てを支配することになる

人間と超人工知能の関係の発展は、長年にわたり話題となっている。少し前に、「人工知能研究ジャーナル」で...

彼女はマスクとビットコインへの多額の投資により伝説となった! 2021年のトップ10テクノロジートレンドを発表

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

茅面映画の李明輝氏:興行収入予測における機械学習の実用化

[51CTO.comより引用] 近年、わが国の興行収入市場は飛躍的に成長し、2011年には150億ド...

ゼロサンプルのパフォーマンスが小サンプルのパフォーマンスを上回り、Google の新しい 1370 億パラメータ モデルは GPT-3 よりも強力

[[422681]] NLP の分野では、事前トレーニングの微調整とプロンプトチューニングの手法に...

人工知能応用シナリオのレビューと展望

2020 年は特別で忘れられない年であり、人工知能にとっても同じことが言えます。 [[374502]...

【ビッグネーム登場、第2話】快溝タクシーの知能進化への道

インテリジェントな注文発送システムをゼロから構築するように依頼され、1 日の注文数が 40 万件だと...