YunYang1994 / tensorflow-yolov3

🔥 TensorFlow Code for technical report: "YOLOv3: An Incremental Improvement"

Home Page:https://yunyang1994.gitee.io/2018/12/28/YOLOv3-算法的一点理解/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

tensorflow-yolov3中文交流

YunYang1994 opened this issue · comments

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

感觉和原版有出入。yolov3的标注是处理为0-1范围内,网络预测出偏移量再联合anchor计算出预测值box,再返回原图与groudTruth计算loss,这版感觉没有把标注处理为0-1

@zouliangyu 其实没有差别,因为我写的代码里也是预测偏移量的。原版yolov3里是要你自己预处理成0~1之间的,我这里是不用的。但本质上的损失都是偏移量的损失。

还是同一个问题,当运行show_input_image.py和train.py,还是出现这样的问题:

OutOfRangeError: End of sequence
[[{{node cond/IteratorGetNext_1}} = 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"]]

During handling of the above exception, another exception occurred。OutOfRangeError Traceback (most recent call last)
in ()
78 if (epoch+1)%1000 == 0: saver.save(sess, save_path="./checkpoint/yolov3.ckpt", global_step=epoch)

应该是读tfrecord的时候出现问题,这该如何解决?

@wangyazhao001 我已经完整运行过作者的show_input_image.py和train.py脚本了,都可以运行成功。我没有出现你这种问题。由于作者没有使用一个统一的config文件来管理各种参数,可能在训练自己的数据集时,出现报错。你仔细看看自己的样本集标注格式是否和VOC格式一致,或者,类别参数是否根据自己的训练集修改,还有voc.name等文件,很多细节地方需要注意。

@liuqinglong110 @zouliangyu @wangyazhao001 大家可以帮忙先train一下VOC数据集,训练的代码可以参考https://github.com/YunYang1994/tensorflow-yolov3/blob/master/quick_train.py 来写

@wangyazhao001 你先看看你的dataset.txt是不是严格按照image_path xmin ymin xmax ymax class_id来写的,制作好tfrecords后用show_input_image.py看看对不对。

@wangyazhao001 @YunYang1994 你好!我也出现了wangyazhao001的情况,我自己的数据集是一个类6万多训练集,2000多测试集我做了如下实验
(1)制作子集tfrecord格式,发现训练 训练集会报同样的错误,训练测试集没有问题。难道数量大会出问题?另外我发现不管把tf record 的num thread 设成多少训练集最后都会有个0k的tfrecord文件,可能和这个有关系?
(2)训练作者提供的一类racoon数据集,训练成功
(3)使用作者提供的show_input_image只显示自己的训练集或者测试集合,都没有出错,正常显示

我想问下,两位有什么好的建议吗?

@sumenpuyuan 你给的信息太少,不排除数据集存在脏数据。比如我之前遇到过数据集里有图片不完整的情况,后面有时间我会再优化下代码。

@wangyazhao001 @YunYang1994 你好!我也出现了wangyazhao001的情况,我自己的数据集是一个类6万多训练集,2000多测试集我做了如下实验
(1)制作子集tfrecord格式,发现训练 训练集会报同样的错误,训练测试集没有问题。难道数量大会出问题?另外我发现不管把tf record 的num thread 设成多少训练集最后都会有个0k的tfrecord文件,可能和这个有关系?
(2)训练作者提供的一类racoon数据集,训练成功
(3)使用作者提供的show_input_image只显示自己的训练集或者测试集合,都没有出错,正常显示

我想问下,两位有什么好的建议吗?

最后的那个0k的tfrecord文件应该删除吧,我自己也产生了这个文件,删除了,训练过程中没有出现问题。

您好, 我用你的脚本把我的.weigths转为.pb文件后跑了一下发现用nms_demo.py测试图片没有问题,但是用同样的.pb模型文件测试视频时候精度很差,远远不如测试图片效果好,奇怪的是把视频文件按帧每隔一段时间截图,再次测截图发现精度也还好,请问这是什么问题呢。。。。麻烦了o.o

@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)

想问一下作者自己训练多类目标的效果怎么样?

@zouliangyu 还没有训练多类,可能等到年后会训练下voc数据吧。目前只训练了一个类别的数据,训练集5800多张,测试集1000多张,准确率在91%左右。

@sumenpuyuan @YunYang1994 @liuqinglong110 我现在在Linux下跑train.py没问题 可以跑起来了,show_input_image.py还没有测试。我前面是在windows下的jupyter下跑的,有可能是环境不兼容或者移植代码过程中出错,我将继续检查原来的错误,并且及时回复上来!

@YunYang1994 如何用训练好的网络来预测新数据(多张新图片),并且输出坐标信息?test.py的作用好像不是预测新数据,是quick_test.py嘛?

@zouliangyu 还没有训练多类,可能等到年后会训练下voc数据吧。目前只训练了一个类别的数据,训练集5800多张,测试集1000多张,准确率在91%左右。

你好,我训练了多个类别的训练集。有三类,车、行人、交通灯。目前,训练的loss值可以降低很小。如下所示:
=> EPOCH 33378 [TRAIN]: loss_xy: 0.0219 loss_wh: 0.0216 loss_conf: 0.0055 loss_class: 0.0000
=> EPOCH 33379 [TRAIN]: loss_xy: 0.0155 loss_wh: 0.0128 loss_conf: 0.0464 loss_class: 0.0000
=> EPOCH 33380 [TRAIN]: loss_xy: 0.0150 loss_wh: 0.0127 loss_conf: 0.0056 loss_class: 0.0001
=> EPOCH 33381 [TRAIN]: loss_xy: 0.0191 loss_wh: 0.0143 loss_conf: 0.0195 loss_class: 0.0000
=> EPOCH 33382 [TRAIN]: loss_xy: 0.0226 loss_wh: 0.0175 loss_conf: 0.0017 loss_class: 0.0000
=> EPOCH 33383 [TRAIN]: loss_xy: 0.0168 loss_wh: 0.0154 loss_conf: 0.0053 loss_class: 0.0000

但是,我用实际的视频进行测试时,发现,检测框抖动比较严重,尤其是目标不太完整时。复现的算法和原始的darknet版本还是有些差距。怀疑应该是在训练过程中,没有添加各种数据增强方法导致的。

@zouliangyu 还没有训练多类,可能等到年后会训练下voc数据吧。目前只训练了一个类别的数据,训练集5800多张,测试集1000多张,准确率在91%左右。

另外,上述结果是在我加载了darknet53.conv.74后,进行微调训练的。

@liuqinglong110 你测试用的哪个文件呢? 我找不到测试新数据的文件

@liuqinglong110 @wangyazhao001 你们训练好了后,可以上一些检测到效果图,以及loss变化情况嘛。另外大家也可以说说训练参数以及所花费的时间。

@liuqinglong110 quick_test.py中采用的是pb文件,但train.py中训练出来的并不是pb文件,我该怎么生成呢?

@liuqinglong110 quick_test.py中采用的是pb文件,但train.py中训练出来的并不是pb文件,我该怎么生成呢?

作者给提供了convert_weight.py文件呀。

@liuqinglong110 @wangyazhao001 你们训练好了后,可以上一些检测到效果图,以及loss变化情况嘛。另外大家也可以说说训练参数以及所花费的时间。

我的loss值在前面已经贴上了。我只使用了7000张样本训练,训练了3万次batch,batch_size=32。我在1080显卡上训练,大概训练了6个小时。各个loss值都可以降低到0.01左右。
对于整体完整的目标检测效果还可以,但是有遮挡的时候,检测框抖动严重。我怀疑是没有使用数据增强的原因。之前,我使用darknet版本的yolov3训练效果还是比较理想的,同样的数据。

@liuqinglong110 可以上图对比下

import tensorflow as tf
from core import utils, yolov3
from core.dataset import dataset, Parser
sess = tf.Session()

IMAGE_H, IMAGE_W = 608, 608
BATCH_SIZE       = 8
EPOCHS           = 80000
LR               = 0.001
SHUFFLE_SIZE     = 200
CLASSES          = utils.read_coco_names('./data/vehicle.names')
ANCHORS          = utils.get_anchors('./data/coco_anchors.txt')
NUM_CLASSES      = len(CLASSES)

screenshot from 2019-01-25 09-51-24
这个是在我测试集上的效果.下面是我的loss变化图[红色的是train,蓝色的是test].
screenshot from 2019-01-25 09-56-06
ls

import tensorflow as tf
from core import utils, yolov3
from core.dataset import dataset, Parser
sess = tf.Session()

IMAGE_H, IMAGE_W = 608, 608
BATCH_SIZE       = 8
EPOCHS           = 80000
LR               = 0.001
SHUFFLE_SIZE     = 200
CLASSES          = utils.read_coco_names('./data/vehicle.names')
ANCHORS          = utils.get_anchors('./data/coco_anchors.txt')
NUM_CLASSES      = len(CLASSES)

我的测试场景和你的图片是一样的。抱歉,公司安全限制,没法上传图片。你加载了darknet53.conv.74预训练模型了吗?我昨天晚上尝试不加载darknet53.conv.74,训练了5万轮,出现了nan。我打算自己增加数据增强的步骤试试。

@liuqinglong110 不要加载darknet53.conv.74,直接加载转化好的yolov3.ckpt就行, 另外train的时候要注意看tensorborad,防止出现过拟合的情况.我可能需要等到年后再把代码优化下

可以参考gluon-cv增加数据增强。另外,gluon的损失函数和原版也有点小差别,有训练需求的可以参考下

@liuqinglong110 不要加载darknet53.conv.74,直接加载转化好的yolov3.ckpt就行, 另外train的时候要注意看tensorborad,防止出现过拟合的情况.我可能需要等到年后再把代码优化下

嗯嗯。感谢。

使用作者的code在coco上进行了训练,并利用evaluate测试了一下mAP,发现只有person这类输出了mAP并且性能极低,想问一下作者收敛的时候最后的loss一般都在多少,以及一般情况下的收敛所需时间。

@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

Hi,我正在读你数据tfrecord那部分,没有看到图片resize成416*416的操作,能帮忙指出这一步在哪里吗

Hi,我正在读你数据tfrecord那部分,没有看到图片resize成416*416的操作,能帮忙指出这一步在哪里吗

@sumenpuyuan

    def preprocess(self, image, gt_boxes):
        # resize_image_correct_bbox
        image, gt_boxes = utils.resize_image_correct_bbox(image, gt_boxes, self.image_h, self.image_w)
        if self.debug: return image, gt_boxes

我正在读你CODE 有哪里 尚未 修正 (all project)

我正在读你CODE 有哪里 尚未 修正 (all project)

欢迎更正!

在coco数据集上前前后后已经训练了三万多epoch,感觉损失不怎么收敛,正常吗?超参数用的是quick_train.py里面的
还有如果目前lr稍微大一点就会nan
webwxgetmsgimg

在coco数据集上已经训练了三万多epoch,感觉损失不怎么收敛,正常吗?参数用的是quick_train.py里面的
还有如果目前lr稍微大一点就会nan
webwxgetmsgimg

你可以尝试加载预训练模型试试。我在不加载预训练模型的时候训练,也经常出现nan的情况。当然,你也可以把学习率调小。另外,仔细看看前面作者的一些回答,会有帮助的。

在coco数据集上前前后后已经训练了三万多epoch,感觉损失不怎么收敛,正常吗?超参数用的是quick_train.py里面的
还有如果目前lr稍微大一点就会nan
webwxgetmsgimg

正常啊,你这是3万多个batch,COCO数据集这么大,你可以手算一下多少个batch相当于一个iteration。对于学习率的问题,YOLO的原作者这样说:

Our learning rate schedule is as follows: For the first epochs we slowly raise the learning rate from 10−3 to 10−2. If we start at a high learning rate our model often diverges due to unstable gradients. We continue training with 10−2 for 75 epochs, then 10−3 for 30 epochs, and finally 10−4 for 30 epochs.

可以尝试刚开始用较小的学习率来训练,等后面稳定后再用大一点的学习率,最后再用小的学习率。另外,训练了有结果的话也请分享一下,谢谢!

1.哪个 code 用 anchor 去 改變 box_sizes ?
2. 有用到 kmean? 哪

仔细看pipline

那 kmean 找 anchor box 的code在哪
能帮忙指出这一步在哪里吗

line124 , yolov3.py , box_sizes = tf.exp(box_sizes) * anchors # anchors -> [w, h]
anchors 怎又成 [w,h]

本當不是 [h,w] ?
ANCHORS = utils.get_anchors('./data/raccoon_anchors.txt', IMAGE_H, IMAGE_W)

box_centers, box_sizes, conf_logits, prob_logits = tf.split(
feature_map, [2, 2, 1, self._NUM_CLASSES], axis=-1)
box_sizes 是 [H,W ] OR [w,h]?
box_centers 是 [X,Y ]?

box_sizes = tf.exp(box_sizes) * anchors # anchors -> [w, h]
如 box_sizes 是 [h,w] , why anchors -> [w, h]
跟你說的 (Rx, Ry, Rh, Rw, Pc, C1..Cn) not same

valid_true_box_wh = valid_true_boxes[:, 2:4] 是 [w,h] 嗎 OR [h,w]

那 kmean 找 anchor box 的code在哪
能帮忙指出这一步在哪里吗

line124 , yolov3.py , box_sizes = tf.exp(box_sizes) * anchors # anchors -> [w, h]
anchors 怎又成 [w,h]

本當不是 [h,w] ?
ANCHORS = utils.get_anchors('./data/raccoon_anchors.txt', IMAGE_H, IMAGE_W)

box_centers, box_sizes, conf_logits, prob_logits = tf.split(
feature_map, [2, 2, 1, self._NUM_CLASSES], axis=-1)
box_sizes 是 [H,W ] OR [w,h]?
box_centers 是 [X,Y ]?

box_sizes = tf.exp(box_sizes) * anchors # anchors -> [w, h]
如 box_sizes 是 [h,w] , why anchors -> [w, h]
跟你說的 (Rx, Ry, Rh, Rw, Pc, C1..Cn) not same

valid_true_box_wh = valid_true_boxes[:, 2:4] 是 [w,h] 嗎 OR [h,w]

repo里面有kmeans的代码,你可仔细看看。
关于anchor的w,h问题,我想说的是anchor是利用box (xmin, ymin, xmax, ymax)聚类来的,x的坐标是在图片width方向上的。

2019-02-01 10 57 17

我說你的 (Rx, Ry, Rh, Rw, Pc, C1..Cn) 順序錯了吧 要為 (Rx, Ry, Rw, Rh, Pc, C1..Cn)
照你CODE
而且TF 的 CONV 是 base on [h,w ] , 而你在predict時 用 [w,h] 去解

我說你的 (Rx, Ry, Rh, Rw, Pc, C1..Cn) 順序錯了吧 要為 (Rx, Ry, Rw, Rh, Pc, C1..Cn)
照你CODE
而且TF 的 CONV 是 base on [h,w ] , 而你在predict時 用 [w,h] 去解

sorry, 没有get到你的意思。这里不是 (Rx, Ry, Rw, Rh)的顺序么?

        center_x, center_y, width, height = tf.split(boxes, [1,1,1,1], axis=-1)
        x0 = center_x - width   / 2.
        y0 = center_y - height  / 2.
        x1 = center_x + width   / 2.
        y1 = center_y + height  / 2.

TF的CONV是按照输入图片的[H, W, C ]进行的,里面的code也是这样去做的。

(Rx, Ry, Rh, Rw, Pc, C1..Cn) 這 readme 尚未更改
image

(Rx, Ry, Rh, Rw, Pc, C1..Cn) 這 readme 尚未更改
image

好的,谢谢更正,马上修改!

true_tw_th = tf.log(tf.clip_by_value(true_tw_th, 1e-9, 1e9))

Do tf.clip_by_value, set range 1e-9 ~ 1e9

Do tf.log: range -20.7233 ~ 20.7233

我發現 true_tw_th 為0.9 , 得到 -0.105361 這有何意義?

true_tw_th = tf.log(tf.clip_by_value(true_tw_th, 1e-9, 1e9))

Do tf.clip_by_value, set range 1e-9 ~ 1e9

Do tf.log: range -20.7233 ~ 20.7233

我發現 true_tw_th 為0.9 , 得到 -0.105361 這有何意義?

训练的时候经常会梯度溢出,出现nan,因此这里截断了下梯度。

这啥意思?
conf_loss_neg = conf_neg_mask * tf.nn.sigmoid_cross_entropy_with_logits(labels=object_mask, logits=pred_conf_logits)
最後卷積有 leaky_relu 錯的

我换了backbone,用的是mnas,并且没有用特征金字塔。然后在coco上训了50个epochs,发现效果还是很差,目前还在做人这一类的回归,整体box定位效果也不行,想请教下问题到底出在哪里,是因为backbone太浅了的问题还是整个模型结构的问题呢。谢谢

@xl1968 你有没有试过mobilenetv2的backbone?

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

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

作者很好,很感谢分享自己的工作:
有个细节的问题想询问下, 你在三个特征层计算完毕后 都会加上 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。另外,训练代码里是加载了预训练模型的。

@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文件后,效果非常差,不知道为什么,有什么要注意的吗

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?

@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.

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

作者好:
发先了一个挺有意思的现象,我在改写代码,作成多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 这一个现象虽然有,但是也只是在前期几次中会出现 后期就会稳定收敛.
不知道 作者对这个问题 有木有什么看法.?

commented

非常感谢作者的分享,在实验的过程中我遇到了一个问题,想麻烦您看一下:
首先我按照作者的步骤实现了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,再改变聚类值的时候,那个数字还会改变,不知道是啥引起的?
麻烦您抽空帮忙看一下,谢谢

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

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

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

非常感谢作者的分享,在实验的过程中我遇到了一个问题,想麻烦您看一下:
首先我按照作者的步骤实现了浣熊数据集的训练;然后用同样的方法实现了自己采集的一个数据集,也没有问题,但是当我在训练另一个数据集的时候报错啦,错误如下:
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,DT_FLOAT],_ device =”/ job:localhost / replica: 0 /任务:0 /装置:CPU:0"]]

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

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

@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, 这是为啥?

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

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

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

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

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

我这里训练了一个医学上的病变组织的分类检测,这里仅仅训练了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没框准,或则没充分打乱.

commented

非常感谢作者的分享,在实验的过程中我遇到了一个问题,想麻烦您看一下:
首先我按照作者的步骤实现了浣熊数据集的训练;然后用同样的方法实现了自己采集的一个数据集,也没有问题,但是当我在训练另一个数据集的时候报错啦,错误如下:
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,DT_FLOAT],_ device =”/ job:localhost / replica: 0 /任务:0 /装置:CPU:0"]]
因为调试,我尝试改变了聚类的数量,得到新的锚定值以后再来进行训练,发现报错的地点不一样,错误原因变成了IndexError:索引14超出了轴1的大小为13的范围,再次改变聚类值的时候,那个数字还会改变,不知道是啥引起的?
麻烦您抽空帮忙看一下,谢谢

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

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

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

commented

作者你好,我改换了一个交通标志数据集在训练,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有问题还是其他的问题?

作者你好,我改换了一个交通标志数据集在训练,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会试试,学习率还可以设置小点。

commented

作者你好,我改换了一个交通标志数据集在训练,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框的准,但是分类的效果很差,不知道这是什么原因,准备先把数据集的类别改少一点试一下

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

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

训练完自己的数据集后,进行测试报错
报错问题如下。为什么会出现维度超出的情况呢。按理说不会预测到这么多啊
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

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'
請問這個是怎麼回事

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

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'
請問這個是怎麼回事

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

训练完自己的数据集后,进行测试报错
报错问题如下。为什么会出现维度超出的情况呢。按理说不会预测到这么多啊
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

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

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

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

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

(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())

作者你好,我改换了一个交通标志数据集在训练,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,这样大家都不会理解偏。

作者你好,我改换了一个交通标志数据集在训练,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,这样大家都不会理解偏。

好的

作者您好,我修改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].
请问是什么问题?

作者您好,我修改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的。

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

作者您好,我修改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的。

嗯嗯,改好了,谢谢您。

作者你好,代码思路很清晰,先谢为敬。最近在使用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波动大的情况是不是还是损失函数设置不当导致的。

谢谢

@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 小一點,也不好。)
非常感謝。

你好作者,首先要感谢你为我提供那么活跃的交流平台一起学习。昨天我开始训练样本,除了样本是我自己做的,改了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,怎么会跑那么多,都一天了,请问这是为什么?他什么时候会停,这个训练的东西我应该能用吧。望告知!十分感谢大大!!!

你好作者,首先要感谢你为我提供那么活跃的交流平台一起学习。昨天我开始训练样本,除了样本是我自己做的,改了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 設多少就跑多少。

你好作者,首先要感谢你为我提供那么活跃的交流平台一起学习。昨天我开始训练样本,除了样本是我自己做的,改了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
能帮我看下嘛。。我也没改什么默认值。。

你好作者,首先要感谢你为我提供那么活跃的交流平台一起学习。昨天我开始训练样本,除了样本是我自己做的,改了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 裡面的設置。

quick

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

你好作者,首先要感谢你为我提供那么活跃的交流平台一起学习。昨天我开始训练样本,除了样本是我自己做的,改了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 裡面的設置。

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

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

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

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

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

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

好的,非常感谢

@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

作者您好,我修改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试试

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

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

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

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

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

@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试试

好的,谢谢