顔検出を実装するための50行のPythonコード

顔検出を実装するための50行のPythonコード

現在、顔認識技術は広く利用されており、決済や本人認証、美容カメラなどに利用されています。 iPhone ユーザーは、次の機能に精通している必要があります。

iPhoneの写真には、写真に写っている顔を認識して分類できる「People」機能があります。その原理も顔認識技術です。

この記事では主にPythonを使って顔検出を実装する方法を紹介します。顔検出は顔認識の基礎です。顔検出の目的は、写真に写っている顔を識別し、顔の特徴を見つけることです。顔認識は、顔検出に基づいて、その人物が誰であるかをさらに知らせることです。

さて、紹介はこれで終わりです。次に、環境の準備を始めましょう。

準備

この記事の顔検出は dlib に基づいていますが、これは Boost と cmake に依存しているため、まずこれらのパッケージをインストールする必要があります。Ubuntu を例に挙げます。

  1. $ sudo apt-get install build-essential cmake
  2.  
  3. $ sudo apt-get で libgtk-3-dev をインストールします
  4.  
  5. $ sudo apt-get install libboost- all -dev

私たちのプログラムは numpy と opencv も使用するため、これらのライブラリもインストールする必要があります。

  1. $ pip numpyをインストール
  2.  
  3. $ pip scipyをインストール
  4.  
  5. $ pip opencv-pythonをインストール
  6.  
  7. $ pip dlibをインストール

顔検出は、ここからダウンロードできる事前トレーニング済みのモデルデータに基づいています。

  1. http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

ローカル パスにダウンロードした後、解凍して、プログラムで使用される解凍されたファイルのパスを書き留めます。

dlibの顔の特徴

上記でダウンロードしたモデルデータを使用して、顔の68個の特徴点(x、y)の座標位置を推定します。これらの68個の座標点の位置は次の図に示されています。

手順は次の 2 つのステップで構成されます。

最初のステップは写真の顔の部分を検出することです

2 番目のステップでは、検出された顔領域内の器官 (目、鼻、口、あご、眉毛) をさらに検出します。

顔検出コード

まず、いくつかのユーティリティ関数を定義しましょう。

  1. rect_to_bb(rect)を定義します。
  2.  
  3. x = rect.left ()
  4.  
  5. y =矩形上端()
  6.  
  7. w = rect.right () - x
  8.  
  9. h = rect.bottom() - y
  10.  
  11. (x, y, w, h)を返す

この関数の rect は、dlib 顔領域検出の出力です。ここで、rect はシーケンスに変換され、その内容は矩形領域の境界情報となります。

  1. def shape_to_np(shape, dtype= "int" ):
  2.  
  3. 座標 = np.zeros((68, 2), dtype=dtype)
  4.  
  5. iが範囲(0, 68)内にある場合:
  6.  
  7. 座標[i] = (shape.part(i).x, shape.part(i).y)
  8.  
  9. 座標を返す

この関数のシェイプは、dlib 顔特徴検出の出力です。シェイプには、上記の顔特徴の 68 個のポイントが含まれます。この関数は、後続の処理を容易にするために、形状を Numpy 配列に変換します。

  1. def resize(画像、幅=1200):
  2.  
  3. r = 幅 * 1.0 / image.shape[1]
  4.  
  5. dim = (幅、 int (image.shape[0] * r))
  6.  
  7. サイズ変更 = cv2.resize(画像、dim、補間=cv2.INTER_AREA)
  8.  
  9. サイズ変更して返す

この関数内の画像は、検出したい画像です。顔検出プログラムの最初に、確認のために検出結果の画像を表示します。ここでサイズを変更するのは、画像が大きくなりすぎて画面からはみ出ないようにするためです。

次に、メインプログラムを開始しましょう。

  1. sysをインポートし、numpyをnpとしてインポートします。
  2.  
  3. dlibをインポート cv2をインポート
  4.  
  5. len(sys.argv) < 2の場合:
  6.  
  7. print "使用法: %s <画像ファイル>" % sys.argv[0]
  8.  
  9. sys.exit(1)
  10.  
  11. イメージファイル = sys.argv[1]
  12.  
  13. 検出器 = dlib.get_frontal_face_detector()
  14.  
  15. 予測子 = dlib.shape_predictor( "shape_predictor_68_face_landmarks.dat" )

顔を検出する画像をsys.argv[1]パラメータから読み取り、顔領域検出用の検出器と顔特徴検出用の予測子を初期化します。 shape_predictor のパラメーターは、先ほど解凍したファイルへのパスです。

  1. 画像 = cv2.imread(画像ファイル)
  2.  
  3. 画像 = resize(画像、幅=1200)
  4.  
  5. グレー = cv2.cvtColor(画像、cv2.COLOR_BGR2GRAY)
  6.  
  7. rects = detector(グレー, 1)

特徴領域を検出する前に、まず顔領域を検出する必要があります。このコードは opencv を呼び出して画像を読み込み、適切なサイズに変更し、グレースケールに変換し、最後に detector を使用して顔領域を検出します。写真には複数の顔が含まれている可能性があるため、ここでは複数の顔に関する情報を含む配列 rects を取得します。

  1. enumerate(rects)内の(i, rect)について:
  2.  
  3. 形状 = 予測子(灰色、四角形)
  4.  
  5. 形状 = shape_to_np(形状)
  6.  
  7. (x, y, w, h) = rect_to_bb(rect)
  8.  
  9. cv2.rectangle(画像、(x, y)、(x + w, y + h)、(0, 255, 0)、2)
  10.  
  11. cv2.putText(image, "Face #{}" .format(i + 1), (x - 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
  12.  
  13. (x, y)形状次のようになります。
  14.  
  15. cv2.circle(画像, (x, y), 2, (0, 0, 255), -1)
  16.  
  17. cv2.imshow( "出力" , 画像)
  18.  
  19. cv2.waitKey(0)

検出された顔ごとに、顔の特徴(鼻、目、眉毛など)をさらに検出します。顔の部分は写真上で緑色の枠でマークし、顔の特徴は赤い点でマークします。

***検出マークの付いた写真を表示し、waitKey(0)は任意のキーを押してプログラムを終了できることを意味します。

これが私たちのプログラムです

テスト

次は、結果をテストするエキサイティングな瞬間です。

以下は元の写真です

[[217981]]

以下はプログラム認定の結果です

[[217982]]

顔の部分が緑色の四角で囲まれ、顔の特徴(鼻、目など)が赤い点でマークされていることがわかります。

簡単じゃないですか?

<<:  李偉博士がブロックチェーンについてわかりやすく語る:技術原理、実用的応用、AIとの統合

>>:  2018年の人工知能の発展に関する5つの予測

ブログ    

推薦する

大人気すぎてブレイク中! ByteDanceのGPT部門フローの秘密を解明

ノアが編集制作:51CTO テクノロジースタック(WeChat ID:blog) 「大規模な言語モデ...

...

Google: 人工知能、機械学習などを Wear OS オペレーティング システムに統合

[[244954]]最近、上海世界博覧センターで 2 日間にわたる Google 開発者会議 (Go...

...

EasyDLは、臨床試験データの敵対的学習と複数のアルゴリズムの比較を簡単に処理します。

[51CTO.com からのオリジナル記事] 画像学習は高度なアルゴリズムであり、画像への高い適応...

2023年の生成AIの包括的なレビュー

2023年には、生成AIが開発者のアプリケーション構築支援において飛躍的な進歩を遂げ、大手ツールベン...

人工知能技術を開発すべきでしょうか?

まず、技術発展の観点から見ると、人工知能技術の発展は避けられません。現在、クラウドコンピューティング...

ResNet仮説は覆されたか? Redditの人:長年誰もその原理を理解していなかった

[[429626]] 2015 年に、画期的なニューラル ネットワーク モデル ResNet がリ...

...

さまざまな分野とフレームワーク、これはディープラーニングモデルの超完全なGitHubコレクションです

研究者や開発者は常に GitHub リポジトリで興味深いプロジェクトや実装を検索してきましたが、特定...

2019年の人工知能レビュー:産業の発展は急速な進展を遂げている

2019年、中国の人工知能市場は「熱狂的」だった。IDCの統計によると、世界の人工知能市場規模は20...

GitHub が機械学習コードの脆弱性スキャンを無料で提供、JavaScript / TypeScript もサポート

現在、JavaScript および TypeScript リポジトリで開発およびテストが行​​われて...

コンピュータビジョンがビジネス課題の解決に役立つ 5 つの方法

自動運転車、交通標識検出、顔認識、セルフサービスチェックアウト。 これらすべての高度なソリューション...

...

AIサークルが爆発した!マイクロソフトがトランスフォーマーのブロックを解除、シーケンスの長さが10億以上に拡大

ビッグデータダイジェスト制作AIサークルが爆発した! Microsoft が立ち上げた LONGNE...