用Yolov5s+HRNet预测本地视频,报错CUDA内存不足

读取本地视频,再用Yolov5s+HRNet一帧一帧预测,最后保存本地视频,中途会报错CUDA内存不足

  • 代码:
def video(video_path, save_path):

    cap=cv2.VideoCapture(video_path)
    fps=int(cap.get(cv2.CAP_PROP_FPS))
    width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fourcc=cv2.VideoWriter_fourcc('M','J','P','G')
    out=cv2.VideoWriter(save_path,fourcc,fps,(width,height))   # 保存视频

    model = SimpleHRNet()   # 加载模型

    while cap.isOpened():
        ret,frame=cap.read()
        if ret:
            poit_set=model.predict(frame)   # 进行预测
            frame=processing(frame, poit_set)   # 用opencv进行处理
            out.write(frame)   # 存入帧
        else:
            break
  • 输出以及错误:

代码报错

img

报错的位置

img

错误是在NMS算法中,不知道 x = x[xc[xi]] 是干什么的,我预测的视频一共315帧(约5秒),读取+预测了19帧以后出现此错误

  • GPU占有率:

1.我的是3060笔记本显卡,6G显存,预测(约5秒)的视频,占用率50%左右(2GB~3GB),3D核心接近100%,预测单张照片不会出错

img

2.别人的是2080ti显卡,11G显存,占用率30%左右(2GB~3GB),占用的显存基本跟我的3060一模一样,但是人家能正常跑完(约5秒的视频),(甚至可以跑完几分钟时常的视频)不会出现CUDA显存不足的错误。

img

  • 新出现的问题:

img

找不到适合的算法

  • 猜测:

1. CUDA版本不一致?

我的CUDA 11.6
我的pytorch对应的是CUDA 11.3(官网最高支持11.3)
我的cnDNN 11.3(官网最高支持11.3)

如果是CUDA版本不对应的话,预测单张照片也应该出现错误才对,但是没有出现错误,只有在预测视频的时候出现错误

2. 我的电脑没有开显卡独连?
我本来就没有开独连,占用率不高,但是3D核心100%,不知道是不是这个原因。别人的2080ti显卡是独连的

  • 问题:

1. 是CUDA版本不对应?
2. 是没开显卡独连?
3. 还是其他问题?

首先确认下你的cudnn确定是11.3而不是cuda?cudnn目前最高好像也就8.4吧,如果你是cudnn没有安装正确先安装好再说.
先说 x = x[xc[xi]],xc就是一列true或者false的tensor数据,xi是索引,所以xc[xi]的结果就是true或者false,x=x[Ttue]的意思就是x取原值,x=x[False]返回值为空。所以这里的x就是均具xc对应下标是否为true来获取x的值,xc就是根据上面的pred>conf,这一整句的功能也就是说置信度大于阈值的x保留下来,小于的去除。下面给你个np的实例你运行下就知道了,不过原来的是换成tensor,功能是一致的。

import numpy as np
p=np.array([110,120,130,140,150,160])
xc=p>120
print(xc)
t=[]
for xi, x in enumerate(p):
    print(xi,x,xc[xi])
    x=x[xc[xi]]
    print(f"x={x}")

至于后面的问题,和你看不开显卡直连关系不大cuda版本最好是11.3与官网保持一致,不然有些莫名的bug谁也不知道原因。至于你的报错,两个都是在显存不足的时候回报的错误,包括下面的找不到卷积算法也是显存不足会导致的。
至于你说的图片可以,视频不行,猜测大概率就是大小不一致或者是你只在视频流中新加载了这个模型,图片没有加载?
另外就是你的解决方案了,你可以先将检测大小改小一些,batch size设置到1看看还会不会报错,如果不会,那就是你的显存不足,不要看别人的足够,加载模型的时候会耗费比较多的显存的,看你显存尖峰之后突然下降,前面上升是yolo本身占用的显存,最大的可能性就是加载HRNET之后剩余显存不足,所以后续计算无法继续就报错退出了。