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

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

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

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

ブログ    
ブログ    
ブログ    

推薦する

写真にピクセルレベルの透かしをひっそり追加: AI による芸術作品の「盗作」を防ぐ方法が発見されました

オープンソースのAI画像生成モデル「Stable Diffusion」のリリース以来、デジタルアート...

スタンフォード大学のマニング教授はAAAS特別号に記事を掲載した。「ビッグモデルは画期的な進歩となり、汎用人工知能に期待が寄せられている」

NLP は人工知能を刺激的な新時代へと導きます。現在、人工知能分野で最もホットな話題は、大規模モデ...

メタバースがますます熱を帯びる中、開発者はどのような主要テクノロジーを掘り下げていくべきでしょうか?

「メタバース」という概念は昨年、海外で爆発的に広まりました。国内の専門家も、我が国の関連技術の開発...

パーソナライズされた推奨事項は、馴染みのあるものに偏っていますか?アルゴリズムは公平性を侵害できない

北京日報によると、異なる消費者が同じ電子商取引プラットフォーム上で同じキーワードを使用して商品を検索...

...

海外のAIは使えない?国内お宝AIツール6選をシェア!

Chat GPTが普及して以来、さまざまなAIツールが次々と登場しました。AIの出現により、多くの...

...

必読 | AI 変革のための開発者ガイド

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

シティグループは5年以内に1万人の雇用を人工知能で置き換える計画

[[233047]]フィナンシャル・タイムズによると、シティグループは5年以内に投資銀行部門の技術・...

アルゴリズム | 再帰の深い理解、あなたは再帰を誤解しています

再帰は、プログラミングの本で説明するのが最も難しい部分である魔法のアルゴリズムです。これらの本では通...

顔認識は常に私たちのそばにあり、中秋節は「ハッピースキャン」から始まります

[[424699]]中秋節が近づいており、旅行の計画を立てている方も多いと思います。この特別な期間中...

面接官はガベージコレクションアルゴリズムについて質問するのが大好きです

[[438235]]この記事はWeChatの公開アカウント「Programmer Bus」から転載し...

2020年東京五輪の秘密兵器が暴露される:AIは計時を担当するだけでなく、審判員の職を失わせる

最近、2020年夏季オリンピックがついに2021年に開幕しました。 [[413267]]現在、我が国...

...

...