keras-faster-rcnn
keras-faster-rcnn copied to clipboard
我的rcnn_class_loss是NAN,是不是每个image裡面一定都要至少要有一个object?
你好,先感谢您的作品,我用您的程式码对于我的资料集进行测试,我的资料集由于图片太大无法处理,也无法缩小因为object相对于图片本身太小了,缩小以后会消失。我以我採用自行裁剪图片的方式让一张大图变成许多小图,也重新计算了object的位置,不过有些图片因此就没有object。请问没有object的图片丢进去会如何?因为我发现我跟其他几个有发问问题人一样,因为rcnn_class_loss为nan所以导致我的loss也是nan,是因为没有object的问题嘛?
另外,聚類的結果,我發現我的iou有一個值是nan,為什麼會這樣呢?
ious:{1: 0.6913855181493698, 2: 0.6936020912514932, 3: 0.7163856307901467, 4: nan, 5: 0.4043729705957652, 6: 0.654302060204877, 7: 0.5302721447155525}
我知道为什么在作cluster的时候会有nan了,是因为有些类别我没有写在config裡面,因为他们的选取框太少。我把这些资料都清除了,现在看到的是正确的
h:[4.45, 5.18, 6.81, 10.43, 11.8, 14.21, 17.51, 29.85, 54.53] w:[12.65, 5.12, 110.84, 12.71, 6.89, 21.45, 11.08, 14.0, 14.84]
但是训练的时候rcann_class_loss依然是nan,我应该从什麽地方查起会比较好?
@derekhsu 您好, a) 您的目标对象太小了,frcnn中anchor是在16倍下采样的feature map上移动的;所以anchor的base_size最小值一般为32(两倍下采样);这样保证基本能够覆盖所有的GT Boxes。 b)另一方面,frcnn保证每个gt都有anchor对应,不管iou是多少;当iou很小时,根据如下公式,回归目标就会变得很大(特别是dh,dw)
dy = (gt_center_y - center_y) / h
dx = (gt_center_x - center_x) / w
dh = tf.log(gt_h / h)
dw = tf.log(gt_w / w)
c) 这么小的对象不适合用frcnn,应该用带特征金字塔的网络(retinanet、ssd、fpn)这一类。 d) 另外据我所知,目前任何网络,对于GT面积小于20*20的小目标检测效果都极差。建议可以将原图适当放大,使得GT对应放大到适合检测的尺寸
感谢你的回覆,那我知道原因了,因为我原本的图片是非常大的长方形图片,约20000~40000x1833,所以把图形切到只有1833x1833的多张图片,然後再丢入网路,但是1833x1833对网路还是太大,所以我在作的时候只好把图再缩成1024x1024,结果就是你看到的这个样子。我的图形里面,目标很小,但是背景很大,所以一大片背景里面,东西只有小小一个。按照dh,dw的计算方式,log的结果就会变很大。
如果我还要用frcnn的话,我是不是应该再把大图在切小,小到让GT能大於32x32的区域?因为我很难直接透过直接放大把gt都弄到32*32的大小,这样塞不进我伺服器的GPU内。
或者,使用比较低的base size,我看到有论文里面用到更小的basic size,像是2, 4, 8之类的 https://researchportal.port.ac.uk/portal/files/8862349/CCCV_Final.compressed.pdf