<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 實(shí)現(xiàn) AI 人臉識(shí)別登錄

          共 9129字,需瀏覽 19分鐘

           ·

          2022-06-02 11:16

          來源: blog.csdn.net/Gaowumao?type=blog

          想自己搞一個(gè)人臉識(shí)別玩玩,隨著開始查找資料來研究這方面的信息,還好有好幾家公司都有提供這方面的免費(fèi)API,也是省下來很多功夫。一開始采用的是face++,但是在執(zhí)行到最后一步人臉?biāo)阉鲿r(shí)出現(xiàn)問題,一直提示INVALID_OUTER_ID,跟著官方文檔,一步步抽離再封裝,最終還是以失敗告終,無奈只能選擇放棄。

          接著輾轉(zhuǎn)第二家 百度AI ,這次還是比較順利的,中間只出現(xiàn)過一次錯(cuò)誤 ? ,而且官方大大還給出了解決方案,很是貼心,最終還是實(shí)現(xiàn)了開始的預(yù)想:成功使用人臉來實(shí)現(xiàn)注冊(cè)和登錄功能。

          難度分析

          由于使用的是百度云AI/face++這兩個(gè)平臺(tái)的現(xiàn)有的Api接口,所以分別對(duì)二者的難度進(jìn)行分析介紹:

          • face++

          曠視face++的難度在于需要自己對(duì)官方提供的代碼段進(jìn)行獨(dú)立封裝,這就比較考驗(yàn)開發(fā)者的代碼抽取能力和 自我獨(dú)立封裝的技能,如果不能很好地進(jìn)行抽取封裝,就會(huì)造成代碼的冗余以及內(nèi)存的浪費(fèi),這樣封裝的效 果并不能達(dá)到最佳。比較耗費(fèi)時(shí)間,在抽取face++平臺(tái)的代碼段時(shí)需要對(duì)IO流有著比較好的理解,從而讀取 讀取配置文件中的內(nèi)容,這里就不多做介紹。

          • 百度云AI

          百度云AI可以讓開發(fā)者對(duì)開發(fā)難度有所選擇,因?yàn)樵撈脚_(tái)提供了兩種方式:第一種方式類似于face++需要抽 取代碼然后進(jìn)行代碼封裝,難度分析見上述face++對(duì)分析;第二種方式則是百度云提供了Maven倉庫,可以 直接導(dǎo)入依賴,直接調(diào)用相應(yīng)的Api進(jìn)行開發(fā)即可!有較好的選擇性!

          • 前端使用JQuery調(diào)用本地?cái)z像頭進(jìn)行拍攝(自我感覺這是????最難????的部分)

          項(xiàng)目回顧(百度云AI)

          最終效果演示:

          技術(shù)選型:

          • SpringBoot

          • BootStrap

          • Thymeleaf

          • 百度云AI / Face++

          項(xiàng)目需求分析

          為了用戶登錄的便捷,不再輸入賬號(hào)密碼進(jìn)行手動(dòng)登錄與注冊(cè),而是使用JQuery調(diào)用本機(jī)的攝像頭進(jìn)行拍攝照片,然后調(diào)用人臉識(shí)別接口將人臉信息自動(dòng)注冊(cè)進(jìn)所使用的平臺(tái)(百度云/Face++)后,用戶即可進(jìn)行人臉掃描實(shí)現(xiàn)登錄操作。

          項(xiàng)目搭建

          1. 前期準(zhǔn)備

          ① 進(jìn)入百度云的人臉識(shí)別控制臺(tái)

          如果沒有百度賬號(hào)可以使用手機(jī)號(hào)快速進(jìn)行注冊(cè)進(jìn)入百度云AI控制臺(tái):

          https://login.bce.baidu.com/?account=&redirect=http%3A%2F%2Fconsole.bce.baidu.com%2Fai%2F%3F_%3D1652174073259%26fromai%3D1#/ai/face/overview/index

          ②創(chuàng)建人臉識(shí)別應(yīng)用

          【1】創(chuàng)建應(yīng)用

          【2】可以選擇自己想要使用的接口:比如人臉識(shí)別、語音技術(shù)等,本次項(xiàng)目采用的是人臉識(shí)別,官方也默認(rèn)選擇了人臉識(shí)別的全部接口,所以也不需要做改動(dòng),只需要填寫應(yīng)用名稱即可!

          【3】獲取秘鑰

          2. 測(cè)試百度云API

          ① 導(dǎo)入依賴

          <dependency>
            <groupId>com.baidu.aip</groupId>
            <artifactId>java-sdk</artifactId>
            <version>4.9.0</version>
          </dependency>

          ② 測(cè)試部分API(人臉注冊(cè)、人臉檢測(cè)、人臉?biāo)阉鞯龋?/span>

          • 人臉注冊(cè)

          用于從人臉庫中新增用戶,可以設(shè)定多個(gè)用戶所在組及組內(nèi)用戶的人臉圖片

          典型應(yīng)用場(chǎng)景:構(gòu)建屬于自己人臉庫,比如:會(huì)員人臉注冊(cè)、已有用戶補(bǔ)全人臉信息

          測(cè)試代碼

          //人臉注冊(cè)
          @Test
          public void testFaceRegister() throws IOException
          {
            //1. 創(chuàng)建Java代碼和百度云交互的Client對(duì)象
            AipFace client = new AipFace("AppId","Api_key","Api_secret");
            //2. 參數(shù)設(shè)置(示例下表格對(duì)參數(shù)進(jìn)行介紹)
            HashMap<String,String> map = new HashMap<>();
            map.put("quality_control","NORMAL");//圖片質(zhì)量
            map.put("liveness_control","LOW");//活體檢測(cè)
            //3. 構(gòu)造圖片
            String path = "本地圖片路徑";
            //上傳的圖片 兩種格式:url地址 Base64字符串形式
            byte[] bytes = Files.readAllBytes(Paths.get(path));
            String encode = Base64Util.encode(bytes);
            //4.調(diào)用api方法完成人臉注冊(cè)
            /**
            * 參數(shù)1:圖片的url或者base64字符串
            * 參數(shù)2:圖片形式(URL,BASE64)
            * 參數(shù)3:組Id(固定一個(gè)字符串)
            * 參數(shù)4:用戶Id
            * 參數(shù)5:hashMap基本參數(shù)配置
            */

            JSONObject res = client.addUser(encode, "BASE64", "pdx", "1000", map);
            System.out.println(res.toString());
          }

          測(cè)試結(jié)果:只要最后error_code為0則表示測(cè)試成功,后續(xù)封裝代碼也是需要判斷error_code的值


          • 人臉檢測(cè)

          判斷圖片是否具有面部信息

          測(cè)試代碼

          @Test
          public void testFaceCheck() throws IOException
          {
                  //1. 創(chuàng)建Java代碼和百度云交互的Client對(duì)象
                  AipFace client = new AipFace("AppId","Api_key","Api_secret");
                  //2. 構(gòu)造圖片
                  String path = "本地圖片路徑";
                  //上傳的圖片 兩種格式:url地址 Base64字符串形式
                  byte[] bytes = Files.readAllBytes(Paths.get(path));
                  String encode = Base64Util.encode(bytes);

                  //調(diào)用Api方法進(jìn)行人臉檢測(cè)
                  /**
                   * 參數(shù)1:圖片的url或者base64字符串
                   * 參數(shù)2:圖片形式(URL,BASE64)
                   * 參數(shù)3:hashMap中的基本參數(shù)配置(null:使用默認(rèn)配置)
                   */

                  JSONObject res = client.detect(encode, "BASE64", null);
                  System.out.println(res.toString(2));
              }

          測(cè)試結(jié)果:


          • 人臉?biāo)阉?/p>

          根據(jù)用戶上傳的圖片和指定人臉庫中的所有人臉進(jìn)行比較,獲取相似度最高的一個(gè)或者某幾個(gè)的評(píng)分返回值(數(shù)據(jù),只需要第一條,相似度最高的數(shù)據(jù))score:相似度評(píng)分(80分以上可以認(rèn)為是同一個(gè)人)

          測(cè)試代碼:

          @Test
          public void testFaceSearch() throws IOException
          {
                  //1. 創(chuàng)建Java代碼和百度云交互的Client對(duì)象
              AipFace client = new AipFace("AppId","Api_key","Api_secret");
                  //2. 構(gòu)造圖片
                  String path = "本地圖片路徑";
                  //上傳的圖片 兩種格式:url地址 Base64字符串形式
                  byte[] bytes = Files.readAllBytes(Paths.get(path));
                  String encode = Base64Util.encode(bytes);
                  //人臉?biāo)阉?/span>
                  JSONObject res = client.search(encode, "BASE64", "pdx", null);
                  System.out.println(res.toString(2));

              }

          測(cè)試結(jié)果:


          小結(jié):

          整體測(cè)試下來,和平常對(duì)數(shù)據(jù)庫的操作類似,都是增刪改查的操作,除了這些Api,還有其他的就不再贅述了,操作類似!所有測(cè)試代碼也會(huì)同項(xiàng)目案例一并上傳到Gitee倉庫中!

          3. 搭建項(xiàng)目(使用Thymeleaf模板引擎)

          ① 創(chuàng)建Maven項(xiàng)目

          引入相關(guān)依賴,構(gòu)建所需文件目錄


          ② 編寫properties配置文件

          ai.appId="api_id"
          ai.apiKey="api_key"
          ai.secretKey="api_secret"
          ai.imageType=BASE64
          ai.groupId="自定義組"
          server.max-http-header-size=1000KB
          spring.thymeleaf.cache=false

          ③ 展示對(duì)上述部分Api接口進(jìn)行二次封裝

          private AipFace client;

              private HashMap<String,String> map = new HashMap<>();

              private BaiduAiUtils(){
                  map.put("quality_control","NORMAL");//圖片質(zhì)量
                  map.put("liveness_control","LOW");//活體檢測(cè)
              }

              @PostConstruct
              public void init()
          {
                  client = new AipFace(APP_ID,API_KEY,SECRET_KEY);
              }

              /**
               * 人臉注冊(cè),將用戶照片存入人臉庫中
               * @param userId
               * @param image
               * @return
               */

              public Boolean faceRegister(String userId,String image){
                  //人臉注冊(cè)
                  JSONObject res = client.addUser(image, IMAGE_TYPE, groupId, userId, map);
                  Integer errorCode = res.getInt("error_code");
                  return errorCode == 0? true : false;
              }

              /**
               * 人臉更新,更新人臉庫中的用戶照片
               * @param userId
               * @param image
               * @return
               */

              public Boolean faceUpdate(String userId,String image){
                  //人臉更新
                  JSONObject res = client.updateUser(image, IMAGE_TYPE, groupId, userId, map);
                  Integer errorCode = res.getInt("error_code");
                  return errorCode == 0 ? true : false;
              }

          想要了解全部封裝代碼請(qǐng)移步Gittee倉庫

          ④ 編寫Controller前端控制器代碼

          首選創(chuàng)建一個(gè)FaceLoginController類

          • 跳轉(zhuǎn)到人臉登錄頁面的控制器

          @RequestMapping("/")
          public String toLogin(){
            return "index";
          }
          • 實(shí)現(xiàn)人臉登錄邏輯

          /**
           * 人臉登錄
           * @return
           * @throws Exception
           */

          @RequestMapping("/face-login")
          @ResponseBody
          public  String searchface(@RequestBody @RequestParam(name = "imagebast64") StringBuffer imagebast64, HttpServletRequest request) throws Exception {
              String userId = faceLoginService.loginByFace(imagebast64);
              request.getSession().setAttribute("userId",userId);
              request.getSession().setAttribute("username","派大星");
              return userId;
          }


          • 實(shí)現(xiàn)人臉登錄業(yè)務(wù)邏輯層

          由于在封裝接口時(shí)設(shè)定的imageType為Base64,所以在實(shí)現(xiàn)前端拍照時(shí)使用的是Canvas Api提供了toDataURL()方法將畫布中的圖形轉(zhuǎn)換為圖片,而默認(rèn)情況下,toDataURL()方法把圖形轉(zhuǎn)變成Base64編碼格式的png,其格式為data:image/png;base64,xxxxx,而,后面的內(nèi)容才是接口中需要的部分,所以需要對(duì)字符串進(jìn)行切割處理。前端部分具體見下圖:

          注意事項(xiàng)(項(xiàng)目搭建前了解)

          ① 出現(xiàn)qps不足如何解決

          Open api qps request limit reached

          這個(gè)問題官方也給出了具體的解決方案,在百度云控制臺(tái)可以免費(fèi)領(lǐng)取測(cè)試額度,也是對(duì)開發(fā)者的一個(gè)福利。

          此處貼上免費(fèi)資源領(lǐng)取地址:https://login.bce.baidu.com/?account=&redirect=http%3A%2F%2Fconsole.bce.baidu.com%2Fai%2F%3F_%3D1652277767387%26fromai%3D1#/ai/face/overview/resource/getFree

          ② oauth 獲取錯(cuò)誤

          0 [main] WARN com.baidu.aip.client.BaseClient - oauth get error, current state: STATE_TRUE_CLOUD_USER
          {
            "error_msg": "IAM Certification failed",
            "error_code": 14
          }

          具體原因:

          仔細(xì)檢查:APP_ID、API_KEY、SECRET_KEY字符串中是否有空格

          項(xiàng)目總結(jié)

          使用百度云AI把項(xiàng)目整體搭建下來,可以很完美的實(shí)現(xiàn)最終的效果,人臉的識(shí)別速度也是相當(dāng)迅速的,一些細(xì)節(jié)處理的特別到位,比如:在進(jìn)行人臉識(shí)別的過程中眼睛必須對(duì)準(zhǔn)攝像頭,當(dāng)你的眼睛有所阻礙時(shí),會(huì)提示的某眼處有阻礙等等。但是在并發(fā)方面支持的并不是很到位!

          新鮮出爐的代碼將會(huì)及時(shí)更新到Gitee倉庫,以上代碼屬于部分實(shí)現(xiàn),想要了解完整版請(qǐng)移步Gitee倉庫:

          https://gitee.com/gao-wumao/ai-face-login

          【END】
          其他優(yōu)質(zhì)好項(xiàng)目
          一鍵生成Spring Boot +Vue項(xiàng)目!接私活縮短一半工期...
          推薦一款牛逼的接私活項(xiàng)目,微服務(wù)也能搞定!
          推薦一套開源通用后臺(tái)管理系統(tǒng)
          12 個(gè)適合做外包項(xiàng)目的開源后臺(tái)管理系統(tǒng)
          基于 SpringBoot + MyBatis 前后端分離實(shí)現(xiàn)的在線辦公系統(tǒng)
          分享70套 Java 項(xiàng)目+實(shí)戰(zhàn)課
          Java項(xiàng)目精選讀者群正式開發(fā),先到先得 !
          歡迎添加編程君個(gè)人微信 cxycode666  進(jìn)粉絲群或圍觀朋友圈
          瀏覽 49
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色福利网站 | 日本在线www | 日皮视频黄片 | 又黄又爽的视频 | 第一色在线|