なじみのある顔:「典型的な」ポートレートを作成するためのアルゴリズム



投稿者:Andrei Sorokin、シニア開発者DataArt



昨年末に、画像処理におけるマシンビジョン手法に特化した研究開発プロジェクトを完了しました。 その結果、さまざまなテクノロジーを使用するIT専門家の平均的な肖像画を多数作成しました。 この記事では、「典型的な」Javaおよび.NETプログラマーのイメージ、適切なフレームワーク、およびこのプロセスの最適化について説明します。



私は大学院からマシンビジョンのテーマに興味がありました-私の博士号は手書きテキストの認識に専念していました。 過去数年にわたって、マシンビジョンの方法論とソフトウェアに大きな変化がありました。新しいツールとフレームワークが試してみました。 このプロジェクトでは、独自のソリューションを発明することを主張しませんでした-画像処理の最適化に主に貢献しました。



もちろん、「平均的な代表者」の肖像画を作成するというアイデアは、ユニークではありません。 たとえば、10月、Reddit osmutiarの著者は、プロ野球選手、バスケットボール選手、ゴルファーなどの中程度の肖像画を投稿しました。





この写真では、アメリカのMLB選手の1800の肖像と世界で最も活躍している500人のサッカー選手に基づいてosmitarによって作成された顔。



4年前、 女性と男性の魅力の研究が広く議論され、その間に科学者は異なる国籍の代表者の平均的な顔をモデル化しました。





実際、最後のイラストのポートレートは、追加の芸術的な処理を受けました。



私たちの主な研究は、同僚の写真でした。同僚の写真は、彼らの外観の特徴と、彼らの専門的な能力に関連する正式な属性に従ってグループ化することができました。





結果として、DataArtの「平均的な」男性同僚の肖像画。



合計で、内部時間追跡システムから取得した1,541人の男性と512人の女性を分析しました。 最初に遭遇した問題は、写真のサイズが小さい(80 x 120ピクセルしかない)ことと、撮影の基準がなかったことです。 写真の頭の回転と傾きはすべての人で異なっていました。当初、プログラムは927人の男性と85人の女性のポートレートでのみ顔を検出しました。 したがって、最初のことは、人の状況を正常化することでした。





頭を水平にする前後の写真。



サイズを大きくし、画像内のポイントを内挿した後、方向勾配ヒストグラム(HOG)メソッドに基づく検出器が起動されました。



アルゴリズムで前処理された顔を結合するために、カリフォルニア大学サンディエゴ校で働くインド系の研究者であるサティヤ・ムリクが提案した方法を使用しました。 サンプルの各顔で68のキーポイントを特定しました。目、眉、唇、鼻の角の座標です。 次に、これらのキーポイントによって各面を三角形分割しました。つまり、三角形に分割しました。





これは、三角形分割後の顔のパターンの外観です。





これは、平均的な顔モデルに従って、変換後の実際のポートレートの外観です。



最後に、サンプルのすべての面について、対応する三角形内のピクセルの色が平均化されました。



さらに、ソース画像のクラスタリングを見るのも面白かったです。 顔のグループを分離するために、N個の主成分のサンプルを使用して、画像記述子のスペクトル分析を使用しました。 特徴のマトリックス(MxN)(Mはサンプル数、Nは特徴ベクトルの成分数)はSVD分解されます。 固有ベクトルに対応する最大の固有値が選択され、残りのサンプルはこれらの上位N個のクラスターに分割されます(固有ベクトルによって定義されたクラスターの中心に「近い」)。 つまり、提示されたサンプルから、最も異なる5つのグループが選択されます。 次に、各グループから3つの画像が選択されます。 したがって、より少ないサンプルを使用することで、対照的な平均顔が得られますが、結果の画像内のすべてのクラスターが表示されます。 その結果、アルゴリズムによって選択された多くの典型的なポートレートを得ました。 画像は「顔なし」または互いにあまりにも類似していることが判明しませんでした。 十分な数の画像の単純なマージでは、これはほとんど避けられないでしょう。



結果





ジャワの少女 ジャワの少年 .NETガール .NETボーイ
クラスター分析を使用して取得されたポートレート(5つのクラスターのそれぞれの上位3つの面をマージすることにより)。
すべての.NETおよびJavaプログラマーのポートレートを単純にマージして撮影した画像。




画像の操作(画像ポイントの操作、アフィン変換、色の操作)のほとんどは、 opencvフレームワークに実装されたアルゴリズムを使用します。 顔の重要なポイントと顔自体を強調するために、画像はdlibフレームワークと事前に訓練されたモデルを使用して、 iBUG 300W画像コレクションでトレーニングされたshape_predictor_68_face_landmarks.datなどの顔の位置を評価します(ここではDavis Kingモデルのユーザーとして行動しました) つまり、単純に150 x 150ピクセルの画像をモデルの入力に送信し、出力で68ポイント(固定長のベクトル)を取得します。



Satya Mullikは最後の部分をPythonで実装しましたが、基本的にはC ++で書き直しました。 これにより、処理速度を向上させ、メモリ消費量を削減し、ソリューションの整合性を確保できました。



もう1つの問題は、すでに300個のイメージをマージするための大量のメモリ消費(> 4GB)でした。 Mullikが提案したマージのコードを分析することで解決しました。すべてのソースイメージは、マージ前に同時に読み取られました。 これは私たちには適していない可能性があります。この場合、読み取る必要があるのは1541個のファイルだけです。 画像のサイズがわずかに大きい場合、32 GBでは十分ではありません。 この問題は、コードを書き直し、次の読み取り画像をインクリメンタルマージすることで解決しました。 現在、使用されているメモリの量は100 MBを超えていません(顔の「キーポイント」の平均座標、1つの処理された画像、ロードされた分類子-fHOGおよびロードされたモデルのみ)。



All Articles