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

ブログ    
ブログ    
ブログ    

推薦する

...

小さなバッチがディープラーニングの一般化を高める理由

バッチ サイズは、機械学習における重要なハイパーパラメータの 1 つです。このハイパーパラメータは、...

もうひとつ:なぜ消費者向けロボット企業は失敗しているのか?

[[264899]] [51CTO.com クイック翻訳] ハードウェア分野の変化はどのくらい速い...

AIはどのようにして責任を持つようになるのでしょうか?英国規格協会が答えを持っている

人工知能(AI)は、現在世界で最も革新的で影響力のある技術の1つであり、さまざまな分野や産業に浸透し...

人工知能を世界で初めて活用し、特発性肺線維症治療薬の新たなメカニズムを発見

Insilico Medicine は、人工知能を使用して特発性肺線維症治療薬の新しいメカニズムを世...

ChatGPT/GPT-4/ラマトロッコ問題コンテスト!小型モデルの方が道徳心が高い?

「モデルには道徳的に推論する能力がありますか?」この質問は、モデルによって生成されるコンテンツ ポ...

フロントエンド: JavaScript でのバイナリ ツリー アルゴリズムの実装

[[359197]]次に、js データ構造のツリーを調べてみましょう。ここでのツリーは、幹と枝を持つ...

ソフトウェアとハ​​ードウェアを組み合わせたCDS Shouyun AIクラウドサービスの技術実践

人工知能は新たな変化を先導しています。近年、人工知能はテクノロジー業界から始まり、急速に生活の各分野...

文部科学省が文書を発表:AI、アルゴリズム等が2018年度から高等学校の教育課程に取り入れられる!

教育部はこのほど記者会見を開き、「高等学校一般教育課程計画及び中国語等教科教育課程基準(2017年版...

コカ・コーラの新たな試み:アートや広告制作における生成AIの活用

生成型 AI の新たな波に直面して、私たちはそれに積極的に適応するか、AI (または AI を受け入...

ロボットと一緒に働くのはどんな感じでしょうか?

[[206343]]アメリカの企業では、多数のロボットを使って働くことが当たり前になっている。ここ...

李徳易学士:人工知能の影響を最も受けている業界は教育

2019年12月22日、中国職業技術教育学会科学技術成果転換作業委員会が中国科学院コンピューティング...

...

人民日報:教室規律における顔認識は目的ではなく手段

どの学校も生徒をより深く理解したいと考えていますが、テクノロジーを駆使した解決策の中には、満場一致で...