You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Android中使用dlib获取人脸128维编码的实现求助

获取dlib人脸128维编码的实现方案

嗨,很高兴能帮你搞定这个需求!你已经能拿到人脸关键点了,离获取128维编码只差一步——用上dlib专门的人脸特征提取预训练模型就行,下面我结合你的现有代码一步步说明怎么改:

第一步:准备预训练模型文件

你需要把dlib的人脸特征模型文件 dlib_face_recognition_resnet_model_v1.dat 放到Android项目的 assets 目录里(和你已经在用的关键点检测模型shape_predictor_68_face_landmarks.dat放一起)。

然后在你的初始化代码里加载这个模型(比如在Activity的onCreate或者自定义Detector的构造方法里):

AssetManager assetManager = getAssets();
// 加载你已经在用的人脸关键点检测器
ShapePredictor shapePredictor = ShapePredictor.deserialize(assetManager.open("shape_predictor_68_face_landmarks.dat"));
// 加载人脸特征提取模型
FaceRecognitionModel faceRecModel = FaceRecognitionModel.deserialize(assetManager.open("dlib_face_recognition_resnet_model_v1.dat"));

第二步:在现有检测流程中添加编码提取逻辑

在你遍历检测结果的代码块里,需要先把dlib需要的人脸区域和关键点结构准备好,再调用模型提取特征。这里假设你有当前帧的Bitmap对象(如果是摄像头帧,需要先转换成Bitmap或者直接用dlib的Matrix处理):

// 先把当前图像转换成dlib的Matrix格式(如果还没转的话)
Matrix<RGBPixel> rgbMatrix = new Matrix<>();
Utils.bitmapToMatrix(yourFrameBitmap, rgbMatrix);

for (VisionDetRet ret : results) {
    // 1. 先获取人脸边界框,转成dlib的Rectangle格式
    Rect faceRect = ret.getFaceRect();
    Rectangle dlibRect = new Rectangle(
        (long) faceRect.left,
        (long) faceRect.top,
        (long) faceRect.right,
        (long) faceRect.bottom
    );

    // 2. 用关键点检测器获取完整的人脸关键点结构(FullObjectDetection)
    FullObjectDetection landmarks = shapePredictor.predict(rgbMatrix, dlibRect);

    // 👇 你原来的绘制关键点代码可以保留,不影响
    ArrayList<Point> landmarkPoints = ret.getFaceLandmarks();
    for (Point point : landmarkPoints) {
        int pointX = (int) (point.x * resizeRatio);
        int pointY = (int) (point.y * resizeRatio);
        canvas.drawCircle(pointX, pointY, 2, paint);
    }

    // 🎯 重点:提取128维人脸编码
    FaceEncoding faceEncoding = faceRecModel.computeFaceDescriptor(rgbMatrix, landmarks);
    // 把编码转换成float数组,方便后续保存或比对
    float[] encodingArray = faceEncoding.getDescriptor();

    // 这里可以做你需要的操作,比如打印特征值、保存到本地、和已有的特征比对
    Log.d("FaceFeature", "128维编码前5个值:");
    for (int i = 0; i < 5; i++) {
        Log.d("FaceFeature", encodingArray[i] + "");
    }
}

几个需要注意的细节

  • 确保你的dlib-android依赖版本是较新的,旧版本可能没有FaceRecognitionModel这个类
  • 如果处理的是摄像头实时帧,要注意图像的方向(比如前置摄像头的镜像、竖屏的旋转),先把图像调整到正脸状态再提取特征,否则编码会不准确
  • 模型文件不要放错路径,加载的时候如果出现IO异常,检查assets目录下的文件是否存在,文件名有没有打错

内容的提问来源于stack exchange,提问作者Stackover67

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:15:00