网题 做问卷的网站自己做的网页发布

news/2025/9/23 22:13:18/文章来源:
网题 做问卷的网站,自己做的网页发布,一份完整app运营推广方案,视频网站自己怎么做的背景 在目标检测任务中#xff0c;评估不同对象之间的重叠情况是至关重要的#xff0c;而IOU#xff08;Intersection Over Union#xff09;是衡量这种重叠程度的重要指标。本文将介绍如何编写一个Python脚本#xff0c;通过并行化处理DOTA格式的标注文件#xff0c;统…背景 在目标检测任务中评估不同对象之间的重叠情况是至关重要的而IOUIntersection Over Union是衡量这种重叠程度的重要指标。本文将介绍如何编写一个Python脚本通过并行化处理DOTA格式的标注文件统计同类别对象之间的IOU超过某个阈值的对数。 代码功能 本文代码的核心功能包括 解析DOTA格式标注文件提取对象类别和多边形坐标。计算同类对象之间的IOU并统计超过设定阈值的情况。使用多进程并行化处理提高对大规模数据的处理效率。将最终的结果保存为CSV格式方便后续分析。 完整代码 import os import logging from shapely.geometry import Polygon import numpy as np from itertools import combinations from concurrent.futures import ProcessPoolExecutor, as_completed import argparse import pandas as pd# 配置日志 logging.basicConfig(levellogging.INFO,format%(asctime)s [%(levelname)s] %(message)s,handlers[logging.StreamHandler()] )def parse_args():解析命令行参数。parser argparse.ArgumentParser(description进行标注文件的IOU分析统计同类别对象之间的重叠数量。)parser.add_argument(--anno_folder, typestr, requiredTrue, help标注文件夹路径)parser.add_argument(--output_csv, typestr, defaultiou_overlap_results.csv, help输出CSV文件路径)parser.add_argument(--iou_threshold, typefloat, default0.01, helpIOU阈值超过此值视为重叠)parser.add_argument(--num_workers, typeint, defaultNone, help并行处理的进程数默认为CPU核心数)parser.add_argument(--by_class, actionstore_true, help是否按类别统计重叠数量)return parser.parse_args()def parse_annotation_file(file_path, class_mapNone):解析标注文件提取对象的类别和多边形坐标。参数file_path (str): 标注文件的路径。class_map (set, optional): 需要筛选的类别集合。默认为None表示不筛选。返回:list of tuples: 每个元组包含类别和对应的Shapely多边形。objects []try:with open(file_path, r) as file:for line_num, line in enumerate(file, 1):parts line.strip().split()if len(parts) 9:logging.warning(f{file_path} 第{line_num}行格式不正确跳过。)continuetry:# 假设坐标为前8个元素类别为第9个元素coords list(map(float, parts[:8]))dota_type parts[8]if class_map and dota_type not in class_map:continue# 将坐标转换为Shapely多边形polygon Polygon(np.array(coords).reshape(-1, 2))if not polygon.is_valid:logging.warning(f{file_path} 第{line_num}行的多边形无效跳过。)continueobjects.append((dota_type, polygon))except ValueError as ve:logging.error(f{file_path} 第{line_num}行坐标转换错误: {ve})except Exception as e:logging.error(f读取文件 {file_path} 时发生错误: {e})return objectsdef compute_iou(poly1, poly2):计算两个多边形的IOU。参数poly1 (Polygon): 第一个多边形。poly2 (Polygon): 第二个多边形。返回:float: 两个多边形的IOU值。intersection poly1.intersection(poly2).areaunion poly1.union(poly2).areaif union 0:return 0return intersection / uniondef analyze_file(file_path, by_classFalse, class_mapNone, iou_threshold0.01):分析单个标注文件统计同类别对象之间的IOU超过阈值的对数。参数file_path (str): 标注文件的路径。by_class (bool, optional): 是否按类别统计。默认为False。class_map (set, optional): 需要筛选的类别集合。默认为None表示所有类别。iou_threshold (float, optional): IOU阈值。默认为0.01。返回:list of dicts: 每个字典包含文件名、类别如果按类别统计和重叠对数。filename os.path.basename(file_path)objects parse_annotation_file(file_path, class_map)results []if by_class:# 按类别分组class_dict {}for dota_type, polygon in objects:class_dict.setdefault(dota_type, []).append(polygon)for dota_type, polygons in class_dict.items():overlap_count 0num_objects len(polygons)if num_objects 2:# 少于两个对象无需比较results.append({filename: filename,class: dota_type,overlap_count: 0})continue# 使用组合生成所有可能的对象对for poly1, poly2 in combinations(polygons, 2):iou compute_iou(poly1, poly2)if iou iou_threshold:overlap_count 1results.append({filename: filename,class: dota_type,overlap_count: overlap_count})else:# 不按类别统计所有对象之间的重叠polygons [polygon for _, polygon in objects]overlap_count 0num_objects len(polygons)if num_objects 2:for poly1, poly2 in combinations(polygons, 2):iou compute_iou(poly1, poly2)if iou iou_threshold:overlap_count 1results.append({filename: filename,overlap_count: overlap_count})return resultsdef main():args parse_args()anno_folder args.anno_folderoutput_csv args.output_csviou_threshold args.iou_thresholdnum_workers args.num_workersby_class args.by_class# 定义类别映射如果需要筛选特定类别可以在这里修改# 例如class_map {embankment_dota, gravity_dota}class_map None # 设置为None表示分析所有类别# class_map {embankment_dota} # 只分析 embankment_dota 类别# 获取所有标注文件all_files [os.path.join(anno_folder, f) for f in os.listdir(anno_folder) if os.path.isfile(os.path.join(anno_folder, f))]logging.info(f找到 {len(all_files)} 个标注文件。)# 准备并行处理results []with ProcessPoolExecutor(max_workersnum_workers) as executor:future_to_file {executor.submit(analyze_file, file_path, by_class, class_map, iou_threshold): file_path for file_path in all_files}for future in as_completed(future_to_file):file_path future_to_file[future]try:file_results future.result()results.extend(file_results)logging.info(f完成分析文件: {os.path.basename(file_path)})except Exception as exc:logging.error(f分析文件 {os.path.basename(file_path)} 时发生异常: {exc})# 将结果写入CSVif results:df pd.DataFrame(results)df.to_csv(output_csv, indexFalse)logging.info(f分析结果已保存到 {output_csv})else:logging.warning(没有生成任何分析结果。)if __name__ __main__:main()代码详解 接下来我们将详细解释该脚本的每个部分。 1. 配置日志和命令行参数解析 我们首先配置了日志系统以便记录运行时的相关信息。日志系统可以帮助我们实时跟踪程序的执行状态和潜在问题。 import logginglogging.basicConfig(levellogging.INFO,format%(asctime)s [%(levelname)s] %(message)s,handlers[logging.StreamHandler()] )然后定义了命令行参数解析函数 parse_args()用于接收用户输入的文件夹路径、IOU阈值、输出文件路径、并行进程数等参数 def parse_args():parser argparse.ArgumentParser(description进行标注文件的IOU分析统计同类别对象之间的重叠数量。)parser.add_argument(--anno_folder, typestr, requiredTrue, help标注文件夹路径)parser.add_argument(--output_csv, typestr, defaultiou_overlap_results.csv, help输出CSV文件路径)parser.add_argument(--iou_threshold, typefloat, default0.01, helpIOU阈值超过此值视为重叠)parser.add_argument(--num_workers, typeint, defaultNone, help并行处理的进程数默认为CPU核心数)parser.add_argument(--by_class, actionstore_true, help是否按类别统计重叠数量)return parser.parse_args()2. 解析DOTA格式文件 DOTA标注文件包含多个对象的坐标和类别通常以文本行的形式存储。我们通过 parse_annotation_file() 函数读取文件内容并提取每个对象的类别和多边形坐标。 def parse_annotation_file(file_path, class_mapNone):解析标注文件提取对象的类别和多边形坐标。参数file_path (str): 标注文件的路径。class_map (set, optional): 需要筛选的类别集合。默认为None表示不筛选。返回:list of tuples: 每个元组包含类别和对应的Shapely多边形。objects []try:with open(file_path, r) as file:for line_num, line in enumerate(file, 1):parts line.strip().split()if len(parts) 9:logging.warning(f{file_path} 第{line_num}行格式不正确跳过。)continuetry:# 假设坐标为前8个元素类别为第9个元素coords list(map(float, parts[:8]))dota_type parts[8]if class_map and dota_type not in class_map:continue# 将坐标转换为Shapely多边形polygon Polygon(np.array(coords).reshape(-1, 2))if not polygon.is_valid:logging.warning(f{file_path} 第{line_num}行的多边形无效跳过。)continueobjects.append((dota_type, polygon))except ValueError as ve:logging.error(f{file_path} 第{line_num}行坐标转换错误: {ve})except Exception as e:logging.error(f读取文件 {file_path} 时发生错误: {e})return objects 通过这个函数我们可以将文件中的每个对象转化为一个Shapely库支持的多边形对象方便后续计算IOU。 3. 计算IOU IOU交并比的计算公式如下 我们利用Shapely库中的 intersection() 和 union() 方法来计算两个多边形的交集和并集面积。 def compute_iou(poly1, poly2):intersection poly1.intersection(poly2).areaunion poly1.union(poly2).areaif union 0:return 0return intersection / union4. 文件分析与并行化处理 analyze_file() 函数用于分析单个标注文件统计同类别对象之间的IOU超过设定阈值的对数。支持按类别统计或整体统计。 def analyze_file(file_path, by_classFalse, class_mapNone, iou_threshold0.01):分析单个标注文件统计同类别对象之间的IOU超过阈值的对数。参数file_path (str): 标注文件的路径。by_class (bool, optional): 是否按类别统计。默认为False。class_map (set, optional): 需要筛选的类别集合。默认为None表示所有类别。iou_threshold (float, optional): IOU阈值。默认为0.01。返回:list of dicts: 每个字典包含文件名、类别如果按类别统计和重叠对数。filename os.path.basename(file_path)objects parse_annotation_file(file_path, class_map)results []if by_class:# 按类别分组class_dict {}for dota_type, polygon in objects:class_dict.setdefault(dota_type, []).append(polygon)for dota_type, polygons in class_dict.items():overlap_count 0num_objects len(polygons)if num_objects 2:# 少于两个对象无需比较results.append({filename: filename,class: dota_type,overlap_count: 0})continue# 使用组合生成所有可能的对象对for poly1, poly2 in combinations(polygons, 2):iou compute_iou(poly1, poly2)if iou iou_threshold:overlap_count 1results.append({filename: filename,class: dota_type,overlap_count: overlap_count})else:# 不按类别统计所有对象之间的重叠polygons [polygon for _, polygon in objects]overlap_count 0num_objects len(polygons)if num_objects 2:for poly1, poly2 in combinations(polygons, 2):iou compute_iou(poly1, poly2)if iou iou_threshold:overlap_count 1results.append({filename: filename,overlap_count: overlap_count})return results 推荐工具 在本文代码中我们使用了以下Python库它们在处理几何计算、多进程处理、文件解析等方面发挥了重要作用。如果你对这些库不太熟悉可以通过以下链接获取更多信息和文档。 Shapely - 进行几何对象的构造和操作比如多边形的交集、并集等计算。 官方文档Shapely Documentation安装方法pip install shapely NumPy - 科学计算库用于处理数值数组。在这里我们用它来将多边形的坐标转换为二维数组。 官方文档NumPy Documentation安装方法pip install numpy itertools - Python标准库中的组合工具用于生成多边形配对计算它们之间的IOU。 官方文档itertools Documentation concurrent.futures - Python标准库中的并发工具用于多进程并行处理标注文件。 官方文档concurrent.futures Documentation 结论 通过这篇博客我们详细介绍了如何使用Python并行化处理DOTA格式的标注文件并统计对象之间的IOU重叠情况。该脚本不仅具有较强的灵活性支持按类别或整体统计还充分利用多进程加速大数据量的处理。希望这篇博客能够帮助你在实际项目中更高效地处理和分析目标检测任务中的标注文件。 --- 希望这篇博客对您有所帮助如果您喜欢这篇文章请点赞或关注我会持续分享更多实用的 Python 技术内容 ---

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

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

相关文章

口碑好的坪山网站建设美食网站设计欣赏

Redisson是什么 怎么用 算是面试题会问到的 redisson 是一个用于java简单易用的redis客户端,它封装了常见的分步式操作和并发控制功能,提供了丰富的apl和功能,使得开发人员能够轻松与redis进行交互 在spring Boot中使用redisson 需要进行以下…

网站定制开发流程无锡建设网站的公司哪家好

一. 阻塞信号 1.信号的相关概念     (1) 递达: 实际执行信号的处理动作称为信号的递达     (2) 未决: 信号从产生到递达之间的过程叫做信号的未决     (3) 阻塞: 进程可以选择阻塞某个信号, 被阻塞的信号产生时将保持在未决状态, 直到进程解除该信号的屏蔽, 才…

内蒙建设厅网站怎么查建筑电工证中国菲律宾会打仗吗现在

协程(Coroutine)是一种用户态的轻量级线程,它可以在单线程内实现多个执行线程的切换和调度,而无需依赖操作系统的线程管理机制(简单来说可以认为协程是线程里不同的函数,这些函数之间可以相互快速切换&…

网站做备案需要多久高端品牌网站建设优势

提到registry v2,主要改进是支持并行pull镜像,镜像层id变成唯一的,解决同一个tag可能对应多个镜像的问题等等。如果还不太了解,可以且听我细细道来。首先不得不说的是v2 新加了一个概念Digest他是基于内容进行寻址(Content-addres…

免费帮助建站国外seo网站

目录 6.1 绳结电子书:绳结1级概览正确打结打绳结绳结组成部分学习术语八字套结(双八字结)观看技术步骤双重单结(反手结绳耳)观看技术步骤骡子结(驮马结)观看技术步骤 6.1 绳结 电子书&#xff1…

网站开发前段和后端海南网站设计

资源 官方文档 https://developer.apple.com/search/?qmotion%20graph&typeDocumentation SensorKit 使应用程序能够访问选定的原始数据或系统从传感器处理的指标。 步骤信息加速度计或旋转速率数据用户手腕上手表的配置物理环境中的环境光有关用户日常通勤或旅行的详细…

你知道吗 网站怎样去推广自己的网店

读取打包到JAR中的文件:常见问题与解决方案 喝淡酒的时候,宜读李清照;喝甜酒时,宜读柳永;喝烈酒则大歌东坡词。其他如辛弃疾,应饮高梁小口;读放翁,应大口喝大曲;读李后主…

重庆玖玺国际做网站网站建设公司net2006

该模式属于结构型模式什么是门面模式?定义:门面模式(有时候也称为外观模式)是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。外部与子系统的通信是通过一个门面(Facade)对象进行。其…

房子装修网站上海人才招聘哪个网站好

1.Kafka的数据存储形式 一个主题由多个分区组成 一个分区由多个segment段组成 一个segment段由多个文件组成(log,index(稀疏索引),timeindex(根据时间做的索引)) 2.读数据的流程 …

网站建设费用如何做账务处理2_网站建设的一般步骤包含哪些?

文章目录 1. APP端抓包配置2. APP端抓包分析3. Web端抓包分析4. 爬虫代码实现 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】&#xff1a…

网站的市场如何制作沈阳京科医院男科

2 数据库环境说明 3 数据库的命名规则 4 逻辑设计 5 物理设计 5.1 表汇总 5.2 表结构设计 6 数据规划 6.1 表空间设计 6.2 数据文件设计 6.3 表、索引分区设计 6.4 优化方法 7 安全性设计 7.1 防止用户直接操作数据库 7.2 用户帐号加密处理 7.3 角色与权限控制 8 数据库管理与维…

深圳建设招标网站首页渭南网站建设网站排名优化

以下是我整理的前端、后端工程师在开发中经常使用到的API接口,希望能帮到大家~ 手机号码归属地:可根据手机号码查询其省市区、运营商区号行政区划代码等信息。 上亿条数据囊括最新的170、166、147等号段,更新及时、准确度高。空号检测&#…

建网站 3年服务器vs设置网站开发环境

Debezium系列之:Debezium技术专栏第300篇系列文章之打通Debezium实时采集Oracle数据库数据到Kafka集群的技术 一、需求描述二、部署Debezium集群和Oracle连接器三、安装Oracle数据库四、设置具有采集Oracle数据库数据权限的账号1.以系统管理员的身份连接到数据库实例2.创建表空…

做网站可以申请个体户么福州网络公司

Google官方出了一款App遍历工具App Crawler。 文档:应用抓取工具 | Android 开发者 | Android Developers App Crawler工具是Android Jetpack的一部分,它可自动的运行你的App,不需要编写或维护任何代码。 通过App Crawler运行App&…

沈阳市城乡建设部官方网站windows软件开发工具

SpringBoot文件上传 上传文件是互联网中常常应用的场景之一&#xff0c;最典型的情况就是上传头像等&#xff0c;今天就带着带着大家做一个 Spring Boot 上传文件的小案例。 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xml…

newDay02

1.大致复习一遍自己暑期学习过的Java知识,继续往下学了学数组的动态初始化和一些常见问题,并做了一些练习,完成了部分作业,继续背单词 2.新的作业还差不少,还是得继续写,抽出时间来学学Java 3.今天浪费的时间有点…

【OI 档案-2025】CSP 赛前集训记(初赛后+复赛)

复赛前 - 第一周(9.22 ~ 9.28) Day1 - 周一 斌斌感冒了 awa,这天只能晚自习坐大牢了。 Day2 - 周二 直接来模拟赛吗 0.0,直接从 lzm 搬运吗?有点意思,但是被薄纱,155pts,rk5,没救了。 小梦学习计网 枚举+模拟…

Git 从零到一:以 Gitee 为例的实战与可视化指南

这是一篇"开箱即用"的 Git 入门到进阶实战文。你将从安装、配置、SSH、创建远端仓库与本地初始化开始, 迅速掌握个人开发与团队协作的两种主流程;并结合真实案例(项目 IOT_LLM 与分支 master、heshuangxi…

金华网站建设方案咨询wordpress非法关键词

CloudCompare是一款功能强大的点云后处理软件,本文讲解CloudCompare中文版下载与安装方法。 文章目录 一、CloudCompare下载地址二、CloudCompare安装教程三、CloudCompare中文设置一、CloudCompare下载地址 官方下载地址:http://www.danielgm.net/cc/release/ 二、CloudComp…