From 0a34d62b35befb989735144bbc2419282d0bd10d Mon Sep 17 00:00:00 2001 From: leon <501646023@qq.com> Date: Sat, 25 Jan 2025 10:29:05 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86yolov5=E6=95=B0=E6=8D=AE=E5=A4=84?= =?UTF-8?q?=E7=90=86=E8=BF=87=E7=A8=8B=E4=B8=AD=E7=9A=84=E5=86=85=E5=AD=98?= =?UTF-8?q?=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 在处理yolov5输出数据时,替换了使用memcpy进行内存复制的操作,直接使用原数据进行赋值,减少了内存复制的开销。 2. 在处理完数据后,将ncnn::Mat的data指针设置为nullptr,避免了原数据在ncnn::Mat析构时被释放导致的内存访问异常。这一改动确保了数据的稳定性和安全性。 --- libapi/svp_npu/yolov5.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/libapi/svp_npu/yolov5.cpp b/libapi/svp_npu/yolov5.cpp index 7a85a42..25f747c 100755 --- a/libapi/svp_npu/yolov5.cpp +++ b/libapi/svp_npu/yolov5.cpp @@ -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(static_cast(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(static_cast(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(static_cast(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);