虹軟人臉識別 - 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
示例程式碼
@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