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導入を加速します。

ブログ    

推薦する

ついに誰かが自動運転を明確にした

01 自動運転とは自動運転は無人運転とも呼ばれ、その名の通り、車両が人間の操作なしに周囲の環境を認...

ファーウェイの「社会的採用停止」の背景:特殊分野を除き、レベル19以上の専門家のみを採用

[[247527]]コストを削減し、効率を向上させるために、人材戦略は変わりますか?北京青年報は10...

...

...

2018 年の 5 つの主要な AI トレンドとそのメリット

[[234392]] [51CTO.com クイック翻訳] 人間は常に、自分たちに似たロボットや人工...

SQL SERVER データマイニング: クラスタリングアルゴリズムとシーケンシャルクラスタリングアルゴリズムの理解

前回の「SQL SERVER データ マイニングと列の使用方法の理解」に続き、今回はSQL SERV...

任正非氏と世界の人工知能専門家との対話の全文記録:ファーウェイの5G技術は米国にのみ販売されている

[[278050]]ファーウェイの創業者兼CEOである任正非氏は、人工知能分野の2人の専門家と対談し...

AIとIoTが交通管理をどう変えるのか

人工知能 (AI) とモノのインターネット (IoT) はどちらも、私たちの周りの世界で注目を集め始...

2024年にワイヤレス技術が接続性、効率性、消費者体験をどのように向上させるか

2024 年には、ワイヤレス テクノロジーに多くの改善がもたらされ、接続性、効率性、消費者体験が向上...

...

ブロックチェーンとAI: 完璧な組み合わせ

ブロックチェーンと人工知能は、現在最もホットなテクノロジートレンドの 2 つです。これら 2 つの技...

ドローンレースが人間のトッププレイヤーを上回り、強化学習が再びネイチャーの表紙を飾る

最近、自律型ドローンがドローン競技会で人間のトッププレイヤーに勝利しました。この自律型ドローンは、チ...

DeepMindの最新研究がNatureに掲載され、AI時代の科学研究の新たなパラダイムを明らかにし、未知の領域を探索し、新たな課題をもたらしている。

AIがさまざまな科学分野と融合するにつれ、可能性と課題に満ちた技術革命が起こっています。 AI は...