近年来,计算机视觉领域的进步已显著改善了物体检测和分割任务。一种流行的方法是 YOLO(You Only Look Once)系列模型。YOLOv8 是 YOLO 架构的演进,兼具准确性和效率,是各种应用的绝佳选择,包括分割卫星航拍图像中的建筑物。
在这篇博文中,我们将引导你完成实施 YOLOv8 对卫星航拍图像进行图像分割的过程,使用 Roboflow 平台的标注数据训练模型,最后将结果转换为shapefle——这是一项提供基于位置信息的新任务。
NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割
1、了解 YOLOv8 架构
YOLOv8 以其前辈为基础,专注于实现准确性和速度之间的平衡。该架构将图像划分为网格,并为每个单元分配检测和分类其边界内物体的责任。这种方法允许在一次传递中实时检测和分割物体。
对于图像分割,我们将调整 YOLOv8,将建筑物分割视为物体检测任务。网格中的每个单元将负责检测建筑物的存在,而生成的边界框将定义建筑物的大致位置。
2、使用 Roboflow 标注数据
要训练 YOLOv8 进行建筑物分割,我们需要标记数据。 Roboflow 提供了一个用户友好的平台来标注图像并生成所需的注释。 标注航空卫星图像涉及在建筑物周围绘制边界框。 此外,每个边界框都需要用建筑物的唯一类别 ID 标记。
- 数据收集:收集包含各种建筑物的多样化航空卫星图像数据集。 此数据集应代表你打算在其中部署模型的真实场景。
- 上传到 Roboflow:将你的数据集导入 Roboflow 平台。
- 标注:使用 Roboflow 的标注工具在图像中的每个建筑物周围绘制边界框。 为边界框分配类别 ID,表明它们代表建筑物。
- 导出标注:标注完成后,以 YOLO 格式导出标注。该格式包括每个图像的文本文件,其中每行对应一个边界框及其类别 ID。
3、训练 YOLOv8
有了标注数据后,就可以训练 YOLOv8 模型了。训练过程包括使用标注数据微调网络权重。
- 数据预处理:将 YOLO 标注转换为适合训练的格式。将数据集组织成训练集和验证集。
- 配置设置:根据您的问题配置 YOLOv8 架构。指定类数(建筑物为 1)和其他相关超参数。
- 模型训练:使用 PyTorch 或 TensorFlow 等深度学习框架训练 YOLOv8 模型。实施必要的数据增强技术以提高模型的泛化能力。
- 模型评估:监控模型在验证集上的表现。如有必要,调整超参数。
4、将结果转换为 Shape 文件
将 YOLOv8 分割结果转换为 Shape 文件引入了地理空间组件,使你可以将建筑物信息叠加在地图上并执行基于位置的分析。
- 后处理:获得 YOLOv8 的分割结果后,提取检测到的建筑物的边界框坐标。
- 地理参考:根据原始卫星图像的元数据为每个边界框分配地理空间坐标。
- 创建 Shape 文件:使用 geopandas 等库,将地理参考边界框坐标转换为 Shape 文件。每个 Shape 文件将代表一栋建筑物的边界。
- 可视化:在 GIS 软件中打开 Shape 文件,在地图上可视化分割的建筑物。此步骤使您能够验证分割结果的准确性并执行地理空间分析。
5、代码演练
整个过程都是使用 Google Colaboratory 完成的。
开始之前:
让我们确保我们可以访问 GPU。我们可以使用 nvidia-smi
命令来做到这一点。如果出现任何问题,请导航至 Edit
-> Notebook settings
-> Hardware accelerator
,将其设置为 GPU,然后单击保存。
下面列出了 Yolov8 模型可以做的事情,
yolo task=detect mode=train model=yolov8n.yaml args...
classify predict yolov8n-cls.yaml args...
segment val yolov8n-seg.yaml args...
export yolov8n.pt format=onnx args...
使用以下命令确保 GPU 已初始化:
!nvidia-smi
输入图像数据如下:
获取权重的自定义训练,
!yolo task=segment mode=train model=yolov8s-seg.pt data=data.yaml epochs=10 imgsz=640 save=true
结果存储在特定目录 runs/segment/train
中。并从该目录中获取预训练权重。
设置 data.yaml 文件,它看起来如下图所示:
验证自定义模型:
!yolo task=segment mode=val model=runs/segment/train/weights/best.pt data=data.yaml
使用自定义模型进行推理:
!yolo task=segment mode=predict model=runs/segment/train/weights/best.pt conf=0.25 source=test/images save=true
使用训练模型预测自定义输入:
model = YOLO(f'runs/segment/train/weights/best.pt')
results = model.predict(source='Coimbatore_Pilot.JPG', conf=0.25)
根据输入图像中分割的建筑物生成 Shaping 文件:
import geopandas as gpd
from shapely.geometry import Polygon
# Create an empty list to store the geometries and class labels
geometries = []
class_labels = []
classNames = ['building']
for r in results5:
boxes = r.boxes
for box in boxes:
x1, y1, x2, y2 = box.xyxy[0]
x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
polygon = Polygon([(x1, y1), (x1, y2), (x2, y2), (x2, y1)])
geometries.append(polygon)
# Assuming you have access to the class_label for each box (adjust accordingly)
class_label = classNames[int(box.cls[0])]
class_labels.append(class_label)
# Create a GeoDataFrame from the list of geometries and class labels
gdf = gpd.GeoDataFrame({'geometry': geometries, 'class_label': class_labels})
# You can now save the GeoDataFrame to a shapefile
output_shapefile = 'Drone_Builiding_Shape_Files/sample5/output_shapefile_boxes5.shp'
gdf.to_file(output_shapefile, driver='ESRI Shapefile')
可视化shapefile:
import matplotlib.pyplot as plt
import geopandas as gpd
# Read the shapefile using geopandas
shapefile_path = '/content/drive/MyDrive/Projects/Building_Detection.v1i.yolov8/Drone_Builiding_Shape_Files//sample5/output_shapefile_boxes5.shp'
gdf = gpd.read_file(shapefile_path)
# Plot the shapefile using matplotlib
gdf.plot()
plt.show()
6、结束语
实施 YOLOv8 来分割航空卫星图像中的建筑物,使用 Roboflow 的标注数据对其进行训练,并将结果转换为形状文件,这是一个将计算机视觉与地理空间分析联系起来的综合过程。这种集成可以实现准确的建筑物分割,并在基于位置的研究中利用分割信息。随着技术的不断发展,这种跨学科方法将在解决复杂的现实问题方面变得越来越有价值。
原文链接:航片转GIS数据自动化 - BimAnt