如何优化 dlib 地标检测? 位图 160x120 处理时间为 7 秒。 我想要 50 或 100 毫秒。 我的代码:
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
ArrayList<android.graphics.Point> points = new ArrayList();
try {
long startTime = System.currentTimeMillis();
points = LandmarkDetection.getLandmark(matToBitmap(mRgba), this, landmarkPath);
long endTime = System.currentTimeMillis();
Log.i(TAG +"Time cost: ", String.valueOf((endTime - startTime) / 1000f) + " sec");
//drawPoint(points);
Log.i(TAG, "size = " + String.valueOf(points.size()));
}catch (Exception e) {
Log.i(TAG, "bitmap error! " + e.getMessage());
}
return mRgba;
}
private Bitmap matToBitmap(@NonNull Mat mat) {
Bitmap bmp;
try {
Mat resized = new Mat();
Imgproc.resize(mat, resized, new Size(160, 120));
bmp = Bitmap.createBitmap(resized.cols(), resized.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(resized, bmp);
}catch(Exception e) {
Log.e(TAG + ":matToBitmap", e.getMessage());
return null;
}
return bmp;
}
和 LandmarkDetection 类(这个方法一直占用时间):
public static ArrayList<Point> getLandmark(@NonNull Bitmap bmp, Context context, String landmarkPath) {
mFaceDet = new FaceDet(landmarkPath);
Log.i(AndroidLauncher.TAG, String.valueOf(new File(context.getExternalCacheDir() + "/shape_predictor_68_face_landmarks.dat").exists()));
Log.i(AndroidLauncher.TAG, "Ширина: " + String.valueOf(bmp.getWidth()) + "\nВысота: " + String.valueOf(bmp.getHeight()));
results = mFaceDet.detect(bmp);
if (results != null) {
for (final VisionDetRet ret : results) {
landmarks = ret.getFaceLandmarks();
}
}
return landmarks;
}
我的代码有什么问题?
最佳答案
很多东西可以优化你的代码:
- 不要为每个人脸检测构建 face_detector 和 shape_predictor。这可能需要几秒钟。您可以为所有线程使用一个 shape_predictor,但 face_detector 应该是每个线程一个
- mFaceDet 代码不清楚。可能是你在那里调整图像大小或做其他操作
- http://dlib.net/faq.html#Whyisdlibslow
关于java - 如何优化 dlib 地标检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43595738/