移动视觉人脸检测器的其他功能比onCreate

时间:2017-11-09 10:23:14

标签: android performance bitmap face-detection vision-api

我面临着移动视觉的问题,面部检测器非常慢,这是我在不是onCreate的函数中运行代码的时候。检测在14秒后完成。但是当我第一次在onCreate中运行检测代码时,它会在一秒钟内加载。我试过这个Google Mobile Vision: Poor FaceDetector performance without CameraSource。我已经看了这篇文章mobile vision API takes too long to detect face,但答案是关于位图,这不是问题。下面给出了有关场景的更多信息。

在方案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;
}

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

  

/ **    *这是面部检测器中的一个错误的解决方法,其中非常小的图像(即,    *尺寸大于&lt;的大多数图像147)非常薄的图像可能会导致原生面部崩溃    *检测代码。这将在面部检测之前向这些图像添加填充以避免    *这个问题。

   *    *对于与相机一起使用不是必需的,因为相机并没有创建这些类型的相机    *图片。

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

0 个答案:

没有答案