keras-yolo3遇到的一些注意点与解决思路

最近在使用yolo3(参考源码:https://github.com/qqwweee/keras-yolo3)做目标检测,在此记录下遇到的若干问题。

(keras-yolo3源码分析已经满天飞,不重复解读)

问题1:原始的yolo3源码,data_generator过程和模型train过程是阻塞式的,模型train速度会受到data产生的影响

解决思路:单独开一个thread,将data_generator过程wrap起来,做成一个数据提供线程,数据线程采用codition机制,根据batch_size大小,提前准备5~10倍的数据量,保证模型每次fit的时候,能立即拿到数据,无法等待。

问题2:训练集合有小目标,模型训练适过程中,loss先逐步下降,中间突然变为inf,再变为nan

解决思路:loss变为inf,说明梯度计算出现了爆炸,梯度反向传播出现了0。需要检查gt(真实的bbox)的小目标是否过小,训练过程在准备true box的时候,由于需要计算中gt的中心点((x1 + x2)/2)导致中心点x或y为0!如果存在过小的gt,需要剔除

问题3:numpy中array的shape,PIL中Image的size的区别:

解决:

numpy的array的shape:先h,再w

PIL的Image的size:先w,再h

问题4:在model过程中,模型的中间权重保存过多,占用大量磁盘空间,有指定的批量删除:

解决:

-- 删除前40个epoch的模型权重,其他的不删除

ls | grep "ep0[0123]" | xargs rm -rf

问题5:原始训练集合中真实样本过少,怎么办?

解决方法:

step1:获取真实样本的标签(只是标签),再根据其他背景图和标签做合成;

step2:生成合成的图片过程,而非真正的图片(真正的图片少则几千,多则几万,数目过多,服务器磁盘不够!),这时需要保留标签在背景中的坐标以及背景图片需要裁剪的坐标(如果需要裁剪)

step3::在模型训练的过程中,实时的动态合成图片

问题6:采用pytho的threading库,自定义线程类时,同时加入了condition机制,如何安全的退出线程

解决方法:

step1:自定义线程类中,添加一个stop函数,调用cond.notify()唤醒可能的wait线程。

step2:run方法中,如果存在循环操作,加入flag标记,保证在wait线程唤醒之后,会退出run方法,而不是又进入下一次循环。

-- over --

猜你喜欢

转载自blog.csdn.net/qm5132/article/details/83651291
今日推荐