91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解析利用人臉識別SDK實現人證比對全過程

發布時間:2021-12-18 16:08:48 來源:億速云 閱讀:128 作者:柒染 欄目:互聯網科技

這篇文章將為大家詳細講解有關如何解析利用人臉識別SDK實現人證比對全過程,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

人證比對在如今的社會中隨處可見,如高鐵、飛機、酒店入住、甚至景區入口都可以看到各種各樣的人證應用,人臉識別SDK的也如雨后春筍一般層出不窮,如百度、商湯、Face++、虹軟等。在嘗試使用各家的SDK之后,最讓我青睞的要數虹軟科技的SDK了,最直接的一個原因就是虹軟承諾永久免費。我從2.0版本開始就在使用了,實測效果確實不錯,就在上個月收到消息ArcFace3.0更新了,作為一個白嫖黨自然不會錯過這次的更新,在上手了3.0 之后,發現ArcFace 3.0有以下新特性

  • 特征比對支持比對模型選擇,有生活照比對模型人證比對模型

  • Android平臺新增64位的SDK

  • 新增了一種圖像數據傳入方式

一、ArcFace 3.0 SDK接口變動的得與失

接口變動的優勢:

1.業務自由度變高

??以人證 2.0為例,我們只能傳入數據、傳出結果,而一些中間產物,例如人臉特數據征就獲取不到了。現在采用ArcFace 3.0之后,取消了固定的流程,檢測、比對、提取等流程都可以由自己控制。

2.可以在同一個工程內實現生活照比對與人證比對

??人證 SDK與ArcFace SDK 存在沖突,無法同時使用,若我們既想用人證又想用生活照,就要寫兩個工程,并且兩個工程的流程還有些不同。而現在只需要接口內選擇模型就可以實現模型的切換,完全可以在一個工程內實現人證與生活照程序的集成。

3.代碼復用性

??ArcFace 3.0中人證與身份證區別只有compare接口中的模型選擇,其他完全一致,因此大部分的代碼都可以復用,大大提高了開發的效率。

接口變動的缺點:

1.接口變動

??萬事有得必有失,由于ArcFace 3.0沒有關于人證部分的封裝,致使在升級過程中所有的接口都需要變更,相信也是所有程序員都不愿意看到的問題。

2.實現變困難

??同樣由于ArcFace 3.0沒有關于人證部分的封裝,使得原本接口中自帶的一些流程與回調需要自己來實現,這對于剛上手的人來說,不是十分友好。

小結:

??雖然上面說了一些ArcFace 3.0的缺點,但是我本人還是很贊成這次的升級,畢竟每個產品的革新總會帶來一些沖擊,但是相對于這些沖擊來說,我相信接口、識別流程的統一為程序的適用性與業務的自由性都提高了,相信對于人證2.0來說這次“壯士斷腕”的舉措長遠來看是值得的。

二、人證 2.0 Demo集成ArcFace 3.0 SDK

??在上面我們看到了由于接口的變動,致使人證2.0程序所有的接口都要修改,接下來我將以 人證2.0  Demo為例,講解一下我是如何使用ArcFace 3.0 SDK進行升級的。

1、人證 2.0 Demo工程配置

??考慮到可能有些用戶對人證 2.0 Demo不太熟悉,先簡單介紹一下官方Demo如何配置使用。

如何解析利用人臉識別SDK實現人證比對全過程
??首先,先將人證引擎如圖所示放入demo內,接下來修改Constants內的APP_ID與SDK_KEY,APP_ID與SDK_KEY以及人證引擎均由官網的 開放平臺上進行獲取。然后在設備的SDCard根目錄下放置一張命名為“sample.jpg”的圖片做為模擬人證輸入的圖片(圖片路徑可以在MainActivity下的SAMPLE_FACE變量內進行修改),下圖為配置完畢后運行的截圖。

如何解析利用人臉識別SDK實現人證比對全過程

2.ArcFace 3.0 SDK替換

??首先我們要先獲取ArcFace3.0的SDK,同樣可以在 開放平臺上進行獲取。用新的SDK庫替換掉原本的SDK,替換后的項目目錄如下圖所示

如何解析利用人臉識別SDK實現人證比對全過程

3.ArcFace3.0接口替換

??上面提到了,由于3.0的全面變更,所有的接口全部都發生了改變,因此我們要把原本2.0的接口全部替換為3.0。

?3.1 引擎激活:

??激活方面接口參數沒有任何變化

人證 2.0 :

IdCardVerifyManager.getInstance().active(Context context, String appId, String sdkKey);

ArcFace 3.0 :

FaceEngine.active(Context context, String appId, String sdkKey);
?3.2 引擎初始化:

??從初始化開始,人證 2.0與ArcFace3.0接口有了較大的區別,人證 2.0有對Id Card信息與Camera信息監聽,而3.0取消了這個監聽機制,接口內的參數就不一一介紹了, 官方文檔介紹的非常詳細,大家可以去參考一下官方文檔。

人證 2.0 :

IdCardVerifyManager.getInstance().init(Context context, IdCardVerifyListener listener)

ArcFace 3.0 :

FaceEngine.init(Context context, DetectMode detectMode, DetectFaceOrientPriority detectFaceOrientPriority, int detectFaceScaleVal, int detectFaceMaxNum, int combinedMask)
?3.3 激活&初始化demo:

??下面是我對2.0進行替換后的前后代碼,可以給大家做一個參考:

人證 2.0 :

  private void initEngine() {
        int result = IdCardVerifyManager.getInstance().init(this, idCardVerifyListener);
        LogUtils.dTag(TAG, "initResult: " + result);
        if (result == IdCardVerifyError.MERR_ASF_NOT_ACTIVATED) {
            Executors.newSingleThreadExecutor().execute(new Runnable() {
                @Override
                public void run() {
                    int activeResult = IdCardVerifyManager.getInstance().active(
                            MainActivity.this, APP_ID, SDK_KEY);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            LogUtils.dTag(TAG, "activeResult: " + activeResult);
                            if (activeResult == IdCardVerifyError.OK) {
                                int initResult = IdCardVerifyManager.getInstance().init(
                                        MainActivity.this, idCardVerifyListener);
                                LogUtils.dTag(TAG, "initResult: " + initResult);
                                if (initResult != IdCardVerifyError.OK) {
                                    toast("人證引擎初始化失敗,錯誤碼: " + initResult);
                                }
                            } else {
                                toast("人證引擎激活失敗,錯誤碼: " + activeResult);
                            }
                        }
                    });
                }
            });
        } else if (result != IdCardVerifyError.OK) {
            toast("人證引擎初始化失敗,錯誤碼: " + result);
        }
    }

ArcFace 3.0 :

 private void initEngine() {
        int result = faceEngine.init(this, DetectMode.ASF_DETECT_MODE_VIDEO, DetectFaceOrientPriority.ASF_OP_ALL_OUT, 16, 1,
                FaceEngine.ASF_FACE_DETECT | FaceEngine.ASF_FACE_RECOGNITION);
        LogUtils.dTag(TAG, "initResult: " + result);
        if (result == ErrorInfo.MERR_ASF_NOT_ACTIVATED) {
            Executors.newSingleThreadExecutor().execute(() -> {
                int activeResult = FaceEngine.active(
                        MainActivity.this, Constants.APP_ID, Constants.SDK_KEY);
                runOnUiThread(() -> {
                    LogUtils.dTag(TAG, "activeResult: " + activeResult);
                    if (activeResult == ErrorInfo.MOK) {
                        int initResult = faceEngine.init(this, DetectMode.ASF_DETECT_MODE_VIDEO, DetectFaceOrientPriority.ASF_OP_ALL_OUT, 16, 1,
                                FaceEngine.ASF_FACE_DETECT | FaceEngine.ASF_FACE_RECOGNITION);
                        LogUtils.dTag(TAG, "initResult: " + initResult);
                        if (initResult != ErrorInfo.MOK) {
                            toast("人證引擎初始化失敗,錯誤碼: ", initResult));
                        }
                    } else {
                        toast("人證引擎激活失敗,錯誤碼: ", activeResult));
                    }
                });
            });
        } else if (result != ErrorInfo.MOK) {
            toast("人證引擎初始化失敗,錯誤碼: " , result));
        }
    }
?3.4 證件照部分的識別及特征提取

??證件照部分我們需要將原本2.0的引擎自帶的圖像處理方法換成3.0包內的ArcSoftImageUtil的方法,同時由于特征提取成功后的回調監聽從引擎內刪除掉了,所以這個回調需要自己來寫,這里我偷了一下懶,抄了一下人證 2.0 demo與3.0 demo中均有的faceHelper中的FaceListener作為監聽回調,當然大家也可以自己實現回調。

人證 2.0 :

    private void inputIdCard() {
        if (bmp == null) {
            return;
        }
        int width = bmp.getWidth();
        int height = bmp.getHeight();
        //圖像裁剪
        boolean needAdjust = false;
        while (width % 4 != 0) {
            width--;
            needAdjust = true;
        }
        if (height % 2 != 0) {
            height--;
            needAdjust = true;
        }
        if (needAdjust) {
            bmp = ImageUtils.imageCrop(bmp, new Rect(0, 0, width, height));
        }
        //轉換為NV21數據格式
        byte[] nv21Data = ImageUtils.getNV21(width, height, bmp);
        //身份證圖像數據輸入
        DetectFaceResult result = IdCardVerifyManager.getInstance().inputIdCardData(
                nv21Data, width, height);
        LogUtils.dTag(TAG, "inputIdCardData result: " + result.getErrCode());
    }

ArcFace 3.0 :

   private void inputIdCard() {
        if (bmp == null) {
            return;
        }
        //圖像4字節對齊 裁剪
        bmp = ArcSoftImageUtil.getAlignedBitmap(bmp, true);
        int width = bmp.getWidth();
        int height = bmp.getHeight();
        //轉換為bgr格式
        byte[] bgrData = ArcSoftImageUtil.createImageData(bmp.getWidth(), bmp.getHeight(), ArcSoftImageFormat.BGR24);
        int translateResult = ArcSoftImageUtil.bitmapToImageData(bmp, bgrData, ArcSoftImageFormat.BGR24);
        //轉換成功
        if (translateResult == ArcSoftImageUtilError.CODE_SUCCESS) {
            List<FaceInfo> faceInfoList = new ArrayList<>();
            //video模式不適合靜態圖片檢測,這里新建了一個idFaceEngine 除了檢測模式修改為Image其他參數與faceEngine一樣
            int detectResult = idFaceEngine.detectFaces(bgrData, width, height, FaceEngine.CP_PAF_BGR24, faceInfoList);
            if (detectResult == ErrorInfo.MOK && faceInfoList.size() > 0) {
                //這里的-2為trackID  因為Camera與證件照提取共用faceHelper 用trackID區分是哪邊來的數據
                faceHelper.requestFaceFeature(bgrData, faceInfoList.get(0), width, height, FaceEngine.CP_PAF_BGR24, -2);
            }
        } else {
            LogUtils.dTag(TAG, "translate Error result: " + translateResult);
        }
    }
?3.5 Camera部分的識別及特征提取

??人證2.0的onPreviewData接口內部其實是存在一個特征提取保護,即上一個特征提取未完成前,不能進行下一個特征提取,但是在3.0沒有外部的封裝了,所以我們要自己來進行特征提取的控制,基礎的策略就是根據trackId,每一個trackId若未進行提取或提取失敗才會進行特征提取。

人證 2.0 :

   public void onPreview(byte[] nv21, Camera camera) {
                if (faceRectView != null) {
                    faceRectView.clearFaceInfo();
                }
                if (nv21 == null) {
                    return;
                }
                //預覽數據傳入
                DetectFaceResult result = IdCardVerifyManager.getInstance().onPreviewData(nv21,
                        previewSize.width, previewSize.height, true);
                Rect rect = result.getFaceRect();
                if (faceRectView != null && drawHelper != null && rect != null) {
                    //生成實時人臉框
                    drawHelper.draw(faceRectView, new DrawInfo(drawHelper.adjustRect(rect), "", Color.YELLOW));
                }
            }

ArcFace 3.0 :

   public void onPreview(byte[] nv21, Camera camera) {
                if (faceRectView != null) {
                    faceRectView.clearFaceInfo();
                }
                if (nv21 == null) {
                    return;
                }
                List<FaceInfo> faceInfoList = new ArrayList<>();
                int ftResult = faceEngine.detectFaces(nv21, previewSize.width, previewSize.height, FaceEngine.CP_PAF_NV21, faceInfoList);
                //人證比對場景下只有最大人臉有效,因此直接取第一個人臉即可,若有其他場景可以自行調整
                if (ftResult == ErrorInfo.MOK && faceInfoList.size() > 0) {
                    Rect rect = faceInfoList.get(0).getRect();
                    if (faceRectView != null && drawHelper != null && rect != null) {
                        drawHelper.draw(faceRectView, new DrawInfo(drawHelper.adjustRect(rect), "", Color.YELLOW));
                    }
                    //等待身份證數據準備完畢后,才開始對Camera的數據進行特征提取 并根據trackId防止重復提取
                    int trackId = faceInfoList.get(0).getFaceId();
                    if (isIdCardReady && requestFeatureStatusMap != null && requestFeatureStatusMap.containsKey(trackId)) {
                        //若一個人臉提取失敗則進行重試
                        if (requestFeatureStatusMap.get(trackId) == null || requestFeatureStatusMap.get(trackId) == RequestFeatureStatus.FAILED) {
                            requestFeatureStatusMap.put(trackId, RequestFeatureStatus.SEARCHING);
                            faceHelper.requestFaceFeature(nv21, faceInfoList.get(0), previewSize.width, previewSize.height, FaceEngine.CP_PAF_NV21, faceInfoList.get(0).getFaceId());
                        }
                    }
                }
            }
? 3.6 camera及idCard數據回調

??上文我們已經提到過,人證 2.0的引擎內對camera數據idCard數據分別有兩個接口作為區分,同時有兩個回調函數分別用于兩個數據的處理。而ArcFace3.0時不僅取消了回調,而且camera數據idCard數據共用一個detect、extractFaceFeature,所以我們可以采用trackId來作為區分,并且因為引擎的變化,引擎內不再存儲特征值,導致我們需要記錄兩個數據源處獲得的特征值。

人證 2.0 :

 private IdCardVerifyListener idCardVerifyListener = new IdCardVerifyListener() {
        @Override
        public void onPreviewResult(DetectFaceResult detectFaceResult, byte[] bytes, int i, int i1) {
            runOnUiThread(() -> {
                //預覽人臉特征提取成功
                if (detectFaceResult.getErrCode() == IdCardVerifyError.OK) {
                    isCurrentReady = true;
                    compare();
                }
            });
        }
        @Override
        public void onIdCardResult(DetectFaceResult detectFaceResult, byte[] bytes, int i, int i1) {
            LogUtils.dTag(TAG, "onIdCardResult: " + detectFaceResult.getErrCode());
            runOnUiThread(() -> {
                //身份證人臉特征提取成功
                if (detectFaceResult.getErrCode() == IdCardVerifyError.OK) {
                    isIdCardReady = true;
                    restartHandler.removeCallbacks(restartRunnable);
                    readHandler.postDelayed(readRunnable, READ_DELAY);
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    bmp.compress(Bitmap.CompressFormat.PNG, 80, baos);
                    byte[] bmpBytes = baos.toByteArray();
                    Glide.with(MainActivity.this).load(bmpBytes).into(ivIdCard);
                    compare();
                }
            });
        }
    };

ArcFace 3.0 :

 FaceListener faceListener = new FaceListener() {
            @Override
            public void onFail(Exception e) {
            }
            @Override
            public void onFaceFeatureInfoGet(@Nullable FaceFeature faceFeature, Integer requestId, Integer errorCode, long frTime, byte[] nv21) {
                //特征提取失敗 將比對狀態置為失敗
                if (ErrorInfo.MOK != errorCode) {
                    requestFeatureStatusMap.put(requestId, RequestFeatureStatus.FAILED);
                    return;
                }
                //requestId 為-2則為身份證數據
                if (requestId == -2) {
                    isIdCardReady = true;
                    //由于接口變更feature不能在引擎內存儲 所以用全局變量進行存儲
                    idFaceFeature = faceFeature;
                    restartHandler.removeCallbacks(restartRunnable);
                    readHandler.postDelayed(readRunnable, 5000);
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
                    runOnUiThread(() -> {
                        Glide.with(MainActivity.this).load(bmp).into(ivIdCard);
                        compare();
                    });
                } else {
                    //由于接口變更feature不能在引擎內存儲 所以用全局變量進行存儲
                    MainActivity.this.faceFeature = faceFeature;
                    isCurrentReady = true;
                    runOnUiThread(() -> {
                        compare();
                    });
                }
            }
        };
? 3.7 compare接口

??比對接口相對于之前的來說改動就小很多了,只需要注意一下將比對模式修改為ID_CARD模式即可。

人證 2.0 :

 private void compare() {
        //.......
        //人證特征比對接口
        CompareResult compareResult = IdCardVerifyManager.getInstance().compareFeature(THRESHOLD);
        LogUtils.dTag(TAG, "compareResult: result " + compareResult.getResult() + ", isSuccess "
                + compareResult.isSuccess() + ", errCode " + compareResult.getErrCode());
        if (compareResult.isSuccess()) {
            playSound(R.raw.compare_success);
            ivCompareResult.setBackgroundResource(R.mipmap.compare_success);
            tvCompareTip.setText(name);
        } else {
            playSound(R.raw.compare_fail);
            ivCompareResult.setBackgroundResource(R.mipmap.compare_fail);
            tvCompareTip.setText(R.string.tip_retry);
        }
        //.......
    }

ArcFace 3.0 :

   private void compare() {
        //.......
        //人證特征比對接口
        FaceSimilar compareResult = new FaceSimilar();
        faceEngine.compareFaceFeature(idFaceFeature, faceFeature, CompareModel.ID_CARD, compareResult);
        //人證比對閾值為0.82
        if (compareResult.getScore() > 0.82) {
            playSound(R.raw.compare_success);
            ivCompareResult.setBackgroundResource(R.mipmap.compare_success);
            tvCompareTip.setText(name);
        } else {
            playSound(R.raw.compare_fail);
            ivCompareResult.setBackgroundResource(R.mipmap.compare_fail);
            tvCompareTip.setText(R.string.tip_retry);
        }
        //.......
    }
?3.8 結果展示

??至此只要將人證 2.0 demo無用的代碼刪除掉,我們就將2.0成功升級為3.0了,讓我們看看部隊成功后的運行截圖。

如何解析利用人臉識別SDK實現人證比對全過程

三、ArcFace 3.0的demo修改為人證程序

??相比較于將人證 2.0升級為將ArcFace3.0來說,直接在將ArcFace3.0版本上進行修改可簡單太多了,畢竟不用將所有的接口全部都更改一遍,我們需要做的就只是增加人證部分的輸入,人證部分的回調以及比對的邏輯。因此在這里我強烈推薦直接上手ArcFace3.0,如果不是有特殊原因修改3.0可比人證2.0快太多了。

修改界面選擇

??首先我們要選擇demo中的一個Activity做為我們修改的模板,我看了一下RegisterAndRecognizeActivity是我認為最為合適的了,因為它的Camera的比對流程已經全部完成了,我們需要做的就是兩點:

  • 增加Id Card數據輸入源
    Id Card數據輸入源我們采用與人證demo相同的方式模擬證件信息傳入,因此可以完全套用inputIdCard方法。

 public void onClickIdCard(View view) {
        //模擬身份證姓名,可修改
        FileInputStream fis;
        //身份證圖像數據
        bmp = null;
        try {
            //模擬身份證圖像數據來源,可修改
            fis = new FileInputStream(SAMPLE_FACE);
            bmp = BitmapFactory.decodeStream(fis);
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        inputIdCard();
    }
    private void inputIdCard() {
        if (bmp == null) {
            return;
        }
        //圖像4字節對齊 裁剪
        bmp = ArcSoftImageUtil.getAlignedBitmap(bmp, true);
        int width = bmp.getWidth();
        int height = bmp.getHeight();
        //轉換為bgr格式
        byte[] bgrData = ArcSoftImageUtil.createImageData(bmp.getWidth(), bmp.getHeight(), ArcSoftImageFormat.BGR24);
        int translateResult = ArcSoftImageUtil.bitmapToImageData(bmp, bgrData, ArcSoftImageFormat.BGR24);
        //轉換成功
        if (translateResult == ArcSoftImageUtilError.CODE_SUCCESS) {
            List<FaceInfo> faceInfoList = new ArrayList<>();
            //video模式不適合靜態圖片檢測,我們選擇frEngine 作為檢測證件照的引擎 初始化時要增加 FaceEngine.ASF_FACE_DETECT 哦
            int detectResult = frEngine.detectFaces(bgrData, width, height, FaceEngine.CP_PAF_BGR24, faceInfoList);
            if (detectResult == ErrorInfo.MOK && faceInfoList.size() > 0) {
                //這里的-2為trackID  因為Camera與證件照提取共用faceHelper 用trackID區分是哪邊來的數據
                faceHelper.requestFaceFeature(bgrData, faceInfoList.get(0), width, height, FaceEngine.CP_PAF_BGR24, -2);
            }
        } else {
            LogUtils.dTag(TAG, "translate Error result: " + translateResult);
        }
    }
  • 修改比對的底庫

??由于絕大部分場景下,人證比對都是1:1進行對比的,因而要在onFaceFeatureInfoGet回調內進行調整。首先通過我們在上面inputIdCard鋪墊的以-2為trackID,作為標識身份證數據的手段。其次我們要記錄一下要對比的身份證feature與camera下的人臉feature信息,這里我們采用全局變量的方式進行記錄。最后由于比對的feature獲取會有前后順序區分,我們用一個狀態位進行記錄(當然也可以判斷兩個feature是否有數據,對此數據進行維護來進行兩邊數據的同步),等待兩邊的數據都準備完畢后,就可以進行比對了。

      public void onFaceFeatureInfoGet(@Nullable final FaceFeature faceFeature, final Integer requestId, final Integer errorCode) {
                //FR成功
                if (faceFeature != null) {
                    //接收身份證數據
                    if (requestId == -2) {
                        isIdCardReady = true;
                        //feature用全局變量進行存儲
                        idFaceFeature = faceFeature;
                        compare();
                        return;
                    }
//                    Log.i(TAG, "onPreview: fr end = " + System.currentTimeMillis() + " trackId = " + requestId);
                    Integer liveness = livenessMap.get(requestId);
                    //不做活體檢測的情況,直接搜索
                    if (!livenessDetect) {
                        isCurrentReady = true;
                        //防止對同一個人臉進行多次特征提取
                        requestFeatureStatusMap.put(requestId, RequestFeatureStatus.SUCCEED);
                        compare();
//                        searchFace(faceFeature, requestId);
                    }
                    //活體檢測通過,搜索特征
                    else if (liveness != null && liveness == LivenessInfo.ALIVE) {
                        isCurrentReady = true;
                        //防止對同一個人臉進行多次特征提取
                        RegisterAndRecognizeActivity.this.faceFeature = faceFeature;
                        requestFeatureStatusMap.put(requestId, RequestFeatureStatus.SUCCEED);
                        compare();
//                        searchFace(faceFeature, requestId);
                    }
                    //活體檢測未出結果,或者非活體,延遲執行該函數
                    else {
                        //......
                    }
                }
                //特征提取失敗
                else {
                   //.........
                }
            }
            @Override
            public void onFaceLivenessInfoGet(@Nullable LivenessInfo livenessInfo, final Integer requestId, Integer errorCode) {
                //.....
            }
        };
  • compare 函數:

    private void compare() {
        if (isCurrentReady && isIdCardReady) {
            FaceSimilar similar = new FaceSimilar();
            int compareResult = frEngine.compareFaceFeature(idFaceFeature, faceFeature, CompareModel.ID_CARD, similar);
            if (compareResult == ErrorInfo.MOK && similar.getScore() > 0.82) {
                Log.i(TAG, "compare: success");
            } else {
                Log.i(TAG, "compare: fail");
            }
            //比對完成后重置比對狀態
            isIdCardReady = false;
            isCurrentReady = false;
            //給同一個人臉若比對后仍想嘗試,允許其進行特征提取
            requestFeatureStatusMap.clear();
        }
    }
小結

??使用ArcFace3.0進行修改,可以明顯的感覺到修改“絲滑”了很多,我們在原代碼的基礎上只需要注意Id Card的數據輸入,以及比對前后的邏輯即可,比對的難度幾乎可以忽略不計,只是簡單的調用接口而已。我這里也寫的比較簡單,有些業務邏輯如:增加身份證數據有效時間;規定雙方數據強制的先后順序;界面部分的展示都沒有做,只打印了一下比對的結果。本文只提供思路給大家參考,業務邏輯還是需要自己添加,最后給大家看一下修改完成后運行比對成功的日志。

如何解析利用人臉識別SDK實現人證比對全過程

關于如何解析利用人臉識別SDK實現人證比對全過程就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

sdk
AI

漾濞| 库车县| 菏泽市| 大田县| 金乡县| 哈密市| 从江县| 乐都县| 西和县| 新野县| 武乡县| 家居| 东兰县| 永顺县| 广南县| 满洲里市| 田阳县| 成都市| 沙河市| 吉林省| 永州市| 红原县| 崇文区| 蓬莱市| 平顶山市| 怀集县| 龙山县| 伊川县| 即墨市| 田东县| 海盐县| 巴彦淖尔市| 昔阳县| 武隆县| 锡林郭勒盟| 萨迦县| 寻乌县| 东乌| 罗定市| 鄯善县| 浦东新区|