YunYang1994 / tensorflow-yolov3

🔥 TensorFlow Code for technical report: "YOLOv3: An Incremental Improvement"
https://yunyang1994.gitee.io/2018/12/28/YOLOv3-算法的一点理解/
MIT License
3.63k stars 1.36k forks source link

tensorflow-yolov3中文交流 #39

Open YunYang1994 opened 5 years ago

YunYang1994 commented 5 years ago

hello大家好,我是该仓库的作者。鉴于我复现tensorflow-yolov3踩了太多坑,特此发个贴,帮助大家少走弯路。大家有问题可以在下面留言。

moondaiy commented 5 years ago

作者很好,很感谢分享自己的工作: 有个细节的问题想询问下, 你在三个特征层计算完毕后 都会加上 feature_map_3 = tf.identity(feature_map_3, name='feature_map_3') 这样的代码,请问,这样做目的是什么?不加这代码的话会出现问题么? 在上采样后也会加上 inputs = tf.identity(inputs, name='upsampled')代码,我有点不太理解,是代码风格问题还是其他原因额? 谢谢作者

另外,请问下,我在看你写代码,并没有关于预训练加载模型,直接从0开始训练的...不知道是我看的不仔细还是就是这样做的...

YunYang1994 commented 5 years ago

作者很好,很感谢分享自己的工作: 有个细节的问题想询问下, 你在三个特征层计算完毕后 都会加上 feature_map_3 = tf.identity(feature_map_3, name='feature_map_3') 这样的代码,请问,这样做目的是什么?不加这代码的话会出现问题么? 在上采样后也会加上 inputs = tf.identity(inputs, name='upsampled')代码,我有点不太理解,是代码风格问题还是其他原因额? 谢谢作者

另外,请问下,我在看你写代码,并没有关于预训练加载模型,直接从0开始训练的...不知道是我看的不仔细还是就是这样做的...

你好,tf.identity属于tensorflow中的一个ops而已,在这里用处不大。它返回一个受到tf.control_dependencies的约束的tensor。另外,训练代码里是加载了预训练模型的。

chunniunai220ml commented 5 years ago

@xliu79 你好,检测效果是可以根据阈值来调整的。另外,你也可以在https://github.com/YunYang1994/tensorflow-yolov3/blob/master/core/utils.py 调整读取权重的精度

def load_weights(var_list, weights_file):
    """
    Loads and converts pre-trained weights.
    :param var_list: list of network variables.
    :param weights_file: name of the binary file.
    :return: list of assign ops
    """
    with open(weights_file, "rb") as fp:
        np.fromfile(fp, dtype=np.int32, count=5)
        weights = np.fromfile(fp, dtype=np.float64)

我按照您的提示修改了精度,error in line 303 in utils,347854 can not into shape (1024,512,3,3), dtype=float32就没有问题?

另外,我自己利用darkenet原来的代码训练了一个只检测人的模型,在darknet的框架下测试成功了,但是用convert_weight.py转换成PB文件后,效果非常差,不知道为什么,有什么要注意的吗

rainley123 commented 5 years ago

I have some questions First, What's the difference between normal train and quick train? second, if I want to train my own dataset, which is different from the things in COCO and VOC, can I use the pre-trained darknet52?

wangyazhao001 commented 5 years ago

@YunYang1994 @zouliangyu @liuqinglong110 @sumenpuyuan 你好!我用所述代码加上我的数据进行训练的时候,在训练到1000多步或2000多步的时候会产生内核崩溃,代码也会报错,如下所示: ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[4,52,52,3,688,2] and type float on /job:localhost/replica:0/task:0/device:CPU:0 by allocator cpu [[{{node yolov3/Minimum_2}} = Minimum[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](yolov3/add_19, yolov3/add_20)]] Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

这是因为计算资源被用完了吗?应该如何处理?

moondaiy commented 5 years ago

作者好: 发先了一个挺有意思的现象,我在改写代码,作成多GPU训练的时候(用的是raccoon数据集, 训练参数没有变动,使用yolov3.weight作为预加载模型参数) ,原 quick_train.py中 update_vars = tf.contrib.framework.get_variables_to_restore(include=["yolov3/yolo-v3"]) 这行代码没有注意, 写成了对所有变量进行梯度更新 包含(yolov3/darknet-53)的变量, 这时候发现在 evaluate_utils.evaluate这个函数中会出现警告(主要是wh变量inf了 ) ,追踪了下发现是 y_pred = model.predict(pred_feature_map)函数中 tf.exp 输出溢出了, 最终的显现是网络无法收敛, 准确率和召回率很长时间下都是0.0, 这个现象很有意思,对全体网络参数进行更新会导致不收敛行为,当然也可能是参数不对. 当更改了更新变量 list 这一个现象虽然有,但是也只是在前期几次中会出现 后期就会稳定收敛. 不知道 作者对这个问题 有木有什么看法.?

lgldl commented 5 years ago

非常感谢作者的分享,在实验的过程中我遇到了一个问题,想麻烦您看一下: 首先我按照作者的步骤实现了raccoon数据集的训练;然后用同样的方法实现了自己采集的一个数据集,也没有问题,但是当我在训练另一个数据集的时候报错啦,错误如下: Traceback (most recent call last): File "/home/lgl/PycharmProjects/tensorflow-yolov3-New/quick_train.py", line 76, in run_items = sess.run([train_op, write_op, y_pred, y_true] + loss, feed_dict={is_training:True}) File "/home/lgl/.conda/envs/tensorflow-gpu/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 889, in run run_metadata_ptr) File "/home/lgl/.conda/envs/tensorflow-gpu/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1120, in _run feed_dict_tensor, options, run_metadata) File "/home/lgl/.conda/envs/tensorflow-gpu/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1317, in _do_run options, run_metadata) File "/home/lgl/.conda/envs/tensorflow-gpu/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1336, in _do_call raise type(e)(node_def, op, message) tensorflow.python.framework.errors_impl.UnknownError: IndexError: index 57 is out of bounds for axis 1 with size 52 [[Node: PyFunc = PyFuncTin=[DT_FLOAT], Tout=[DT_FLOAT, DT_FLOAT, DT_FLOAT], token="pyfunc_0"]] [[Node: cond/IteratorGetNext = IteratorGetNextoutput_shapes=[[?,416,416,3], , , ], output_types=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"]]

为了调试,我尝试改变了聚类的数量,得到新的anchors值以后再来进行训练,发现报错的地点不一样,错误原因变成了IndexError: index 14 is out of bounds for axis 1 with size 13,再改变聚类值的时候,那个数字还会改变,不知道是啥引起的? 麻烦您抽空帮忙看一下,谢谢

mujinbao commented 5 years ago

我这里训练了一个医学上的病变组织的分类检测,这里仅仅训练了5000个step(1900张样本),但是已经可以看到明显效果了,不过我这里有一个问题,就是在测试过程中发现经常有候选框重叠的情况,且有的目标候选框精度不如原版的好,这里想请教一下大家

  1. 修改哪个参数可以减少候选框重叠的问题呢(而且我发现好像有些过拟合的情况,是否应该稍微调大学习率呢)
  2. loss中隔一段时间就出现一个山峰,这个是怎么回事呢。。会不会是数据有问题呢

下面上个loss吧(参数用的默认的,没有改变) qwe

mujinbao commented 5 years ago

非常感谢作者的分享,在实验的过程中我遇到了一个问题,想麻烦您看一下: 首先我按照作者的步骤实现了浣熊数据集的训练;然后用同样的方法实现了自己采集的一个数据集,也没有问题,但是当我在训练另一个数据集的时候报错啦,错误如下: Traceback(最近一次调用最后一次): 文件“/home/lgl/PycharmProjects/tensorflow-yolov3-New/quick_train.py”,第76行,在 run_items = sess.run([train_op,write_op,y_pred,y_true] + loss,feed_dict = {is_training:True}) 文件“/home/lgl/.conda/envs/tensorflow-gpu/lib/python3。 6 / site-packages / tensorflow / python / client / session.py“,第889行,运行run_metadata_ptr) 文件”/home/lgl/.conda/envs/tensorflow-gpu/lib/python3.6/site-packages/ tensorflow / python / client / session.py“,第1120行,_run feed_dict_tensor,options,run_metadata) 文件“/home/lgl/.conda/envs/tensorflow-gpu/lib/python3.6/site-packages/tensorflow/python/client/session.py”,第1317行,在_do_run选项中,run_metadata) 文件“/ home /lgl/.conda/envs/tensorflow-gpu/lib/python3.6/site-packages/tensorflow/python/client/session.py“,第1336行,在_do_call raise type(e)中(node_def,op,message) tensorflow.python.framework.errors_impl.UnknownError:IndexError:索引57超出轴1的范围,大小为52 [[Node:PyFunc = PyFunc Tin = [DT_FLOAT],Tout = [DT_FLOAT,DT_FLOAT,DT_FLOAT],token =“ pyfunc_0“ ]] [[节点:cond / IteratorGetNext = IteratorGetNext output_shapes = [[?,416,416,3] ,,,],output_types = [DT_FLOAT,DT_FLOAT,DT_FLOAT,DTFLOAT], device =”/ job:localhost / replica: 0 /任务:0 /装置:CPU:0"]]

因为调试,我尝试改变了聚类的数量,得到新的锚定值以后再来进行训练,发现报错的地点不一样,错误原因变成了IndexError:索引14超出了轴1的大小为13的范围,再次改变聚类值的时候,那个数字还会改变,不知道是啥引起的? 麻烦您抽空帮忙看一下,谢谢

我也遇到你这个问题了,最后是因为我自己配置的路径写错了,之前遇到的一次问题的生成的tfrecords有问题,建议可以再仔细检查下代码还有数据

rainley123 commented 5 years ago

@charpoint 我还没训练过COCO,像这么大的数据集,我觉得至少要train 50 个epoch以上吧!目前来说,我在VOC数据集上train了60个epoch,花了一天时间左右,出现了比较严重的过拟合情况。可能是train太久了或者没有添加数据增强以及正则化损失的代码。

训练集:

=> Class  aeroplane - AP: 0.9924
=> Class    bicycle - AP: 0.9684
=> Class       bird - AP: 0.9833
=> Class       boat - AP: 0.9827
=> Class     bottle - AP: 0.9904
=> Class        bus - AP: 0.9891
=> Class        car - AP: 0.9891
=> Class        cat - AP: 0.9616
=> Class      chair - AP: 0.9401
=> Class        cow - AP: 0.9730
=> Class diningtable - AP: 0.9785
=> Class        dog - AP: 0.9651
=> Class      horse - AP: 0.9768
=> Class  motorbike - AP: 0.9594
=> Class     person - AP: 0.9800
=> Class pottedplant - AP: 0.9873
=> Class      sheep - AP: 0.9767
=> Class       sofa - AP: 0.8665
=> Class      train - AP: 0.9914
=> Class  tvmonitor - AP: 0.9875
=> mAP: 0.9720

测试集:

=> Class  aeroplane - AP: 0.6862
=> Class    bicycle - AP: 0.6378
=> Class       bird - AP: 0.5750
=> Class       boat - AP: 0.3625
=> Class     bottle - AP: 0.4401
=> Class        bus - AP: 0.6795
=> Class        car - AP: 0.7104
=> Class        cat - AP: 0.6660
=> Class      chair - AP: 0.3259
=> Class        cow - AP: 0.5680
=> Class diningtable - AP: 0.4250
=> Class        dog - AP: 0.6055
=> Class      horse - AP: 0.6805
=> Class  motorbike - AP: 0.5947
=> Class     person - AP: 0.6347
=> Class pottedplant - AP: 0.2218
=> Class      sheep - AP: 0.5501
=> Class       sofa - AP: 0.4691
=> Class      train - AP: 0.6602
=> Class  tvmonitor - AP: 0.5622
=> mAP: 0.5528

screenshot from 2019-01-27 19-30-46

我也在voc上训练的时候出现了过拟合的现象,我有个问题想要请教一下: 测试的时候, 感觉预测的box和真正的box有点差距,但是算出来的scores却能达到了0.99, 这是为啥?

rainley123 commented 5 years ago

我这里训练了一个医学上的病变组织的分类检测,这里仅仅训练了5000个step(1900张样本),但是已经可以看到明显效果了,不过我这里有一个问题,就是在测试过程中发现经常有候选框重叠的情况,且有的目标候选框精度不如原版的好,这里想请教一下大家

1. 修改哪个参数可以减少候选框重叠的问题呢(而且我发现好像有些过拟合的情况,是否应该稍微调大学习率呢)

2. loss中隔一段时间就出现一个山峰,这个是怎么回事呢。。会不会是数据有问题呢

下面上个loss吧(参数用的默认的,没有改变) qwe

这应该是nms的问题,你可以改变一下tf.tf.image.non_max_suppression 这个函数的参数再试试

YunYang1994 commented 5 years ago

我这里训练了一个医学上的病变组织的分类检测,这里仅仅训练了5000个step(1900张样本),但是已经可以看到明显效果了,不过我这里有一个问题,就是在测试过程中发现经常有候选框重叠的情况,且有的目标候选框精度不如原版的好,这里想请教一下大家

1. 修改哪个参数可以减少候选框重叠的问题呢(而且我发现好像有些过拟合的情况,是否应该稍微调大学习率呢)

2. loss中隔一段时间就出现一个山峰,这个是怎么回事呢。。会不会是数据有问题呢

下面上个loss吧(参数用的默认的,没有改变) qwe

这应该是nms的问题,你可以改变一下tf.tf.image.non_max_suppression 这个函数的参数再试试

1)精度没原版本的高那是肯定的,因为我开源的这个版本比较粗糙,写的也简单,所以还未达到论文精度!(达到论文精度的tensorflow-yolov3版本受公司保密限制,恕我目前还不能开源,请谅解!).这个粗糙版本的目地是为为大家提供一个tensorflow-yolov3复现的思路,大家可以参考着进行改进.

2)过拟合的问题大家可以尝试着使用数据增强,正则化损失以及提前终止的办法去解决.

3) loss中隔一段时间就出现一个山峰,可能是你数据的gt-boxes没框准,或则没充分打乱.

lgldl commented 5 years ago

非常感谢作者的分享,在实验的过程中我遇到了一个问题,想麻烦您看一下: 首先我按照作者的步骤实现了浣熊数据集的训练;然后用同样的方法实现了自己采集的一个数据集,也没有问题,但是当我在训练另一个数据集的时候报错啦,错误如下: Traceback(最近一次调用最后一次): 文件“/home/lgl/PycharmProjects/tensorflow-yolov3-New/quick_train.py”,第76行,在 run_items = sess.run([train_op,write_op,y_pred,y_true] + loss,feed_dict = {is_training:True}) 文件“/home/lgl/.conda/envs/tensorflow-gpu/lib/python3。 6 / site-packages / tensorflow / python / client / session.py“,第889行,运行run_metadata_ptr) 文件”/home/lgl/.conda/envs/tensorflow-gpu/lib/python3.6/site-packages/ tensorflow / python / client / session.py“,第1120行,_run feed_dict_tensor,options,run_metadata) 文件“/home/lgl/.conda/envs/tensorflow-gpu/lib/python3.6/site-packages/tensorflow/python/client/session.py”,第1317行,在_do_run选项中,run_metadata) 文件“/ home /lgl/.conda/envs/tensorflow-gpu/lib/python3.6/site-packages/tensorflow/python/client/session.py“,第1336行,在_do_call raise type(e)中(node_def,op,message) tensorflow.python.framework.errors_impl.UnknownError:IndexError:索引57超出轴1的范围,大小为52 [[Node:PyFunc = PyFunc Tin = [DT_FLOAT],Tout = [DT_FLOAT,DT_FLOAT,DT_FLOAT],token =“ pyfunc_0“ ]] [[节点:cond / IteratorGetNext = IteratorGetNext output_shapes = [[?,416,416,3] ,,,],output_types = [DT_FLOAT,DT_FLOAT,DT_FLOAT,DTFLOAT], device =”/ job:localhost / replica: 0 /任务:0 /装置:CPU:0"]] 因为调试,我尝试改变了聚类的数量,得到新的锚定值以后再来进行训练,发现报错的地点不一样,错误原因变成了IndexError:索引14超出了轴1的大小为13的范围,再次改变聚类值的时候,那个数字还会改变,不知道是啥引起的? 麻烦您抽空帮忙看一下,谢谢

我也遇到你这个问题了,最后是因为我自己配置的路径写错了,之前遇到的一次问题的生成的tfrecords有问题,建议可以再仔细检查下代码还有数据

谢谢您的答复,我检查了路径还有生成代码,运行几十个EPOCH以后还是会出现上述问题,不知道怎么回事?关键是换一个数据集,同样的操作就可以训练啦,但是我用原文作者公开的YOLO-v3进行测试,又能够运行,说明数据集没有问题,不知道还有哪儿会出问题?

wangyazhao001 commented 5 years ago

当我执行quick_test.py时,老出现这个错误,出现invalid value encoutered in subtract...... 错误提示如下: image 这是网络没有训练好还是什么原因?

hxwork commented 5 years ago

作者你好,我改换了一个交通标志数据集在训练,train_dataset包含45类,每类大概有1000个box实例,但是train的时候即使是设置小的学习率(0.0005或者0.0001),batch_size设置为8,训练3w个epoch后,confidence置信度和class分类的loss都还是在个位数浮动(3或是4左右),没有办法收敛到很小,但是bbox的两个损失可以收敛到0.1以内。想请问一下这种情况是我的train_dataset有问题还是其他的问题?

YunYang1994 commented 5 years ago

作者你好,我改换了一个交通标志数据集在训练,train_dataset包含45类,每类大概有1000个box实例,但是train的时候即使是设置小的学习率(0.0005或者0.0001),batch_size设置为8,训练3w个epoch后,confidence置信度和class分类的loss都还是在个位数浮动(3或是4左右),没有办法收敛到很小,但是bbox的两个损失可以收敛到0.1以内。想请问一下这种情况是我的train_dataset有问题还是其他的问题?

纠正一下,我的一个epoch是一个batch_size,你再多train会试试,学习率还可以设置小点。

hxwork commented 5 years ago

作者你好,我改换了一个交通标志数据集在训练,train_dataset包含45类,每类大概有1000个box实例,但是train的时候即使是设置小的学习率(0.0005或者0.0001),batch_size设置为8,训练3w个epoch后,confidence置信度和class分类的loss都还是在个位数浮动(3或是4左右),没有办法收敛到很小,但是bbox的两个损失可以收敛到0.1以内。想请问一下这种情况是我的train_dataset有问题还是其他的问题?

纠正一下,我的一个epoch是一个batch_size,你再多train会试试,学习率还可以设置小点。

我明白的,我的数据集大概4w张图,按我说的那样已经把train_dataset过了几遍了,我单张图测试的时候发现bbox框的准,但是分类的效果很差,不知道这是什么原因,准备先把数据集的类别改少一点试一下

rainley123 commented 5 years ago

hello大家好,我是该仓库的作者。鉴于我复现tensorflow-yolov3踩了太多坑,特此发个贴,帮助大家少走弯路。大家有问题可以在下面留言。

请教一个问题各位大佬一个问题,我在训练voc的时候,在训练集上的precision 和 recall都能达到90%以上, 但是在验证集上precision为85左右,但是重点是我的recall只有30%多, 请问我该怎么修改一些参数,使得precision和recall在验证集上有很好的表现

muyiyiyi commented 5 years ago

训练完自己的数据集后,进行测试报错 报错问题如下。为什么会出现维度超出的情况呢。按理说不会预测到这么多啊 Traceback (most recent call last): File "C:\Users\admin\Desktop\yolov3\quick_test.py", line 33, in boxes, scores, labels = utils.cpu_nms(boxes, scores, num_classes, score_thresh=0.3, iou_thresh=0.5) File "C:\Users\admin\Desktop\yolov3\core\utils.py", line 122, in cpu_nms filter_boxes = boxes[indices] IndexError: index 17440 is out of bounds for axis 0 with size 10647

jinzimumu commented 5 years ago

Traceback (most recent call last): File "flow", line 6, in cliHandler(sys.argv) File "C:\Users\ASUS\darkflow\darkflow\cli.py", line 33, in cliHandler print('Enter training ...'); tfnet.train() File "C:\Users\ASUS\darkflow\darkflow\net\flow.py", line 39, in train for i, (x_batch, datum) in enumerate(batches): File "C:\Users\ASUS\darkflow\darkflow\net\yolo\data.py", line 114, in shuffle inp, new_feed = self._batch(train_instance) File "C:\Users\ASUS\darkflow\darkflow\net\yolov2\data.py", line 28, in _batch img = self.preprocess(path, allobj) File "C:\Users\ASUS\darkflow\darkflow\net\yolo\predict.py", line 62, in preprocess result = imcv2_affine_trans(im) File "C:\Users\ASUS\darkflow\darkflow\utils\im_transform.py", line 20, in imcv2_affine_trans h, w, c = im.shape AttributeError: 'NoneType' object has no attribute 'shape' 請問這個是怎麼回事

zkk0911 commented 5 years ago

quick_train.py 中的epoch设置的是2500,看代码应该是2500个batch_size,而不是2500个epoches,不知道是不是我理解错了

YunYang1994 commented 5 years ago

Traceback (most recent call last): File "flow", line 6, in cliHandler(sys.argv) File "C:\Users\ASUS\darkflow\darkflow\cli.py", line 33, in cliHandler print('Enter training ...'); tfnet.train() File "C:\Users\ASUS\darkflow\darkflow\net\flow.py", line 39, in train for i, (x_batch, datum) in enumerate(batches): File "C:\Users\ASUS\darkflow\darkflow\net\yolo\data.py", line 114, in shuffle inp, new_feed = self._batch(train_instance) File "C:\Users\ASUS\darkflow\darkflow\net\yolov2\data.py", line 28, in _batch img = self.preprocess(path, allobj) File "C:\Users\ASUS\darkflow\darkflow\net\yolo\predict.py", line 62, in preprocess result = imcv2_affine_trans(im) File "C:\Users\ASUS\darkflow\darkflow\utils\im_transform.py", line 20, in imcv2_affine_trans h, w, c = im.shape AttributeError: 'NoneType' object has no attribute 'shape' 請問這個是怎麼回事

这不是我的代码吧,可能是你的图片没读进去

YunYang1994 commented 5 years ago

训练完自己的数据集后,进行测试报错 报错问题如下。为什么会出现维度超出的情况呢。按理说不会预测到这么多啊 Traceback (most recent call last): File "C:\Users\admin\Desktop\yolov3\quick_test.py", line 33, in boxes, scores, labels = utils.cpu_nms(boxes, scores, num_classes, score_thresh=0.3, iou_thresh=0.5) File "C:\Users\admin\Desktop\yolov3\core\utils.py", line 122, in cpu_nms filter_boxes = boxes[indices] IndexError: index 17440 is out of bounds for axis 0 with size 10647

检查下输入图片的尺寸是不是416x416

YunYang1994 commented 5 years ago

quick_train.py 中的epoch设置的是2500,看代码应该是2500个batch_size,而不是2500个epoches,不知道是不是我理解错了

你没理解错,是我命名不太合适

jinzimumu commented 5 years ago

上一篇我是理解錯了。。我以為img裡面是要放test的圖片。。後面改過來可以了。。不過我想問。訓練的時候要讓他跳1000次。。我能中途退出。我能更改他的訓練次數嗎

YunYang1994 commented 5 years ago

这样吧,我从以下几点去建议大家改进代码:

(1)目前我的图片预处理是直接resize成416x416的尺寸,而darknet的源码是采用letterbox_image方法来改变原图的尺寸,具体参考这里

(2)数据增强部分我本来想加上的,但是加上后报出一些莫名其妙的错误,然后后面我也没管了,大家可以补充。

(3)我看issue里面都提到了过拟合的情况,大家可以在训练代码里加上这样一行:

# 权重衰减
with tf.name_scope("define_weight_decay"):
    moving_ave = tf.train.ExponentialMovingAverage(0.995).apply(tf.trainable_variables())
ai-porter commented 5 years ago

作者你好,我改换了一个交通标志数据集在训练,train_dataset包含45类,每类大概有1000个box实例,但是train的时候即使是设置小的学习率(0.0005或者0.0001),batch_size设置为8,训练3w个epoch后,confidence置信度和class分类的loss都还是在个位数浮动(3或是4左右),没有办法收敛到很小,但是bbox的两个损失可以收敛到0.1以内。想请问一下这种情况是我的train_dataset有问题还是其他的问题?

纠正一下,我的一个epoch是一个batch_size,你再多train会试试,学习率还可以设置小点。

作者能不能将这点修正一下,把EPOCHS改为ITERATIONS,这样大家都不会理解偏。

YunYang1994 commented 5 years ago

作者你好,我改换了一个交通标志数据集在训练,train_dataset包含45类,每类大概有1000个box实例,但是train的时候即使是设置小的学习率(0.0005或者0.0001),batch_size设置为8,训练3w个epoch后,confidence置信度和class分类的loss都还是在个位数浮动(3或是4左右),没有办法收敛到很小,但是bbox的两个损失可以收敛到0.1以内。想请问一下这种情况是我的train_dataset有问题还是其他的问题?

纠正一下,我的一个epoch是一个batch_size,你再多train会试试,学习率还可以设置小点。

作者能不能将这点修正一下,把EPOCHS改为ITERATIONS,这样大家都不会理解偏。

好的

dizzycc0 commented 5 years ago

作者您好,我修改anchor box的个数并重新聚类后训练出现如下错误: Traceback (most recent call last): File "D:/project/yolo/tensorflow-yolov3-master/quick_train.py", line 47, in loss = model.compute_loss(pred_feature_map, y_true) File "D:\project\yolo\tensorflow-yolov3-master\core\yolov3.py", line 263, in compute_loss result = self.loss_layer(pred_feature_map[i], y_true[i], _ANCHORS[i]) File "D:\project\yolo\tensorflow-yolov3-master\core\yolov3.py", line 335, in loss_layer xy_loss = tf.reduce_sum(tf.square(true_xy - pred_xy) object_mask box_loss_scale) / N File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\ops\math_ops.py", line 866, in binary_op_wrapper return func(x, y, name=name) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\ops\gen_math_ops.py", line 8318, in sub "Sub", x=x, y=y, name=name) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 787, in _apply_op_helper op_def=op_def) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\util\deprecation.py", line 488, in new_func return func(*args, **kwargs) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 3274, in create_op op_def=op_def) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1792, in init control_input_ops) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1631, in _create_c_op raise ValueError(str(e)) ValueError: Dimensions must be equal, but are 3 and 2 for 'yolov3/sub_7' (op: 'Sub') with input shapes: [?,13,13,3,2], [?,13,13,2,2]. 请问是什么问题?

YunYang1994 commented 5 years ago

作者您好,我修改anchor box的个数并重新聚类后训练出现如下错误: Traceback (most recent call last): File "D:/project/yolo/tensorflow-yolov3-master/quick_train.py", line 47, in loss = model.compute_loss(pred_feature_map, y_true) File "D:\project\yolo\tensorflow-yolov3-master\core\yolov3.py", line 263, in compute_loss result = self.loss_layer(pred_feature_map[i], y_true[i], _ANCHORS[i]) File "D:\project\yolo\tensorflow-yolov3-master\core\yolov3.py", line 335, in loss_layer xy_loss = tf.reduce_sum(tf.square(true_xy - pred_xy) object_mask box_loss_scale) / N File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\ops\math_ops.py", line 866, in binary_op_wrapper return func(x, y, name=name) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\ops\gen_math_ops.py", line 8318, in sub "Sub", x=x, y=y, name=name) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 787, in _apply_op_helper op_def=op_def) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\util\deprecation.py", line 488, in new_func return func(*args, kwargs) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 3274, in create_op op_def=op_def) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1792, in init** control_input_ops) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1631, in _create_c_op raise ValueError(str(e)) ValueError: Dimensions must be equal, but are 3 and 2 for 'yolov3/sub_7' (op: 'Sub') with input shapes: [?,13,13,3,2], [?,13,13,2,2]. 请问是什么问题?

这个你需要自己改下代码,当时我写的代码是每个尺度只cover三个anchor boxes的。

zkk0911 commented 5 years ago

很多留言说有train.py, 但是现在只有quick_train.py。 train.py删除了吗?

dizzycc0 commented 5 years ago

作者您好,我修改anchor box的个数并重新聚类后训练出现如下错误: Traceback (most recent call last): File "D:/project/yolo/tensorflow-yolov3-master/quick_train.py", line 47, in loss = model.compute_loss(pred_feature_map, y_true) File "D:\project\yolo\tensorflow-yolov3-master\core\yolov3.py", line 263, in compute_loss result = self.loss_layer(pred_feature_map[i], y_true[i], _ANCHORS[i]) File "D:\project\yolo\tensorflow-yolov3-master\core\yolov3.py", line 335, in loss_layer xy_loss = tf.reduce_sum(tf.square(true_xy - pred_xy) object_mask box_loss_scale) / N File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\ops\math_ops.py", line 866, in binary_op_wrapper return func(x, y, name=name) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\ops\gen_math_ops.py", line 8318, in sub "Sub", x=x, y=y, name=name) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 787, in _apply_op_helper op_def=op_def) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\util\deprecation.py", line 488, in new_func return func(*args, kwargs) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 3274, in create_op op_def=op_def) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1792, in init** control_input_ops) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1631, in _create_c_op raise ValueError(str(e)) ValueError: Dimensions must be equal, but are 3 and 2 for 'yolov3/sub_7' (op: 'Sub') with input shapes: [?,13,13,3,2], [?,13,13,2,2]. 请问是什么问题?

这个你需要自己改下代码,当时我写的代码是每个尺度只cover三个anchor boxes的。

嗯嗯,改好了,谢谢您。

HoracceFeng commented 5 years ago

作者你好,代码思路很清晰,先谢为敬。最近在使用yolov3的tensorflow/keras复现时出现了些问题,想请教一下:

  1. yolov3源码的损失函数貌似与v1,v2的有很大区别?我看到github上改版写的v3的loss都是 loss_xy + loss_wh + loss_conf + loss_class,但是在源码中我在 ./src/yolo_layer.c:forward_yolo_layer() 找到的loss却是 (l.cost) = pow(mag_array(l.delta, l.outputs l.batch), 2); 其中 l.delta是相当于mask的变量。我在源码中没有找到 xy+wh+conf+class 的代码,请教作者源码loss的设置和相应的位置
  2. 我使用的 experiencor/keras-yolo3,他的loss设置与你的是一样的,问题是我在训练过程中发现loss一直很难收敛,波动的范围是两个数量级(即0.1-10)这样。用同样的数据去训练,出来的结果与原版相比 precision/recall 降低超过5%,而我在原版中训练时损失是(0.1-0.2)。所以,其实还是想请教下作者这个loss波动大的情况是不是还是损失函数设置不当导致的。

谢谢

kkk324 commented 5 years ago

@charpoint 我还没训练过COCO,像这么大的数据集,我觉得至少要train 50 个epoch以上吧!目前来说,我在VOC数据集上train了60个epoch,花了一天时间左右,出现了比较严重的过拟合情况。可能是train太久了或者没有添加数据增强以及正则化损失的代码。

训练集:

=> Class  aeroplane - AP: 0.9924
=> Class    bicycle - AP: 0.9684
=> Class       bird - AP: 0.9833
=> Class       boat - AP: 0.9827
=> Class     bottle - AP: 0.9904
=> Class        bus - AP: 0.9891
=> Class        car - AP: 0.9891
=> Class        cat - AP: 0.9616
=> Class      chair - AP: 0.9401
=> Class        cow - AP: 0.9730
=> Class diningtable - AP: 0.9785
=> Class        dog - AP: 0.9651
=> Class      horse - AP: 0.9768
=> Class  motorbike - AP: 0.9594
=> Class     person - AP: 0.9800
=> Class pottedplant - AP: 0.9873
=> Class      sheep - AP: 0.9767
=> Class       sofa - AP: 0.8665
=> Class      train - AP: 0.9914
=> Class  tvmonitor - AP: 0.9875
=> mAP: 0.9720

测试集:

=> Class  aeroplane - AP: 0.6862
=> Class    bicycle - AP: 0.6378
=> Class       bird - AP: 0.5750
=> Class       boat - AP: 0.3625
=> Class     bottle - AP: 0.4401
=> Class        bus - AP: 0.6795
=> Class        car - AP: 0.7104
=> Class        cat - AP: 0.6660
=> Class      chair - AP: 0.3259
=> Class        cow - AP: 0.5680
=> Class diningtable - AP: 0.4250
=> Class        dog - AP: 0.6055
=> Class      horse - AP: 0.6805
=> Class  motorbike - AP: 0.5947
=> Class     person - AP: 0.6347
=> Class pottedplant - AP: 0.2218
=> Class      sheep - AP: 0.5501
=> Class       sofa - AP: 0.4691
=> Class      train - AP: 0.6602
=> Class  tvmonitor - AP: 0.5622
=> mAP: 0.5528

screenshot from 2019-01-27 19-30-46

想請教一下這邊使用的 quick_train.py 參數 也就是以下這個部分 (這是原始參數) image

另外就是 tfrecord 就是使用make_voc_tfrecords.sh來製作嗎? 因為我這部分是把所有 voc data (2007 - 2012) 的 80% 拿來作為 train_tfrecord,剩下作 test_record, 但evaluate出來數據很差,我最多訓練到 STEPS = 80000,其他參數一樣 (有試過 LR 小一點,也不好。) 非常感謝。

jinzimumu commented 5 years ago

你好作者,首先要感谢你为我提供那么活跃的交流平台一起学习。昨天我开始训练样本,除了样本是我自己做的,改了label.txt那些,其他默认值我没改,然后如下: step 4591 - loss 8.160919189453125 - moving ave loss 8.273758598488705 step 4592 - loss 8.05339241027832 - moving ave loss 8.251721979667666 step 4593 - loss 8.219359397888184 - moving ave loss 8.248485721489718 step 4594 - loss 8.336946487426758 - moving ave loss 8.257331798083422 step 4595 - loss 8.23604965209961 - moving ave loss 8.255203583485041 然后我以为他只会跑1000,怎么会跑那么多,都一天了,请问这是为什么?他什么时候会停,这个训练的东西我应该能用吧。望告知!十分感谢大大!!!

kkk324 commented 5 years ago

你好作者,首先要感谢你为我提供那么活跃的交流平台一起学习。昨天我开始训练样本,除了样本是我自己做的,改了label.txt那些,其他默认值我没改,然后如下: step 4591 - loss 8.160919189453125 - moving ave loss 8.273758598488705 step 4592 - loss 8.05339241027832 - moving ave loss 8.251721979667666 step 4593 - loss 8.219359397888184 - moving ave loss 8.248485721489718 step 4594 - loss 8.336946487426758 - moving ave loss 8.257331798083422 step 4595 - loss 8.23604965209961 - moving ave loss 8.255203583485041 然后我以为他只会跑1000,怎么会跑那么多,都一天了,请问这是为什么?他什么时候会停,这个训练的东西我应该能用吧。望告知!十分感谢大大!!!

你的 steps 設多少就跑多少。

jinzimumu commented 5 years ago

你好作者,首先要感谢你为我提供那么活跃的交流平台一起学习。昨天我开始训练样本,除了样本是我自己做的,改了label.txt那些,其他默认值我没改,然后如下: step 4591 - loss 8.160919189453125 - moving ave loss 8.273758598488705 step 4592 - loss 8.05339241027832 - moving ave loss 8.251721979667666 step 4593 - loss 8.219359397888184 - moving ave loss 8.248485721489718 step 4594 - loss 8.336946487426758 - moving ave loss 8.257331798083422 step 4595 - loss 8.23604965209961 - moving ave loss 8.255203583485041 然后我以为他只会跑1000,怎么会跑那么多,都一天了,请问这是为什么?他什么时候会停,这个训练的东西我应该能用吧。望告知!十分感谢大大!!!

你的 steps 設多少就跑多少。 Statistics: tiguan: 296 Dataset size: 252 Dataset of 252 instance(s) Training statistics: Learning rate : 1e-05 Batch size : 16 Epoch number : 1000 Backup every : 2000 能帮我看下嘛。。我也没改什么默认值。。

kkk324 commented 5 years ago

你好作者,首先要感谢你为我提供那么活跃的交流平台一起学习。昨天我开始训练样本,除了样本是我自己做的,改了label.txt那些,其他默认值我没改,然后如下: step 4591 - loss 8.160919189453125 - moving ave loss 8.273758598488705 step 4592 - loss 8.05339241027832 - moving ave loss 8.251721979667666 step 4593 - loss 8.219359397888184 - moving ave loss 8.248485721489718 step 4594 - loss 8.336946487426758 - moving ave loss 8.257331798083422 step 4595 - loss 8.23604965209961 - moving ave loss 8.255203583485041 然后我以为他只会跑1000,怎么会跑那么多,都一天了,请问这是为什么?他什么时候会停,这个训练的东西我应该能用吧。望告知!十分感谢大大!!!

你的 steps 設多少就跑多少。 Statistics: tiguan: 296 Dataset size: 252 Dataset of 252 instance(s) Training statistics: Learning rate : 1e-05 Batch size : 16 Epoch number : 1000 Backup every : 2000 能帮我看下嘛。。我也没改什么默认值。。

要看 quick_train.py 裡面的設置。

jinzimumu commented 5 years ago

quick

我没这个档。。我只找得到那个作者说的defaults.py

jinzimumu commented 5 years ago

你好作者,首先要感谢你为我提供那么活跃的交流平台一起学习。昨天我开始训练样本,除了样本是我自己做的,改了label.txt那些,其他默认值我没改,然后如下: step 4591 - loss 8.160919189453125 - moving ave loss 8.273758598488705 step 4592 - loss 8.05339241027832 - moving ave loss 8.251721979667666 step 4593 - loss 8.219359397888184 - moving ave loss 8.248485721489718 step 4594 - loss 8.336946487426758 - moving ave loss 8.257331798083422 step 4595 - loss 8.23604965209961 - moving ave loss 8.255203583485041 然后我以为他只会跑1000,怎么会跑那么多,都一天了,请问这是为什么?他什么时候会停,这个训练的东西我应该能用吧。望告知!十分感谢大大!!!

你的 steps 設多少就跑多少。 Statistics: tiguan: 296 Dataset size: 252 Dataset of 252 instance(s) Training statistics: Learning rate : 1e-05 Batch size : 16 Epoch number : 1000 Backup every : 2000 能帮我看下嘛。。我也没改什么默认值。。

要看 quick_train.py 裡面的設置。

那还有能不能就此停下训练,就用到目前为止的训练。

BUPTLYH commented 5 years ago

请问作者有没有v3-tiny版本的规划,目前正尝试v3-tiny版本

Yyinghao commented 5 years ago

作者你好!!非常感谢你的分享。由于一些原因我要用C复现一下前向传播过程。现在我需要读你提供的权值数据,但是总是还有剩余的数据没读完。我看了你的读数据的代码,有个地方不一样,不太明白bia读的是什么,麻烦看到了帮我解答一下好吗?感谢!

HoracceFeng commented 5 years ago

@BUPTLYH tiny版的代码可以试试这个 https://github.com/HoracceFeng/keras-yolo3-tiny 我用起来没什么问题

Yyinghao commented 5 years ago

能给我先qq或者微信嘛,我数据读的老是有问题。。

BUPTLYH commented 5 years ago

@BUPTLYH tiny版的代码可以试试这个 https://github.com/HoracceFeng/keras-yolo3-tiny 我用起来没什么问题

好的,非常感谢

Andy546 commented 5 years ago

@dizzycc0

作者您好,我修改anchor box的个数并重新聚类后训练出现如下错误: Traceback (most recent call last): File "D:/project/yolo/tensorflow-yolov3-master/quick_train.py", line 47, in loss = model.compute_loss(pred_feature_map, y_true) File "D:\project\yolo\tensorflow-yolov3-master\core\yolov3.py", line 263, in compute_loss result = self.loss_layer(pred_feature_map[i], y_true[i], _ANCHORS[i]) File "D:\project\yolo\tensorflow-yolov3-master\core\yolov3.py", line 335, in loss_layer xy_loss = tf.reduce_sum(tf.square(true_xy - pred_xy) object_mask box_loss_scale) / N File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\ops\math_ops.py", line 866, in binary_op_wrapper return func(x, y, name=name) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\ops\gen_math_ops.py", line 8318, in sub "Sub", x=x, y=y, name=name) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 787, in _apply_op_helper op_def=op_def) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\util\deprecation.py", line 488, in new_func return func(*args, kwargs) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 3274, in create_op op_def=op_def) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1792, in init** control_input_ops) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1631, in _create_c_op raise ValueError(str(e)) ValueError: Dimensions must be equal, but are 3 and 2 for 'yolov3/sub_7' (op: 'Sub') with input shapes: [?,13,13,3,2], [?,13,13,2,2]. 请问是什么问题?

您好,请问这个问题您怎么解决的啊

dizzycc0 commented 5 years ago

@dizzycc0

作者您好,我修改anchor box的个数并重新聚类后训练出现如下错误: Traceback (most recent call last): File "D:/project/yolo/tensorflow-yolov3-master/quick_train.py", line 47, in loss = model.compute_loss(pred_feature_map, y_true) File "D:\project\yolo\tensorflow-yolov3-master\core\yolov3.py", line 263, in compute_loss result = self.loss_layer(pred_feature_map[i], y_true[i], _ANCHORS[i]) File "D:\project\yolo\tensorflow-yolov3-master\core\yolov3.py", line 335, in loss_layer xy_loss = tf.reduce_sum(tf.square(true_xy - pred_xy) object_mask box_loss_scale) / N File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\ops\math_ops.py", line 866, in binary_op_wrapper return func(x, y, name=name) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\ops\gen_math_ops.py", line 8318, in sub "Sub", x=x, y=y, name=name) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 787, in _apply_op_helper op_def=op_def) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\util\deprecation.py", line 488, in new_func return func(*args, kwargs) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 3274, in create_op op_def=op_def) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1792, in init** control_input_ops) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1631, in _create_c_op raise ValueError(str(e)) ValueError: Dimensions must be equal, but are 3 and 2 for 'yolov3/sub_7' (op: 'Sub') with input shapes: [?,13,13,3,2], [?,13,13,2,2]. 请问是什么问题?

您好,请问这个问题您怎么解决的啊

这个要改yolov3.py和utils.py里面很多地方,要是嫌麻烦的话可以用重复的anchor box或者把多余的anchor box设为0试试

YuDamon commented 5 years ago

目前我的图片预处理是直接resize成416x416的尺寸

您好,如果测试图像的长宽比很大,比如kitti的目标检测数据集,大概是1240375, 请问直接将原始输入resize到416416是不是并不合理?是否应该保持原始数据长宽比进行训练呢?

YunYang1994 commented 5 years ago

目前我的图片预处理是直接resize成416x416的尺寸

您好,如果测试图像的长宽比很大,比如kitti的目标检测数据集,大概是1240_375, 请问直接将原始输入resize到416_416是不是并不合理?是否应该保持原始数据长宽比进行训练呢?

对啊,直接resize会改变图片的平移不变性,所以你要用源码的letterbox_image代码。当时我为了图简单就没有写,你自己补充写下。

Andy546 commented 5 years ago

@dizzycc0

作者您好,我修改anchor box的个数并重新聚类后训练出现如下错误: Traceback (most recent call last): File "D:/project/yolo/tensorflow-yolov3-master/quick_train.py", line 47, in loss = model.compute_loss(pred_feature_map, y_true) File "D:\project\yolo\tensorflow-yolov3-master\core\yolov3.py", line 263, in compute_loss result = self.loss_layer(pred_feature_map[i], y_true[i], _ANCHORS[i]) File "D:\project\yolo\tensorflow-yolov3-master\core\yolov3.py", line 335, in loss_layer xy_loss = tf.reduce_sum(tf.square(true_xy - pred_xy) object_mask box_loss_scale) / N File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\ops\math_ops.py", line 866, in binary_op_wrapper return func(x, y, name=name) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\ops\gen_math_ops.py", line 8318, in sub "Sub", x=x, y=y, name=name) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 787, in _apply_op_helper op_def=op_def) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\util\deprecation.py", line 488, in new_func return func(*args, kwargs) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 3274, in create_op op_def=op_def) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1792, in init** control_input_ops) File "D:\anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\framework\ops.py", line 1631, in _create_c_op raise ValueError(str(e)) ValueError: Dimensions must be equal, but are 3 and 2 for 'yolov3/sub_7' (op: 'Sub') with input shapes: [?,13,13,3,2], [?,13,13,2,2]. 请问是什么问题?

您好,请问这个问题您怎么解决的啊

这个要改yolov3.py和utils.py里面很多地方,要是嫌麻烦的话可以用重复的anchor box或者把多余的anchor box设为0试试

好的,谢谢