目录
tensorflow版本Faster Rcnn训练用新数据时的问题
tensorflow版本Faster Rcnn训练用新数据时的问题
刚开始跑faster rcnn的tf版本的时候,明明改了类别数,却总是会出现其他类别。
debug半天,皇天不负有心人,终于发现在cashe文件夹下竟然有第一次生成数据时的缓存文件。
删掉即可,记录一下,找得超级辛苦。
项目思维导图
接手一个大项目,每天起来经常会断片,忘了前面做到哪里了,忘了后面是想干啥来着,正在训练的程序也得想半天训的是什么玩意儿……真的是每天的日常。
其实挺正常的,因为不是只有这一个工作,而且流程复杂,涉及多个模型的改进和测试,会乱很正常,关键是怎么迅速找回昨天的回忆。思维导图记录过程很重要,我用一个在线制作流程图的网站 ProcessOn 帮忙展现整个项目完善过程,目前为止的进度如下图所示:
红色是有效果的改进;
灰色是失败的尝试;
蓝色带‘进行中’标签的是正在训练或者正在改进的地方;
带‘待定’标签的是未来的计划。
这样一来,对整个项目目前的状态一目了然。忘了正在训练什么东西的时候,看一下正在进行的任务就能很快想起来。不知道下一步该往哪里走的时候看一下待定标签,一个一个完成便是。
完成这么一个图很麻烦,会费一些时间,但这是一个事半功倍的事情。
花一点点时间,可以帮助你理清来龙去脉,也可以在未来漫长的做项目过程中,带给你绵长的助力。
测试图片上只能检测到很少目标
跑遥感领域一个表现比较好的模型(SCRDet),把源代码中针对倾斜框的操作改成了针对正框的操作,发现测试效果很不好,针对这个问题排查了很多方面的原因。
- 看权重加载是否有问题:测试训练过的图片看看能不能测出来东西(排除因为权重加载不进去而用随机初始化的权重进行测试的情况)
- 若训练图片可以测出来,则为测试过程有问题。
因为研究生阶段做遥感项目,图像比较大,测试时需要切图进行,排除是切的图像块测试的问题还是结果拼接的时候出了问题:
可视化测试时切的每个图像块的检测结果,发现呈现出来的直接是一整张图像而不是一部分切块,这表明测试时没有成功进行切块。
仔细看代码,发现传给sess.run的图像果然是整图而不是切块图像,导致图片输入网络前的resize操作损失了大量信息。
- 解决完切图问题后,发现测试图片上检测出来的目标多了一些,但仍然不太理想。
排查一遍自己动的倾斜框改正框的一系列操作有无问题,不仅要看网络输入输出处理时的维度问题,还要看制作target时有无问题。
本次问题在于计算显著区域监督的target时,对cv2.fillConvesPoly(mask, rect, 1)的理解不够充分。
这个函数用于对mask在rect提供的坐标点围成的闭环中的像素点置1,比如,若坐标点为3个点就围成一个三角形,对mask落在三角形内部的像素点置1。
因为原先用的倾斜框坐标有8个值,直接reshape成(4,2)的矩形就是4个坐标点,我们想当然的觉得改成正框之后只有4个值(左上和右下),就将reshape的形状改成(2,2)。结果在cv2.fillConvesPoly(mask, rect, 1)中,两个坐标点围成的形状其实是一条线,在二维平面上面积为0,相当于让网络去学一个全0的矩阵 T_T,抑制了整张特征图的信息,结果当然不好。
同时跑训练或测试,应该改文件名还是改配置文件的图片路径?
经过多方尝试,我认为改配置文件更合理。原因如下:
- 若是自己命名的文件名称一般都有特殊的含义,比如train_200,train_400这样的文件夹可能我是想分别表示200张图片和400张图片构造的训练集,若配置文件中写的是读取train文件夹中的图片,那么我们在训练200张图的时候就得把train_200改成train。短时间或者一次两次还好,时间长了都忘了这个train是什么含义的一个训练集了。
- 跑程序的时候可以print目前所用数据集名称,可以通过名称实时校对是否跑对了数据。
有些同学担心改配置文件怕改了这里漏了那里,那么我们可以把需要经常改动的路径都放在一起,这样要改就全部改,不用全篇找。