fcosr.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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 = "./data/dota/DOTA_trainval1024.json"
  10. # 数据集图像目录
  11. IMAGE_DIR = "./data/dota/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. # 对于旋转目标检测,我们需要安装ppdet的外部自定义算子,安装方式如下:
  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 = T.Compose([
  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. # 定义作用在一个批次数据上的变换
  45. # 使用BatchCompose组合
  46. train_batch_transforms = T.BatchCompose([
  47. # 归一化图像
  48. T.BatchNormalizeImage(
  49. mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
  50. # 用0填充标签
  51. T.BatchPadRGT(),
  52. # 填充图像
  53. T._BatchPad(pad_to_stride=32)
  54. ])
  55. eval_transforms = T.Compose([
  56. T.DecodeImg(),
  57. # 将标签转换为numpy array
  58. T.Poly2Array(),
  59. # 随机缩放图片
  60. T.RResize(
  61. target_size=IMAGE_SIZE, keep_ratio=True, interp=2),
  62. # 归一化图像
  63. T.Normalize(
  64. mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
  65. ])
  66. eval_batch_transforms = T.BatchCompose([T._BatchPad(pad_to_stride=32)])
  67. # 分别构建训练和验证所用的数据集
  68. train_dataset = pdrs.datasets.COCODetDataset(
  69. data_dir=DATA_DIR,
  70. image_dir=IMAGE_DIR,
  71. anno_path=ANNO_PATH,
  72. transforms=train_transforms,
  73. shuffle=True,
  74. batch_transforms=train_batch_transforms)
  75. eval_dataset = pdrs.datasets.COCODetDataset(
  76. data_dir=DATA_DIR,
  77. image_dir=IMAGE_DIR,
  78. anno_path=ANNO_PATH,
  79. transforms=eval_transforms,
  80. shuffle=False,
  81. batch_transforms=eval_batch_transforms)
  82. # 构建FCOSR模型
  83. # 目前已支持的模型请参考:https://github.com/PaddlePaddle/PaddleRS/blob/develop/docs/intro/model_zoo.md
  84. model = pdrs.tasks.det.FCOSR(
  85. backbone="ResNeXt50_32x4d",
  86. num_classes=15,
  87. nms_score_threshold=0.1,
  88. nms_topk=2000,
  89. nms_keep_topk=-1,
  90. nms_normalized=False,
  91. nms_iou_threshold=0.1)
  92. # 执行模型训练
  93. model.train(
  94. num_epochs=36,
  95. train_dataset=train_dataset,
  96. train_batch_size=2,
  97. eval_dataset=eval_dataset,
  98. # 每多少个epoch存储一次检查点
  99. save_interval_epochs=5,
  100. # 每多少次迭代记录一次日志
  101. log_interval_steps=4,
  102. save_dir=EXP_DIR,
  103. # 初始学习率大小
  104. learning_rate=0.001,
  105. # 学习率预热(learning rate warm-up)步数
  106. warmup_steps=500,
  107. # 初始学习率大小
  108. warmup_start_lr=0.03333333,
  109. # 学习率衰减的epoch节点
  110. lr_decay_epochs=[24, 33],
  111. # 学习率衰减的参数
  112. lr_decay_gamma=0.1,
  113. # 梯度裁剪策略的参数
  114. clip_grad_by_norm=35.,
  115. # 指定预训练权重
  116. pretrain_weights="COCO",
  117. # 是否启用VisualDL日志功能
  118. use_vdl=True)