Ma-Dan / keras-yolo4

A Keras implementation of YOLOv4 (Tensorflow backend)
MIT License
381 stars 175 forks source link

恕我直言qqwweee那版yolo3就是个废仓库 #22

Open miemie2013 opened 4 years ago

miemie2013 commented 4 years ago

恕我直言qqwweee那版yolo3就是个废仓库,训练不出效果,loss经常出现nan,那段时间让我踩了很多坑。恕我直言这么废的仓库也有那么多star真的让人很无语。算法复现的要求是达到指定精度,而不是让观众成为你的debugger、改进者。广告虽可耻,大家可以看看我复现的这版yolov4,精心设计了损失函数,训练了70000步就没出现过nan,mAP至少可达36%,欢迎点star:

https://github.com/miemie2013/Keras-YOLOv4

Runist commented 4 years ago

恕我直言qqwweee那版yolo3就是个废仓库,训练不出效果,loss经常出现nan,那段时间让我踩了很多坑。恕我直言这么废的仓库也有那么多star真的让人很无语。算法复现的要求是达到指定精度,而不是让观众成为你的debugger、改进者。广告虽可耻,大家可以看看我复现的这版yolov4,精心设计了损失函数,训练了70000步就没出现过nan,mAP至少可达36%,欢迎点star:

https://github.com/miemie2013/Keras-YOLOv4

能不能详细说说问题出在哪里?我之前也是mAP上不去。

miemie2013 commented 4 years ago

恕我直言qqwweee那版yolo3就是个废仓库,训练不出效果,loss经常出现nan,那段时间让我踩了很多坑。恕我直言这么废的仓库也有那么多star真的让人很无语。算法复现的要求是达到指定精度,而不是让观众成为你的debugger、改进者。广告虽可耻,大家可以看看我复现的这版yolov4,精心设计了损失函数,训练了70000步就没出现过nan,mAP至少可达36%,欢迎点star: https://github.com/miemie2013/Keras-YOLOv4

能不能详细说说问题出在哪里?我之前也是mAP上不去。

别debug了,会让你对这个算法产生误解的。你不是别人的debugger。

Runist commented 4 years ago

恕我直言qqwweee那版yolo3就是个废仓库,训练不出效果,loss经常出现nan,那段时间让我踩了很多坑。恕我直言这么废的仓库也有那么多star真的让人很无语。算法复现的要求是达到指定精度,而不是让观众成为你的debugger、改进者。广告虽可耻,大家可以看看我复现的这版yolov4,精心设计了损失函数,训练了70000步就没出现过nan,mAP至少可达36%,欢迎点star: https://github.com/miemie2013/Keras-YOLOv4

能不能详细说说问题出在哪里?我之前也是mAP上不去。

别debug了,会让你对这个算法产生误解的。你不是别人的debugger。

恕我直言qqwweee那版yolo3就是个废仓库,训练不出效果,loss经常出现nan,那段时间让我踩了很多坑。恕我直言这么废的仓库也有那么多star真的让人很无语。算法复现的要求是达到指定精度,而不是让观众成为你的debugger、改进者。广告虽可耻,大家可以看看我复现的这版yolov4,精心设计了损失函数,训练了70000步就没出现过nan,mAP至少可达36%,欢迎点star: https://github.com/miemie2013/Keras-YOLOv4

能不能详细说说问题出在哪里?我之前也是mAP上不去。

别debug了,会让你对这个算法产生误解的。你不是别人的debugger。

我不知道问题出在哪里,迁移学习我也试了。只能提升6个点

Runist commented 4 years ago

你是指他的问题就出在Loss函数那里吗?

miemie2013 commented 4 years ago

你是指他的问题就出在Loss函数那里吗?

不知道,知道他的仓库有问题之后我不再看他仓库的代码了。我实现的这一版参考了YunYang1994和百度PaddleDetection的代码,很权威了。

yangshuchao4616 commented 4 years ago

给你个star

miemie2013 commented 4 years ago

谢谢作者!我不好意思放广告了,呜呜呜。不好意思了。I feel sorry.

yangshuchao4616 commented 4 years ago

谢谢作者!我不好意思放广告了,呜呜呜。不好意思了。I feel sorry.

#s8 = layers.Concatenate()([x, s8])          #s8是不是应该为下一层,堆叠之后做一次卷积再route
#x = conv2d_unit(s8, i256, 1, strides=1)

## ============================= s16 =============================
#x = layers.ZeroPadding2D(padding=((1, 0), (1, 0)))(x)

x = layers.Concatenate()([x, s8])          
s8 = conv2d_unit(s8, i256, 1, strides=1)

# ============================= s16 =============================
x = layers.ZeroPadding2D(padding=((1, 0), (1, 0)))(s8)

s16 = layers.Concatenate()([x, s16]) #s16是不是应该为下一层,堆叠之后做一次卷积再route

#x = conv2d_unit(s16, i512, 1, strides=1)

## ============================= s32 =============================
#x = layers.ZeroPadding2D(padding=((1, 0), (1, 0)))(x)

x = layers.Concatenate()([x, s16])          
s16 = conv2d_unit(s16, i512, 1, strides=1)

# ============================= s32 =============================
x = layers.ZeroPadding2D(padding=((1, 0), (1, 0)))(s16)

yolo4.py的模型主体部分,你检查一下,有两个地方的route,是不是提前了一层,还是我找到的网络图有问题?

miemie2013 commented 4 years ago

谢谢作者!我不好意思放广告了,呜呜呜。不好意思了。I feel sorry.

#s8 = layers.Concatenate()([x, s8])          #s8是不是应该为下一层,堆叠之后做一次卷积再route
#x = conv2d_unit(s8, i256, 1, strides=1)

## ============================= s16 =============================
#x = layers.ZeroPadding2D(padding=((1, 0), (1, 0)))(x)

x = layers.Concatenate()([x, s8])          
s8 = conv2d_unit(s8, i256, 1, strides=1)

# ============================= s16 =============================
x = layers.ZeroPadding2D(padding=((1, 0), (1, 0)))(s8)

s16 = layers.Concatenate()([x, s16]) #s16是不是应该为下一层,堆叠之后做一次卷积再route

x = conv2d_unit(s16, i512, 1, strides=1)

## ============================= s32 =============================
#x = layers.ZeroPadding2D(padding=((1, 0), (1, 0)))(x)

x = layers.Concatenate()([x, s16])          
s16 = conv2d_unit(s16, i512, 1, strides=1)

# ============================= s32 =============================
x = layers.ZeroPadding2D(padding=((1, 0), (1, 0)))(s16)

yolo4.py的模型主体部分,你检查一下,有两个地方的route,是不是提前了一层,还是我找到的网络图有问题?

是我根据原版那个网络配置文件写的,应该没问题。

yangshuchao4616 commented 4 years ago

我这里有一张图,我看和Ma-Dan写得是一样的,跟你哪个就是不一样的? 图太长了

Ma-Dan commented 4 years ago

因为太多的反馈训练问题,为了避免我的代码对大家的误导,抄作业了训练和loss,一直抄到 label smooth 之前。后面这个repo不会再抄和更新,抄到这里是为了发现和定位问题。 为了模型有更专业的持续维护,请大家用原作者的完善版本。

qqwwee版的训练确实很多坑,抄作业过程发现的问题和修改: (1) 模型主干没有太大问题,修改了kernel_initializer和 L2正则化(会加速收敛,酌情加上可能更好); (2) train里面的letterbox预处理,不如scale方式准确; (3) 没有多尺度输入; (4) 之前的ciou loss也不太对,miemie2013的全尺度 ciou loss 好很多; (5) 从主干输出解码的流程也有精度问题;

从新开始训练voc2012,100 epoch后,loss在9.094,loss由3部分组成,objectness loss是数值最大的组成部分。测试结果如下:

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.152
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.336
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.117
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.284
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.209
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.303
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.308
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.308
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000

用miemie2013的模型代码,从头开始训练voc2012,235000步,测试结果如下:

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.159
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.348
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.120
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.280
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.212
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.300
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.304
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.304
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000

两者比较接近,可见问题大部分都在训练和loss等处。

再次感谢 @miemie2013 的批评指正!请大家尊重原创!

miemie2013 commented 4 years ago

因为太多的反馈训练问题,为了避免我的代码对大家的误导,抄作业了训练和loss,一直抄到 label smooth 之前。后面这个repo不会再抄和更新,抄到这里是为了发现和定位问题。 为了模型有更专业的持续维护,请大家用原作者的完善版本。

qqwwee版的训练确实很多坑,抄作业过程发现的问题和修改: (1) 模型主干没有太大问题,修改了kernel_initializer和 L2正则化(会加速收敛,酌情加上可能更好); (2) train里面的letterbox预处理,不如scale方式准确; (3) 没有多尺度输入; (4) 之前的ciou loss也不太对,miemie2013的全尺度 ciou loss 好很多; (5) 从主干输出解码的流程也有精度问题;

从新开始训练voc2012,100 epoch后,loss在9.094,loss由3部分组成,objectness loss是数值最大的组成部分。测试结果如下:

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.152
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.336
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.117
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.284
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.209
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.303
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.308
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.308
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000

用miemie2013的模型代码,从头开始训练voc2012,235000步,测试结果如下:

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.159
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.348
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.120
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.280
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.212
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.300
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.304
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.304
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000

两者比较接近,可见问题大部分都在训练和loss等处。

再次感谢 @miemie2013 的批评指正!请大家尊重原创!

谢谢在readme上帮我打广告的,我只是一个打广告的,谢谢!

boreas-l commented 3 years ago

因为太多的反馈训练问题,为了避免我的代码对大家的误导,抄作业了训练和loss,一直抄到 label smooth 之前。后面这个repo不会再抄和更新,抄到这里是为了发现和定位问题。 为了模型有更专业的持续维护,请大家用原作者的完善版本。

qqwwee版的训练确实很多坑,抄作业过程发现的问题和修改: (1) 模型主干没有太大问题,修改了kernel_initializer和 L2正则化(会加速收敛,酌情加上可能更好); (2) train里面的letterbox预处理,不如scale方式准确; (3) 没有多尺度输入; (4) 之前的ciou loss也不太对,miemie2013的全尺度 ciou loss 好很多; (5) 从主干输出解码的流程也有精度问题;

从新开始训练voc2012,100 epoch后,loss在9.094,loss由3部分组成,objectness loss是数值最大的组成部分。测试结果如下:

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.152
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.336
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.117
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.284
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.209
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.303
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.308
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.308
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000

用miemie2013的模型代码,从头开始训练voc2012,235000步,测试结果如下:

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.159
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.348
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.120
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.280
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.212
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.300
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.304
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.304
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = -1.000

两者比较接近,可见问题大部分都在训练和loss等处。

再次感谢 @miemie2013 的批评指正!请大家尊重原创!

话说,同一份权重,我分别用qqwwee和yangyun的代码测了一下,貌似qqwwee版本预测得更好一些。预测得时候也会用到输出解码部分。请问qqwwee版本在哪个部分大致有什么问题吖?谢谢楼主解答