虹軟人臉識別 - faceId及IR活體檢測的更新介紹


虹軟人臉識別 - faceId及IR活體檢測的介紹

前幾天虹軟推出了 Android ArcFace 2.2版本的SDK,相比於2.1版本,2.2版本中的變化如下:

  • VIDEO模式新增faceId(類似於之前文章中提到的trackId)
  • 新增IR活體檢測功能
  • 新增IR、RGB的活體閾值設置

一、faceId介紹

1. 定義

在連續的視頻幀中,當一個人臉進入視頻畫面直到離開,其faceId不變。

2. 應用場景舉例

在門禁應用場景下,若一個人長時間停留在畫面中,借助faceId的功能,在此人的人臉特征提取成功后,可不再對此人的后續人臉信息進行處理。

3. 注意事項

faceId在VIDEO模式下有意義;
faceId在IMAGE模式下無效。

二、 IR活體檢測

1. 接口介紹

支持的顏色格式如下:
Windows: GRAY、DEPTH_U16、NV21、NV12、I420
Android: GRAY、DEPTH_U16、NV21
注:若圖像數據的顏色格式不在上述列表中,必須對圖像數據進行格式轉換。

2. IR活體檢測實現方案

  • 單目攝像頭檢測方案(IR)

 

單目攝像頭檢測流程

注意:在Windows平台下,若通過OpenCV獲取IR攝像頭的圖像數據,由於其顏色格式為BGR_24,不能用於IR活體檢測,需要轉成GRAY(或IR活體檢測接口支持的其他顏色格式),但BGR_24數據可直接用於人臉檢測。

  • 雙目攝像頭檢測方案(IR + RGB)

 

雙目攝像頭檢測流程

人臉檢測結果信息調整 :若RGB攝像頭和IR攝像頭的成像不一致(存在偏移、旋轉、鏡像等問題),需要將傳遞給IR活體檢測的人臉信息(人臉框、人臉角度)進行調整。

3. 雙目IR活體檢測遇到的坑

在雙目的畫面有明顯的不一致的情況時,若我們直接把RGB攝像頭的人臉檢測結果用於IR活體檢測,很有可能會報81925(人臉置信度低)錯誤。原來,攝像頭回傳的數據和我們直接看到的畫面很可能是不一樣的,我們看到的畫面可能是經過處理的(縮放、旋轉、鏡像等)。

  • 檢測方法
    最直觀的檢查方法就是將攝像頭數據顯示到屏幕上。只要我們把2個攝像頭回傳的數據顯示到屏幕上,就能了解兩個攝像頭數據的成像關系。例如Android平台可使用以下方式查看NV21數據:
    示例流程
    nv21 -> YuvImage -> jpg bytes -> bitmap -> ImageView

    示例代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public void onPreview(final byte[] nv21, Camera camera) {
   ......
   //30幀一次,把幀數據顯示到界面上(要是每幀都做就太卡了),若還是影響UI請放到子線程處理
   if (index++ % 30 == 0) {
     YuvImage yuvImage = new YuvImage(nv21, ImageFormat.NV21, previewSize.width, previewSize.height, null);
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     yuvImage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 100, baos);
     byte[] bytes = baos.toByteArray();
     ivFrame.setImageBitmap(BitmapFactory.decodeByteArray(bytes, 0, bytes.length));
   }
   ......
}
  • 解決方案

1. RGB和IR攝像頭圖像數據的其中一個被左右鏡像
對於這種情況,我們在將RGB數據的人臉檢測結果用於IR活體檢測時,需要將其人臉框(rect)進行左右鏡像調整。(Android demo中已提供左右鏡像的代碼):

  
復制代碼
  /**
     * 人臉框水平鏡像
     *
     * @param rect 人臉框
     * @return 水平鏡像后的人臉框
     */
    private Rect mirrorRectHorizontal(Rect rect) {
        Rect newRect = new Rect(rect);
        newRect.right = previewSize.width - rect.left;
        newRect.left = previewSize.width - rect.right;
        return newRect;
    }
復制代碼

2. RGB和IR攝像頭圖像數據均被鏡像或均未被鏡像
對於這種情況,RGB數據的人臉檢測結果用於IR活體檢測時,不需要進行鏡像調整。

3. RGB和IR攝像頭圖像數據有旋轉關系
若有旋轉關系,我們不僅要旋轉人臉信息(FaceInfo)中的人臉框(rect),還需要修改人臉角度(orient)。否則IR活體檢測將無法解析人臉,報81925錯誤。
(Android demo中已提供將orient單次旋轉90度的代碼):

復制代碼
 /**
     * 獲取逆時針旋轉90度后的人臉角度
     *
     * @param orient 人臉角度信息,即{@link FaceInfo#orient}屬性,由{@link FaceEngine#detectFaces(byte[], int, int, int, List)}接口獲取
     * @return 旋轉后的人臉角度
     */
    private int rotateOrient(int orient) {
        switch (orient) {
            case FaceEngine.ASF_OC_0:
                return FaceEngine.ASF_OC_90;
            case FaceEngine.ASF_OC_90:
                return FaceEngine.ASF_OC_180;
            case FaceEngine.ASF_OC_180:
                return FaceEngine.ASF_OC_270;
            case FaceEngine.ASF_OC_270:
                return FaceEngine.ASF_OC_0;
            default:
                throw new IllegalArgumentException("unsupported orient '" + orient + "'");
        }
    }
復制代碼

若需要下載虹軟sdk,可以到官網:

https://ai.arcsoft.com.cn/product/arcface.html?utm_source=cnblogs&utm_medium=referral

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM