ひどい、顔認識の練習のための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 を使用してディープラーニング モデルを構築する方法を教えます

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

...

チャットボットをよりエレガントに設計する方法

AI アルゴリズムの人気により、近年会話型ロボットの人気が高まり、あらゆる分野で推進され、使用されて...

...

テスラが自社開発したスーパーコンピューター「Dojo」は今月発表されるのか? UCLA教授がツイートで事前に情報を漏らす

[[415656]]謎のツイートにより、テスラが再び人気急上昇中だ。昨日、@Dennis Hong ...

...

ディープラーニングを使用してPythonコードを自動的に補完するこのオープンソースプロジェクトは非常に素晴らしい

コード補完機能は IDE では非常に一般的です。優れたコード自動補完機能により、作業効率が大幅に向上...

ディープラーニングにおける活性化関数の概要

この記事では、さまざまな活性化関数を紹介し、活性化関数の長所と短所を比較します。この記事は、人工ニュ...

双子: 効率的な視覚的注意モデルの設計を再考する

著者 | 湘湘天志 張波 他Twins は Meituan とアデレード大学が提案した視覚的注意モデ...

ポストエピデミック時代:医療業界で成功するには?

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

上位 10 の古典的なソート アルゴリズムの概要 (Java コード実装を含む)

最近、ソートアルゴリズムを勉強していて、多くのブログを読んでいます。インターネット上のいくつかの記事...

生成AIを使用して学生のイノベーションを促進する

今年も新学期がやってきましたが、教育者は AI テクノロジーの爆発的な進歩によって大きな倫理的プレッ...

...

もしエイリアンが本当に存在するなら、AIは最終的に彼らを見つけるだろう

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

最新のMLPerfランキング:アリババのAIコンピューティングパワーが多くの分野で1位を獲得

4月7日、権威あるAIベンチマーク評価組織MLPerfが最新の推論パフォーマンスリストを公開した。 ...

Go 向けに設計された機械学習ライブラリ Gorgonia: TensorFlow や Theano のライバル

[[184558]] Gorgonia は、Go での機械学習を容易にし、多次元配列を含む数式の記述...