不知道是不是版本的原因,用fast rcnn训练自己的数据集时,好几次碰到了数据类型出错的问题(索引不是整型)。
一是,minibatch.py中,_sample_rois(roidb, fg_rois_per_image, rois_per_image, num_classes)函数中, if fg_ins.size > 0: fg_inds = npr.choice(fg_inds, size=fg_rois_per_this_image, replace=False)一直报错,原因是非整型不能做索引。通过排除法找到出错的变量为size=fg_rois_per_this_image,找到其定义的地方,发现fg_rois_per_this_image是从get_minibatch中传过来的。因此get_minibatch(roidb, num_classes)函数中,labels, overlaps, im_rois, bbox_targets, bbox_loss = _sample_rois(roidb[im_i], fg_rois_per_image, rois_per_image, num_classes)也一直报错,通过输出不同的变量,发现fg_rois_per_image不是整型,这与报错的类型相符。查找fg_rois_per_image定义的地方,发现fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image),其计算结果不是整型。原因是numpy.round函数,只进行四舍五入,不进行取整,导致以该结果进行索引时,一直报错。
def get_minibatch(roidb, num_classes):
"""Given a roidb, construct a minibatch sampled from it."""
num_images = len(roidb)
# Sample random scales to use for each image in this batch
random_scale_inds = npr.randint(0, high=len(cfg.TRAIN.SCALES),
size=num_images)
assert(cfg.TRAIN.BATCH_SIZE % num_images == 0), \
'num_images ({}) must divide BATCH_SIZE ({})'. \
format(num_images, cfg.TRAIN.BATCH_SIZE)
rois_per_i