Traceback (most recent call last):
File "/root/autodl-tmp/Faster-rcnn/train.py", line 451, in <module>
fit_one_epoch(model, train_util, loss_history, eval_callback, optimizer, epoch, epoch_step, epoch_step_val, gen, gen_val, UnFreeze_Epoch, Cuda, fp16, scaler, save_period, save_dir)
File "/root/autodl-tmp/Faster-rcnn/utils/utils_fit.py", line 27, in fit_one_epoch
rpn_loc, rpn_cls, roi_loc, roi_cls, total = train_util.train_step(images, boxes, labels, 1, fp16, scaler)
File "/root/autodl-tmp/Faster-rcnn/nets/frcnn_training.py", line 321, in train_step
losses = self.forward(imgs, bboxes, labels, scale)
File "/root/autodl-tmp/Faster-rcnn/nets/frcnn_training.py", line 248, in forward
rpn_locs, rpn_scores, rois, roi_indices, anchor = self.model_train(x = [base_feature, img_size], scale = scale, mode = 'rpn')
File "/root/miniconda3/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "/root/miniconda3/lib/python3.8/site-packages/torch/nn/parallel/data_parallel.py", line 169, in forward
return self.module(*inputs[0], **kwargs[0])
File "/root/miniconda3/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "/root/autodl-tmp/Faster-rcnn/nets/frcnn.py", line 97, in forward
rpn_locs, rpn_scores, rois, roi_indices, anchor = self.rpn.forward(base_feature, img_size, scale)
File "/root/autodl-tmp/Faster-rcnn/nets/rpn.py", line 175, in forward
roi = self.proposal_layer(rpn_locs[i], rpn_fg_scores[i], anchor, img_size, scale = scale)
File "/root/autodl-tmp/Faster-rcnn/nets/rpn.py", line 91, in __call__
index_extra = np.random.choice(range(len(keep)), size=(n_post_nms - len(keep)), replace=True)
File "mtrand.pyx", line 934, in numpy.random.mtrand.RandomState.choice
ValueError: 'a' cannot be empty unless no samples are taken
运行Bubbliiiing的Faster r-cnn,运行完50个epoch后运行第51个epoch时,就会报上述错误,根据 File "/root/autodl-tmp/Faster-rcnn/nets/frcnn.py", line 97这个提示,定位到错误的代码处,发现我不知道咋搞的,有句代码重复了(B导的源代码是没有问题的)
if len(keep) < n_post_nms:
index_extra = np.random.choice(range(len(keep)), size=(n_post_nms - len(keep)), replace=True)
index_extra = np.random.choice(range(len(keep)), size=(n_post_nms - len(keep)), replace=True)
keep = torch.cat([keep, keep[index_extra]])
keep = keep[:n_post_nms]
roi = roi[keep]
return roi
删除掉重复的那句代码即可正常运行。