基于YOLOv8的航片转SHP
近年来,计算机视觉的进步带来了对象检测和分割任务的显着改进。 一种流行的方法是 YOLO(You Only Look Once)系列模型。 YOLOv8 是 YOLO 架构的演变,结合了准确性和效率,使其成为各种应用的绝佳选择,包括在航空卫星图像中分割建筑物。
在这篇博文中,我们将引导你完成实现 YOLOv8 对航空卫星图像进行图像分割的过程,使用 Roboflow 平台的标注训练模型,最后将结果转换为Shp文件——这是一项提供基于位置的新颖任务 信息。
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、将结果转换为Shp文件
将 YOLOv8 分割结果转换为Shp文件引入了地理空间组件,允许你将建筑物信息覆盖在地图上并执行基于位置的分析。
- 后处理:获得YOLOv8的分割结果后,提取检测到的建筑物的边界框坐标。
- 地理参考:根据原始卫星图像的元数据为每个边界框分配地理空间坐标。
- 创建shp文件:使用 geopandas 等库,将地理参考边界框坐标转换为形状文件。 每个形状文件将代表建筑物的边界。
- 可视化:在 GIS 软件中打开形状文件,以在地图上可视化分段建筑物。 此步骤使你能够验证分割结果的准确性并执行地理空间分析。
5、代码演练
整个过程是使用谷歌Colab完成的。
在你开始之前:
让我们确保我们可以访问 GPU。 我们可以使用 nvidia-smi 命令来做到这一点。 如果出现任何问题,请导航至 编辑 -> 笔记本设置 -> 硬件加速器
,将其设置为 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
输入图像数据如下:
1、用定制的数据训练:
!yolo task=segment mode=train model=yolov8s-seg.pt data=data.yaml epochs=10 imgsz=640 save=true
结果存储在 runs/segment/train
的具体目录中。 并从目录中获取预先训练的权重。
2、设置 data.yaml 文件,它看起来如下图所示:
3、验证自定义模型:
!yolo task=segment mode=val model=runs/segment/train/weights/best.pt data=data.yaml
4、使用自定义模型进行推理:
!yolo task=segment mode=predict model=runs/segment/train/weights/best.pt conf=0.25 source=test/images save=true
5、使用经过训练的模型预测自定义输入:
model = YOLO(f'runs/segment/train/weights/best.pt')
results = model.predict(source='Coimbatore_Pilot.JPG', conf=0.25)
6、根据输入图像分割的建筑物生成Shp文件:
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')
7、可视化Shp文件
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()
8、输出Shp文件:
6、结束语
实施 YOLOv8 在航空卫星图像中构建分割、使用 Roboflow 的注释数据对其进行训练,并将结果转换为形状文件,这是一个将计算机视觉与地理空间分析联系起来的综合过程。 这种集成可以实现准确的建筑分割以及在基于位置的研究中利用分割信息。 随着技术的不断发展,这种跨学科方法在解决复杂的现实问题方面将变得越来越有价值。
原文链接:Implementing YOLOv8 for Aerial Satellite Image Building Segmentation and Converting to Shape files
BimAnt翻译整理,转载请标明出处