顔認識モデルをゼロから構築する(例と Python コード付き)

顔認識モデルをゼロから構築する(例と Python コード付き)

01 はじめに

Facebook に写真をアップロードするたびに、プラットフォームが顔認識アルゴリズムを使用して写真に写っている人物を識別していることをご存知でしたか?一部の政府は現在、犯罪者を特定し逮捕するために顔認識技術を使用しています。さらに、最も一般的な用途は、顔で携帯電話のロックを解除することです。

コンピューター ビジョンのサブフィールドは広く使用されており、世界中の多くの企業がその恩恵を受けています。顔認識モデルの使用は今後数年間で増加し続けるでしょう。そこで、顔認識モデルをゼロから構築する方法を学びましょう。

[[250684]]

この記事では、まず顔認識モデルの内部の仕組みについて紹介します。次に、簡単なケースと組み合わせて、Python を通じてケースを練習します。この記事の最初の部分では、最初の顔認識モデルを完成させます。

02 顔認識の仕組みを理解する

顔認識アルゴリズムの仕組みを理解するには、まず特徴ベクトルの概念を理解しましょう。 (訳者注:ここでの固有ベクトルは機械学習の概念を指し、行列理論とは異なります。)

すべての機械学習アルゴリズムはデータセットを入力として受け取り、そこから学習します。アルゴリズムはデータを調べて、その中のパターンを識別します。たとえば、特定の画像内の人物の顔を認識したいとします。多くのオブジェクトはパターンとして考えることができます。

  • 顔の長さ/幅。
  • 画像は拡大縮小されているため、長さと高さは信頼できない可能性があります。ただし、画像を拡大縮小した後も、比率は同じままです。つまり、顔の長さと幅の比率は変わりません。
  • 顔の肌の色。
  • 口、鼻など、顔の部分的な細部の幅。

ここにはパターンがあることは明らかです。異なる顔には異なる寸法があり、類似した顔には類似した寸法があります。難しいのは、機械学習アルゴリズムが理解できるのは数字だけなので、特定の顔を数字に変換することです。顔 (またはトレーニング セット内の要素) を表す数値は、特徴ベクトルと呼ばれます。特徴ベクトルは特定の順序の数字で構成されます。

簡単な例として、顔を特徴ベクトルにマッピングすることができます。特徴ベクトルは、次のようなさまざまな特徴で構成されます。

  • 顔の長さ(cm)
  • 顔の幅(cm)
  • 顔の平均的な肌の色(R、G、B)
  • 唇の幅(cm)
  • 鼻の長さ(cm)

画像が与えられた場合、次のようにさまざまな特徴に注釈を付けて特徴ベクトルに変換できます。

​​

このようにして、画像はベクトルに変換され、(23.1, 15.8, 255, 224, 189, 5.2, 4.4) として表すことができます。もちろん、画像からは無数の特徴(髪の色、ひげ、眼鏡など)を導き出すこともできます。ただし、この単純な例では、これら 5 つの単純な機能のみを考慮します。

さて、各画像を特徴ベクトルにデコードすると、問題ははるかに簡単になります。当然のことながら、同じ人物の顔画像を 2 つ使用すると、抽出された特徴ベクトルは非常に類似したものになります。言い換えれば、2 つの固有ベクトル間の「距離」は非常に小さくなります。

この時点で、機械学習は次の 2 つのことを実現するのに役立ちます。

  • 特徴ベクトルを抽出します。機能が多すぎるため、すべての機能を手動でリストすることは非常に困難です。機械学習アルゴリズムは、多くの特徴に自動的にラベルを付けることができます。たとえば、複雑な特徴としては、鼻の長さと額の幅の比率などが挙げられます。これらの派生機能をすべて手動でリストすることは非常に困難です。
  • マッチング アルゴリズム: 特徴ベクトルが取得されると、機械学習アルゴリズムは新しい画像をコーパス内の特徴ベクトルとマッチングする必要があります。

顔認識の仕組みについて基本的な理解ができたので、広く使用されている Python ライブラリを使用して独自の顔認識アルゴリズムを構築してみましょう。

03 ケーススタディ

まず、マーク・ザッカーバーグ、ウォーレン・バフェット、ビル・ゲイツ、シャー・ルク・カーンなど、有名人の顔写真がいくつか与えられ、これらの顔をコーパスとみなします。ここで、他の有名人の新しい写真 (「新しいキャラクター」) がいくつか提供され、これらの「新しいキャラクター」がコーパス内に存在するかどうかを判断します。

コーパスからの画像は次のとおりです。

図に示すように、私たちがリストした有名人は、バラク・オバマ、ビル・ゲイツ、ジェフ・ベゾス、マーク・ザッカーバーグ、レイ・ダリオ、シャー・ルク・カーンです。

ここで、「新しい文字」が次のとおりであると仮定します。

[[250685]]

▲注: 上記の写真はすべて Google 画像から取得しました

明らかに、これはシャー・ルク・カーンです。しかし、このタスクはコンピュータにとって困難です。なぜなら、私たちにとっては、画像の複数の特徴を組み合わせて、それがどの人物であるかを簡単に判断できるからです。しかし、顔を認識する方法を学ぶことはコンピュータにとって直感的ではありません。

上記のすべてをカプセル化した、驚くほどシンプルな Python ライブラリがあります。このライブラリは、顔の特徴に基づいて特徴ベクトルを生成し、さまざまな顔を区別する方法を知っています。この Python ライブラリは face_recognition と呼ばれます。これは、複雑な C++ ベースのアプリケーションを完成させるのに役立ついくつかの機械学習アルゴリズムを含む最新の C++ ツールキットである dlib を使用します。

Python の face_recognition ライブラリは、多数のタスクを実行できます。

  • 指定された画像内のすべての顔を見つけます。
  • 画像内の顔の特徴を検出し、処理します。
  • 画像内の顔を認識します。
  • リアルタイムの顔認識。

次に、3 番目のタスクである画像内の顔の認識について説明します。

face_recognition ライブラリのソースコードは、github の次のリンクから入手できます。

リンク:

​​https://github.com/ageitgey/face_recognition​​

実際、face_recognition ライブラリをインストールする方法については、次の説明を参照してください。

リンク:

​​https://github.com/ageitgey/face_recognition#インストールオプション​​

face_recognition をインストールする前に、dlib パッケージもインストールする必要があります。 dlib のインストール手順については、次のリンクを参照してください。

リンク:

​​https://gist.github.com/ageitgey/629d75c1baac34dfa5ca2a1928a7aeaf ​​

04 Pythonアプリケーション

このセクションには、face_recognition ライブラリを使用して簡単な顔認識システムを構築するためのコードが含まれています。これはアプリケーションが動作する部分であり、次のセクションでコードを確認して詳細を理解していきます。

 # ライブラリをインポートする
インポートOS
顔認識をインポートする
# 利用可能なすべての画像のリストを作成します
画像 = os.listdir('画像')
# 画像を読み込む
マッチングする画像 = face_recognition.load_image_file('my_image.jpg')
# 読み込んだ画像を特徴ベクトルにエンコードする
マッチングするエンコードされた画像 = 顔認識.顔エンコーディング(
一致する画像[0]
# 各画像を反復処理する
画像内の画像の場合:
# 画像を読み込む
現在の画像 = face_recognition.load_image_file("images/" + 画像)
# 読み込んだ画像を特徴ベクトルにエンコードする
現在の画像エンコード = 顔認識.顔エンコード(現在の画像)[0]
# あなたのイメージを画像と照合し、一致するかどうかを確認します
結果 = face_recognition.compare_faces(
[一致してエンコードされた画像]、現在のエンコードされた画像)
# 一致したかどうか確認する
結果[0] == Trueの場合:
「一致: 」+ 画像を印刷
それ以外:
「一致しません:」+ 画像を印刷

ファイル構造は次のとおりです。

顔認識:

  • python の最新バージョンは、 python.com から入手できます。
  • 私の画像.jpg
  • 画像/
  • バラク・オバマ
  • ビル・ゲイツ
  • ジェフ・ベゾス
  • マーク・ザッカーバーグ
  • レイダリオ
  • シャールク・カーン
  • ウォーレン・バフェット

ルート ディレクトリの facialrecognition には次のものが含まれます。

  • fr.py 形式の顔認識コード。
  • my_image.jpg – 認識される画像(「新しい人物」)。
  • images/ – コーパス。

上記のようにファイル構造を作成し、コードを実行すると、次の結果が得られます。

一致: shah_rukh_khan.jpg
一致しません: warren_buffett.jpg
一致しません: barack_obama.jpg
一致しません: ray_dalio.jpg
一致しません: bill_gates.jpg
一致しません: jeff_bezos.jpg
一致しません: mark_zuckerberg.jpg

明らかに、新しい有名人はシャー・ルク・カーンであり、私たちの顔認識システムは彼を識別できます!

05 Pythonコードを理解する

それでは、コードを確認して、それがどのように機能するかを理解しましょう。

 # ライブラリをインポートする
インポートOS
顔認識をインポートする

以上が導入操作となります。ビルドされた OS ライブラリを使用してコーパス内のすべての画像を読み取り、face_recognition を通じてアルゴリズム部分を完了します。

 # 利用可能なすべての画像のリストを作成します
画像 = os.listdir('画像')

このシンプルなコードは、コーパス内のすべての画像へのパスを識別するのに役立ちます。このコードを実行すると、次の結果が得られます。

画像 = ['shah_rukh_khan.jpg', 'warren_buffett.jpg', 'barack_obama.jpg', 'ray_dalio.jpg', 'bill_gates.jpg', 'jeff_bezos.jpg', 'mark_zuckerberg.jpg']

ここで、次のコードを実行すると、新しい人物の画像が読み込まれます。

 # 画像を読み込む
マッチングする画像 = face_recognition.load_image_file('my_image.jpg')

アルゴリズムが画像を解析できるようにするために、顔画像を特徴ベクトルに変換します。

 # 読み込んだ画像を特徴ベクトルにエンコードする
マッチングするエンコードされた画像 = 顔認識.顔エンコーディング(
一致する画像[0]

残りのコードは比較的シンプルです。

 # 各画像を反復処理する
画像内の画像の場合:
# 画像を読み込む
現在の画像 = face_recognition.load_image_file("images/" + 画像)
# 読み込んだ画像を特徴ベクトルにエンコードする
現在の画像エンコード = 顔認識.顔エンコード(現在の画像)[0]
# あなたのイメージを画像と照合し、一致するかどうかを確認します
結果 = face_recognition.compare_faces(
[一致してエンコードされた画像]、現在のエンコードされた画像)
# 一致したかどうか確認する
結果[0] == Trueの場合:
「一致: 」+ 画像を印刷
それ以外:
「一致しません:」+ 画像を印刷

この時点で、次のようになります。

  • 各画像をループします。
  • 画像を特徴ベクトルに解析します。
  • コーパスにすでに読み込まれている画像と、識別される新しい人物の画像を比較します。
  • 両者が一致した場合は表示します。一致するものがない場合には、結果も表示します。

上記のように、結果は、この単純な顔認識アルゴリズムがスムーズに実行されたことを示しています。 my_image を別の画像に置き換えてみましょう。

[[250686]]

アルゴリズムを再度実行すると、次の結果が表示されます。

一致しません: shah_rukh_khan.jpg
一致しません: warren_buffett.jpg
一致しません: barack_obama.jpg
一致しません: ray_dalio.jpg
一致しません: bill_gates.jpg
一致しません: jeff_bezos.jpg
一致しません: mark_zuckerberg.jpg

明らかに、システムはジャック・マー氏を上記の有名人のいずれとも認識しませんでした。これは、当社のアルゴリズムが以下の点で優れたパフォーマンスを発揮することを意味します。

  • コーパスに保存されているものを正しく識別します。
  • コーパスに存在しない文字にラベルを付けます。

06 顔認識アルゴリズムの応用

顔認識は成熟した研究分野であり、産業界や学術界で広く利用されてきました。たとえば、中国では顔認識システムのおかげで犯罪者が逮捕される可能性があります。システムが犯人の顔を認識し、警報を鳴らすのです。これは、顔認識が犯罪を減らすために使用できることを示しています。顔認識の興味深い使用例は他にもたくさんあります。

  • 顔認証: Apple は顔認証のために iPhone に Face ID を導入しました。一部の銀行では、携帯電話のロック解除に顔認証を使用する実験も行われている。
  • ユーザーサービス: マレーシアの一部の銀行は、貴重な銀行顧客を識別し、銀行が個人サービスを提供できるようにするための新しい顔認識システムを導入しました。銀行は、そのようなユーザーを維持し、ユーザー満足度を向上させることで、より多くの利益を得ることができます。
  • 保険業界: 多くの保険会社は、保険金支払い手続きを容易にするために、人の顔と身分証明書に記載された写真とを照合する顔認識システムを使用しています。

07 エンドノート

要約すると、顔認識は興味深い問題であり、多くの強力な使用例があります。これらのアプリケーションは、さまざまな面で社会に効果的に貢献できます。これらの技術を商業化すると倫理的なリスクが生じる可能性がありますが、この質問については別の機会に取り上げることにします。

この記事から何かを得られることを願っています。

原題:

顔認識の簡単な入門(Python コード付き)

オリジナルリンク:

​​https://www.analyticsvidhya.com/blog/2018/08/a-simple-introduction-to-facial-recognition-with-python-codes/​​

翻訳者について: データサイエンスの修士号取得を目指している統計学の学生、Wang Yutong さんは、ランニングとピアノ演奏を欠かしません。私の夢はデータビジュアライゼーションをアートとして扱うことです。今は顎をさすりながら機械学習を見ています。

<<:  機械学習の世界的ゴッドファーザーであるトム・ミッチェルは、スクワールAIラーニングに入社すると発表した。

>>:  なぜ AIoT が将来の主流となるのでしょうか?

ブログ    
ブログ    

推薦する

機械学習に関する7つの誤解

ディープラーニングを学ぶ過程では、私たちが当たり前だと思っているさまざまな噂やさまざまな「こだわり」...

...

単一画像超解像におけるディープラーニングの応用: SRCNN、知覚損失、SRResNet

[[209375]]単一画像の超解像度では、品質の低下を最小限に抑えながら小さな画像のサイズを拡大...

5つの重要なステップ!ディープラーニングモデルを構築するにはどうすればいいですか?

この記事は、公開アカウント「Reading the Core」(ID: AI_Discovery)か...

...

UiPath、業界初のエンドツーエンドのハイパーオートメーションプラットフォームを発表

[[326225]] 「すべての人にロボットを」というビジョンを掲げ、エンタープライズ向けロボティッ...

YOLOはまだ死んでいません! YOLOv9がリリースされました:パフォーマンスと速度SOTA〜

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

AIが無人車両群を指揮、中国が世界最大の3Dプリント建物を建設

サウスチャイナ・モーニング・ポストとインサイダー誌が報じたところによると、中国はチベット高原のダム建...

ロボットはサービス業界に参入できるのか?事実が教えてくれる

有名なアニメーション会社ディズニーは、近々人工知能とロボット工学の分野に参入すると発表しました。ディ...

...

Claude3 が GPT4 に教訓を与えました!オープンAI最強の対戦相手の深夜爆弾、全貌解析付き!

制作:51CTO テクノロジースタック(WeChat ID:blog)深夜、OpenAI の最大のラ...

Python + 機械学習手法を使用した感情分析 (詳細な手順)

辞書マッチングの方法はないのでしょうか?なぜ複数の機械学習方法が必要なのでしょうか?辞書方式と機械学...

人工知能が金融を変える5つの方法

人工知能 (AI)、機械学習 (ML)、ディープニューラルネットワーク (DNN) は、金融業界のビ...

...

...