3分で顔認識を始めましょう

3分で顔認識を始めましょう

顔認識は、AI 研究が世界にもたらした数多くの驚異のうちの 1 つです。これは多くの技術者にとって興味深いトピックであり、彼らは物事がどのように機能するかについて基本的な理解を得たいと考えています。このテーマについて詳しく調べて、仕組みを見てみましょう。

顔認識

このような問題を解決するときは、車輪の再発明をしないことが最善です。それは不可能です!研究者が提供したモデルに従うのが最善です。オープンソースで利用できるツールも数多くあります。そのような Python ライブラリの 1 つが face_recognition です。それはいくつかのステップで機能します:

  • 与えられた画像内の顔を認識する
  • 顔の特徴を認識する
  • 128値の顔エンコーディングベクトルを生成する

このエンコーディングに基づいて、2 つの顔画像間の類似性を測定することができ、それによってそれらが同一人物のものであるかどうかがわかります。

まずface_recognitionモジュールをインストールします

  1. 顔認識をpipでインストールする

モジュールのインポート
次に、必要なモジュールをインポートします

  1. PIL.Imageをインポートする
  2. PIL.ImageDrawをインポートする
  3. 輸入リクエスト
  4. ioからBytesIOをインポート
  5.  
  6. IPython.displayからdisplayをインポートする
  7.  
  8. 顔認識をインポートする

画像を読み込んでいます
次に、画像を読み込みます。画像をGithubアカウントに保存しました。こうすることで、URL から元の画像を読み取ることができます。

  1. レスポンス = リクエスト.get( "https://raw.githubusercontent.com/solegaonkar/solegaonkar.github.io/master/img/rahul1.jpeg" )
  2. fr_image = 顔認識.load_image_file(BytesIO(応答.content))

顔を認識する
顔が読み込まれたら、face_recognition モジュールのさまざまな部分を見てみましょう。どうやって顔を認識するのですか?

  1. 顔の位置 = 顔認識.顔の位置(fr_image)
  2.  
  3. 面の数 = len(面の位置)
  4. print( "この写真には {} 人の顔が見つかりました。" .format(number_of_faces))

出力は次のようになります:

  1. この写真の中に1 人のが見つかりました。</span>

これは、アルゴリズムが画像内で 1 つの顔のみを検出したことを意味します。認識された画像と顔を見てみましょう。

  1. pil_image = PIL.Image.fromarray(fr_image)
  2.  
  3. face_locations 内の face_locationの場合:
  4. #この画像内の各面の位置を出力します。各面は、(上、右、下、左) の順序で並べられた座標のリストです。
  5. 上、右、下、左 = 顔の位置
  6. print( "顔はピクセル位置にあります。上: {}、左: {}、下: {}、右: {}" .format(top, left, bottom, right))
  7. # 顔の周りにボックスを描きましょう
  8. 描画 = PIL.ImageDraw.Draw(pil_image)
  9. draw.rectangle([左、上、右、下]、アウトライン= "黒" )

これにより出力が得られる

  1. 顔は、ピクセル位置上: 68 、左: 117 、下: 291 、右: 340 にあります

上記のコードは、画像を変更して顔の周囲に四角形を描画します。うまく動作するか確認してみましょう。

それはすでに可能です。

フェイスコーディング
これが私たちの顔です。しかし、私たちのアルゴリズムにとって、それは単なる RGB 値の配列であり、私たちが入力したデータ サンプルから学習したパターンに一致するものです。

顔認識の場合、アルゴリズムは目の色、大きさ、傾き、眉間の間隔など、顔の特定の重要な測定値を記録します。これらすべてを組み合わせることで、特定の顔を認識するために使用される顔コード(画像から取得される情報)が定義されます。

顔から何が読み取られるかを理解するために、読み取られるエンコードを見てみましょう。

  1. face_encodings = face_recognition.face_encodings(fr_image)
  2. フェイスエンコーディング[ 0 ]

巨大な配列を出力します:

  1. 配列([- 0.10213576 , 0.05088161 , - 0.03425048 , - 0.09622347 , - 0.12966095 ,
  2. 0.04867411 、 - 0.00511892 、 - 0.03418527 0.2254715 、 - 0.07892745
  3. 0.21497472 、 - 0.0245543 、 - 0.2127848 、 - 0.08542262 、 - 0.00298059
  4. 0.13224372 、 - 0.21870363 、 - 0.09271716 、 - 0.03727289 、 - 0.1250658
  5. 0.09436664 0.03037129 、 - 0.02634972 0.02594662 、 - 0.1627259
  6. - 0.29416466 、 - 0.12254384 、 - 0.15237436 0.14907973 、 - 0.09940194
  7. 0.02000656 , 0.04662619 , - 0.1266906 , - 0.11484023 , 0.04613583 ,
  8. 0.1228286 、 - 0.03202137 、 - 0.0715076 0.18478717 、 - 0.01387333
  9. - 0.11409076 0.07516225 0.08549548 0.31538364 0.1297821
  10. 0.04055009 , 0.0346106 , - 0.04874525 , 0.17533901 , - 0.22634712 ,
  11. 0.14879328 0.09331974 0.17943285 0.02707857 0.22914577
  12. - 0.20668915 , 0.03964197 , 0.17524502 ​​, - 0.20210043 , 0.07155308 ,
  13. 0.04467429 , 0.02973968 , 0.00257265 , - 0.00049853 , 0.18866715 ,
  14. 0.08767469 、 - 0.06483966 、 - 0.13107982 0.21610288 、 - 0.04506358
  15. - 0.02243116 0.05963502 、 - 0.14988004 、 - 0.11296406 、 - 0.30011353
  16. 0.07316103 0.38660526 0.07268623 、 - 0.14636359 0.08436179
  17. 0.01005938 、 - 0.00661338 0.09306039 0.03271955 、 - 0.11528577
  18. - 0.0524189 、 - 0.11697718 0.07356471 0.10350288 、 - 0.03610475
  19. 0.00390615 , 0.17884226 , 0.04291092 , - 0.02914601 , 0.06112404 ,
  20. 0.05315027 、 - 0.14561613 、 - 0.01887275 、 - 0.13125736 、 - 0.0362937
  21. 0.16490118 、 - 0.09027836 、 - 0.00981111 0.1363602 、 - 0.23134531
  22. 0.0788044 、 - 0.00604869 、 - 0.05569676 、 - 0.07010217 、 - 0.0408107
  23. - 0.10358225 0.08519378 0.16833456 、 - 0.30366772 0.17561394
  24. 0.14421709 、 - 0.05016343 0.13464174 0.0646335 、 - 0.0262765
  25. 0.02722404 、 - 0.06028951 、 - 0.19448066 、 - 0.07304715 0.0204969
  26. - 0.03045784 、 - 0.02818791 0.06679841 ])

これらの数字はそれぞれ、顔のエンコーディングの直交成分を表します。

類似点
では、次のステップ、つまり顔の類似性を判断することに進みましょう。これを行うには、さらに画像を読み込む必要があります。

まず、3 つの画像を読み込みます。画像を読み込むときも、まず顔を検索し、次に顔のエンコーディングを検索します。

  1. レスポンス = リクエスト.get( "https://raw.githubusercontent.com/solegaonkar/solegaonkar.github.io/master/img/rahul1.jpeg" )
  2. image_of_person_1 = face_recognition.load_image_file(BytesIO(response.content))
  3. 顔の位置 = 顔認識.顔の位置(人物1の画像)
  4. person_1_face_encoding = face_recognition.face_encodings(人物1の画像、既知の顔の場所=顔の場所)
  5.  
  6. レスポンス = リクエスト.get( "https://raw.githubusercontent.com/solegaonkar/solegaonkar.github.io/master/img/rahul2.jpg" )
  7. image_of_person_2 = face_recognition.load_image_file(BytesIO(response.content))
  8. 顔の位置 = 顔認識.顔の位置(人物2の画像)
  9. person_2_face_encoding = face_recognition.face_encodings(人物2の画像、既知の顔の場所=顔の場所)
  10.  
  11. レスポンス = リクエスト.get( "https://raw.githubusercontent.com/solegaonkar/solegaonkar.github.io/master/img/trump.jpg" )
  12. image_of_person_3 = face_recognition.load_image_file(BytesIO(response.content))
  13. 顔の位置 = face_recognition.face_locations(人物の画像3)
  14. person_3_face_encoding = face_recognition.face_encodings(image_of_person_3、known_face_locations=face_locations) のようになります。

今では、類似点を特定することは難しくありません。 face_recognition モジュールはシンプルな API を提供します。

  1. 顔認識.比較顔([person_1_face_encoding,person_3_face_encoding], person_2_face_encoding[ 0 ], 許容値= 0.08 )

このメソッドは、比較する 2 つの面の各コンポーネントをチェックし、現在のコンポーネントが許容範囲内で変化するかどうかを通知します。上記のコマンドを実行すると、次の出力が表示されます。

  1. [配列([ 真、真、真、真、真、真、真、真、真、真、
  2. 本当、本当、本当、本当、本当、本当、本当、本当、本当、本当、
  3. 本当、本当、本当、本当、本当、本当、本当、本当、本当、本当、
  4. 本当、本当、本当、本当、本当、本当、本当、本当、本当、本当、
  5. 本当、本当、本当、本当、偽、本当、本当、本当、本当、
  6. 本当、本当、本当、本当、本当、本当、本当、本当、本当、偽、
  7. 本当、本当、本当、本当、本当、本当、本当、本当、本当、本当、
  8. 本当、本当、本当、本当、本当、本当、偽、本当、本当、本当、
  9. 本当、本当、本当、本当、本当、本当、本当、本当、本当、偽、
  10. 本当、本当、本当、本当、本当、本当、本当、本当、本当、本当、
  11. 本当、本当、本当、偽、本当、本当、本当、本当、本当、
  12. 本当、本当、本当、本当、本当、本当、本当、本当、本当、本当、
  13. 本当、本当、本当、本当、本当、本当、本当、本当、本当、本当、
  14. 本当、本当、本当、本当、本当、本当、本当、本当、本当、偽、
  15. 本当だよ、本当だよ])、
  16. 配列([ True, True, True, True, True, True, False, False, False,
  17. 本当、本当、本当、偽、本当、本当、本当、偽、本当、
  18. 偽、真、真、真、真、偽、真、真、真、
  19. 偽、真、真、真、偽、真、真、真、真、
  20. 本当、本当、本当、本当、偽、本当、偽、本当、本当、
  21. 本当、本当、本当、偽、本当、偽、本当、本当、本当、
  22. 偽、偽、真、真、真、真、真、偽、真、
  23. 偽、偽、偽、偽、真、偽、真、偽、真、
  24. 偽、真、真、真、真、偽、真、真、真、
  25. 本当、本当、本当、偽、本当、本当、本当、偽、本当、
  26. 本当、嘘、本当、本当、本当、本当、本当、本当、本当、本当、
  27. 本当、本当、本当、本当、本当、本当、偽、偽、本当、本当、
  28. 偽、偽、偽、真、真、偽、真、真、真、
  29. 本当、本当、本当、本当、本当、本当、本当、偽り、偽り、本当、
  30. 本当だよ、本当だよ

これら 2 つの配列は、指定された画像 (2 番目の引数) と、指定されたリスト (最初の引数) 内の各既知の顔エンコーディングとの類似性を表します。

最初の配列の方が類似点が多いことがわかります。人物を正確に識別できます。

デジタルメイク
楽しみたいなら、顔認識ライブラリでできることは他にもたくさんあります。顔の個々の特徴を識別するのに役立つ API があります。

  1. 顔のランドマークリスト = 顔認識.顔のランドマーク(fr_image)
  2. print(face_landmarks_list)

これにより、個々の特性曲線の長いリストが得られます。

  1. [{
  2. 「あご」 : [( 46 , 47 ), ( 45 , 54 ), ( 44 , 62 ), ( 44 , 69 ), ( 44 , 77 ), ( 46 , 84 ), ( 49 , 91 ), ( 54 , 95 ) , ( 61 , 97 ), ( 68 , 97 ), ( 76 , 95 ), ( 84 , 91 ) , ( 90 , 87 ), ( 94 , 81 ), ( 97 , 75 ) , ( 99 , 68 ) , ( 101 , 60 ) ] ,
  3. '左眉' : [( 51 , 42 ), ( 54 , 39 ), ( 58 , 39 ), ( 63 , 40 ), ( 67 , 42 )],
  4. '右眉' : [( 75 , 44 ), ( 80 , 44 ), ( 86 , 44 ), ( 90 , 47 ), ( 93 , 51 )],
  5. 'ノーズブリッジ' : [( 70 , 48 ), ( 68 , 52 ), ( 67 , 56 ), ( 66 , 60 )],
  6. '鼻先' : [( 60 , 64 ), ( 62 , 65 ), ( 65 , 67 ), ( 68 , 66 ), ( 71 , 66 )],
  7. '左目' : [( 55 , 47 ), ( 57 , 45 ), ( 61 , 46 ), ( 63 , 48 ), ( 60 , 48 ), ( 57 , 48 )],
  8. '右目' : [( 77 , 51 ), ( 80 , 50 ), ( 84 , 51 ), ( 86 , 54 ), ( 83 , 54 ), ( 79 , 53 )],
  9. '上唇' : [( 54 , 75 ), ( 58 , 72 ), ( 61 , 72 ), ( 64 , 73 ) , ( 66 , 73 ), ( 70 , 75 ), ( 73 , 80 ), ( 71 , 79 ) , ( 66 , 75 ), ( 63 , 75 ), ( 61 , 74 ) , ( 56 , 75 ) ] ,
  10. '下唇' : [( 73 , 80 ), ( 68 , 81 ), ( 64 , 81 ), ( 62 , 80 ), ( 60 , 80 ), ( 57 , 78 ), ( 54 , 75 ), ( 56 , 75 ) , ( 60 , 77 ), ( 63 , 78 ), ( 65 , 78 ) , ( 71 , 79 ) ]
  11. }]

この画像にデジタルメイクを施すことができます。

  1. face_landmarks_list 内の face_landmarksの場合:
  2. pil_image = PIL.Image.fromarray(fr_image)
  3. d = PIL.ImageDraw.Draw(pil_image, 'RGBA' ) です。
  4.  
  5. # 眉毛を悪夢にする
  6. d.line(face_landmarks[ 'left_eyebrow' ], 塗りつぶし=( 0 , 0 , 0 , 255 ), 幅= 3 )
  7. d.line(face_landmarks[ 'right_eyebrow' ], 塗りつぶし=( 0 , 0 , 0 , 255 ), 幅= 3 )
  8. d.polygon(face_landmarks[ 'left_eyebrow' ], fill=( 0 , 0 , 0 , 255 ))
  9. d.polygon(face_landmarks[ 'right_eyebrow' ], fill=( 0 , 0 , 0 , 255 ))
  10.  
  11. # 唇にグロスを塗る
  12. d.line(face_landmarks[ 'top_lip' ], 塗りつぶし=( 0 , 0 , 0 , 255 ), 幅= 10 )
  13. d.line(face_landmarks[ 'bottom_lip' ], 塗りつぶし=( 0 , 0 , 0 , 255 ), 幅= 10 )
  14.  
  15. d.polygon(face_landmarks[ 'bottom_lip' ], fill=( 255 , 0 , 0 , 255 ))
  16. d.polygon(face_landmarks[ 'top_lip' ], fill=( 255 , 0 , 0 , 255 ))
  17. d.line(face_landmarks[ 'top_lip' ], 塗りつぶし=( 0 , 0 , 0 , 255 ), 幅= 2 )
  18. d.line(face_landmarks[ 'bottom_lip' ], 塗りつぶし=( 0 , 0 , 0 , 255 ), 幅= 2 )
  19.  
  20. # チン
  21. d.polygon(face_landmarks[ 'あご' ], fill=( 255 , 0 , 0 , 16 ))
  22.  
  23. # アイライナーを塗る
  24. d.line(face_landmarks[ 'left_eye' ] + [face_landmarks[ 'left_eye' ][ 0 ]], 塗りつぶし=( 10 , 0 , 0 , 255 ), 幅= 6 )
  25. d.line(face_landmarks[ 'right_eye' ] + [face_landmarks[ 'right_eye' ][ 0 ]], 塗りつぶし=( 10 , 0 , 0 , 255 ), 幅= 6 )
  26.  
  27. # 目を輝かせる
  28. d.polygon(face_landmarks[ 'left_eye' ], fill=( 255 , 0 , 0 , 200 ))
  29. d.polygon(face_landmarks[ 'right_eye' ], fill=( 255 , 0 , 0 , 200 ))
  30.  
  31. 表示(pil_image)

これが私たちが得たものです。

<<:  顔認識とは何ですか?あなたは顔認識技術を本当に理解していますか?

>>:  スマートセンサー: 従業員をオフィスに戻すための鍵となるか?

ブログ    
ブログ    

推薦する

...

音声合成のためのディープフィードフォワードシーケンシャルメモリネットワーク

まとめディープフィードフォワードシーケンスメモリネットワークに基づく音声合成システムを提案します。こ...

...

AI 開発の加速: 企業はどのように MLOps を使用して生産効率を向上できるでしょうか?

企業が初めて AI を導入し、機械学習プロジェクトを構築するときは、理論に重点を置くことがよくありま...

これら 5 つのオープンソース ソフトウェアを使用すると、音声からテキストへの変換が簡単になります。

音声テキスト変換(STT)システムは、話した言葉をテキストに変換できる方法です。私たちがよく使うWe...

運転教習業界にも「AI」の波が吹き荒れる、普及規模に注目

[[422314]]近年、都市化と道路交通建設の加速により、自動車旅行の需要が継続的に増加しており、...

インテル子会社が自動運転向け5nm RISC-Vプロセッサをリリース

CES(コンシューマーエレクトロニクスショー)がラスベガスで盛況だ。インテル、マイクロソフト、グーグ...

謎の AI 顔変更ソフトウェアが世界中のソーシャル ネットワークに侵入!マスク氏は数秒でルネサンス貴族になる

[[410798]] FaceAppの人気は過ぎ去り、最近では、あなたの顔を数秒で「ディズニー」に変...

任正非氏と世界の人工知能専門家との対話の全文記録:ファーウェイの5G技術は米国にのみ販売されている

[[278050]]ファーウェイの創業者兼CEOである任正非氏は、人工知能分野の2人の専門家と対談し...

人工知能はクラウドストレージとデータサービスの革新を推進する

[[358649]]従来のストレージとデータ構造が、クラウドネイティブ アプリケーションに必要な移植...

Java プログラミング スキル - データ構造とアルゴリズム「フィボナッチ検索」

[[398011]]基本的な紹介フィボナッチとは、線分を 2 つの部分に分割し、一方の長さと全体の...

...

米メディア:人工知能の発展には5つの大きなトレンドが予想される

3月15日、アメリカの隔週刊ウェブサイト「フォーブス」は「2021年の人工知能:期待できる(または期...

ChatGPT でより良いコードを書く方法

翻訳者 |李睿レビュー | Chonglouコードの生成は、ChatGPT や指示に従うその他の大規...

強化学習のゴッドファーザーによる新しい論文では、意思決定エージェントの普遍的なモデルを探求しています。学際的な共通点を見つける

強化学習と意思決定に関する学際会議 (RLDM) の重要な前提は、複数の分野が長期にわたる目標指向の...