- eval失败。解决:script.py文件中16,17行改为 ‘GT_SAMPLE_NAME_2_ID’: ‘gt_img_([0-9]+).txt’,
‘DET_SAMPLE_NAME_2_ID’: ‘res_img_([0-9]+).txt’ - 其他python版本编译pse.so出错。我修改makefile文件编译成功了。详情见:
- 训练过程中writer保存了很多图片,但是我感觉用不到,而且保存图片后log文件会很大,可以添加一个if条件。例如添加:
if config.display_input_images:
- scale设置2或4时报错,尺寸不匹配。原因是模型得到的图是160x160,但是label图是640x640的。
解决:看了一下原作者的代码,train时不设置scale,test时设置scale。
if self.train:
x = F.interpolate(x, size=(H, W), mode='bilinear', align_corners=True)
else:
x = F.interpolate(x, size=(H // self.scale, W // self.scale), mode='bilinear', align_corners=True)
- 加载模型出错。解决:train.py文件,main的 start_epoch =
load_checkpoint(config.checkpoint, model, logger, device)
,load_checkpoint的参数optimizer是None时,不加载文件中记录的optimizer,不是None时,加载文件中记录的optimizer,但是文件中保存的不知道是sgd还是adam,在前面设置optimizer时如果不匹配会报错。这里我感觉最好是参数None,就不会报错。
然后后面的MultiStepLR(optimizer, config.lr_decay_step,
gamma=config.lr_gamma,last_epoch=-1),最后的参数设置-1,这个是我在其他issue里看到的。 - 保存太多模型文件。main这里我稍微改了一下,改成如果出现test结果更高的,就把以前存的所有文件删除。
if f1 > best_model['f1']:
best_path = glob.glob(config.output_dir + '/Best_*.pth')
for b_path in best_path:
if os.path.exists(b_path):
os.remove(b_path)
best_model['recall'] = recall
best_model['precision'] = precision
best_model['f1'] = f1
best_model['models'] = net_save_path
best_save_path = '{}/Best_{}_r{:.6f}_p{:.6f}_f1{:.6f}.pth'.format(config.output_dir, epoch,
recall,
precision,
f1)
if os.path.exists(net_save_path):
shutil.copyfile(net_save_path, best_save_path)
else:
save_checkpoint(best_save_path, model, optimizer, epoch, logger)
pse_path = glob.glob(config.output_dir + '/PSENet_*.pth')
for p_path in pse_path:
if os.path.exists(p_path):
os.remove(p_path)
writer.add_scalar(tag='Test/recall', scalar_value=recall, global_step=epoch)
writer.add_scalar(tag='Test/precision', scalar_value=precision, global_step=epoch)
writer.add_scalar(tag='Test/f1', scalar_value=f1, global_step=epoch)
writer.close()
except KeyboardInterrupt:
save_checkpoint('{}/final.pth'.format(config.output_dir), model, optimizer, epoch, logger)
finally:
if best_model['models']:
# shutil.copy(best_model['models'],
# '{}/best_r{:.6f}_p{:.6f}_f1{:.6f}.pth'.format(config.output_dir, best_model['recall'],
# best_model['precision'], best_model['f1']))
logger.info(best_model)
- 训练几轮测试一次的结果,与保存的模型文件单独进行测试的结果不一致。
解决:train.py的eval里,加了一句“if max(h, w) > long_size:”,但是在eval.py中没有这一句,意思是训练后的test中,图片不进行放大,因此得到的f值较小。把这个if注释掉后f值从60多提高到80多。
# if max(h, w) > long_size:
scale = long_size / max(h, w)
img = cv2.resize(img, None, fx=scale, fy=scale)
- pytorch1.1之后,scheduler.step()要放到optimizer.step()之后?改变位置之后没有warning了,效果未知。
- epoch信息没有正确保存?加载模型需要手动赋值?(好像现在又可以正确保存了)
- 调节pse/init.py文件中decode的输入值threshold,可以将F值提高很多,我的实验中提高了至少1%。。。。。话说训练了很长时间都难以提高1%了。。。