人脸检测模块内存泄漏

Viewed 166
tools.face_det->pre_process(img);
tools.face_det->inference();

vector<FaceDetectionInfo> det_results;
tools.face_det->post_process({img.cols, img.rows}, det_results)

face_det被定义在全局中,当重复多次执行这段代码进行人脸检测时,最终会出现“mem alloc failed”的错误导致程序中断

3 Answers

这是你自己写的代码吗?示例里的代码好像不是这样的,可以提供更多的信息吗?

好的

#define DET_MODEL_PATH "face_detection_640.kmodel" // 人脸检测模型路径
#define RECG_MODEL_PATH "face_recognition.kmodel"  // 人脸识别模型路径

struct Tools
{
    FaceDetection *face_det = NULL;
    FaceVerification *face_verify = NULL;
    DB *db = NULL;
};

Tools tools;

vector<VerifyInfo> face_verify(const cv::Mat &img, float recg_thres)
{
    vector<VerifyInfo> results;


    tools.face_det->pre_process(img);
    tools.face_det->inference();

    vector<FaceDetectionInfo> det_results;
    tools.face_det->post_process({img.cols, img.rows}, det_results);  // 这行语句注释掉后暂时没有出现内存泄漏的情况
    
    // 注释下方代码后依旧会出现内存泄漏
    // unordered_map<int, vector<float>> features;
    // tools.db->load_all(features);

    // for (auto &det_result : det_results)
    // {
    //     tools.face_verify->pre_process(img, det_result.sparse_kps.points);
    //     tools.face_verify->inference();

    //     for (auto &item : features)
    //     {
    //         float score = tools.face_verify->calculate_similarity(item.second);
    //         if (score < recg_thres)
    //             continue;

    //         results.push_back({item.first, score, det_result});
    //         break;
    //     }
    // }

    return results;
}

int main(int argc, char *argv[])
{
    tools.face_det = new FaceDetection(DET_MODEL_PATH, det_thres, nms_thres, 0);
    tools.face_verify = new FaceVerification(RECG_MODEL_PATH, 0);
    tools.db = new DB();

    while (true)
    {
        face_verify(图片, 人脸识别阈值);
        usleep(1000 * 100);
    }
    
}

这是通过ai人脸识别示例代码调整后的程序,真实情况face_verify的调用是通过小核通信来触发调用

cout << "ipcmsg: Start connection..." << endl;
Message msg("frame", 200, LITTLE_CORE, IMPORTANT);
cout << "ipcmsg: Successful connection..." << endl;
msg.on([](void *data, k_u32 length)
       {
           static vector<uchar> datas;
           if (length == 1 && *(char *)data == '\0')
           {
               cv::Mat img = cv::imdecode(datas, cv::IMREAD_COLOR);
               if (!img.empty())
               {
                   auto infos = face_verify(img, recg_thres);
                   if (infos.empty())
                       cout << "未检测到人脸" << endl;
                   unordered_map<int, string> map({
                    {1, "A"},
                    {2, "B"},
                    {3, "C"}
                   });
                   for (auto &item : infos)
                       cout << map[item.id] << ' ' << item.score << endl;
               }
               datas.clear();
           }
           else
           {
               datas.insert(datas.end(), (uchar *)data, (uchar *)data + length);
           } 
      });

报错完整信息为“[ipcm_dev_recv:131] mem alloc failed”

将下面几行每次注掉一行:

tools.face_det->pre_process(img);
tools.face_det->inference();

vector<FaceDetectionInfo> det_results;
tools.face_det->post_process({img.cols, img.rows}, det_results);

多次调试,定位内存泄漏的具体位置。