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踩了太多坑,特此发个贴,帮助大家少走弯路。大家有问题可以在下面留言。

zouliangyu commented 5 years ago

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

YunYang1994 commented 5 years ago

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

wangyazhao001 commented 5 years ago

还是同一个问题,当运行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的时候出现问题,这该如何解决?

liuqinglong110 commented 5 years ago

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

YunYang1994 commented 5 years ago

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

YunYang1994 commented 5 years ago

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

sumenpuyuan commented 5 years ago

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

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

YunYang1994 commented 5 years ago

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

liuqinglong110 commented 5 years ago

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

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

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

xliu79 commented 5 years ago

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

YunYang1994 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)
zouliangyu commented 5 years ago

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

YunYang1994 commented 5 years ago

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

wangyazhao001 commented 5 years ago

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

wangyazhao001 commented 5 years ago

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

liuqinglong110 commented 5 years ago

@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版本还是有些差距。怀疑应该是在训练过程中,没有添加各种数据增强方法导致的。

liuqinglong110 commented 5 years ago

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

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

wangyazhao001 commented 5 years ago

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

liuqinglong110 commented 5 years ago

就是quick_test.py。发自我的华为手机-------- 原始邮件 --------主题:Re: [YunYang1994/tensorflow-yolov3] tensorflow-yolov3中文交流 (#39)发件人:wangyazhao001 收件人:YunYang1994/tensorflow-yolov3 抄送:liuqinglong110 ,Mention @liuqinglong110 你测试用的哪个文件呢? 我找不到测试新数据的文件

—You are receiving this because you were mentioned.Reply to this email directly, view it on GitHub, or mute the thread.

YunYang1994 commented 5 years ago

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

wangyazhao001 commented 5 years ago

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

liuqinglong110 commented 5 years ago

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

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

liuqinglong110 commented 5 years ago

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

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

YunYang1994 commented 5 years ago

@liuqinglong110 可以上图对比下

YunYang1994 commented 5 years ago
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)
liuqinglong110 commented 5 years ago

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。我打算自己增加数据增强的步骤试试。

YunYang1994 commented 5 years ago

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

wizyoung commented 5 years ago

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

liuqinglong110 commented 5 years ago

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

嗯嗯。感谢。

charpoint commented 5 years ago

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

YunYang1994 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

sumenpuyuan commented 5 years ago

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

YunYang1994 commented 5 years ago

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
Phoebe-star commented 5 years ago

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

YunYang1994 commented 5 years ago

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

欢迎更正!

tanjiarui commented 5 years ago

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

liuqinglong110 commented 5 years ago

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

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

YunYang1994 commented 5 years ago

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

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

YunYang1994 commented 5 years ago

1.哪个 code 用 anchor 去 改變 box_sizes ?

  1. 有用到 kmean? 哪

仔细看pipline

Phoebe-star commented 5 years ago

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

2. 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)

3. 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 ]?

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

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

YunYang1994 commented 5 years ago

那 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
Phoebe-star commented 5 years ago

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

YunYang1994 commented 5 years ago

我說你的 (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也是这样去做的。

Phoebe-star commented 5 years ago

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

YunYang1994 commented 5 years ago

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

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

Phoebe-star commented 5 years ago

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 這有何意義?

YunYang1994 commented 5 years ago

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,因此这里截断了下梯度。

Phoebe-star commented 5 years ago

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

xl1968 commented 5 years ago

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

OPPOA113 commented 5 years ago

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