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);