地图图像识别的目标
地图图像识别的目标是在卫星图片上标注出建筑物轮廓。是一个图像语义分割问题(Semantic Segmentation). 但是分割目标与其它大型比赛, 如微软的COCO Challenge, 谷歌的Google AI Open Images比赛相比, 物体类别单一, 且图片质量均匀.
如图所示, 是一组人工标注完善的卫星图片, Mask和建筑物匹配度高. 这张图来自Crowdai 上的比赛 Mapping Challenge
![](https://img.haomeiwen.com/i23657/70208b917358ff05.png)
地图图像识别数据集准备
生成训练样本
目前在完成项目期间, 所使用的训练数据来源都不是人工直接标注出的卫星图像. 而是有一个由人工打上地理标记的图层文件(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而无效
![](https://img.haomeiwen.com/i23657/f2092846c73de931.png)
深度神经网络模型
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), 结果很糟.
网友评论