github上的yolov3不同版本的区别

目前yolov3在工业界目标检测领域获得了广泛的应用,在github上有很多yolov3源码的资源。现在做深度学习使用pytorch最为方便,在github上pytorch版本的yolov3的star数量最多的的是https://github.com/ultralytics/yolov3https://github.com/eriklindernoren/PyTorch-YOLOv3这两个。然而,仔细观察这两个项目里,定义yolov3网络结构的文件models.py,可以看到这两个版本的区别。使用beyond compare软件比较这两个项目里的models.py文件。首先看create_modules函数,它们在定义卷积层时,命名有区别,如下图所示:

还有池化层,upsample层等等,都在命名上有区别的。接下来看forward函数,它们的区别在route层的计算上,如下图所示

可以看到,右边的route层计算时,是有if else分支的,而且在else里有一个try except,当进入except时,会进行一个特征图缩小一半的插值计算.。

在计算loss的时候,它们也有不同。eriklindernoren的yolov3的loss是在YOLOLayer里定义的,如下图所示

ultralytics的yolov3则是单独定义一个函数,如下图所示

注意到,它们调用pytorch的loss函数还是有区别的。eriklindernoren调用的是nn.BCELoss(),而ultralytics调用的是nn.BCEWithLogitsLoss(),这两个函数的区别是,可以阅读这篇博文:https://blog.csdn.net/qq_22210253/article/details/85222093?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

我最近训练Yolov3,里面用到了nn.BCELoss()这种loss函数,然后在gpu服务器上训练一段时间之后,就出现如下错误:

我在google和baidu里查找了一下解决办法,很多人说把nn.BCELoss()替换成nn.BCEWithLogitsLoss(),问题就解决了。

小伙伴们有没有发现这个差异呢?我在想,如果使用同一个数据集,在这两个项目里训练,它们的map会不会是一样的呢

猜你喜欢

转载自blog.csdn.net/nihate/article/details/103736384