【ncnn android】算法移植(八)——終於移植成功了DBface

1. 效果

先上效果,密集。
在這裏插入圖片描述

2.路線

  • pytorch2onnx
  • 解決bilinear2d上採樣問題
  • 編譯ncnn
  • 創建項目,導入libncnn,完善DBface的推理代碼
  • 解決nms有重框的問題

3. 具體事項

  1. 圖像預處理:((image / 255 - mean) / std).astype(np.float32)
    項目初始調試成功的時候,結果和DBface.pytorch推理的結果有很大差距。從以下幾個方面進行了檢驗。
  • 後面對導出的onnx模型進行了檢驗
  • 對onnx2ncnn的導出進行了檢查
  • 檢查ncnn項目的數據預處理
    • 最後發現是數據預處理部分的問題。問題出在in.substract_mean_normalize,其中的源碼是 × norm_value,所以需要對DBface的std_value取倒
    • 其次是image/255這部分,最初是cv::Mat image/255發現還是有問題,後面是先cv::Mat > ncnn::Mat,然後再 / 255.

對應的ncnn項目代碼:

// 1. DBface的std取倒數
const float mean_value[3] = {0.408f, 0.447f, 0.47f};
const float std_value[3] = {1/0.289f, 1/0.274f, 1/0.278f};

// 2.先轉到ncnn::Mat,再/255
in = ncnn::Mat::from_pixels(image.data, ncnn::Mat::PIXEL_BGR, image.cols, image.rows);

int c, h, w;
c = in.c;
h = in.h;
w = in.w;
float *data = (float *)(in.data);
for (int i = 0; i < c; ++i) {
    for (int j = 0; j < h; ++j) {
        for (int k = 0; k < w; ++k) {
            data[i*h*w + j*w + k] /= 255;
        }
    }
}

in.substract_mean_normalize(mean_value, std_value);

TO DO

  • 移植到android
  • 使android項目支持GPU
  • 速度測試報告
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章