本文参考了以下三篇成果,分别有关经纬度提取、爬虫和语义分割:

基于GIS和Python的百度地图街景爬取 - 灰信网(软件开发博客聚合)基于GIS和Python的百度地图街景爬取,灰信网,软件开发博客聚合,程序员专属的优秀博客文章阅读平台。icon-default.png?t=M4ADhttps://www.freesion.com/article/6033578903/BaiduStreetViewSpider: 多角度百度街景图像抓取爬虫源码(Python) - 城市之光 – City of Light百度街景爬虫该项目用于根据指定的wgs84经纬度坐标获取对应位置的百度地图的街景图像。项目地址:https://github.com/whuyao/BaiduStreetViewSpider内容该文件夹主要包含一个用于获取街景的脚本文件和一个输出目录。baiduStreetViewSpider.pyhttps://www.urbancomp.net/archives/baidustreetviewspiderv1手把手教你5行代码实现街景图片语义分割并计算绿视率与天空率 - 云+社区 - 腾讯云icon-default.png?t=M4ADhttps://cloud.tencent.com/developer/article/1790563

准备街景采样点经纬度

首先,获取街景图片的经纬度需要准备路网数据。尝试了一下百度地图截获器,发现很久不更新了。。于是我买了基地的路网shp数据,这方面获取的方法有很多,可以QGIS,可以用Bigmap或者水经注这种软件。

拿到shp之后,使用Densify工具等距离增密道路的vertice,再通过Feature Vertices To Points转为采样点。经纬度坐标值可以使用Add XY Coordinates工具直接添加在属性表中。就可以获得一定间隔的路网经纬度点数据。

用表转excel工具,导出表格,后面爬虫里面要用。

运行街景图片爬虫

首先下载一下文章开头链接2的爬虫源码。爬虫下载下来,结构挺简单,是这样的:

 但是dir文件夹里,少了一个叫images的文件夹,自己新建一个空文件夹命名为images即可

然后看代码,找到读取的文件路径,替换成刚才准备好的文件:

 运行代码,就可以跑起来啦~

实现图像语义分割

这里建议使用google colab,配置起来很方便,而且还可以白嫖GPU~

用一张图做了测试,这部分完整代码如下:

# 安装依赖库,colab里安装新的包需要加!
# for mxnet
!pip install --upgrade mxnet
# for pytorch
!pip install torch==1.6.0+cpu torchvision==0.7.0+cpu -f https://download.pytorch.org/whl/torch_stable.html

!pip install --upgrade gluoncv


# 初始化
import mxnet as mx
from mxnet import image
import gluoncv
import matplotlib.pyplot as plt
from gluoncv.data.transforms.presets.segmentation import test_transform
from gluoncv.utils.viz import get_color_pallete,plot_image
import matplotlib.image as mpimg
import numpy as np
# using cpu
ctx = mx.cpu()

# 读取图片
img = image.imread('/content/d1.jpg')
img = test_transform(img,ctx)

# 调用model1,即用cityscapes训练出来的模型之一
model1 = gluoncv.model_zoo.get_model('deeplab_resnet101_citys', pretrained=True)

# 两个输出参数
output = model1.predict(img)
predict = mx.nd.squeeze(mx.nd.argmax(output, 1)).asnumpy()


# 解析输出参数
green = (predict==8)
print('绿视率为:',str(len(predict[green])/(predict.shape[0]*predict.shape[1])))
sky = (predict==10)
print('天空率为:',str(len(predict[sky])/(predict.shape[0]*predict.shape[1])))

# 可视化
mask = get_color_pallete(predict, 'citys')
base = mpimg.imread('/content/d1.jpg')
plt.figure(figsize=(10,5))
plt.imshow(base)
plt.imshow(mask,alpha=0.5)
plt.axis('off')
#plt.savefig('cd2_deeplab_citys.jpg',dpi=150,bbox_inches='tight')

也可以继续试下另一个模型模型,代码如下:

model2 = gluoncv.model_zoo.get_model('deeplab_resnet101_ade', pretrained=True)
output = model2.predict(img)
predict = mx.nd.squeeze(mx.nd.argmax(output, 1)).asnumpy()
mask = get_color_pallete(predict, 'ade20k')
green = (predict==4)
print('绿视率为:',str(len(predict[green])/(predict.shape[0]*predict.shape[1])))
sky = (predict==2)
print('天空率为:',str(len(predict[sky])/(predict.shape[0]*predict.shape[1])))

base = mpimg.imread('/content/d1.jpg')
plt.figure(figsize=(10,5))
plt.imshow(base)
plt.imshow(mask,alpha=0.5)
plt.axis('off')
plt.savefig('cd2_deeplab_ade.jpg',dpi=150,bbox_inches='tight')

在这张图上效果没有之前好:

 ok啦~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐