yolov3 05节(2)修复bug

2021/11/29 6:07:46

本文主要是介绍yolov3 05节(2)修复bug,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

关于昨天的检测bug

吐了,昨天的bug还是没修复,详细追踪了下可能错误的地方

在前向传播获得的预测结果就是错的,全部是torch.nan。同时按照正确的流程,最终write_result应该没有检测结果,而不是显示person person...这样的bug。故这两个函数都有问题

1.1)对于write_results函数

首先对相对简单的write_result函数处理,该函数用于获得最终的true检测结果,核心是非极大抑制和IoU

问题出现在最开始的矩阵过滤部分,由于 nan +=/* R(nan与任何实数做运算均为nan,包括比较等),所以下面这段代码不能过滤掉nan值,造成后续直接将coco class类别中的(0,person)错误赋予给了nan

但增加一小段新的(矩阵过滤+赋值)的代码即可实现将nan变为0的操作,其中转为cpu是必须的,如下:

 

这样bug就修复了

 

1.1.1)关于在gpu和cpu上对运算实现加速的有趣误区 

在我最初的印象中,认为使用gpu能极大加速运算,但事实上可能有所出入,对小数据量,反而cpu更快,在我的简单测试中有1000倍差距,通过如下案例理解:

import torch
a = torch.randn(10000, 10000).to('cpu')
b = torch.randn(10000, 10000).to('cpu')

start = time.time()
c = torch.add(a, b)
end = time.time()
print((end-start)*1000 , ' ms(cpu-0)')

start = time.time()
d = torch.add(a, b)
end = time.time()
print((end-start)*1000 , ' ms(cpu-0)')

a = a.to('cuda')# 初次调用gpu,由于数据传输,速度会较慢
b = b.to('cuda')
start = time.time()
e = torch.add(a, b)
end = time.time()
print((end-start)*1000 , ' ms(cuda-0)')

a = a.to('cuda') # 超快的速度fasttttttttttttttt!!!!!!
b = b.to('cuda')
start = time.time()
f = torch.add(a, b)
end = time.time()
print((end-start)*1000 , ' ms(cuda-1)')

i = torch.randn(10000, 10000).to('cuda')
j = torch.randn(10000, 10000).to('cuda')
start = time.time()
k = torch.add(i, j)
end = time.time()
print((end-start)*1000 , ' ms(cuda-2 )')
cuda加速对比

第一次在cuda上计算较慢,但后来就很快了,不知道为什么?望大佬告知

 

而且实际情况没有这么简单:gpu很多核,但每个核心能力不强,并行计算,cpu“单核”,但每个核心超强,串行计算。所以对于上述小数据量测试,cpu单核具有碾压性能,而gpu那没多核反而没用(数据量不够,没必要调用所有的核),单核性能拉跨,所以速度很慢。

但对于图像这类的矩阵运算,超多核+并行 就很有必要了,此时gpu的优势才能体现出来。 https://blog.csdn.net/sru_alo/article/details/93539633

https://blog.csdn.net/qq_36162036/article/details/107407928?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-2.essearch_pc_relevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-2.essearch_pc_relevant

 

 1.2)prediction结果错误

这个原因出在darknet53网络中,今天已经排查了网络的搭建,感觉都没啥问题,明天继续排查前向传播,不过也加深了我对darknet53的理解

总共有107层(75个conv,23个shortcut,4个route,2个upsample,3个yolo)

 

值得一提的是,shortcut层基本可以类比resnet中的残差块,而route层本质就是shortcut,只是出于parse读取文本的原因,使用route这个层来形成>2层数量的连接cat

https://discuss.gluon.ai/t/topic/9056/2

 而且bn层的nb之处可以再次复习一下,其可以实现如下的转换(以简单二维为例)

 

https://blog.csdn.net/qq_29573053/article/details/79878437

 

明天又是充满希望和划水的一天



这篇关于yolov3 05节(2)修复bug的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程