ppyoloe_r.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #!/usr/bin/env python
  2. # 旋转目标检测模型PPYOLOE-R训练示例脚本
  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/ppyoloe_r/"
  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. # 构建YOLOE-R模型
  75. # 使用如下方式查看PPYOLOE-R支持的backbone
  76. # print(pdrs.tasks.det.PPYOLOE_R.supported_backbones)
  77. # 目前已支持的模型请参考:https://github.com/PaddlePaddle/PaddleRS/blob/develop/docs/intro/model_zoo.md
  78. model = pdrs.tasks.det.PPYOLOE_R(
  79. backbone="CSPResNet_m",
  80. num_classes=15,
  81. nms_score_threshold=0.1,
  82. nms_topk=2000,
  83. nms_keep_topk=-1,
  84. nms_normalized=False,
  85. nms_iou_threshold=0.1)
  86. # 执行模型训练
  87. model.train(
  88. num_epochs=36,
  89. train_dataset=train_dataset,
  90. train_batch_size=2,
  91. eval_dataset=eval_dataset,
  92. # 每多少个epoch存储一次检查点
  93. save_interval_epochs=5,
  94. # 每多少次迭代记录一次日志
  95. log_interval_steps=4,
  96. metric='rbox',
  97. save_dir=EXP_DIR,
  98. # 使用余弦退火学习率调度器
  99. scheduler='Cosine',
  100. # 学习率调度器的参数
  101. cosine_decay_num_epochs=44,
  102. # 初始学习率大小,请根据此公式适当调整learning_rate:(train_batch_size * gpu_nums) / (2 * 4) * 0.01
  103. learning_rate=0.008,
  104. # 学习率预热(learning rate warm-up)步数
  105. warmup_steps=100,
  106. # 初始学习率大小
  107. warmup_start_lr=0.,
  108. # 学习率衰减的epoch节点
  109. lr_decay_epochs=[24, 33],
  110. # 学习率衰减的参数
  111. lr_decay_gamma=0.1,
  112. # L2正则化系数
  113. reg_coeff=0.0005,
  114. # 梯度裁剪策略的参数
  115. clip_grad_by_norm=35.,
  116. # 指定预训练权重
  117. pretrain_weights="IMAGENET",
  118. # 是否启用VisualDL日志功能
  119. use_vdl=True)