作者 | Gabriel Garza
来源 | Medium
编辑 | 代码医生团队
在这篇文章中,将使用Mask R-CNN构建一个模型,该模型将卫星图像作为输入,然后检测海洋中的任何船只,输出一个分割图像中每个船舶实例的mask。将使用 Kaggle Airbus Challenge提供的训练和开发数据集以及Matterport的伟大Mask R-CNN实施库。
链接到github中的代码:
https://github.com/gabrielgarza/Mask_RCNN
深度学习最激动人心的应用之一是机器理解图像的能力。李飞飞将此称为赋予机器“看见能力”。如下面的图像(a)中所述,检测和分割中存在四类主要问题。
(a)李飞飞斯坦福课程 - 检测和分割
实例分割有几种方法,在这篇文章中将使用Mask R-CNN。
Mask R-CNN
Mask R-CNN是对快速R-CNN的扩展。更快的R-CNN预测边界框和Mask R-CNN本质上增加了一个分支以并行地预测对象Mask。
Mask R-CNN框架用于实例分割。资料来源:
https://arxiv.org/abs/1703.06870
Mask R-CNN预测边界框和对象Mask的示例
不详细讨论Mask R-CNN如何工作,这里是一般步骤:
骨干模型:标准卷积神经网络,用作特征提取器。例如,它会将1024x1024x3图像转换为32x32x2048要素图,作为下一层的输入。
区域提议网络(RPN):使用由多达200K锚定框定义的区域,RPN扫描每个区域并预测对象是否存在。RPN的一大优势是不扫描实际图像,网络扫描特征图,使其更快。
感兴趣区域分类和边界框:在该步骤中,算法将RPN提出的感兴趣区域作为输入并输出分类(softmax)和边界框(回归量)。
分段Mask:在最后一步中,将正ROI区域作为输入的算法和具有浮点值的28x28像素Mask生成为对象的输出。在推理期间,这些Mask按比例放大。
使用Mask R-CNN进行训练和推理
将使用Matterport构建的令人敬畏的Mask R-CNN库,而不是基于研究论文复制整个算法。必须A)生成训练和开发设置,B)做一些争论加载到库中,C)在AWS中设置训练环境进行训练,D)使用迁移学习从coco预开始训练的重量,和E)调整模型,以获得良好的结果。
第1步:下载Kaggle数据并生成Train和Dev Splits
Kaggle提供的数据集包含数十万个图像,因此最简单的方法是将它们直接下载到将要进行训练的AWS机器上。一旦下载它们,就必须将它们分成train和dev集合,这将通过python脚本随机完成。
强烈建议使用Spot实例从Kaggle使用Kaggle的API下载数据,并将该压缩数据上传到S3存储桶。您稍后将从S3下载该数据并在训练时解压缩。
Kaggle提供了一个名为train_ship_segmentations.csv的csv文件,其中包含两列:ImageId和EncodedPixels(运行长度编码格式)。假设已经将图像下载到 ./datasets/train_val/路径中,可以将图像拆分并将图像移动到train和dev中,使用以下代码设置文件夹:
train_ship_segmentations_df = pd.read_csv(os.path.join("./datasets/train_val/train_ship_segmentations.csv"))
msk = np.random.rand(len(train_ship_segmentations_df)) 0.8
train = train_ship_segmentations_df[msk]
test = train_ship_segmentations_df[~msk] # Move train set for index, row in train.iterrows