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

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

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

  1. 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’

  2. 其他python版本编译pse.so出错。我修改makefile文件编译成功了。详情见:https://blog.csdn.net/ab0902cd/article/details/88352417

  3. 训练过程中writer保存了很多图片,但是我感觉用不到,而且保存图片后log文件会很大,可以添加一个if条件。例如添加:

 if config.display_input_images:
  1. 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)
  1. 加载模型出错。解决: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里看到的。
  2. 保存太多模型文件。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)
  1. 训练几轮测试一次的结果,与保存的模型文件单独进行测试的结果不一致。
    PSENet.pytorch使用中遇到的问题以及解决,优化_第1张图片
    解决: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)
  1. pytorch1.1之后,scheduler.step()要放到optimizer.step()之后?改变位置之后没有warning了,效果未知。

  2. epoch信息没有正确保存?加载模型需要手动赋值?(好像现在又可以正确保存了)

  3. 调节pse/init.py文件中decode的输入值threshold,可以将F值提高很多,我的实验中提高了至少1%。。。。。话说训练了很长时间都难以提高1%了。。。

你可能感兴趣的:(pytorch)