PCの顔認証ログイン、驚くほど簡単

PCの顔認証ログイン、驚くほど簡単

以前、オープンソース プロジェクトをやったことがあります。GitHub ログインが完成した後、もっと高級感を出したいと思い、顔認識ログインを追加することにしました。開発スケジュールが遅いため、1 週間後にようやく時間が取れました。

ソースコードは記事の最後にあります

実は、最近は記事を書くことに少し抵抗を感じています。自分の書いたものを読んでくれる人は誰もいないし、いつも少しがっかりしています。幸い、同僚の指導のおかげで自信を取り戻すことができました。考え方を変えました。私が共有するものがみんなの役に立つ限り、それでいいのです。どれだけの人が読むかは運命次第です!

では早速、ダイナミック顔認識効果を見てみましょう。モザイクが少し濃く、見た目があまり良くありません。

[[335574]]

実施原則

顔認識ログインを実装する一般的なプロセス、3 つの主なステップを見てみましょう。

フロントエンドのログインページでカメラを開き、顔認識を実行します。注意: 写真に顔があるかどうかのみを認識します。

顔を認識したら写真を撮り、現在の画面画像をアップロードします

バックエンドは画像を受け取り、顔ライブラリ SDK を呼び出して肖像画を比較します。合格するとログインが成功し、肖像画の情報が顔ライブラリとローカル MySQL に登録されます。

フロントエンド実装

前述のように、フロントエンドで顔を認識する必要があるため、ここではツールを使用する必要があります。私は、軽量のフロントエンド顔認識フレームワークであるtracking.jsを使用します。

フロントエンドの Vue コードの実装ロジックは比較的シンプルです。tracking.js はカメラを開いて顔情報を認識した後、ビデオ画像の写真を撮影し、画像情報をバックグラウンドにアップロードし、画像比較の結果を待ちます。

  1. データ() {  
  2. 戻る {  
  3. showContainer: true, // 表示 
  4. トラッカー: null、  
  5. tipFlag: false, // デバイスが検出されたことをユーザーに通知する 
  6. flag: false, // 写真が撮影されたかどうかを確認します 
  7. context: null, // キャンバスコンテキスト 
  8. removePhotoID: null, // 画像の変換を停止 
  9. scanTip: '顔認識を実行中...', // プロンプトテキスト 
  10. imgUrl: '', // base64 形式の画像 
  11. キャンバス: null  
  12. }  
  13. },  
  14. マウント() {  
  15. this.playVideo()  
  16. },  
  17. メソッド: {  
  18. ビデオを再生する(){  
  19. varビデオ=ドキュメント.getElementById('ビデオ');  
  20. this.canvas =ドキュメント.getElementById('canvas');  
  21. this.context = this.canvas.getContext('2d' ) ;  
  22. this.tracker =新しいtracking.ObjectTracker('face');  
  23. this.tracker.setInitialScale(4);  
  24. this.tracker.setStepSize(2);  
  25. this.tracker.setEdgesDensity(0.1);  
  26. トラッキングの追跡('#video', this.tracker, {カメラ: true});  
  27. this.tracker.on('track', this.handleTracked);  
  28. },  
  29. 追跡イベントを処理する{
  30.   this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);  
  31. イベントデータ長さが 0 の場合 
  32. this.scanTip = '顔が検出されませんでした'    
  33. } それ以外 {  
  34. if (!this.tipFlag) {  
  35. this.scanTip = '認識に成功しました。写真を撮っています。動かないでください〜'    
  36. }  
  37. // 1秒後に1回だけ写真を撮影します 
  38. if (!this.flag) {  
  39. this.scanTip = '写真を撮っています...'    
  40. this.flag = true  
  41. this.removePhotoID = setTimeout (() = > {  
  42. this.tackPhoto()  
  43. this.tipFlag = true    
  44. },  
  45. 2000  
  46.  
  47. }  
  48. イベントデータごとにプロットします。  
  49. }
  50. },  
  51. プロット(rect){  
  52. this.context.strokeStyle = '#eb652e' ;  
  53. this.context.strokeRect(rect.x, rect.y, rect.width, rect.height);  
  54. this.context.font = '11px Helvetica' ;  
  55. this.context.fillStyle = "#fff" ;  
  56. this.context.fillText('x: ' + rect.x + 'px', rect.x + rect.width + 5, rect.y + 11);  
  57. this.context.fillText('y: ' + rect.y + 'px', rect.x + rect.width + 5, rect.y + 22);  
  58. },  
  59. // 写真
  60. タックフォト() {  
  61. this.context.drawImage(this.$refs.refVideo, 0, 0, 500, 500)  
  62. // base64形式で保存 
  63. this.imgUrl = this.saveAsPNG(this.$refs.refCanvas)です 
  64. varフォームデータ=新しいフォームデータ();  
  65. formData.append("ファイル", this.imgUrl);  
  66. this.scanTip = 'ログイン中です。お待​​ちください〜'    
  67. アクシオス({  
  68. メソッド: 'post'、  
  69. url: '/faceDiscern',  
  70. データ: フォームデータ、  
  71. }).then(関数 (応答) {  
  72. アラート(応答データデータ);  
  73. window.location.href = "http://127.0.0.1:8081/home" ;  
  74. }).catch(関数(エラー) {  
  75. コンソール.log(エラー);
  76. });  
  77. this.close()  
  78. },  
  79. // png、base64 形式の画像として保存 
  80. PNGとして保存(c) {  
  81. c.toDataURL('image/png', 0.3) を返します 
  82. },  
  83. // リソースを閉じてクリーンアップする 
  84. 近い() {  
  85. this.flag = false    
  86. this.tipFlag = false  
  87. this.showContainer = false    
  88. this.tracker && this.tracker.removeListener('track', this.handleTracked) && tracking.track('#video', this.tracker, {camera: false});  
  89. this.tracker = null    
  90. this.context = null    
  91. this.scanTip = ''    
  92. タイムアウトをクリアします(this.removePhotoID)  
  93. }  
  94. }

顔認識

以前、「Java ベースで実装した顔認識機能(ソースコード付き)」という顔認識案件をやったことがあるのですが、SDK の呼び出し方が面倒でコード量が膨大になってしまいました。そこで今回は、実装を簡素化するために、Baidu の顔認識 API に切り替えてみたところ、意外と簡単にできました。

なぜ独自の顔認識ツールを書かないのかと聞かないでください。聞かないでください。やり方が分からないだけです。

Baidu Cloud https://console.bce.baidu.com/ai/?_=1595996996657&fromai=1#/ai/face/app/list にアプリケーションを登録し、その後のトークン取得のために API キーとシークレット キーを取得します。

Baidu Cloud Face Recognition API は非常にユーザーフレンドリーで、さまざまな操作のデモがすでに作成されています。それを入手して、簡単な変更を加えるだけで済みます。

最初のステップは、Baidu 顔認識 API を呼び出すための基礎となるトークンを取得することです。

  1. https://aip.baidubce.com/oauth/2.0/token?  
  2. grant_type =クライアント資格情報&  
  3. client_id = [Baidu Cloud ApplicationのAK] &  
  4. client_secret = [Baidu Cloud アプリケーション SK]

次に、写真を比較します。Baidu Cloud はオンライン顔データベースを提供しています。ユーザーがログインすると、まず顔データベースに肖像画が存在するかどうかを照会します。存在する場合は、ログインが成功したことを意味します。存在しない場合は、顔データベースに登録されます。各画像には一意の識別子 face_token があります。

Baidu 顔認識 API の実装は比較的簡単です。次の 3 つのタイプがあるパラメータ image_type に特に注意する必要があります。

  • BASE64: 画像の base64 値、base64 でエンコードされた画像データ。エンコードされた画像のサイズは 2M を超えません。
  • URL: 画像の URL アドレス (ネットワークなどの理由により、画像のダウンロードに時間がかかる場合があります)。
  • FACE_TOKEN: 顔画像の一意の識別子。顔検出 API を呼び出すと、各顔画像に一意のトークンが割り当てられます。

FACE_TOKEN、同じ画像を複数回検出して得られた FACE_TOKEN は同じです。

ここでは BASE64 画像ファイルを使用しているため、image_type は BASE64 に設定する必要があります。

  1. @オーバーライド 
  2. パブリック BaiDuFaceSearchResult faceSearch(文字列ファイル) {  
  3. 試す {  
  4. byte[]デコード= Base64.decode (Base64Util.base64Process(ファイル));  
  5. 文字列faceFile = Base64Util .encode(decode);  
  6. マップ<文字列、オブジェクト>   map =新しいHashMap < > ();  
  7. map.put("画像", faceFile);  
  8. map.put("liveness_control", "NORMAL");  
  9. map.put("group_id_list", "ユーザー");  
  10. map.put("image_type", "BASE64");  
  11. map.put("quality_control", "LOW");  
  12. 文字列パラメータ= GsonUtils.toJson (マップ);  
  13. 文字列結果= HttpUtil .post(faceSearchUrl、this.getAccessToken()、"application/json"、param);  
  14. BaiDuFaceSearchResult のsearchResult = JSONObject .parseObject(result, BaiDuFaceSearchResult.class);  
  15. log.info(" faceSearch: {}", JSON.toJSONString(searchResult));  
  16. searchResult を返します。  
  17. } キャッチ (例外 e) {  
  18. log.error("faceSearch エラー {} を取得", e.getStackTrace());  
  19. e.getStackTrace();  
  20. }  
  21. null を返します。
  22. }  
  23. @オーバーライド 
  24. パブリック BaiDuFaceDetectResult faceDetect(文字列ファイル) {  
  25. 試す {  
  26. byte[]デコード= Base64.decode (Base64Util.base64Process(ファイル));  
  27. 文字列faceFile = Base64Util .encode(decode);  
  28. マップ<文字列、オブジェクト>   map =新しいHashMap < > ();  
  29. map.put("画像", faceFile);  
  30. map.put("face_field", "faceshape,facetype");  
  31. map.put("image_type", "BASE64");  
  32. 文字列パラメータ= GsonUtils.toJson (マップ);  
  33. 文字列結果= HttpUtil .post(faceDetectUrl、this.getAccessToken()、"application/json"、param);  
  34. BaiDuFaceDetectResult検出結果= JSONObject .parseObject(結果、BaiDuFaceDetectResult.class);  
  35. log.info(" 検出結果: {}", JSON.toJSONString(検出結果));  
  36. 検出結果を返します。  
  37. } キャッチ (例外 e) {  
  38. log.error("faceDetect エラー {} を取得", e.getStackTrace());  
  39. e.getStackTrace();  
  40. }  
  41. null を返します。  
  42. }  
  43. @オーバーライド 
  44. パブリック BaiDuFaceAddResult addFace(String file, UserFaceInfo userFaceInfo) {  
  45. 試す {  
  46. byte[]デコード= Base64.decode (Base64Util.base64Process(ファイル));  
  47. 文字列faceFile = Base64Util .encode(decode);  
  48. マップ<文字列、オブジェクト>   map =新しいHashMap < > ();  
  49. map.put("画像", faceFile);  
  50. map.put("グループID", "ユーザー");  
  51. map.put("user_id", userFaceInfo.getUserId());  
  52. map.put("user_info", JSON.toJSONString(userFaceInfo));  
  53. map.put("liveness_control", "NORMAL");  
  54. map.put("image_type", "BASE64");  
  55. map.put("quality_control", "LOW");  
  56. 文字列パラメータ= GsonUtils.toJson (マップ);  
  57. 文字列結果= HttpUtil .post(addfaceUrl、this.getAccessToken()、"application/json"、param);  
  58. BaiDuFaceAddResult追加します  
  59. log.info("addResult: {}", JSON.toJSONString(addResult));  
  60. addResult を返します。  
  61. } キャッチ (例外 e) {  
  62. log.error("addFace エラー {} を取得", e.getStackTrace());  
  63. e.getStackTrace();  
  64. }  
  65. null を返します。  
  66. }

プロジェクトはフロントエンドとバックエンドに分かれていますが、学習の便宜上、顔認識ページをバックエンドプロジェクトに統合しました。

最後に、FireControllerApplication を実行し、アドレス http://localhost:8082/face にアクセスします。

<<:  インタビュアー: よく使用する暗号化アルゴリズムについて教えてください。

>>:  Cloud Pak for Data 3.0は、企業のコスト削減と効率性の向上を支援し、AI導入を加速します。

ブログ    
ブログ    

推薦する

AIへの幻滅? AIの発展を妨げる8つのトレンド

それは「もし」ではなく「いつ」の問題です。以前の記事では、AI が革新的な可能性においてこれまでのテ...

ChatGPT 技術製品の実装: 技術アーキテクチャから実際のアプリケーションまで

導入この共有では、ChatGPTテクノロジー製品の実装についてお話ししたいと思います。技術アーキテク...

AI投資を最大限に活用するための6つのステップ

人工知能は、将来の発展にとって大きな破壊的技術の 1 つであるとよく考えられています。これにより、多...

...

NVIDIA が Tensor RT-LLM を発表、RTX 搭載 PC プラットフォームで大規模言語モデルを 4 倍高速化

10月18日、NVIDIAはハードウェア分野における生成型人工知能の王者となった。同社のGPUは、M...

ChatGPTのサプライチェーンへの応用の可能性

IT ソリューション プロバイダーの Manhattan Associates のマネージング ディ...

競争が激化する中、ドローン配達の時代はいつ来るのでしょうか?

現在、電子商取引の発展が継続的に加速する中、物流と配送のプレッシャーは高まり続けており、ドローンは業...

アルゴリズム設計者が新たな人気者になる

Aisle50 の共同創設者であるクリストファー・シュタイナー氏は、新著の中で、デジタルが優位性を...

...

手書きを模倣するAIが独自のフォントを作成

手書き模倣AIの研究背景諺にあるように、人の筆跡はその人の性格を表す。硬い印刷フォントと比較すると、...

Googleは、ニュースコンテンツを作成するために生成AIツールを使用するためにいくつかの出版社と提携していると報じられている。

2月28日、Adweekは、Googleがいくつかの出版社と、ニュースコンテンツを作成するための新...

インテルがコードの類似性を評価するAIシステムを開発、コンピューターのセルフコーディング性能を40倍向上

[[335747]]コンピュータプログラミングはかつてないほど簡単になりました。当初、プログラマー...

LeCun はもう一つの有名な引用を残しました: ChatGPT?犬ほども良くない!それは言語モデルによって供給されるだけである

チューリング・ビッグスリーの一人であるルカン氏は昨日、もう一つの名言を残した。 「知能の面では、Ch...

...

...