python SHP2COCO

1. 将shp的标签数据转成coco

# -*- coding: utf-8 -*-
import os, json
import cv2
from osgeo import gdal
import numpy as np
from osgeo import ogr, gdal, osr
from shapely.geometry import box, shape
from shapely.geometry.polygon import Polygon
import collections
import datetime
import geopandas as gpd
import shutildef read_img(filename):dataset=gdal.Open(filename)im_width = dataset.RasterXSizeim_height = dataset.RasterYSizeim_geotrans = dataset.GetGeoTransform()im_proj = dataset.GetProjection()im_data = dataset.ReadAsArray(0,0,im_width,im_height)# del dataset return im_width, im_height, im_proj, im_geotrans, im_data, datasetdef write_img(filename,im_proj,im_geotrans,im_data):if 'int8' in im_data.dtype.name:datatype = gdal.GDT_Byteelif 'int16' in im_data.dtype.name:datatype = gdal.GDT_UInt16else:datatype = gdal.GDT_Float32if len(im_data.shape) == 3:im_bands, im_height, im_width = im_data.shapeelse:im_bands, (im_height, im_width) = 1,im_data.shape driver = gdal.GetDriverByName("GTiff")dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)dataset.SetGeoTransform(im_geotrans)dataset.SetProjection(im_proj)if im_bands == 1:dataset.GetRasterBand(1).WriteArray(im_data)else:for i in range(im_bands):dataset.GetRasterBand(i+1).WriteArray(im_data[i])def data2YoloAndCoco(shapefile_path, tif_path): full_name = os.path.split(tif_path)[1]name = full_name[:-4]# 打开Shapefile文件shapefile_ds = ogr.Open(shapefile_path)if shapefile_ds is None:print("无法打开Shapefile文件")returnshapefile_layer = shapefile_ds.GetLayer()#feature_num = shapefile_layer.GetFeatureCount()  # get poly count# 打开TIFF文件获取地理转换信息tif_ds = gdal.Open(tif_path)if tif_ds is None:print("无法打开TIFF文件")returnwidth = tif_ds.RasterXSizeheight = tif_ds.RasterYSizeyolo_label_path = os.path.join(yolo_txt_path, name + ".txt")txt = open(yolo_label_path, 'w')def get_bbox_points(ring, geo_transform, x_res, y_res, width, height):corner1 = ring.GetPoint(0)corner2 = ring.GetPoint(1)corner3 = ring.GetPoint(2)corner4 = ring.GetPoint(3)# print(corner1, corner2, corner3, corner4)# 计算像素坐标,考虑分辨率pixel_corner1 = (int((corner1[0] - geo_transform[0]) / x_res), int((corner1[1] - geo_transform[3]) / y_res))pixel_corner2 = (int((corner2[0] - geo_transform[0]) / x_res), int((corner2[1] - geo_transform[3]) / y_res))pixel_corner3 = (int((corner3[0] - geo_transform[0]) / x_res), int((corner3[1] - geo_transform[3]) / y_res))pixel_corner4 = (int((corner4[0] - geo_transform[0]) / x_res), int((corner4[1] - geo_transform[3]) / y_res))x1, y1_  = pixel_corner1x2, y2_  = pixel_corner2x3, y3_  = pixel_corner3x4, y4_  = pixel_corner4y1 = y1_y2 = y2_y3 = y3_y4 = y4_# print(x1,y1,x2,y2,x3,y3,x4,y4)w = x2 - x1h = y3 - y2x_center = x1 + w/2.0y_center = y2 + h/2.0x_normalized = abs(x_center / width)y_normalized = abs(y_center / height)width_normalized = abs(w / width)height_normalized = abs(h / height)return x_normalized, y_normalized, width_normalized, height_normalized#return x1,y1,x2,y2,x3,y3,x4,y4def get_boundary_points(geom, geo_transform, x_res, y_res):points = []  # store points in real worldpixels = []  # store pixels in imagesx_pixels = []y_pixels = []feature_type = geom.GetGeometryName() #feature_type: LINEARRINGfor j in range(geom.GetPointCount()):px = geom.GetX(j)py = geom.GetY(j)points.append((px, py))for p in points:new_pixel_x = int((p[0] - geo_transform[0]) / x_res)new_pixel_y = int((p[1] - geo_transform[3]) / y_res)x_pixels.append(new_pixel_x)y_pixels.append(new_pixel_y)pixels.append([new_pixel_x, new_pixel_y])return x_pixels, y_pixels, pixelsdef getsegmenation(x_pixels, y_pixels):getsegmenation_list = []minx = min(x_pixels)maxx = max(x_pixels)miny = min(y_pixels)maxy = max(y_pixels)box_w = maxx - minxbox_h = maxy - minybounding_box_area = box_w * box_hbox_info = [minx, miny, box_w, box_h]getsegmenation = [[minx, miny], [maxx, miny], [minx, maxy], [maxx, maxy]]getsegmenation = np.asarray(getsegmenation).flatten().tolist()  #segmentation[[x1,y1,x2,y2,...]]getsegmenation_list.append(getsegmenation)return box_info, bounding_box_area, getsegmenation_listif __name__ == "__main__":now = datetime.datetime.now()# 定义coco数据格式data = dict(info=dict(description=None,url=None,version=None,year=now.year,contributor=None,date_created=now.strftime('%Y-%m-%d %H:%M:%S.%f'),),licenses=[dict(url=None,id=0,name=None,)],images=[# license, url, file_name, height, width, date_captured, id],type='instances',annotations=[# segmentation, area, iscrowd, image_id, bbox, category_id, id],categories=[# supercategory, id, name],
)# 定义类别信息#class_names = ["pine", "spruce", "birch", "populus"]cls_dict = {'1':'pine', '2':'spruce', '3':'birch', '4':'populus'}for i, class_name in enumerate(class_names):data["categories"].append({"id": i + 1,"name": class_name,"supercategory": ""})root_tiff_folder = './data4train/train_image_128/'root_shpf_folder = './data4train/train_label_128/'out_json_file = './STDtrain128.json'image_id = 0for sitname in os.listdir(root_shpf_folder):for regionn in os.listdir(os.path.join(root_shpf_folder, sitname)):#tiff_folder = './data4train/train_image_128/'#shpf_folder = './data4train/train_label_128/'shpf_folder = os.path.join(root_shpf_folder, sitname, regionn)tiff_folder = os.path.join(root_tiff_folder, sitname, regionn)# # 遍历每个shp文件for shpfile in os.listdir(shpf_folder):        if shpfile[-4:] == ".shp":print('Processing shpfile:', shpfile)        shpfile_path = os.path.join(shpf_folder, shpfile)shpfile_name, shpfile_ext = os.path.splitext(shpfile)#siten, regionn, mark_ = shpfile_name.split('-')#tiffile_name = siten + '_' + regionn + '_deno.tif'#shpfile_path = './train_shp/jokisalo_region1_deno_1.shp'tiffile_name = shpfile_name + '.tif'tiffile_path = os.path.join(tiff_folder, tiffile_name)#tiffile_path = './train_img/jokisalo_region1_deno_1.tif'#txt_path = os.path.join(txt_folder, txt_name)#print('tiffile_path:', tiffile_path)#copy tiff image files to a new folder tiffile_to_path = os.path.join('./data4train/TIFFImage-train-128/', tiffile_name)shutil.copy(tiffile_path, tiffile_to_path)dataset = gdal.Open(tiffile_path)im_width = dataset.RasterXSizeim_height = dataset.RasterYSizedata['images'].append(dict(license=0,url=None,file_name=tiffile_name,height = im_width,width = im_height,date_captured=None,id=image_id,))# 打开Shapefile文件shapefile_ds = ogr.Open(shpfile_path)#gdf = gpd.read_file(shpfile_path)if shapefile_ds is None:print("无法打开Shapefile文件")pass# 获取字段信息shapefile_layer = shapefile_ds.GetLayer()layer_defn = shapefile_layer.GetLayerDefn()num_fields = layer_defn.GetFieldCount()#feature_num = shapefile_layer.GetFeatureCount()  # get poly count# 打印字段信息#for i in range(num_fields):#field_defn = layer_defn.GetFieldDefn(i)#print(f"字段名称: {field_defn.GetName()}, 类型: {field_defn.GetTypeName()}")#exit(0)# 打开TIFF文件获取地理转换信息geo_transform = dataset.GetGeoTransform()# 分辨率x_res = geo_transform[1]y_res = geo_transform[5]# 遍历每个要素#bbox_id = 0x_pixels = []y_pixels = []for feature in shapefile_layer:#print(feature)#exit(0)geometry = feature.GetGeometryRef()ring = geometry.GetGeometryRef(0) class_id = str(feature.GetField("Class")) #The field retore class id if class_id in list(cls_dict.keys()): #['1','2','3','4']label = cls_dict[class_id]feature_type = ring.GetGeometryName()x_pixels, y_pixels, point_pixel = get_boundary_points(ring, geo_transform, x_res, y_res) # get xy of each featureif len(x_pixels) > 0 and len(y_pixels) > 0:bbox, area, bbox_points = getsegmenation(x_pixels, y_pixels)# 将边界框信息保存到COCO格式的字典中data["annotations"].append({"id": len(data['annotations']),"image_id": image_id,"category_id": int(class_id),"segmentation": bbox_points,"area": area,"bbox": bbox,"iscrowd": 0})#bbox_id += 1else:print('class_id is empty!')image_id += 1shapefile_ds = Nonedataset = Nonewith open(out_json_file, 'w') as f:json.dump(data, f)f.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/713813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter 的状态管理

状态提升(Lifting-state-up) 把子组件的状态,提升到上级组件中,从而实现在多个组件之间共享和同步数据的效果 以 flutter counter demo,那个按按钮1 的来说,现在的 count 是几,不是存在页面显…

政府采购标书制作的要点解析

导语:政府采购是政府为满足公共利益,按照法定程序和标准,通过招标、竞争性谈判等方式,购买商品、工程和服务的行为。标书作为政府采购活动中的重要文件,其制作质量直接影响到项目的顺利进行。本文将围绕政府采购标书制…

二路归并排序的算法设计和复杂度分析and周记

数据结构实验报告 实验目的: 通过本次实验,了解算法复杂度的分析方法,掌握递归算法时间复杂度的递推计算过程。 实验内容: 二路归并排序的算法设计和复杂度分析 实验过程: 1.算法设计 第一步,首先要将数组进行…

【网站项目】314学生二手书籍交易平台

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

关于游戏公司组织架构的小讨论

过完年刚刚上班没几天,就有一件比较搞笑的事情,可以和大家分享一下。   某一天我们在公司的会议室开会,发现有非常多蚊子,于是找行政问能不能找专业人士来灭蚊。行政的答复是,专业灭蚊是有固定时间的,还要…

JVM相关面试题(2024大厂高频面试题系列)

一、JVM的组成 1、JVM由哪些部分组成,运行流程是什么? 回答:在JVM中共有四大部分,分别是Class Loader(类加载器)、Runtime Data Area(运行时数据区,内存分区)、Execut…

MyBatis的补充用法

说明:之前介绍过MyBatis的用法,像 用注解和Mapper.xml操作数据库、在Mapper.xml里写动态SQL。最近在一次用MyBatis批量更新数据库对象的场景中,意识到对MyBatis的一些标签用法不太熟悉,所以去 MyBatis官网 看了一些文档&#xff0…

php httpfs链接hdfs

一.代码(有bug) GitHub - michaelbutler/php-WebHDFS: A PHP client for WebHDFS 二.调用代码 1.代码1.代码 require_once(../webhdfs/src/org/apache/hadoop/WebHDFS.php);require_once(../webhdfs/src/org/apache/hadoop/tools/Curl.php); require_o…

什么是人才储备?如何做人才储备?

很多小伙伴都会有企业面试被拒的情况,然后HR会告诉你,虽然没有录用你,但是你进入了他们的人才储备库,那么这个储备库有什么作用和特点呢?我们如何应用人才测评系统完善人才储备库呢? 人才储备一般有以下三…

Python打发无聊时光:12.用PyQt实现简易的心电起搏器界面

第一步:装PyQt库 pip install PyQt5 第二步:复制代码 import sys from PyQt5.QtWidgets import (QApplication, QMainWindow, QPushButton, QVBoxLayout,QWidget, QLabel, QProgressBar, QSlider, QLineEdit, QHBoxLayout) from PyQt5.QtCore import …

软件分层(数据结构/软件逻辑上分层+举例),相连节点的概念+如何相连,为什么是层状结构(软件分层,网络协议分层+梳理协议顺序),协议分层(打电话例子)

目录 软件分层 介绍 举例 类的继承 虚拟文件系统 线程接口封装 虚拟地址空间 总结 为什么是层状的 软件分层 网络协议 原因 梳理协议顺序 相连节点 协议分层 引入 示例 实际上 逻辑上 制定出协议 软件分层 介绍 通过将软件系统划分为不同的层次,每一层都有…

uniApp 调整小程序 单个/全部界面横屏展示效果

我们打开uni项目 小程序端运行 默认是竖着的一个效果 我们打开项目的 pages.json 给需要横屏的界面 的 style 属性 加上 "mp-weixin": {"pageOrientation": "landscape" }界面就横屏了 如果是要所有界面都横屏的话 就直接在pages.json 的 gl…

Ps:海绵工具

海绵工具 Sponge Tool可用于调整图像中特定区域的饱和度,常用于增加或减少颜色的饱和度。 快捷键:O 在特别的灰度图像上,则可用于调整对比度,这可以开发出更多的创意技巧。 ◆ ◆ ◆ 常用操作方法与技巧 1、海绵工具主要用于调整…

源码解析篇 | YOLOv8官方源码项目目录结构解析

前言:Hello大家好,我是小哥谈。YOLOv8是一种目标检测算法,它是YOLO(You Only Look Once)系列算法的第8个版本。YOLOv8相比于之前的版本,在检测精度和速度上都有所提升,它在各种场景下都表现出色…

Git源码管理

参考视频:16-git的日志以及版本管理_哔哩哔哩_bilibili 参考博客:Git && Docker 学习笔记-CSDN博客 目录 简介 个人操作初始化 初始化git目录 查看生成的git目录文件 配置git工作目录的用户信息 查看工作区的状态,生成文件的…

【JS】生成N位随机数

作用 用于邮箱验证码 码 ramNum.js /*** 生成N位随机数字* param {Number} l 默认&#xff1a;6&#xff0c;默认生成6位随机数字* returns 返回N位随机数字*/ const ramNum (l 6) > {let num for (let i 0; i < l; i) {const n Math.random()const str String(n…

C++面试干货---带你梳理常考的面试题(一)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 1.C和C的区别 1.语法和特性&#xff1a;C是一种过程式编程语言&#xff0c;而C是一种面向对象编程语言。C在C的基础上增加…

Java智慧云HIS医院信息化系统源码 更具灵活性、扩展性

目录 什么是云HIS 趋势与转变 HIS上云后有哪些好处 解决方案 云HIS组成 1、门诊挂号 2、住院管理 3、电子病历 4、药物管理 5、统计报表 6、综合维护 7、运营运维 什么是云HIS 云HIS是一种基于云计算技术的医院信息管理系统。云HIS可以帮助医院管理各类医院信息&a…

CIE-Alevel-Physics分类真题下载(更新中)

链接真题归类年份https://www.savemyexams.com/https://gceguide.com/papershttps://pastpapers.papacambridge.com/https://rocketrevise.comhttps://www.exam-mate.com/markhint.inhttps://xtremepape.rs/threads/as-and-a-level-physics-topical-pastpapers-upto-2015-with-…

Java Linux基本命令面试题

Java Linux基本命令面试题 前言1、查看文件内容有哪些命令可以使用&#xff1f;2、终端是哪个文件夹下的哪个文件&#xff1f;黑洞文件是哪个文件夹下的哪个命令&#xff1f;3、用什么命令对一个文件的内容进行统计&#xff1f;(行号、单词数、字节数)4、怎么使一个命令在后台运…