2

我遇到了移动视觉的问题,人脸检测器非常慢,这是当我在不是 onCreate 的函数中运行代码时。检测在 14 秒后完成。但是当我第一次在 onCreate 中运行检测代码时,它会在一秒钟内加载。我试过这个谷歌移动视觉:没有 CameraSource 的 FaceDetector 性能差。我看过这篇 移动视觉 API 检测人脸的时间太长,但答案是关于位图,这不是问题所在。下面提供了有关场景的更多信息。

在场景 1 中,我在单击按钮后开始检测。但是当我第一次运行检测器时,会有 14 或 15 秒的延迟。我第二次运行检测器时,它会在 1 秒内运行。内存和CPU看起来正常。这是代码:

private ImageButton mTakePictureButton;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mTakePictureButton = (ImageButton) findViewById(R.id.take_picture_button);
    mTakePictureButton.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.take_picture_button:
            Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.camera_example);
            SparseArray<Face> faces = getFaceArrayFromBitmap(bmp);//<----
            break;
    }
}
private SparseArray<Face> getFaceArrayFromBitmap(Bitmap bmp){
    FaceDetector detector = new FaceDetector.Builder(this)
            .setTrackingEnabled(false)
            .setMode(FaceDetector.FAST_MODE)
            .setClassificationType(FaceDetector.NO_CLASSIFICATIONS)
            .setLandmarkType(FaceDetector.NO_LANDMARKS)
            .build();
    // Create a frame from the bitmap and run face detection on the frame.
    Frame frame = new Frame.Builder().setBitmap(bmp).build();
    SparseArray<Face> faceArray = detector.detect(frame);// <--- First time takes 14/15 seconds
    detector.release();
    return faceArray;
}

在场景 2 中,我第一次在 onCreate 中运行人脸检测器,运行检测器代码只需要 1 秒。

private ImageButton mTakePictureButton;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mTakePictureButton = (ImageButton) findViewById(R.id.take_picture_button);
    mTakePictureButton.setOnClickListener(this);

    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.camera_example);
    SparseArray<Face> faces = getFaceArrayFromBitmap(bmp);// <-----
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.take_picture_button:

            break;
    }
}
private SparseArray<Face> getFaceArrayFromBitmap(Bitmap bmp){
    FaceDetector detector = new FaceDetector.Builder(this)
            .setTrackingEnabled(false)
            .setMode(FaceDetector.FAST_MODE)
            .setClassificationType(FaceDetector.NO_CLASSIFICATIONS)
            .setLandmarkType(FaceDetector.NO_LANDMARKS)
            .build();
    // Create a frame from the bitmap and run face detection on the frame.
    Frame frame = new Frame.Builder().setBitmap(bmp).build();
    SparseArray<Face> faceArray = detector.detect(frame);// <-- Now it takes only 1 second the first time
    detector.release();
    return faceArray;
}

我还看到移动视觉的源代码有一个错误,但这对我来说似乎不是问题,因为在检测中,它不会崩溃。

/** * 这是人脸检测器中的一个错误的解决方法,其中非常小的图像(即 * 大多数尺寸 < 147 的图像)和非常薄的图像都可能导致本机人脸检测代码崩溃。这将在人脸检测之前为此类图像添加填充,以避免*此问题。

* * 与相机一起使用时没有必要这样做,它永远不会创建这些类型的 * 图像。

* * 此检测器应包装底层 FaceDetector 实例,如下所示: * * Detector safeDetector = new SafeFaceDetector(faceDetector); * * 用 safeDetector 替换所有剩余的 faceDetector。*/

4

0 回答 0