fcosr.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #!/usr/bin/env python
  2. # 旋转目标检测模型FCOSR训练示例脚本
  3. # 执行此脚本前,请确认已正确安装PaddleRS库
  4. import paddlers as pdrs
  5. from paddlers import transforms as T
  6. # 数据集存放目录
  7. DATA_DIR = "./data/dota/"
  8. # 数据集标签文件路径
  9. ANNO_PATH = "trainval1024/DOTA_trainval1024.json"
  10. # 数据集图像目录
  11. IMAGE_DIR = "trainval1024/images"
  12. # 实验目录,保存输出的模型权重和结果
  13. EXP_DIR = "./output/fcosr/"
  14. IMAGE_SIZE = [1024, 1024]
  15. # 下载和解压SAR影像舰船检测数据集
  16. pdrs.utils.download_and_decompress(
  17. "https://paddlers.bj.bcebos.com/datasets/dota.zip", path="./data/")
  18. # 对于旋转目标检测任务,需要安装自定义外部算子库,安装方式如下:
  19. # cd paddlers/models/ppdet/ext_op
  20. # python setup.py install
  21. # 定义训练和验证时使用的数据变换(数据增强、预处理等)
  22. # 使用Compose组合多种变换方式。Compose中包含的变换将按顺序串行执行
  23. # API说明:https://github.com/PaddlePaddle/PaddleRS/blob/develop/docs/apis/data.md
  24. train_transforms = [
  25. # 读取影像
  26. T.DecodeImg(),
  27. # 将标签转换为numpy array
  28. T.Poly2Array(),
  29. # 随机水平翻转
  30. T.RandomRFlip(),
  31. # 随机旋转
  32. T.RandomRRotate(
  33. angle_mode='value', angle=[0, 90, 180, -90]),
  34. # 随机旋转
  35. T.RandomRRotate(
  36. angle_mode='value', angle=[30, 60], rotate_prob=0.5),
  37. # 随机缩放图片
  38. T.RResize(
  39. target_size=IMAGE_SIZE, keep_ratio=True, interp=2),
  40. # 将标签转换为rotated box的格式
  41. T.Poly2RBox(
  42. filter_threshold=2, filter_mode='edge', rbox_type="oc"),
  43. ]
  44. train_batch_transforms = [
  45. # 归一化图像
  46. T.BatchNormalizeImage(
  47. mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
  48. ]
  49. eval_transforms = [
  50. T.DecodeImg(),
  51. # 将标签转换为numpy array
  52. T.Poly2Array(),
  53. # 随机缩放图片
  54. T.RResize(
  55. target_size=IMAGE_SIZE, keep_ratio=True, interp=2),
  56. # 归一化图像
  57. T.Normalize(
  58. mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
  59. ]
  60. # 分别构建训练和验证所用的数据集
  61. train_dataset = pdrs.datasets.COCODetDataset(
  62. data_dir=DATA_DIR,
  63. image_dir=IMAGE_DIR,
  64. anno_path=ANNO_PATH,
  65. transforms=train_transforms,
  66. batch_transforms=train_batch_transforms,
  67. shuffle=True)
  68. eval_dataset = pdrs.datasets.COCODetDataset(
  69. data_dir=DATA_DIR,
  70. image_dir=IMAGE_DIR,
  71. anno_path=ANNO_PATH,
  72. transforms=eval_transforms,
  73. shuffle=False)
  74. # 构建FCOSR模型
  75. # 目前已支持的模型请参考:https://github.com/PaddlePaddle/PaddleRS/blob/develop/docs/intro/model_zoo.md
  76. model = pdrs.tasks.det.FCOSR(
  77. backbone="ResNeXt50_32x4d",
  78. num_classes=15,
  79. nms_score_threshold=0.1,
  80. nms_topk=2000,
  81. nms_keep_topk=-1,
  82. nms_normalized=False,
  83. nms_iou_threshold=0.1)
  84. # 执行模型训练
  85. model.train(
  86. num_epochs=36,
  87. train_dataset=train_dataset,
  88. train_batch_size=4,
  89. eval_dataset=eval_dataset,
  90. # 每多少个epoch存储一次检查点
  91. save_interval_epochs=5,
  92. # 每多少次迭代记录一次日志
  93. log_interval_steps=4,
  94. metric='rbox',
  95. save_dir=EXP_DIR,
  96. # 初始学习率大小,请根据此公式适当调整learning_rate:(train_batch_size * gpu_nums) / (4 * 4) * 0.01
  97. learning_rate=0.01,
  98. # 学习率预热(learning rate warm-up)步数
  99. warmup_steps=50,
  100. # 初始学习率大小
  101. warmup_start_lr=0.03333333 * 0.01,
  102. # 学习率衰减的epoch节点
  103. lr_decay_epochs=[24, 33],
  104. # 学习率衰减的参数
  105. lr_decay_gamma=0.1,
  106. # 梯度裁剪策略的参数
  107. clip_grad_by_norm=35.,
  108. # 指定预训练权重
  109. pretrain_weights="IMAGENET",
  110. # 是否启用VisualDL日志功能
  111. use_vdl=True)