You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将QGIS标注的地理参考多边形转COCO/YOLO格式并逆向转换?

QGIS标注多边形与COCO/YOLO分割格式互转方案

一、QGIS地理参考多边形转COCO/YOLO分割格式

核心逻辑

QGIS标注的是地理坐标,而COCO/YOLO依赖图像像素坐标(或归一化坐标),核心是完成「地理坐标 ↔ 像素坐标」的转换,再适配目标格式的结构要求。

具体操作步骤

  1. 对齐图层与影像的坐标参考系(CRS)

    • 确保标注矢量图层(Shapefile/GeoPackage)和对应的遥感影像使用相同CRS。若不一致,用QGIS的投影转换工具调整矢量图层的CRS,匹配影像参数。
  2. 提取关键参数与地理坐标

    • 从影像属性中获取地理变换参数:左上角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])
            # 后续用于转换为像素坐标
        
  3. 转换为目标训练格式

    • YOLO分割格式:
      1. 地理坐标转像素坐标(注意图像Y轴向下,与地理Y轴方向相反):
        x_pixel = (x_geo - x_origin) / pixel_width
        y_pixel = (y_origin - y_geo) / pixel_height
        
      2. 将像素坐标归一化(除以图像宽、高),生成每行格式为class_id x1 y1 x2 y2 ... xn yn的.txt文件,每个图像对应一个同名标注文件。
    • COCO分割格式:
      1. 构建标准JSON结构,包含images(图像ID、文件名、宽高)、categories(类别ID、名称)、annotations(标注ID、图像ID、类别ID、segmentation像素坐标列表、bbox、面积);
      2. 用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
            })
        

二、模型输出结果转地理参考多边形导入QGIS

核心逻辑

将模型输出的像素/归一化坐标转换回地理坐标,生成带对应CRS的矢量文件,即可直接导入QGIS。

具体操作步骤

  1. 解析模型输出的坐标数据

    • YOLO输出:将归一化坐标乘以图像宽、高,得到像素坐标顶点列表;
    • COCO输出:直接从segmentation字段提取像素坐标列表。
  2. 像素坐标转地理坐标
    使用影像的地理变换参数逆运算:

    x_geo = x_origin + x_pixel * pixel_width
    y_geo = y_origin - y_pixel * pixel_height
    
  3. 生成可导入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 01:05:11