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”的错误导致程序中断
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”的错误导致程序中断
#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);
多次调试,定位内存泄漏的具体位置。