绿视率,即人的视野中绿色所占的比重,是街景分析中常用的评价指标之一。相较于反映二维层面绿化情况的绿地率、绿化覆盖率、归一化植被指数(NDVI)等,绿视率能够从立体视野直观反映人对绿色空间的感知,可以更人性化地反映绿化环境质量。本文结合相关文献资料,主要介绍基于深度学习技术 DeepLab V3+模型算法的街道绿视率评价。
一、方法对比
1.人工调研提取法
将街景照片绿色部分进行手工划分计算街景中的绿色占比。该方法精度低、费时费力,无法应用于大区域的城市绿视率计算。
2.软件色彩处理法
通过分析街景中绿色像素的比例,将 RGB 转换为 HSV 空间,提取绿色部分的阈值用以表示绿视率。此类方法较人工调研提取法有所改进,但会将绿色招牌等不属于城市绿化的绿色部分计算在内,使得结果存在较大误差。
3.深度学习提取法
模拟人类的思考和学习能力,自动识别街景中的绿化要素,自动分类出城市街道空间的植被等元素,提升了绿视率识别的精度。目前常用的有PSPnet、DeepLab V3、DeepLab V3+、Fastrcnn、HSV色彩阈值5种算法。
从图中可以看出,在分割的精度上 DeepLab V3+相对于其他 4 种方法精度最高。
二、DeepLab V3+模型结构
在 DeeplabV3+中,加强特征提取网络可以分为两部分:
1.Encoder
在 Encoder 中,对压缩四次的初步有效特征层利用并行的 Atrous Convolution,分别用不同 rate 的 Atrous Convolution 进行特征提取后合并,再进行 1x1 卷积压缩特征。
2.Decoder
在 Decoder 中,对压缩两次的初步有效特征层利用 1x1 卷积调整通道数,再和空洞卷积后的有效特征层上采样的结果进行堆叠,完成堆叠后,进行两次深度可分离卷积块。Deeplab V3+保持了原来的空间卷积和 ASSP 层,增加了 Xception 模型,提高了图像特征采样的准确率。
三、分析过程
大致思路:获取研究区域内路网数据→街景点坐标→街景点全景图片→利用DeepLabV3+神经网络模型完成语义分割→通过 OpenCV 识别语义图,得到绿视率
1.街景图片获取
途径一:通过腾讯地图服务所提供的 API 接口获取位置点的相应街景图片。腾讯街景 API 服务可以提供完整的街景请求 URL 地址,并提供街景中所需要设置的完整的参数,包括位置,偏航角,俯仰角,场景 ID,图片尺寸。
途径二:利用谷歌街景地图收集静态图与全景视图。谷歌街景地图可以直接采集街道图像,并通过整合不同角度的街道图像创造出 360°的街道全景视图。
2.模型训练与绿视率计算(示例用 Google Colab 平台)
在 Google Colab 平台(https://colab.google/)上结合 CityScapes 数据集,用 Deeplab V3+卷积神经网络模型训练,将待分析的街景照片输入到网络中,经过卷积,池化等操作实现语义分割。
Demo 示例对比:
图为基于 deeplabv3plus_r101-d8_4xb2-40k_cityscapes-512x1024 语义分割结果。 图为基于 pspnet_r50-d8_4xb2-40k_cityscapes-512x1024 语义分割结果可以看到还是 deeplabv3plus 性能更优,例如在红色箭头处 pspnet 出现疏漏。
四、参考代码
1.语义分割
!pip3 install openmim
!mim install mmengine
!mim install "mmcv>=2.0.0"
#从 source 安装 MMSegmentation 模块
!git clone https://github.com/open-mmlab/mmsegmentation.git
%cd mmsegmentation
!git checkout main
!pip install -e .
# Example output: 1.0.0,检查版本
import mmseg
print(mmseg.__version__)
#下载 deeplabv3plus_r101-d8_4xb2-40k_cityscapes-512x1024 系列的 py 配置和 pth 权重文件
!mim download mmsegmentation --config
deeplabv3plus_r101-d8_4xb2-40k_cityscapes-512x1024 --dest .
#用 deeplabv3+模型训练 cityscapes 城市景观数据集,并对 demo.png 进行语义分割
!python demo/image_demo.py demo/demo.png
configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb2-40k_cityscapes-512x1024.py
deeplabv3plus_r101-d8_512x1024_40k_cityscapes_20200605_094614-3769eecf.pth --device cuda:0 --out-file Hresult.jpg
2.计算绿视率
图像中的所有绿化部分的像素记为𝑁𝑔, 𝑁为整张全景图的像素总数。𝑅𝐺为每张图片的绿视率结果。
参考代码(python 版):
import cv2
import numpy as np
import os
# 定义绿色范围(在 HSV 中)
lower_green = np.array([35, 43, 46])
upper_green = np.array([77, 255, 255])
# 待分析语义图所在的文件夹路径,可根据个人情况修改
pictures_folder = '/content/mmsegmentation/picture'
# 遍历该文件夹中的所有语义图
for filename in os.listdir(pictures_folder):
if filename.endswith('.png') or filename.endswith('.jpg'):
# 构建完整的语义图文件路径
picture_path = os.path.join(pictures_folder, filename)
# 读取语义图
picture = cv2.imread(picture_path)
# 将语义图转换为 HSV
hsv_picture = cv2.cvtColor(picture, cv2.COLOR_BGR2HSV)
# 创建绿色遮罩
green_mask = cv2.inRange(hsv_picture, lower_green, upper_green)
# 计算绿色像素数量
green_pixel_count = np.count_nonzero(green_mask)
# 计算总像素数量
total_pixel_count = picture.shape[0] * picture.shape[1]
# 计算绿视率
reen_ratio = green_pixel_count / total_pixel_count
#输出文件名和对应的绿视率结果
print(f"图片名称:{filename}")
print(f"绿视率:{green_ratio * 100:.2f}%")
print("- " * 100)
五、结果解读
将绿视率划分成以下 5 类:
绿视率 0% ~ 5%:绿化水平不及格
绿视率 5% ~15%:绿化水平较差
绿视率 15%~25%:绿化水平一般
绿视率 25%~35%:绿化水平良好
绿视率 大于 35%: 绿化水平优秀
还可通过 ArcGIS 等平台对分析结果进行可视化呈现,使得研究区内各街道绿化情况更直观。
六、文章来源
[1]张驰. 基于DeepLab V3+框架的上海静安区街道绿视率评价及驱动因素研究[D].上海应用技术大学,2022.DOI:10.27801/d.cnki.gshyy.2022.000440.
[2]李晓江,蔡杨,卡洛·拉蒂. 使用街道级图像和深度学习进行城市景观研究.建筑前沿,2018,6(2):20\u29 https://doi.org/10.15302/J-LAF-20180203
[3]吴昕燃,邱慧.街景图像解译下的长沙市历史文化风貌核心区道路绿视率研究[J].园
林,2022,39(09):106-116.
[4]朱怀真,杨凡,南歆格等.国内外绿视率研究进展[J].中国城市林业,2022,20(03):140-146.
[5]https://github.com/open-mmlab/mmsegmentation/tree/main/configs/deeplabv3plus
[6]https://github.com/open-mmlab/mmsegmentation/blob/main/docs/en/get_started.md#installation
[7]https://blog.csdn.net/weixin_44791964/article/details/120113686?spm=1001.2014.3001.5506