船舰识别比赛总结

最近参加了中科星图杯的遥感图像船舰识别的比赛,在此总结一下。

数据

组委会只给了10张遥感图像数据,所以我们要对数据进行扩增。

数据扩增的大概步骤为:

  • 截取原始图片的船舰
  • 将船舰贴到新的海港图片中并标记标签

截取原始图片的船舰

根据提供的数据集中船的坐标,可以用脚本将船单独截取出来。注意有的船不是正的矩形而是旋转过的矩形或者四边形,所以要将四边形外的像素点设置成透明(PNG格式的图片第四个通道表示透明度)。

这个算法需要通过四个点的坐标计算其围成的四边形所包含的像素。我采用的方法是先将四边形的四条边旋转绕一个顶点旋转为竖直和水平,记录旋转角度θ,再将所有像素点旋转θ后与边界比较,即可判断某一像素点是否在四边形内了。

将船舰贴到新的海港图片中并标记标签

这一步可以采用了两种扩增方式:

  • 用PS+labelme软件手动打标签

    由于船舰的位置一般靠近码头,所有手动添加可以使得扩增的数据维持这个特性。做法是先用PS将截取的船只放到靠近码头的海域,再用labelme软件打上标签。这种方法虽然能维持船舰的位置靠近码头这一特性,但是效率较低。

  • 寻找海港图片的海洋区域,随机把船贴到海洋上

    首先,我们先寻找海港图片的海洋区域。我采用的方法是对于每个海港图片,取一块海洋区域,计算RGB通道的平均值,设置阈值来寻找图片的海洋区域。

    提取出海洋区域后,就可以随机的往上面放船了。

模型

用了R2CNN-FPN网络,源代码链接
用这个结果训练和测试自己随机生成的数据效果还不错,但是跑组委会的数据效果不好,有待改进和分析。