1. 效果
先上效果,密集。
2.路線
- pytorch2onnx
- 解決bilinear2d上採樣問題
- 編譯ncnn
- 創建項目,導入libncnn,完善DBface的推理代碼
- 解決nms有重框的問題
3. 具體事項
- 圖像預處理:((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
- 速度測試報告