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

作者的代码真的很优秀!为了方便新手和需要部署的人使用,我基于作者的代码做了一些细节上的优化(增加中文注释,修改网络结构,保存视频,serving部署等)! #362

Open Byronnar opened 4 years ago

Byronnar commented 4 years ago

https://github.com/Byronnar/tensorflow-serving-yolov3 下面是修改的部分: 1 修改了网络结构,支持了tensorflow-serving部署,自己训练的数据集也可以在线部署,并给出了 docker+yolov3-api测试脚本

2 修改了ulits文件,优化了demo展示,可以支持中文展示,添加了字体

3 详细的中文注释,代码更加易读,添加了数据敏感性处理,一定程度避免index的错误

4 修改了训练代码,支持其他数据集使用预训练模型了,模型体积减小二分之一(如果不用指数平滑,可以减小到200多M一个模型,减小三分之二),图片视频demo展示完都支持保存到本地,十分容易操作

5 借鉴视频检测的原理,添加了批量图片测试脚本,速度特别快(跟处理视频每一帧一样的速度),视频检测可以显示 帧数跟ms了

6 添加了易使用的Anchors生成脚本以及各步操作完整的操作流程

7 添加了 Mobilenetv2 backbone, 支持训练模型, 模型大小70多M

YunYang1994 commented 4 years ago

你问我资不资持,我当然资持!

zpge commented 4 years ago

模型体积减小三分之二是怎么做到的?

Byronnar commented 4 years ago

模型体积减小三分之二是怎么做到的?

你好,之所以有900M,是因为tf.train.ExponentialMovingAverage()这个函数,它会是生成等量的tf.trainable_variable(),保存到tf.global_variables(),而ckpt保存的主要是tf.trainable_variable(还有untrainable,但太小),所以ckpt的大小会翻倍; 为了不报找不到预训练模型的错,这里我做了改动,而且对位置进行了调整。

zpge commented 4 years ago

我现在生成的模型是 200多m,而且效果也没变差。

很优秀,非常感谢。想问一下,模型变小了是不是意味着占用GPU显存也变小了。原来YunYang版本的模型freeze之后,也要占用5G多,感觉有点怪。

Byronnar commented 4 years ago

我现在生成的模型是 200多m,而且效果也没变差。

很优秀,非常感谢。想问一下,模型变小了是不是意味着占用GPU显存也变小了。原来YunYang版本的模型freeze之后,也要占用5G多,感觉有点怪。

我的这里预测的话,显存占用很小,基本没用到多少啊,中文的会慢一些。

hqq1990 commented 4 years ago

我想问下 怎么样输出测试的结果坐标之类的 保存在txt里面啊

Byronnar commented 4 years ago

evaluate不可以嘛

robinjoe93 commented 4 years ago

我想问下 怎么样输出测试的结果坐标之类的 保存在txt里面啊

evaluate.py会生成,文件在data/predict文件夹里

hqq1990 commented 4 years ago

我想问下 怎么样输出测试的结果坐标之类的 保存在txt里面啊

evaluate.py会生成,文件在data/predict文件夹里

嗯嗯。我看下,谢谢您

hqq1990 commented 4 years ago

evaluate不可以嘛

我看看,谢谢

zpge commented 4 years ago

我现在生成的模型是 200多m,而且效果也没变差。

很优秀,非常感谢。想问一下,模型变小了是不是意味着占用GPU显存也变小了。原来YunYang版本的模型freeze之后,也要占用5G多,感觉有点怪。

我的这里预测的话,显存占用很小,基本没用到多少啊,中文的会慢一些。

tensorflow默认占用全部显存,可能是我这边的原因吧

huyi1989 commented 4 years ago

那请问最终生成的pb文件和原来的pb文件比,也相应的减小了吗? 感觉你上面的操作就是进行类似剪枝的过程,那这个在转pb的时候会自动进行,想问一下pb文件有减小吗?

Dontla commented 4 years ago

你好,我想请教一下你,怎样才能使用这个模型同时运行多个video_demo.py而识别速度不降低呢。我在1080Ti显卡上跑video_demo.py,单帧识别时间为60-80ms(1280×720像素下)。后来,我尝试使用python多线程Threading,但发现因为有全局解释器锁GIL的存在,虽然看起来能同时跑,但消耗时间却翻了很多倍。后来我又使用了多进程multiprocess,但是却爆出了NotImplementedError: Can not build up yolov3 network!的错误,我猜测是否multiprocess只是分配了gpu,而我们真正识别所用到的是GPU?我该如何改动代码,才能成功同时运行多个video_demo.py呢? Best regard! Dontla

Byronnar commented 4 years ago

你好,我想请教一下你,怎样才能使用这个模型同时运行多个video_demo.py而识别速度不降低呢。我在1080Ti显卡上跑video_demo.py,单帧识别时间为60-80ms(1280×720像素下)。后来,我尝试使用python多线程Threading,但发现因为有全局解释器锁GIL的存在,虽然看起来能同时跑,但消耗时间却翻了很多倍。后来我又使用了多进程multiprocess,但是却爆出了NotImplementedError: Can not build up yolov3 network!的错误,我猜测是否multiprocess只是分配了gpu,而我们真正识别所用到的是GPU?我该如何改动代码,才能成功同时运行多个video_demo.py呢? Best regard! Dontla

一个代码里面同时运行多个 video_demo.py么?

Dontla commented 4 years ago

是哒------------------ 原始邮件 ------------------ 发件人: "Byronnar"notifications@github.com 发送时间: 2019年12月22日(星期天) 晚上7:59 收件人: "YunYang1994/tensorflow-yolov3"tensorflow-yolov3@noreply.github.com; 抄送: "Dontla"sxana@qq.com;"Comment"comment@noreply.github.com; 主题: Re: [YunYang1994/tensorflow-yolov3] 作者的代码真的很优秀!为了方便新手和需要部署的人使用,我基于作者的代码做了一些细节上的优化(增加中文注释,修改网络结构,保存视频,serving部署等)! (#362)

你好,我想请教一下你,怎样才能使用这个模型同时运行多个video_demo.py而识别速度不降低呢。我在1080Ti显卡上跑video_demo.py,单帧识别时间为60-80ms(1280×720像素下)。后来,我尝试使用python多线程Threading,但发现因为有全局解释器锁GIL的存在,虽然看起来能同时跑,但消耗时间却翻了很多倍。后来我又使用了多进程multiprocess,但是却爆出了NotImplementedError: Can not build up yolov3 network!的错误,我猜测是否multiprocess只是分配了gpu,而我们真正识别所用到的是GPU?我该如何改动代码,才能成功同时运行多个video_demo.py呢? Best regard! Dontla

一个代码里面同时运行多个 video_demo.py么?

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

yangzhenjie commented 4 years ago

@Byronnar @YunYang1994 大神们好,想问下这个是不是只支持yolov3, 不支持 yolov3-tiny啊,就是yolov3-tiny.weight 不支持转pb模型和用这个train自己的数据?

987410 commented 4 years ago

你好,我想请教一下你,怎样才能使用这个模型同时运行多个video_demo.py而识别速度不降低呢。我在1080Ti显卡上跑video_demo.py,单帧识别时间为60-80ms(1280×720像素下)。后来,我尝试使用python多线程Threading,但发现因为有全局解释器锁GIL的存在,虽然看起来能同时跑,但消耗时间却翻了很多倍。后来我又使用了多进程multiprocess,但是却爆出了NotImplementedError: Can not build up yolov3 network!的错误,我猜测是否multiprocess只是分配了gpu,而我们真正识别所用到的是GPU?我该如何改动代码,才能成功同时运行多个video_demo.py呢? Best regard! Dontla

您好,请问 NotImplementedError: Can not build up yolov3 network! 这个问题解决了吗?我是自爱运行convert_weight.py的时候出现这个问题的。 谢谢你的回复

SJXWJK commented 3 years ago

你好,请问:NotImplementedError: Can not build up yolov3 network!这个是什么原因呀?

SJXWJK commented 3 years ago

你好,我想请教一下你,怎样才能使用这个模型同时运行多个video_demo.py而识别速度不降低呢。我在1080Ti显卡上跑video_demo.py,单帧识别时间为60-80ms(1280×720像素下)。后来,我尝试使用python多线程Threading,但发现因为有全局解释器锁GIL的存在,虽然看起来能同时跑,但消耗时间却翻了很多倍。后来我又使用了多进程multiprocess,但是却爆出了NotImplementedError: Can not build up yolov3 network!的错误,我猜测是否multiprocess只是分配了gpu,而我们真正识别所用到的是GPU?我该如何改动代码,才能成功同时运行多个video_demo.py呢? Best regard! Dontla

您好,请问 NotImplementedError: Can not build up yolov3 network! 这个问题解决了吗?我是自爱运行convert_weight.py的时候出现这个问题的。 谢谢你的回复

请问你解决这个问题了吗?

STRIVESS commented 3 years ago

您好!请问一下,我的电脑配置:GTX 1650(4G独显)+16G 主显 i7 intel,我这边把bath_size改为1,然后其他参数是没有改变,都是按yunyang作者 的开始训练VOC的数据集,数量大概是100张,但是训练不到1分钟,好像显存爆掉了,报以下错:

Caused by op 'define_weight_decay/ExponentialMovingAverage/AssignMovingAvg_172/sub_1', defined at: File "train.py", line 188, in if name == 'main': YoloTrain().train() File "train.py", line 84, in init moving_ave = tf.train.ExponentialMovingAverage(self.moving_ave_decay).apply(tf.trainable_variables()) File "/home/kevin/.conda/envs/tf/lib/python3.6/site-packages/tensorflow/python/training/moving_averages.py", line 431, in apply self._averages[var], var, decay, zero_debias=zero_debias)) File "/home/kevin/.conda/envs/tf/lib/python3.6/site-packages/tensorflow/python/training/moving_averages.py", line 91, in assign_moving_average update_delta = (variable - value) decay File "/home/kevin/.conda/envs/tf/lib/python3.6/site-packages/tensorflow/python/ops/variables.py", line 827, in _run_op return getattr(ops.Tensor, operator)(a._AsTensor(), args) File "/home/kevin/.conda/envs/tf/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py", line 874, in binary_op_wrapper return func(x, y, name=name) File "/home/kevin/.conda/envs/tf/lib/python3.6/site-packages/tensorflow/python/ops/gen_math_ops.py", line 8318, in sub "Sub", x=x, y=y, name=name) File "/home/kevin/.conda/envs/tf/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py", line 787, in _apply_op_helper op_def=op_def) File "/home/kevin/.conda/envs/tf/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 488, in new_func return func(*args, **kwargs) File "/home/kevin/.conda/envs/tf/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 3272, in create_op op_def=op_def) File "/home/kevin/.conda/envs/tf/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 1768, in init self._traceback = tf_stack.extract_stack()

ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[1024] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc [[{{node define_weight_decay/ExponentialMovingAverage/AssignMovingAvg_172/sub_1}} = Sub[T=DT_FLOAT, _class=["loc:@define_weight_decay/ExponentialMovingAverage/AssignMovingAvg_172"], _device="/job:localhost/replica:0/task:0/device:GPU:0"](conv_lobj_branch/batch_normalization/gamma/ExponentialMovingAverage/read, conv_lobj_branch/batch_normalization/gamma/read)]] 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.

 [[{{node learn_rate/cond/Merge/_755}} = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_2987_learn_rate/cond/Merge", tensor_type=DT_DOUBLE, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

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.

请问一开始训练小批量数据,是不是要调整好__C.TRAIN.INPUT_SIZE 以及 __C.TRAIN.FISRT_STAGE_EPOCHS 等等参数?训练有什么一些策略要注意?