OpenCVと画像処理

おはようございます。 気配りのある読者は、ロシア市場でコンピュータービジョンをテーマにした翻訳本が再びハッキングされたことに気付きました。 次の本に興味がありましたが、仕方がありませんでした。









コンピュータービジョンテクノロジーは主にPythonとC ++の両方に関連付けられているため、両方の言語の解析タスクとコードを含む記事を選択しました。 さらに、私たちはあなたがカットの下の女の子を好きになることを心から願っています。



この記事では、OpenCVライブラリー(C ++ / Python)を使用して平均的な顔画像を生成する方法を説明します。









1



図に描かれている女性 1、ほとんどの読者はそれをかなり見つけるでしょう。 しかし、あなたは彼女の国籍を推測できますか? なぜ彼女はそのような肌を持っているのですか? そうです-この女性は存在しません。 しかし、これが完全に仮想的なイメージであるとは言えません。 これは、私の会社Sight Commerce Inc.の全従業員の平均的な肖像です。 2011年頃。 私たちにはヨーロッパ、ラテンアメリカ、東アジア、インドのルーツを持つ少女がいるので、彼女の国籍を判断するのは難しいです!



顔の平均化の話は単に魅力的です。



それはすべて、1878年に新しい写真装置を発明したフランシスガルトン(いとこチャールズダーウィン)の研究から始まりました。彼は顔を組み合わせて最初のフォトボットを作ることを学びました。 彼は、犯罪者の顔を組み合わせることで、犯罪者の「典型的な」顔をシミュレートし、顔の特徴によって潜在的な犯罪者を認識することができると信じていました。 この仮説は誤りであることが判明しました。誰かの写真を調べた後、犯罪の傾向を判断することは不可能です。



しかし、Galtonは、平均的な人は常に自分の顔のすべての「構成要素」よりも魅力的に見えると指摘しました。 1つの驚くべき実験で、研究者は「ミスドイツ2002」コンテストの22人のファイナリスト全員の顔を「折り畳み」ました。 インタビュイーは、結果のポートレートを他のどの競技者よりも高く評価し、ミス・ベルリンよりもさらに高く評価しました。 ふう! 彼女の顔が平均に近いため、ジェシカアルバは非常に正確であることがわかります。



「平均」を「平均」と同等にすることは可能ですか? なぜ平均的な顔は私たちにとって魅力的だと思いますか? 「コイノフィリア」と呼ばれる進化仮説によれば、平均からの逸脱は有害な突然変異を示す可能性があるため、活動的な生殖年齢の個人は平均的な特性を持つパートナーを探します。 さらに、顔の左右の部分の変動が相互に平滑化されるため、中央の顔は対称です。

OpenCVで平均的な顔を生成する方法は?









2:米国大統領はカーターからオバマまで平均した



記事のコードと画像はこちらからダウンロードできます



以下は、上記の一連の画像を使用して、平均化された顔を生成する方法の段階的な説明です。 ただし、画像自体のサイズや各ポートレートの顔のサイズは考慮していません。



ステージ1:顔検出









3:顔検出の例



各ポートレートについて、dlibライブラリを使用して68の「コントロールポイント」を計算します。 dlibのインストール方法と使用方法については、別の記事「 顔の特徴の検出」で詳しく説明します。 オバマ氏の肖像画には、68個のコントロールポイントが配置されていました。



ステップ2:座標を変換する



入力時に、顔画像のサイズは大きく異なる場合があります。 したがって、それらを正規化し、単一の参照フレームを作成する必要があります。 これを行うには、すべての顔画像を600×600のサイズに変形して、左目の左隅が座標(180、200)のポイントにあり、右目の右隅がポイント(420、200)にあるようにします。 この参照フレームを「最終座標系」 、ソース画像の座標「初期座標系」と呼びましょう。



上記のポイントをどのように選択しましたか? これらのポイントが1本の水平線上に配置され、この線が画像の上端から下端までの約3分の1の長さになることを保証したかったのです。 そのため、アイソケットの端が座標(0.3 x幅、高さ/ 3)および(0.7 x幅、高さ/ 3)のポイントにあることを確認しました。



また、コントロールポイント36と45で、ソース画像の目の隅の位置をそれぞれ把握しています。次に、類似度変換(回転、変換、スケーリング)を計算し、初期座標系から最終座標系にポイントを転送できます。









4:類似変換を使用して、サイズ3000×2300のソース画像をサイズ600×600の最終画像に変換します。



類似変換とは何ですか? 類似性変換は、ポイント(x、y)または画像全体の位置を変更できる2×3マトリックスです。 この行列の最初の2列は回転とスケーリングをエンコードし、最後の列はハイフネーション(つまり、オフセット)をエンコードします。 正方形がxおよびy方向にそれぞれs xおよびs y回スケーリングするように、正方形の4つのコーナーを変換(移動)するとします。 同時に、角度θだけ回転し、xおよびy方向にt xおよびt yに移動(移動)します。 類似性変換は次のように記述できます。











ポイント(x、y)に基づいて、上記の類似性変換は、次の式に従ってこのポイントを(x t 、y t )に転送します。











timateRigidTransformを使用して、類似性変換を実行できます。



 // C++ // inPts  outPts –  ,    //   ,       , //     cv::estimateRigidTransform(inPts, outPts, false);
      
      





 # Python # inPts  outPts -      numpy #   ,       , #     cv2.estimateRigidTransform(inPts, outPts, False);
      
      





ただし、1つの小さな問題があります。 OpenCVでは、少なくとも3組のポイントを指定する必要があります。 これは愚かです。なぜなら、類似性変換は2つのポイントだけで実行できるからです。 したがって、単純に3番目の点を想像することができます。これにより、3番目の点と既知の2つの点が正三角形を形成します。 次に、3組のポイントがあるかのようにtimateRigidTransformを使用します。



類似度変換を計算することにより、元の画像とその制御点を最終座標に変換するために使用できます。 画像はwarpAffine



を使用してtransform



され、ポイントはtransform



を使用してtransform



ます。



ステージ3:顔の位置合わせ









5:単純化された顔の平均化の結果



前の段階で、すべての画像と制御点を最終画像の座標に変換することができました。 これで、すべての画像のサイズが同じになり、目の角が揃います。 これらの位置合わせされた画像の平均ピクセル値を取得して、平均化された画像を取得しようとするのは魅力的かもしれません。 ただし、この場合、図のような画像が表示されます。 5.はい、目は揃っており、他のすべての顔の特徴は無計画に配置されています。



あるソース画像のどの点が別のソース画像のどの点に対応するかがわかれば、理想的には2つの画像を重ねることができます。 しかし、そのような情報はありません。 各ソース画像上の68個の対応するポイントの位置のみがわかります。 これらの点に注目して、各画像を三角形の領域に分割し、まずこれらの領域を位置合わせしてから、ピクセル値を平均化します。



このプロセスについては、 顔のモーフィングの投稿で詳しく説明しますが、一般的には以下のとおりです。



中間点を計算する



平均顔がどのように見えるかを計算するには、そのすべての特徴が揃っているため、最初に最終画像のすべての変換されたコントロールポイントの平均を計算する必要があります。 これを行うには、最終画像の座標内のすべての制御点のx値とy値を単純に平均します。



ドローネ三角形分割の計算









6:平均化されたコントロールポイントのドロネー三角形分割の計算。



前の段階で、最終的な座標で平均的な人のコントロールポイントの位置を取得しました。 これらの68ポイント(図6の青で表示)と最終画像の境界上の8ポイント(緑で表示)を使用して、ドロネー三角形分割(赤で表示)を計算できます。 ここで、より多くのドロネー三角形分割について説明します



ドローネ三角形分割では、画像を三角形に分割できます。 このような三角形分割の結果として、76ポイント(顔上の68ポイント+ 8つの境界ポイント)のインデックスの配列として表される三角形のリストを取得します。 以下に示す三角形の例では、制御点62、68、60が三角形、32、50、49-別の三角形などを形成していることがわかります。



三角形の変形



三角測量の例



 [ 62 68 60 32 50 49 15 16 72 9 8 58 53 35 36 … ]
      
      





前の段階で、顔のコントロールポイントの平均位置を計算し、これらのデータに基づいて、ドロネー三角形分割を実行して画像を三角形に分割しました。 図 7変換された元の画像に重ねられたドロネー三角形が表示され、中央の画像は平均化されたコントロールポイントの三角形分割を示しています。 注:左の画像の三角形1は、中央の画像の三角形1に対応しています。 左の画像にある三角形1の3つの頂点と、中央の画像からの三角形の対応する3つの頂点がわかっているので、アフィン変換を計算できます。 左の画像の三角形ごとにこの手順を繰り返して、右の画像を取得します。 したがって、右の画像は、平均化された顔の状態への左の変形の結果です。









7:Delaunayの三角形分割に基づく画像のワーピング



ステージ4:顔の平均化



前のステップの操作をすべてのソース画像に適用すると、結果が平均化されたエンドポイントと一致するように最終画像が正確に変形されます。 平均画像を計算するには、すべての変形画像のピクセルの強度値を加算し、この量を画像の数で除算します。 図 図2は、そのような平均化の結果を示しています。 図にある「平均」よりもずっと良く見えます。 5。

「平均的な」米国大統領はどのように見えると思いますか? 私の意見では-父親と甘い。



顔の平均化結果









8:マーク・ザッカーバーグ、ラリー・ペイジ、イーロン・マスク、ジェフ・ベゾスの平均的な顔









9:ブリー・ラーソン、ジュリアン・ムーア、ケイト・ブランシェット、ジェニファー・ローレンスの平均的な顔



平均的なリードテクノロジー起業家はどのように見えますか? 図 図8は、Mark Zuckerberg、Larry Page、Elon Musk、Jeff Bezosの平均的な顔を示しています。 この「平均的な起業家」について特別なことを言うことはできませんが、彼はまだ髪を見ることができます(ジェフベゾスの否定的な貢献にもかかわらず)。



平均的なオスカー受賞女優はどのように見えますか? 図 図9は、ブリーラーソン、ジュリアンムーア、ケイトブランシェット、ジェニファーローレンスの平均的な顔を示しています。 だから、平均的な映画スターはとてもきれいです。 そして彼女の歯は、成功した起業家の歯よりも優れています。 当然です。



鏡像で平均化することにより、対称面を作成することもできます。 以下に例を示します。









10:彼の写真(左)を彼自身の鏡像(右)と平均化して得られた対称オバマ大統領(中央)。



All Articles