ひどい、顔認識の練習のための40行のコード

ひどい、顔認識の練習のための40行のコード

最近、恐れることなく赤信号を無視していた人々が交通警察署に電話し、交通警察のおじさんに自分の写真を削除するように頼むようになったブラックテクノロジーについて聞きました...

[[197832]]

赤信号を無視することは、交通問題において常に大きな頭痛の種となってきました。交通法で赤信号を無視した自動車に6点の減点措置が導入されて以来、多くのドライバーはもう過失を犯すことはできないと言っている。

[[197833]]

自動車は問題ないが、自動車以外の車両や歩行者の信号無視の問題をどう解決するのか?中国式の道路横断方法が人々の心に深く根付いているところに、ブラックテクノロジーが登場。一見すると、本当に警察が容疑者を捜索しているように見える。

[[197834]]

[[197835]]

最近、山東省、江蘇省、深セン市などの一部の都市では、交差点で顔認識システムを使い、歩行者や信号無視の非自動車などの違反者を捕捉し、その場で摘発し始めている。

赤信号を無視した歩行者や非動力車両に対しては、交通管理部門が20~50元の罰金を科す。

[[197836]]

罰金は大した額ではないが、人々が最も恐れているのは、自分の非道な行為や個人情報が映し出されたビデオが一日中大画面で放映されることだ。交通警察のおじさんは、写真を撮られた住民たちは二度と赤信号を無視することはないと言ったと話した。

[[197837]]

[[197838]]

顔キャプチャシステムの動作原理は、赤信号が点灯し、歩行者や非自動車が停止線を越えると、システムが自動的に4枚の写真をキャプチャし、15秒間のビデオを保存して違反者の顔写真をキャプチャし、夜間でも鮮明な画像を生成するというものです。現場での再生に加え、交通管理部門では接続された世帯登録情報も公開します。

顔認識技術はどのように機能するのでしょうか?

多くの人は、顔認識は非常に難しいタスクだと考えています。名前を見ると怖くなり、恐る恐るオンラインで検索します。しかし、オンラインで何ページものチュートリアルを見るとすぐに諦めてしまいます。

これらの人々の中には、かつての私自身も含まれています。実際、背後にある原理を深く理解する必要がなく、ただ実現したいだけであれば、顔認識はそれほど難しくありません。

今日は、40 行未満のコードで顔認識を簡単に実装する方法を見ていきます。

ちょっとした違い

ほとんどの人にとって、顔検出と顔認識を区別することはまったく問題ではありません。しかし、オンラインのチュートリアルには、意図的か否かにかかわらず顔検出を顔認識と呼んでいるものが多くあり、一般の人々を誤解させ、この 2 つが同じものだと思わせる原因となっています。

実際、顔検出が解決する問題は写真に顔があるかどうかを判断することであり、顔認識が解決する問題はそれが誰の顔であるかを判断することです。顔検出は人間認識の前段階の作業であると言えます。

今日やるのは顔認識です。

使用されるツール

アナコンダ 2 - Python 2

ドリブ

scikit-イメージ

ドリブ

今日使用する主なツールについてもう少し説明する必要があります。 Dlib は、最新の C++ に基づくクロスプラットフォームのユニバーサル フレームワークです。作者は非常に熱心に取り組んでおり、継続的に更新しています。

Dlib は、機械学習、画像処理、数値アルゴリズム、データ圧縮など、幅広いコンテンツをカバーしています。さらに重要なのは、Dlib のドキュメントが非常に充実しており、例が非常に豊富であることです。多くのライブラリと同様に、Dlib も Python インターフェイスを提供します。インストールは非常に簡単で、pip を使用する場合は 1 つの文だけが必要です。

  1. pip で dlib をインストール

上記で必要な scikit-image にも、次の文だけが必要です。

  1. pip で scikit-image をインストールします

注意: pip install dlib を使用してインストールに失敗した場合、インストールはさらに面倒になります。エラー プロンプトは非常に詳細なので、エラー プロンプトに従って手順を追って対処してください。

顔認識

顔認識を実装するために Dlib を使用する理由は、ほとんどの作業が Dlib によって実行されており、呼び出すだけで済むためです。 Dlib には、顔検出器、トレーニング済みの顔キーポイント検出器、およびトレーニング済みの顔認識モデルが含まれています。

私たちの今日の主な目標は、原則を掘り下げることではなく、実装することです。サンプルコードは40行を超えないので、実際には難しくありません。

まず、ファイル ツリーを通じて今日使用する必要があるコードを確認します。

候補画像を 6 つ用意して candidate-faces フォルダに配置し、認識する必要がある顔画像 test.jpg を配置します。私たちの仕事は、test.jpg 内の顔を検出し、候補の中から誰であるかを判断することです。

もう 1 つの girl-face-rec.py は Python スクリプトです。

shape_predictor_68_face_landmarks.dat は、トレーニング済みの顔ランドマーク検出器です。

dlib_face_recognition_resnet_model_v1.dat は、トレーニング済みの ResNet 顔認識モデルです。

ResNet は、He Kaiming 氏が Microsoft に在籍していたときに提案した深層残差ネットワークです。ImageNet 2015 で優勝しました。ネットワークに残差を学習させることで、深度と精度の点で CNN よりも強力です。

事前準備

shape_predictor_68_face_landmarks.dat と dlib_face_recognition_resnet_model_v1.dat は両方ともここにあります。

ハイパーリンクをクリックできない場合は、次の URL を直接入力できます: http://dlib.net/files/。

次に、候補となる顔として、正面からの顔写真が最も適した、数人の顔写真を用意します。それを candidate-faces フォルダに配置します。

この記事のために用意した写真は以下の6枚です。

[[197839]]

彼らです:

次に、認識する必要のある顔画像を 4 つ用意します。実際には 1 つで十分です。ここでは、さまざまな状況を見てみましょう。

[[197840]]

最初の 2 枚の写真が、候補ファイル内の人物とはかなり異なっていることがわかります。3 枚目の写真は、候補の中の元の写真です。4 枚目の写真では、人物の顔が少し横を向いており、右側に影があります。

識別プロセス

データは準備完了です。次のステップはコードです。一般的な識別プロセスは次のとおりです。

まず、候補に対して顔検出、キーポイント抽出、記述子生成を実行し、候補記述子を保存します。

次に、テスト顔に対して顔検出、キーポイント抽出、記述子生成が実行されます。

*** テスト画像の顔記述子と候補の顔記述子間のユークリッド距離を求め、距離が最小のものを同一人物と判断する。

コード

すでに十分にコメントされているため、コードの詳細については説明しません。 girl-face-rec.py は次のとおりです:

  1. # -*- コーディング: UTF-8 -*-
  2. sys、os、dlib、glob、numpy をインポートします。
  3. skimageからio をインポート
  4. len(sys.argv) != 5の場合:
  5. 「パラメータが正しいかどうか確認してください」と印刷します 
  6. 出口()
  7. # 1. 顔キーポイント検出器
  8. 予測子パス = sys.argv[1]
  9. # 2. 顔認識モデル
  10. face_rec_model_path = sys.argv[2]
  11. # 3. 候補者の顔フォルダー
  12. faces_folder_path = sys.argv[3]
  13. # 4. 認識される顔
  14. img_path = sys.argv[4]
  15. # 1. 正面顔検出器をロードする
  16. 検出器 = dlib.get_frontal_face_detector()
  17. # 2. 顔のキーポイント検出器をロードする
  18. sp = dlib.shape_predictor(予測子パス)
  19. # 3. 顔認識モデルをロードする
  20. facerec = dlib.face_recognition_model_v1(face_rec_model_path)
  21. # win = dlib.image_window()
  22. # 候補顔記述子リスト
  23. 記述子 = []
  24. # フォルダー内の各顔について:
  25. # 1. 顔検出
  26. # 2. キーポイント検出
  27. # 3. 記述子の抽出
  28. glob.glob(os.path.join (faces_folder_path, " *.jpg" ))内のfについて:
  29. print( "処理ファイル: {}" .format(f))
  30. img = io.imread(f)
  31. #win.clear_overlay()
  32. #win.set_image(画像)
  33. # 1. 顔検出
  34. dets = detector(画像、1)
  35. print( "検出された顔の数: {}" .format(len(dets)))
  36. enumerate (dets)k、dについて:
  37. # 2. キーポイント検出
  38. 形状 = sp(画像, d)
  39. # 顔の部分とキーポイントを描く
  40. # win.clear_overlay()
  41. # win.add_overlay(d)
  42. # win.add_overlay(シェイプ)
  43. # 3. 記述子抽出、128Dベクトル
  44. 顔記述子 = facerec.compute_face_descriptor(画像、形状)
  45. # numpy配列に変換する
  46. v = numpy.array(顔記述子)
  47. 記述子.append(v)
  48. # 認識する顔に対して同じプロセスを実行します
  49. # 記述子を抽出し、コメントをなくす
  50. img = io.imread(img_path)
  51. dets = detector(画像、1)
  52. 距離 = []
  53. enumerate (dets)k、dについて:
  54. 形状 = sp(画像, d)
  55. 顔記述子 = facerec.compute_face_descriptor(画像、形状)
  56. d_test = numpy.array(顔記述子)
  57. # ユークリッド距離を計算する
  58. 記述子i場合:
  59. dist_ = numpy.linalg.norm(i-d_test)
  60. dist.append(dist_)
  61. # 候補者一覧
  62. 候補 = [ 'Unknown1' 'Unknown2' 'Shishi' 'Unknown4' 'Bingbing' 'Feifei' ]
  63. # 候補と距離が辞書を形成する
  64. c_d = dict(zip(候補,dist))
  65. cd_sorted = sorted(c_d.iteritems(),キー=lambda d:d[1])
  66. print "\n 人物は: " ,cd_sorted[0][0]
  67. dlib.hit_enter_to_continue()

運用結果

.py が配置されているフォルダーでコマンド ラインを開きます。次のコマンドを実行します。

python 女の子の顔のrec.py 1.dat 2.dat ./candidate-faecs test1.jpg

shape_predictor_68_face_landmarks.dat と dlib_face_recognition_resnet_model_v1.dat は長すぎるため、1.dat と 2.dat に名前を変更しました。

結果は次のとおりです。

  • その人はビンビンです。

記憶力の悪い生徒は、写真 test1.jpg が誰のものか調べることができます。ご興味があれば、4 つのテスト画像をすべて実行してみてください。

ここで注目すべきは、最初の 3 枚の写真の出力結果が非常に理想的であるということです。しかし、4 番目のテスト画像の出力結果は候補 4 になります。 2枚の写真を比較すると、混乱の理由は簡単にわかります。

結局のところ、機械は人間ではないので、その知能は人間によって向上される必要があります。

興味のある方は、認識精度を向上させる方法について引き続き詳しく学習してください。例えば、各人物に対して複数の候補写真を用意し、各人物間の平均距離を比較するなど、すべてあなた次第です。

<<:  ディープラーニング: シンプルだが限界のあるソリューション

>>:  独占 | R で Keras と TensorFlow を使用してディープラーニング モデルを構築する方法を教えます

ブログ    
ブログ    

推薦する

K-means クラスタリングがあるのに、なぜ DBSCAN クラスタリング アルゴリズムが必要なのでしょうか?

クラスタリング分析は、データ ポイントを複数の特定のクラスターまたはグループに分割する教師なし学習手...

旅の途中+第2世代、「バルペンハイマー」完成までの7つのステップにカルパシーが驚愕 | 実際のテスト体験を添付

数日前、バービー・ハイモアがインターネットで話題になって以来、ネットユーザーたちは、MidJourn...

2457億のパラメータ!世界最大のAIモデル「Source 1.0」がリリース、中国が独自のGPT-3を製作

[[426889]]古代の学者たちは、一杯の酒を飲みながら心の奥底にある感情を表現したり、武宇寺に...

Keras でカスタム損失関数を作成する方法は?

[[284375]] UnsplashのDhruv Deshmukhによる写真損失関数を使用して、...

...

ディープラーニングを使用してXSSを検出する方法

1. はじめに周知のとおり、ディープラーニングはコンピュータービジョン、自然言語処理、人工知能などの...

MITチームの最新研究により、LiDARと2Dマップのみでエンドツーエンドの自動運転が実現

自動運転に関して言えば、当然のことながら「視覚アルゴリズム」派と「ライダー」派の論争が思い浮かびます...

世界図書デー: スマートテクノロジーがいかにして優れた読書環境を作り出すか

4月23日は第25回「世界本の日」です!今日は本を読みましたか?ゴーリキーはかつてこう言った。「本は...

AIチップの過去と未来、この記事を読んでください

[[248236]]皆さんは、イ・セドルと柯潔を破った Google の「Alpha Go」をまだ覚...

強力な人工知能まであとどれくらいでしょうか?まず、これらの5つの数学の問題を解くのに10年から20年かかります

[[272461]] 7月30日、成都ハイテクゾーンの景栄会で開催された2019年世界人工知能サミッ...

AI に「大きな力と小さな心」を与える - ユニバーサル CNN アクセラレーション設計

[[207759]]導入FPGA ベースの汎用 CNN アクセラレーション設計により、FPGA 開発...

軍事用AIは普及するだろうか?公共の安全を重視すべきか、住民のプライバシーを重視すべきか?

[[227907]]ここ数カ月、軍事用AIと能動攻撃兵器の問題が話題になっており、多くのAI研究者...

4 大検索大手は人工知能に夢中です。最も有望なのはどれだと思いますか?

近年、世界の科学技術分野で最もホットな言葉は「人工知能」です。グーグル、百度、ヤンデックス、ネイバー...

...