det_utils.py文件里面的non_max_suppression函数是不是存在内存泄漏的问题?
收藏回复举报
det_utils.py文件里面的non_max_suppression函数是不是存在内存泄漏的问题?
t('forum.solved') 已解决
发表于2024-08-29 08:39:15
0 查看

如题,我的项目实现是参照yolo_acl_sample这个例子实现的,里面关于图片处理的一些功能函数放在了det_utils.py文件里面(板卡自带的notebooks/01-yolov5 里面也有同样的文件和代码逻辑)。

最近通过注释逐步删减运行代码,初步定位到det_utils.py 里面的yolo_acl_sample函数长时间运行会存在内存溢出的问题,会造成程序被系统killed掉。 

最后的对比情况如下:脱离了我自己的代码,直接在yolo_acl_sample的代码上进行了循环执行代码的调整(0.1秒执行一次),main.py修改如下:

if __name__ == '__main__':
    context = init_acl(DEVICE_ID)  # 初始化acl相关资源
    det_model = YoloV5(model_path=trained_model_path)  # 初始化模型

    while True:
        # 读入文件并推理
        img = cv2.imread(image_path, cv2.IMREAD_COLOR)  # 读入图片
        img_res = det_model.infer(img)  # 前处理、推理、后处理, 得到最终推理图片
        if img_res is not None:
            cv2.imwrite('img_res.png', img_res)
        time.sleep(0.1)

    # 释放相关资源
    det_model.release()  # 释放 acl 模型相关资源, 包括输入数据、输出数据、模型等
    deinit_acl(context, 0)  # acl 去初始化

在infer函数中通过屏蔽后处理部分的代码,来对比运行情况,如下:

# 后处理
        # boxout = nms(torch.tensor(output), conf_thres=0.4, iou_thres=0.5)  # 利用非极大值抑制处理模型输出,conf_thres 为置信度阈值,iou_thres 为iou阈值
        # pred_all = boxout[0].numpy()  # 转换为numpy数组
        # scale_coords([640, 640], pred_all[:, :4], img_bgr.shape, ratio_pad=(scale_ratio, pad_size))  # 将推理结果缩放到原始图片大小

        # height, width = img_bgr.shape[:2]
        # #print(f"scale_coords后:pad_size-{pad_size},cale_ratio--{scale_ratio}。height-{height},width-{width}")
        # img_dw = draw_bbox(pred_all, img_bgr, (0, 255, 0), 2, labels_dict)  # 画出检测框、类别、概率
        # return img_dw
        return None

对比现象:
1.当没有注释掉 nms() 函数执行时,程序运行后,一开始内存会稳定在1.8G左右,但再持续运行一段时间,半个小时或几个小时都有可能,内存会增长到6个G左右,如果在运行更长的时间,程序会系统Killed掉。

cke_134648.png

2.当注释掉nms()函数执行时(如前面发的后处理部分代码),程序长时间运行能稳定在1.8G的情况。最后一次是昨天睡觉前运行了一个晚上(大概9个小时),到发帖时,内存没有再增长,也没有被系统killed。

上面的测试验证情况大概就这样,一开始是在自己项目里面排查,后面怀疑是nms函数后,就在给的例子(yolo_acl_sample)中对比,大概80%的可能吧,是否是box.mask,x,v这些张量对象没来得及释放?

我要发帖子