有个疑惑,这个问题一直灭有彻底弄明白。official/cv/faster_rcnn · MindSpore/models - 码云 - 开源中国 (gitee.com) faster_rcnn的模型代码?
数据pad填充,做batch之后。如何在求loss得时候将补齐之后得到得数据中得零去除掉?
麻烦讲解一下,之前就有这个疑惑,也提过问题,之前我是tensor和数组之间转换去除得零元素。现在在graph模式下,construct部分,不能使用普通得numpy。
还希望有位老师可以仔细地讲解一下。
*******************************************************************************************************************
无论是fasterrcnn还是其他涉及bbox pad的网络,当前基本都是将bbox pad到固定数量去操作,同时数据会同步生成一个mask矩阵,来标记哪些bbox是有效的。
当然在网络的不同阶段,这个mask的含义是不同的,以fasterrcnn为例,这个mask可以来标记groundtruth bbox的有效数量,也可以标记proposal bbox的有效数量,mask矩阵是贯穿整个网络的。
到loss计算时,我们只需根据mask将有效的bbox参与loss计算即可。如在fasterrcnn的rcnn里,就是在计算完回归loss之后,直接乘以mask来过滤无效的结果,再将loss转为标量。
loss_reg = self.loss_bbox(pos_bbox_pred, bbox_targets) loss_reg = self.sum_loss(loss_reg, (2,)) loss_reg = loss_reg * bbox_weights
以rcnn的回归loss计算为例,我们直接计算得到的loss_reg的shape为(num_bboxes, num_classes, 4),mask矩阵bbox_weights的shape为(num_bboxes,),标记有效的目标框,所以loss_reg * bbox_weights之后,仅保留有效目标框的loss值