位置: IT常识 - 正文
推荐整理分享深度学习部署(十九): CUDA RunTime API YOLOV5后处理cpu解码以及gpu解码,希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!
跟着杜老师学AI
看看我们干了什么, 就是把bouding box恢复成框而已
1.1 知识点和先验知识对于模型推理后的后处理,可以直接使用cuda核函数进行解码,效率比较高nms也可以在核函数里面实现这里演示了一个yolov5的实际案例,后续其他的操作都是类似的gpu_decoder难度较大,一般先写一个cpu的decoder, 再写个gpu_decoder.注意: yolov5 中的detect.py是对一张图片做推理, 推理用的信息是(n x num_classes + 5)yolov5的输出tensor(n x 85), n 是 n个bounding box其中85是cx, cy, width, height, objness, classification * 80objctness(物体检测)的意思是当前这个Bounding Box是否包含检测目标class_confidence条件概率的意思是当前Bounding Box的对于是否包含这个类别目标的概率, 并且每一个bounding box里面有全类别的class_confidence。当前bounding box的 confidence(置信度) = objectness(物体概率) x class_confidence(条件概率)最后拿来计算置信度的confidence是最大的class_confidence总之, 无论是CPU解码还是GPU解码, 都是两步走, 置信度过滤后NMS过滤, 把一张图多余的框去掉。但是NMS操作之前需要先把Box信息恢复成框在GPU解码输出中,[count, box1, box2, box3] 因为GPU解码是多线程的, 所以需要用count记录已经处理了多少个bounding box。CPU单线程不需要, GPU需要确保不会将一个检测框重复输出或者漏掉。在深度学习部署中,通常使用单精度浮点数(float)来存储数据。单精度浮点数占用4个字节,相比于双精度浮点数(double)占用的8个字节,可以减少存储空间和计算时间,同时也可以更好地利用GPU的计算资源。不过,在某些特殊情况下,可能需要使用双精度浮点数来更准确地表示数据。代码中看到f要知道为什么在CPU和GPU用box信息回复bounding box的时候需要知道, 图像的左上角才是原点下图是NMS流程图 1.2 kernel函数的简单了解kernel函数可以理解为是对线程的模板, 写好了一个模板其他线程都可以用这个模板高性能计算这里面怎么知道是哪一个呢? 用position索引就行了在CUDA中,静态修饰符static用于限制变量、函数、结构体等在当前文件中的作用范围。在Kernel函数中,使用静态修饰符可以避免编译器为每个线程重新创建一份变量,提高代码的效率。通常情况下,我们会将Kernel函数上一篇:Python+chatGPT编程5分钟快速上手,强烈推荐!!!(python编程100例)
友情链接: 武汉网站建设