地图图像识别的目标
地图图像识别的目标是在卫星图片上标注出建筑物轮廓。是一个图像语义分割问题(Semantic Segmentation). 但是分割目标与其它大型比赛, 如微软的COCO Challenge, 谷歌的Google AI Open Images比赛相比, 物体类别单一, 且图片质量均匀.
如图所示, 是一组人工标注完善的卫星图片, Mask和建筑物匹配度高. 这张图来自Crowdai 上的比赛 Mapping Challenge
Crowdai已经下线, 我下载了Map Challenge 比赛的数据集. 包括Train, Validation 和Test. Test 没有标注. Train 和Validation的标注是COCO 标注格式. 百度云的下载链接在这里:https://pan.baidu.com/s/1wm4WtOLGiknaqAJSrlzufA 密码:xho2
地图图像识别数据集准备
生成训练样本
目前在完成项目期间, 所使用的训练数据来源都不是人工直接标注出的卫星图像. 而是有一个由人工打上地理标记的图层文件(shapefile格式, GIS领域的标准数据格式), 以及从Google Map上抓取到的对应地区的卫星图片.
为了构建训练数据, 需要完成的第一件事, 是将图层文件中的标记(经纬度坐标), 映射到Google Map卫星图片上(以图片左上角为原点, 向右为X轴, 向下为Y轴).
所使用的方法, 是Google Map JavaScript API的转换方式, 用Python语言重写实现.
标注数据的格式
生成的数据集都是COCO风格的标注数据. COCO标注数据的具体规范, 可以参考https://github.com/cocodataset/cocoapi
这个Github repo里的示例代码. 在Windows 安装Pycocotools的话, 可以参考 https://github.com/philferriere/cocoapi
训练数据的问题
目前生成的训练数据中, 标注与真实房屋的位置, 很多图像上有大约10-20个像素的偏差(图片大小300 x 300), 也有不少标注大于房屋实际面积的情况. 我们甚至发现标注面积实际为房屋面积的2倍以上. 这就导致如果精准分割出房屋, 使用IoU>0.5作为阈值过滤掉不合格预测结果, 再计算准确率的话, 很多实际上完美分割的结果, 会被认为是无效的. 我自己制作的示例图如下(非项目中真实使用的图片):
- 红色边框较蓝色房屋, 大小相似, 但是位置偏移;
- 黄色边框将绿色的建筑物全部囊括, 但是面积要大很多, 此时如果完美分割绿色建筑物, IoU很可能由于小于0.5而无效
深度神经网络模型
1. ResNet + U-Net
Crowdai 上举办了Open Map Challenge, 其所解决的问题和这个问题相近, 排名第一的队伍, 是Neptume.ml公司. Github Repo地址为:
https://github.com/neptune-ml/open-solution-mapping-challenge
其所使用的模型. 是ResNet 101 和U-Net的组合. 使用预训练的ResNet101 对图像进行特征提取. 再使用U-Net进行图像分割.
模型的损失函数由两部分组成
loss = binary_cross_entropy * weight1 + dice_loss * weight2
其中, Binary Cross Entropy是计算预测值与实际标注每一个像素的异同. Dice Loss是用IoU的思想计算预测值与实际标注的偏差. 两种Loss值的权重, 是需要人为设定的超参数. 根据Github中的描述, 模型训练前期, 需要更多考虑Binary Cross Entropy损失值.
2. Mask R CNN
比赛的主办方, 给出的Baselline模型是Mask R CNN模型:
https://github.com/crowdAI/crowdai-mapping-challenge-mask-rcnn
相较比赛第一名使用的RestNet + U-Net的方式, Mask R CNN模型太重型了, 这个模型一般用于解决复杂场景下的图像分类, 物体检测和语义分割问题.
目前尚没有开始尝试在项目中使用这个模型.
面临的问题
目前面临的问题, 是生成的训练集质量较低, 导致肉眼评估模型, 觉得模型表现尚可, 但是使用程序比较预测结果的查全率, 查准率(IoU >= 0.5), 结果很糟.