PSENet.pytorch使用中遇到的问题以及解决,优化

mac2022-06-30  19

源码总体写的还是非常棒的,反正我是不能完全地写出来。学习一下。开源地址: https://github.com/WenmuZhou/PSENet.pytorch

在这几天使用的过程中,发现了一些bug并进行了修改,对一些细节进行了优化,在这里记录下来。issue地址:https://github.com/WenmuZhou/PSENet.pytorch/issues/39

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文件编译成功了。详情见:https://blog.csdn.net/ab0902cd/article/details/88352417

训练过程中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%了。。。

最新回复(0)