如何将QGIS标注的地理参考多边形转COCO/YOLO格式并逆向转换?
QGIS标注多边形与COCO/YOLO分割格式互转方案
一、QGIS地理参考多边形转COCO/YOLO分割格式
核心逻辑
QGIS标注的是地理坐标,而COCO/YOLO依赖图像像素坐标(或归一化坐标),核心是完成「地理坐标 ↔ 像素坐标」的转换,再适配目标格式的结构要求。
具体操作步骤
对齐图层与影像的坐标参考系(CRS)
- 确保标注矢量图层(Shapefile/GeoPackage)和对应的遥感影像使用相同CRS。若不一致,用QGIS的
投影转换工具调整矢量图层的CRS,匹配影像参数。
- 确保标注矢量图层(Shapefile/GeoPackage)和对应的遥感影像使用相同CRS。若不一致,用QGIS的
提取关键参数与地理坐标
- 从影像属性中获取地理变换参数:左上角X坐标(
x_origin)、左上角Y坐标(y_origin)、像素宽度(pixel_width)、像素高度(pixel_height),这些是坐标转换的核心依据。 - 提取多边形顶点的地理坐标:
- 手动方式:用QGIS的
导出属性表工具,将多边形的WKT格式几何导出为CSV; - 批量方式:用PyQGIS脚本批量提取,示例代码:
from qgis.core import QgsProject, QgsGeometry layer = QgsProject.instance().mapLayersByName("你的标注图层名")[0] for feature in layer.getFeatures(): geom = feature.geometry() # 获取多边形顶点的地理坐标列表 coords = list(geom.asPolygon()[0]) # 后续用于转换为像素坐标
- 手动方式:用QGIS的
- 从影像属性中获取地理变换参数:左上角X坐标(
转换为目标训练格式
- YOLO分割格式:
- 地理坐标转像素坐标(注意图像Y轴向下,与地理Y轴方向相反):
x_pixel = (x_geo - x_origin) / pixel_width y_pixel = (y_origin - y_geo) / pixel_height - 将像素坐标归一化(除以图像宽、高),生成每行格式为
class_id x1 y1 x2 y2 ... xn yn的.txt文件,每个图像对应一个同名标注文件。
- 地理坐标转像素坐标(注意图像Y轴向下,与地理Y轴方向相反):
- COCO分割格式:
- 构建标准JSON结构,包含
images(图像ID、文件名、宽高)、categories(类别ID、名称)、annotations(标注ID、图像ID、类别ID、segmentation像素坐标列表、bbox、面积); - 用geopandas读取矢量图层,结合PIL获取图像尺寸批量生成,示例片段:
import geopandas as gpd from PIL import Image # 读取矢量标注文件 gdf = gpd.read_file("你的标注文件.gpkg") # 获取对应影像的尺寸 img = Image.open("遥感影像.tif") img_w, img_h = img.size # 构建COCO标注结构 annotations = [] for idx, row in gdf.iterrows(): geom = row.geometry pixel_coords = [] for x, y in geom.exterior.coords: px = (x - x_origin) / pixel_width py = (y_origin - y) / pixel_height pixel_coords.extend([px, py]) annotations.append({ "id": idx+1, "image_id": 1, "category_id": row["class_id"], "segmentation": [pixel_coords], "bbox": [min(pixel_coords[::2]), min(pixel_coords[1::2]), max(pixel_coords[::2])-min(pixel_coords[::2]), max(pixel_coords[1::2])-min(pixel_coords[1::2])], "area": geom.area })
- 构建标准JSON结构,包含
- YOLO分割格式:
二、模型输出结果转地理参考多边形导入QGIS
核心逻辑
将模型输出的像素/归一化坐标转换回地理坐标,生成带对应CRS的矢量文件,即可直接导入QGIS。
具体操作步骤
解析模型输出的坐标数据
- YOLO输出:将归一化坐标乘以图像宽、高,得到像素坐标顶点列表;
- COCO输出:直接从
segmentation字段提取像素坐标列表。
像素坐标转地理坐标
使用影像的地理变换参数逆运算:x_geo = x_origin + x_pixel * pixel_width y_geo = y_origin - y_pixel * pixel_height生成可导入QGIS的矢量文件
- 用geopandas创建GeoDataFrame,将地理坐标转换为Polygon几何对象,并设置与原影像一致的CRS;
- 导出为Shapefile或GeoPackage格式,示例代码:
import geopandas as gpd from shapely.geometry import Polygon # 假设已得到地理坐标顶点列表geo_coords polygon = Polygon(geo_coords) gdf = gpd.GeoDataFrame({"geometry": [polygon]}, crs="原影像的CRS(如EPSG:4326)") gdf.to_file("模型输出结果.gpkg", driver="GPKG") - 将生成的矢量文件直接拖入QGIS即可加载,自动带有地理参考。
内容的提问来源于stack exchange,提问作者elk_python
相关产品推荐
相关产品推荐

