顔検出を実装するための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つの予測

ブログ    
ブログ    

推薦する

最新のMLPerfランキング:アリババのAIコンピューティングパワーが多くの分野で1位を獲得

4月7日、権威あるAIベンチマーク評価組織MLPerfが最新の推論パフォーマンスリストを公開した。 ...

...

AIは人間の教師に取って代わるでしょうか?どれだけの能力があるのか​​を確かめるためにレッスンを受けました

少し前に、「ピーター」と「トニー」という名前の二人の英語教師が人々の注目を集めました。彼らはあらゆる...

...

人工知能が普及しつつある今、将来はロボットの時代になるのでしょうか?

今は特に人工知能が普及していますが、将来はロボットの時代になることは絶対にありません。なぜなら、機械...

...

Google、AIアシスタント「Gemini」の修正を加速、拒否率を半減

2月18日、Googleは人工知能プロジェクトを大幅にアップデートし、BardをGeminiに改名し...

AIを優先する際にITの基礎を軽視してはいけない

GenAI は多くの企業の IT プロジェクトで引き続き主流を占めており、ビジネス リーダーの 3 ...

AIは昨日のことを思い出せるが、過去を思い出すのはまだ少し難しい

[[285973]]人工知能が長期記憶を形成するには、脳科学、神経科学、心理学、行動経済学の分野にお...

国境を越えた大企業よ、安易に「自社開発チップ」を主張しないでほしい

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

機械学習の謎を解く: プログラムはどのようにして自分自身を作成するのか?

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

...

OpenAI の科学者による最新のスピーチ: GPT-4 は変曲点を超えようとしており、1000 倍のパフォーマンスが確実に出現します。

「GPT-4 は変曲点を超え、パフォーマンスの大幅な向上を達成しようとしています。」これは、Ope...

ChatGPTを使った学生の不正行為を防ぐため、一部の大学教授は紙ベースの試験と手書きのエッセイへの復帰を検討している。

8月14日、人工知能(AI)の発展は教育に新たな課題をもたらしました。フォーチュン誌の最近の報道に...