fix(代码优化): 优化了yolov5数据处理过程中的内存使用

1. 在处理yolov5输出数据时,替换了使用memcpy进行内存复制的操作,直接使用原数据进行赋值,减少了内存复制的开销。
2. 在处理完数据后,将ncnn::Mat的data指针设置为nullptr,避免了原数据在ncnn::Mat析构时被释放导致的内存访问异常。这一改动确保了数据的稳定性和安全性。
This commit is contained in:
leon 2025-01-25 10:29:05 +08:00
parent b3dff8f798
commit 0a34d62b35

View File

@ -930,7 +930,9 @@ int ncnn_result(const float *src, unsigned int len) {
ncnn::Mat out;
out.create(85, 80, 80, 3);
// ex.extract("output", out);
memcpy(out.data, src, len * sizeof(float));
// memcpy(out.data, src, len * sizeof(float));
// 替换memcpy内存复制操作直接使用原数据
out.data = const_cast<void*>(static_cast<const void*>(src));
// out = out.reshape( 85);
printf("w = %d,h=%d,d=%d,c=%d\n", out.w, out.h, out.d, out.c);
@ -949,6 +951,8 @@ int ncnn_result(const float *src, unsigned int len) {
proposals.insert(proposals.end(), objects8.begin(), objects8.end());
// 去除对原数据的引用避免原数据数据被释放。出代码块之后ncnn::Mat析构会自动释放内存原数据会被释放导致内存访问异常
out.data = nullptr;
return 0;
}
@ -960,7 +964,10 @@ int ncnn_result(const float *src, unsigned int len) {
// out.create(85, 480, 1, 3);
// ex.extract("353", out);
memcpy(out.data, src, len * sizeof(float));
// memcpy(out.data, src, len * sizeof(float));
// 替换memcpy内存复制操作直接使用原数据
out.data = const_cast<void*>(static_cast<const void*>(src));
ncnn::Mat anchors(6);
anchors[0] = 30.f;
anchors[1] = 61.f;
@ -973,6 +980,10 @@ int ncnn_result(const float *src, unsigned int len) {
generate_proposals(anchors, 16, in_pad, out, prob_threshold, objects16);
printf("objects16.size():%d\n", (int)objects16.size());
proposals.insert(proposals.end(), objects16.begin(), objects16.end());
// 去除对原数据的引用避免原数据数据被释放。出代码块之后ncnn::Mat析构会自动释放内存原数据会被释放导致内存访问异常
out.data = nullptr;
return 0;
}
@ -981,7 +992,9 @@ int ncnn_result(const float *src, unsigned int len) {
printf("----------------3 * 20 * 20 * 85--------------------\n");
ncnn::Mat out;
out.create(85, 20, 20, 3);
memcpy(out.data, src, len * sizeof(float));
// memcpy(out.data, src, len * sizeof(float));
// 替换memcpy内存复制操作直接使用原数据
out.data = const_cast<void*>(static_cast<const void*>(src));
ncnn::Mat anchors(6);
anchors[0] = 116.f;
@ -995,6 +1008,9 @@ int ncnn_result(const float *src, unsigned int len) {
generate_proposals(anchors, 32, in_pad, out, prob_threshold, objects32);
printf("objects32.size():%d\n", (int)objects32.size());
proposals.insert(proposals.end(), objects32.begin(), objects32.end());
// 去除对原数据的引用避免原数据数据被释放。出代码块之后ncnn::Mat析构会自动释放内存原数据会被释放导致内存访问异常
out.data = nullptr;
}
// sort all proposals by score from highest to lowest
qsort_descent_inplace(proposals);