シンプルで使いやすいPythonの顔認識アルゴリズムをいくつかまとめます

シンプルで使いやすいPythonの顔認識アルゴリズムをいくつかまとめます

こんにちは、みんな。

今日は、シンプルで使いやすい顔認識アルゴリズムをいくつかまとめます。顔認識はコンピュータービジョンの一般的な技術です。生活の中で、私たちが最もよく接する顔認識のシナリオは顔の出席です。私は以前、顔の出席に関する特別なプロジェクトを書きました。興味のある方はご覧ください。

顔認識アルゴリズムの中心的な役割は、写真から顔の位置を識別することです。認識アルゴリズムにはさまざまな種類があります。 一つずつ紹介していきたいと思います。

1. HoG顔検出

このアルゴリズムは、従来の機械学習アルゴリズムを使用して顔を認識します。従来の機械学習アルゴリズムの特徴は、手動で特徴を構築し、構築した特徴をモデルのトレーニングに送信することです。

このアルゴリズムは、HoG を使用して画像内の顔の特徴を抽出し、SVM アルゴリズムを使用して分類します。

HoG (Histogram of Oriented Gradient) 特徴は、コンピュータ ビジョンや画像処理におけるオブジェクト検出に使用される特徴記述子です。画像の局所領域の勾配方向ヒストグラムを計算してカウントすることで特徴を構築します。

このアルゴリズムはdlibライブラリに実装されています。コアコードを見てみましょう。

 dlibをインポートする
# 事前学習済みのHoG顔検出器をロードする
hog_face_detector = dlib.get_frontal_face_detector ( )

# 画像上で顔検出を実行する
結果= hog_face_detector ( imgRGB , 0 )

結果bbox :
x1 = bbox.left ( ) # 顔の左上隅のx座標
y1 = bbox .top ( ) # 顔の左上隅のy座標
x2 = bbox.right ( ) # 顔の右下隅のx座標
y2 = bbox.bottom ( ) # 顔の右下隅のy座標

results​ には、画像内で検出された複数の顔が格納されます。 results を走査することで、各顔の長方形の枠を取得できます。

以下に検出例をいくつか示します。

緑色の枠はアルゴリズムによって検出された顔です。

HoG 顔検出は従来の機械学習アルゴリズムを使用するため、比較的高いパフォーマンスを持ち、CPU 上で比較的高速に実行できます。しかし、80×80より小さい顔は検出できず、回転した顔や正面以外の顔では認識効果があまり良くありません。

2. ディープラーニングによる顔検出

従来の機械学習アルゴリズムは検出が高速ですが、その精度を向上させる必要があります。ディープラーニングに基づく顔検出アルゴリズムは、より正確になる傾向があります。

ここでは、残差ネットワーク ResNet-10 を使用して、ネットワーク (モデル) を通じて画像の単一チャネル (シングル ショット検出器、SSD) で複数の顔を検出する方法を紹介します。 SSDアルゴリズムと呼ばれます。

まず、元の画像をブロブ前処理し、検出のためにモデルに直接取り込む必要があります。

cv2 ライブラリはこのアルゴリズムの実装を提供します。コア コードは次のとおりです。

 cv2をインポート

# 事前トレーニング済みのSSDモデルをロードする
opencv_dnn_model = cv2.dnn.readNetFromCaffe (
prototxt = "models/deploy.prototxt"
caffeModel = "models/res10_300x300_ssd_iter_140000_fp16.caffemodel" )

# オリジナル画像のブロブ処理
preprocessed_image = cv2.dnn.blobFromImage ( 画像スケール係数= 1.0 サイズ= ( 300 , 300 ) 平均= ( 104.0 , 117.0 , 123.0 ) swapRB = False クロップ= False )

# Blob画像がモデルに入力される
opencv_dnn_model .setInput (前処理された画像)

# モデル推論、顔検出
結果= opencv_dnn_model.forward ( )

# 面を横断する
顔の検索結果[ 0 ] [ 0 ] :
# 自信
顔の自信=[ 2 ]

# 面の境界の左上と右下の座標
x1 = int ( bbox [ 0 ] *画像幅)
y1 = int ( bbox [ 1 ] *画像の高さ)
x2 = int ( bbox [ 2 ] *画像幅)
y2 = int ( bbox [ 3 ] *画像の高さ)

Results[0][0]には、検出された複数の顔が格納されます。各顔は配列で表されます。配列の3番目のビットには信頼度レベルが格納されます。信頼できない顔は、しきい値を使用して除外できます。配列の 4 番目から 7 番目のビットには、検出された顔の四角形の左上隅と右下隅の座標が格納されます。

HoG 顔検出と比較して、SSD アルゴリズムは、隠れた顔や正面以外の顔も検出できます。

3. 畳み込みニューラルネットワークによる顔検出

コンピューター ビジョンについて知っている人なら誰でも知っているので、畳み込みについてはあまり説明しません。

dlib ライブラリは、これまでと同様の方法で使用される畳み込みニューラル ネットワークの顔検出アルゴリズムの実装を提供します。

 dlibをインポートする

# 事前学習済みモデルを記録する
cnn_face_detector = dlib .cnn_face_detection_model_v1 ( "models/mmod_human_face_detector.dat" )

# 顔検出
結果= cnn_face_detector ( imgRGB , 0 )

# 各面をトラバースする
結果:
# フェイスボーダー
bbox = フェイス.rect

# 顔の境界の左上と右下の座標
x1 = int ( bbox .left ( ) * (/新しい幅) )
y1 = int ( bbox .top ( ) * (高さ/新しい高さ) )
x2 = int ( bbox .right ( ) * (/新しい幅) )
y2 = int ( bbox .bottom ( ) * (高さ/新しい高さ) )

結果の分析は上記と同様ですので、ここでは詳細には触れません。

畳み込みニューラル ネットワークを使用した顔検出アルゴリズムの利点は明らかです。前の 2 つよりも正確で堅牢であり、遮蔽された顔も検出できます。

正面以外の写真や暗い写真でも検出可能

しかし、このアルゴリズムの対応する欠点も明らかです。検出プロセスには非常に長い時間がかかり、CPU 上でリアルタイムに実行することはできません。

4. ブレイズフェイス

上記のアルゴリズムは、高精度だが低速、または高速だが低精度のいずれかです。高精度と高性能を両立した検出アルゴリズムはありますか?

答えは「はい」です。BlazeFace は、サブミリ秒の顔検出器として知られる、非常に軽量で高精度な顔検出器です。これは、Single Shot MultiBox Detector (SSD)​ と MobileNetv2 からインスピレーションを得ています。

Mediapipe ライブラリはこのアルゴリズムの実装を提供します。コア コードは次のとおりです。

 mediapipe を mp としてインポート

# 描画ツール
mp_drawing = mp .ソリューション.drawing_utils

# 顔検出モデルを初期化する
mp_face_detection = mp.solutions.face_detection
mp_face_detector = mp_face_detection .FaceDetection (最小検出信頼度= 0.4 )

結果= mp_face_detector.process ( imgRGB )

結果が.detectionsの場合:

# 顔の変化によって顔が検出されました
face_no の場合 face in enumerate ( results .detections ) :

# 顔の要点を描く
mp_drawing .draw_detection ( image = output_image detection = face keypoint_drawing_spec = mp_drawing .DrawingSpec ( color = ( 0 , 255 , 0 ) thickness = - 1 circle_radius = image_width // 115 ) bbox_drawing_spec = mp_drawing .DrawingSpec ( color = ( 0 , 255 , 0 ) thickness = image_width // 180 ) )

# 顔の枠を描く
face_bbox = face.location_data.relative_bounding_box
x1 = int ( face_bbox .xmin * image_width )
y1 = int ( face_bbox .ymin * image_height )

cv2.rectangle ( output_image pt1 = ( x1 y1 - image_width // 20 ) pt2 = ( x1 + image_width // 16 y1 ) color = ( 0 255 0 ) thick = -1 )

効果は以下のとおりです。

ご覧のとおり、BlazeFace アルゴリズムは顔を検出できるだけでなく、顔の 6 つの主要なポイント (目、鼻、耳、口) を識別することもできます。

上記は、本日公開された 4 つの顔認識アルゴリズムです。

顔を認識した後は、顔認識を行うのは非常に簡単です。顔をベクトルに埋め込み、ベクトル間の距離を計算するだけです。

<<:  ディープラーニングがロボットの変形可能な物体の取り扱いにどのように役立つか

>>:  サービスロボット市場の最前線に立つセキュリティは注目に値する

ブログ    

推薦する

AIが指紋を偽造できる場合、生体認証は依然として安全ですか?

[[256506]] 「人工知能技術は、大量の指紋データを『原材料』として利用し、その構造的特徴や...

AIが達成できること

半世紀にわたり、人工知能はコンピュータ開発の夢でしたが、常に手の届かないところにありました。しかし、...

恒生電子と恒生巨源が共同で新たなデジタル金融商品を発売、金融ビジネスにおける大規模モデル技術の応用に重点

恒生銀行とその子会社である恒生聚源は6月28日、金融インテリジェントアシスタントPhotonや新しく...

インテリジェントな人間とコンピュータの相互作用とは何ですか?

これは非常に興味深い質問であり、知性と人間とコンピューターの相互作用の両方が関係しており、さらに重要...

顔認識に関する国家基準が策定中:顔のスキャンは許可されず、検証後にデータは削除される必要がある

近年、顔認識技術が急速に発展し、顔をスキャンするだけで高速鉄道駅に入ることができるので非常に便利です...

人工知能: キャリア開発のための3つの戦略

ビジネスに AI を導入するには、テクノロジーとスキルだけでは不十分です。いくつかの戦略を導入するこ...

...

エッジデバイス上でモデル推論を効率的に実行できる 5 つのアルゴリズム

ディープラーニングが進歩するにつれて、ニューラルネットワークはますます大きくなっています。たとえば、...

...

...

...

...

...

人工知能には関連する専門家の参加も必要です!これはより良く、より速くなります

機械にはハードウェアだけでなくソフトウェアもあります。ハードウェアには材料や電力の問題が必要ですが、...

機械学習の発展の歴史と啓蒙

[[188091]]近年、人工知能の目覚ましい発展、特にAlphaGoと韓国のチェスプレイヤー、イ・...