Pythonでシンプルだが強力な顔認識システムを書く

Pythonでシンプルだが強力な顔認識システムを書く

face_recognition は、強力でシンプル、使いやすい顔認識オープンソース プロジェクトであり、完全な開発ドキュメントとアプリケーション ケースを備えており、特に Raspberry Pi システムと互換性があります。 Face_recognition はオープンソースとしてリリースされて以来、広く歓迎されてきました。その使いやすさと強力な機能により、非常に目立つラベルが付けられました。 Face_recognition は、企業や一部のエンジニアリング実践アプリケーション シナリオにとって非常に使いやすいツールです。認識プロジェクトを簡単に完了するために、それほど多くの理論的基礎は必要ないので、今日は具体的に説明します。

まず、face_recognition プロジェクトのオープンソース アドレスは次のとおりです。

https://github.com/ageitgey/face_recognition

インターネット上には比較的完全な API の説明とサンプルアプリケーションが存在するため、ここでは詳細には触れません。まず、face_recognition をインストールする必要があります。これは pip を通じて実行できます。インストール中にエラーが発生した場合は、以下を参照してください。

https://yishuihancheng.blog.csdn.net/article/details/102679177

インストールが完了したら、使用できます。コーディングする前に、次に示すように、簡単なテストでインストールが成功したかどうかを確認できます。

インストールが成功したら、使用を開始できます。

1. 画像内の顔を見つける

  1. demoFunc() を定義します:  
  2. '''  
  3. 顔が写っている写真では顔を丸で囲みます 
  4. '''  
  5. 画像=顔認識.load_image_file("test.jpg")  
  6. face_locations = face_recognition.face_locations (画像)  
  7. face_locations に 1 つある場合:  
  8. y0、x1、y1、 x0 = 1    
  9. cv2.rectangle(画像、 pt1 =(x0, y0)、 pt2 =(x1, y1)、=(0, 0, 255)、厚さ= 3 )  
  10. cv2.imshow('aaa', 画像)  
  11. cv2.waitKey(0) & 0xFF == ord('q')の場合:  
  12. cv2.すべてのウィンドウを破棄する()

以下のようなランダムな画像をインターネットで見つけました。

位置合わせの結果は次のとおりです。

それでも、非常に強力だと感じます。もちろん、練習中に、一部の画像認識では顔を検出できないこともわかりました。結局のところ、これは 100% の問題ではありません。Face_recognition は、独自の顔認識関連アプリケーションをより効率的に構築するのに役立つ基本的なフレームワークのようなものです。

2. 切り取った画像の各顔をローカルに保存する

  1. demoFunc() を定義します:  
  2. '''  
  3. 写真の顔をスクリーンショットして保存する 
  4. '''  
  5. img = cv2.imread ("test.jpg")  
  6. 画像=顔認識.load_image_file("test.jpg")  
  7. face_locations = face_recognition .face_locations(画像) #(上、右、下、左)  
  8. i が範囲(len(face_locations))内である場合:  
  9. y0, x1, y1, x0 =面の位置[i]  
  10. cropped = img .crop((x0,y0,x1,y1)) # (左、上、右、下) 左上隅 右下隅 
  11. 切り取って保存(str(i)+"_.jpg")
  12. 切り取られた.表示()

使用した元の画像は上記と同じで、結果は次のようになります。

5 つの顔がすべて検出され、正常に保存されました。ここで、face_locations 関数の戻り結果に注意する必要があります。返されたサブリストの各サブリストには 4 つの要素が含まれており、これらは単一の顔画像の左上頂点と右下頂点の座標です。注目すべき主な点は、これら 4 つのパラメータの順序です。私が示した結果では、(x0、y0) は左上頂点の座標を表し、(x1、y1) は右下頂点の座標を表します。

3. 画像内の各顔を128次元のベクトルにエンコードする

  1. demoFunc() を定義します:  
  2. '''  
  3. 画像内の各顔を128次元のベクトルにエンコードする 
  4. '''  
  5. 画像=顔認識.load_image_file("cl.jpg")  
  6. face_locations = face_recognition .face_locations(画像) #(上、右、下、左)  
  7. face_encodings = face_recognition .face_encodings(image, face_locations) # 単一の顔データを128次元のベクトルに変換します 
  8. face_encodings の 1 つ:  
  9. print('1: ',1) を出力します。

ここで、顔認識のいくつかの応用原理についてお話ししなければなりません。以下は私の要約の一部です。不適切な点がありましたら、ご指摘いただければ幸いです。

face_recognition モジュールで顔認識アプリケーションを実装する原則:

(1)識別したい顔の写真が与えられたら、それをエンコードし(1人につき1つのみ必要)、これらのさまざまな顔のエンコードのリストを作成します。エンコードでは、実際に顔画像を 128 次元の特徴ベクトルにマッピングします。

(2)画像ベクトル間の類似度を計算し、閾値または許容値に基づいて同一人物かどうかを判定する。

(3)認識結果ラベルを出力する。

face_recognitionの核心はこの部分のベクトル化処理にあると言っても過言ではありません。入力された顔画像はそれぞれ128次元の特徴ベクトルに変換されて保存されます。128次元の特徴ベクトルの生成もアルゴリズムです。興味があれば調べてみて詳細を知ることができます。ここでは詳しく説明しません。その後の顔認識は、2つの顔画像間のベクトル類似性の問題に変換されます。

ここでは、ジャッキー・チェンの画像をテストに使用します。元の画像は次のとおりです。

ベクトル化された結果は次のとおりです。

独自のカスタマイズされたアプリケーションを構築する場合は、通常、ここで変更することを選択します。最初に行う必要があるのは、ここで特徴ベクトルを保存することです。

4. 2枚の顔画像を入力して同一人物かどうかを判定する

  1. def demoFunc( one_pic = 'c1.jpg' two_pic = 'c2.jpg' ):  
  2. '''  
  3. 2枚の写真が与えられた場合、それらが同一人物であるかどうかを判断します。  
  4. '''  
  5. chenglong = face_recognition.load_image_file (one_pic)  
  6. 不明な画像= face_recognition.load_image_file (2 つの画像)  
  7. biden_encoding =顔認識.face_encodings(chenglong)[0]  
  8. 不明なエンコーディング=顔認識.顔エンコーディング(不明な画像)[0]  
  9. 結果= face_recognition .compare_faces([biden_encoding], unknown_encoding)  
  10. print('結果: ',結果)
  11. 結果を返す[0]

これは実際には上記の 3 番目の部分と少し似ています。この部分は 3 番目の部分に基づいていますが、compare_faces 類似度計算インターフェースが付属しています。実際にここで置き換えを自分で実装することができます。

同様に、ジャッキー・チェンの画像 2 枚がテストに使用されました。元の画像は次のとおりです。

テスト結果は次のとおりです。

5. 顔のキーポイント認識とラベル付け

  1. demoFunc( pic_path = 'cl.jpg' ):
  2. '''  
  3. 顔のキーポイント認識とラベル付け 
  4. '''  
  5. 画像= face_recognition.load_image_file (pic_path)  
  6. face_landmarks_list = face_recognition.face_landmarks (画像)  
  7. print("この写真には {} 人の顔が見つかりました。".format(len(face_landmarks_list)))  
  8. pil_image = Image.fromarray (画像)  
  9. d = ImageDraw.Draw (pil_image)  
  10. face_landmarks_list 内の face_landmarks の場合:  
  11. face_landmarks.keys() の facial_feature の場合:  
  12. print("この面の {} には次のポイントがあります: {}".format(facial_feature, face_landmarks[facial_feature]))  
  13. face_landmarks.keys() の facial_feature の場合:  
  14. d.line(face_landmarks[顔の特徴],= 5 )  
  15. pil_image.show()

顔の重要なポイントには、鼻、口、目、眉毛などがあります。ここでも上記のジャッキー・チェンの写真を使用し、次の結果が出力されます。

6. メイク

この部分は第5部分に基づいています。顔の特徴を取得した後、自動メイクを行うことができます。具体的な実装は次のとおりです。

  1. def demoFunc( pic_path = "haiwang.jpg" ):  
  2. '''  
  3. 補う 
  4. '''  
  5. 画像= face_recognition.load_image_file (pic_path)  
  6. face_landmarks_list = face_recognition.face_landmarks (画像)  
  7. pil_image = Image.fromarray (画像)  
  8. face_landmarks_list 内の face_landmarks の場合:  
  9. デモ= ImageDraw .Draw(pil_image, 'RGBA')  
  10. demo.polygon(face_landmarks['left_eyebrow'], fill =(68, 54, 39, 128))  
  11. demo.polygon(face_landmarks['right_eyebrow'], fill =(68, 54, 39, 128))
  12. demo.line(face_landmarks['left_eyebrow'],塗りつぶし=(68, 54, 39, 150),= 2 )  
  13. demo.line(face_landmarks['right_eyebrow'],塗りつぶし=(68, 54, 39, 150),= 2 )  
  14. demo.polygon(face_landmarks['top_lip'],塗りつぶし=(150, 0, 0, 128))  
  15. demo.polygon(face_landmarks['bottom_lip'], fill =(150, 0, 0, 128))  
  16. demo.line(face_landmarks['top_lip'],塗りつぶし=(150, 0, 0, 64),= 2 )  
  17. demo.line(face_landmarks['bottom_lip'],塗りつぶし=(150, 0, 0, 64),= 2 )  
  18. demo.polygon(face_landmarks['left_eye'], fill =(255, 255, 255, 30))  
  19. デモ.polygon(face_landmarks['right_eye'],塗りつぶし=(255, 255, 255, 30))  
  20. demo.line(face_landmarks['left_eye'] + [face_landmarks['left_eye'][0]],塗りつぶし= (0, 0, 0, 110),= 2 )  
  21. demo.line(face_landmarks['right_eye'] + [face_landmarks['right_eye'][0]],塗りつぶし= (0, 0, 0, 110),= 2 )  
  22. pil_image.show()

ここでは、テストにアクアマンの写真を使用します。元の画像は次のとおりです。

処理後の結果は次のとおりです。

次のようなこともできます:

7. face_recognitionをベースにしたシンプルな顔認識アプリケーションを構築する

上記では、顔認識アプリケーションを多数紹介しました。ここで最も重要なのは、既存の機能に基づいて独自のパーソナライズされたアプリケーションを実現できることだと思います。ここではいくつかのアイデアを提示し、最もシンプルな独自の実装を示します。

  1. faceRecognitionDemo( picDir = 'data/' test_pic = 'test.png' ):  
  2. '''  
  3. face_recognitionをベースに顔認識モジュールを構築する 
  4. '''  
  5. pic_list = os .listdir(picDir)  
  6. pic_list内のone_picの場合:  
  7. 1 つの pic パス= picDir + 1 つの pic  
  8. one_res = demo6 ( one_pic = one_pic_path two_pic = test_pic )  
  9. one_name = one_pic .split('.')[0].strip()  
  10. one_resの場合:  
  11. print('この人物は: ', one_name)  
  12. 壊す 
  13. それ以外:  
  14. print('この人物は次ではありません: ', one_name)

データフォルダデータのスクリーンショットは次のとおりです。

test.png の内容は次のとおりです。

結果の出力は次のようになります。

もちろん、リアルタイムコンピューティングは、現在のコンピューティング方法では絶対に満たせないものです。これは、最も単純なアプリケーションにすぎません。ここでは、いくつかのアイデアを提案したいと思います。ここでは、face_recognition インターフェースを呼び出すことで類似性判断作業が完了します。もう 1 つの非常に一般的な方法は、顔画像の 128 次元の特徴ベクトルを取得した後、機械学習モデルに基づいて顔認識問題を単純な分類問題に変換することです。たとえば、SVM、RF、GBDT などはすべて、上記のタスクを非常にうまく完了できます。

さて、この記事はここで終わりです。コミュニケーションを歓迎します!

<<:  IBM Cloud Pack for Data が Wunderman Thompson の再開ガイドの作成を支援

>>:  解釈可能な機械学習のための Python ライブラリ

ブログ    
ブログ    
ブログ    

推薦する

8 クイーン問題を解く C# アルゴリズムの簡単な分析

8つのクイーンの問題の説明: 8 クイーン問題は古くからある有名な問題であり、バックトラッキング ア...

ジェネレーションオートメーション:AI主導の労働力

生成 AI は AI の「津波」を引き起こし、AI 駆動型アプリケーションの急速な開発、広範な採用、...

...

大規模機械学習のためのプログラミング手法、計算モデル、Xgboost および MXNet の事例

[[191977]]現在、機械学習のトレンドは、従来の方法のシンプルなモデル + 少量データ (手動...

韓信は本当に数学の達人なのでしょうか?古代中国の数学にヒントを得たコンピュータ暗号化アルゴリズム

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

ガートナー、中国企業向け人工知能トレンド ウェーブ 3.0 を発表

2023 年 6 月 13 日 – 先日開催された 2023 年 Greater China Exe...

...

2017 年の機械学習開発に関するトップ 10 の予測: 悲観的か現実的か?

「分析の時代」はまだ始まったばかりですが、私たちには多くの刺激的なアイデアと期待がもたらされていま...

WeBank AI 主任科学者 NeurIPS の論文で「最新のニューラル ネットワーク盗難防止技術」が明らかに

保護されていないニューラル ネットワークは、誰でも運転できるロックされていない車のようなものです。...

...

...

テクノロジー統合によるバーチャルキャラクターの創造と実践

著者 | 崔昊レビュー | Chonglouまとめこの記事では、パーソナライズされた仮想キャラクター...

パラメータ数はわずか1/700で、性能はGPT-3.5を超えます! CMU+Tsinghua オープンソース Prompt2Model フレームワーク

大規模言語モデル (LLM) に基づいて、開発者やユーザーは、タスクを記述し、いくつかの例を示して自...

テスラ モデル3とYが再びハッカーのリレー攻撃の危険に直面、車は10秒で走り去られる可能性も

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