yolov8旋转框+关键点检测
一、Yolov8obb_kpt
-----------------------------------现已在v8官方库上更新旋转框分割算法和旋转框关键点检测算法--------------------------
------------------------------------------- https://github.com/yzqxy/ultralytics-obb_segment---------------------------------
记得给博主点上⭐,给予博主继续创作好用算法的动力。
可参考博主上一篇文章,Yolov8obb_kpt,旋转框+关键点检测,有向目标检测,判断目标正方向
二、标注工具
标注软件:X-AnyLabeling,可查阅博客进行安装使用
标注旋转框和关键点,生成json文件。

三、json2txt转化为yolov8可训练标签的脚本
# COCO 格式的数据集转化为 YOLO 格式的数据集
# --json_path 输入的json文件路径
# --save_path 保存的文件夹名字,默认为当前目录下的labels。import os
import json
from tqdm import tqdm
import argparse
import cv2
import numpy as np
parser = argparse.ArgumentParser()
# 这里根据自己的json文件位置,换成自己的就行
parser.add_argument('--json_path',default=r'D:\Dataset\关键点\tading\coco_kpt_format\annotations\tading_kpt_val.json', type=str,help="input: coco format(json)")
# 这里设置.txt文件保存位置
parser.add_argument('--save_path', default=r'D:\Dataset\关键点\tading\20220912_hailei\txt\val', type=str,help="specify where to save the output dir of labels")
arg = parser.parse_args()def convert(size, box):dw = 1. / (size[1])dh = 1. / (size[0])x = (box[0] + box[2]) / 2.0y = (box[1] + box[3] )/ 2.0w = box[2]-box[0]h = box[3]-box[1]x = round(x * dw, 6)w = round(w * dw, 6)y = round(y * dh, 6)h = round(h * dh, 6)return (x, y, w, h)def check_points_in_rotated_boxes(points, boxes):"""Check whether point is in rotated boxesArgs:points (tensor): (1, L, 2) anchor pointsboxes (tensor): [B, N, 5] gt_bboxeseps (float): default 1e-9Returns:is_in_box (tensor): (B, N, L)"""a = np.array(boxes[0])b = np.array(boxes[1])c = np.array(boxes[2])d = np.array(boxes[3])ab = b - aad = d - a# [B, N, L, 2]ap = points - a# [B, N, L]norm_ab = np.sum(ab * ab)# [B, N, L]norm_ad = np.sum(ad * ad)# [B, N, L] dot productap_dot_ab = np.sum(ap * ab)# [B, N, L] dot productap_dot_ad = np.sum(ap * ad)# [B, N, L] <A, B> = |A|*|B|*cos(theta)is_in_box = (ap_dot_ab >= 0) & (ap_dot_ab <= norm_ab) & (ap_dot_ad >= 0) & (ap_dot_ad <= norm_ad)return is_in_boxdef save_txt(data,ana_txt_save_path,obb_cls_kpt,obb_cls,width,heigth):with open(os.path.join(ana_txt_save_path, filename.split('.json')[0] + '.txt'), 'w', encoding='utf-8') as f:# 类别,obbbox,8个kptfor i in range(len(data['shapes'])):len_line = 9 + max(len(sublist) for sublist in obb_cls_kpt) * 3# len_line=9line = ['0' for _ in range(len_line)]for obb_i in range(len(obb_cls)):if data['shapes'][i]['label'] == obb_cls[obb_i]:line[0] = str(obb_i)print('obb_cls[obb_i]', obb_cls[obb_i])# import pdb# pdb.set_trace()x1 = data['shapes'][i]['points'][0][0]y1 = data['shapes'][i]['points'][0][1]x2 = data['shapes'][i]['points'][1][0]y2 = data['shapes'][i]['points'][1][1]x3 = data['shapes'][i]['points'][2][0]y3 = data['shapes'][i]['points'][2][1]x4 = data['shapes'][i]['points'][3][0]y4 = data['shapes'][i]['points'][3][1]# if x1>x2:# x3=x2# x2=x1# x1=x3# if y1 > y2:# y3=y2# y2=y1# y1=y3tatou = [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]line[1] = str(round(x1 / width, 6))line[2] = str(round(y1 / heigth, 6))line[3] = str(round(x2 / width, 6))line[4] = str(round(y2 / heigth, 6))line[5] = str(round(x3 / width, 6))line[6] = str(round(y3 / heigth, 6))line[7] = str(round(x4 / width, 6))line[8] = str(round(y4 / heigth, 6))print(line)for j in range(len(data['shapes'])):if len(obb_cls_kpt[obb_i]) > 0:for kpt_i in range(len(obb_cls_kpt[obb_i])):if data['shapes'][j]['label'] == obb_cls_kpt[obb_i][kpt_i]:print('data[]',data['shapes'][j]['label'])x = data['shapes'][j]['points'][0][0]y = data['shapes'][j]['points'][0][1]if check_points_in_rotated_boxes([x, y], tatou):print('obb_cls_kpt[obb_i][kpt_i]',obb_cls_kpt[obb_i][kpt_i])x = round(x / width, 6)y = round(y / heigth, 6)line[9 + 3 * (kpt_i + 1) - 3] = str(x)line[9 + 3 * (kpt_i + 1) - 2] = str(y)line[9 + 3 * (kpt_i + 1) - 1] = '2'print('line', line)str_line = ' '.join(line)print('str_line', str_line)f.write(str_line + "\n")f.close()if __name__ == '__main__':obb_cls=['旋转框类别一','旋转框类别二','旋转框类别三']#对应某类别旋转框中关键点,比如旋转框类别一中有4个点,类别二中2个点,三中没有点obb_cls_kpt=[['1', '2', '3', '4'],[ 'point1', 'point2'],[]]# obb_cls_kpt = [[], [], []]json_root = r'D:\Dataset\jsons' # COCO Object Instance 类型的标注ana_txt_save_path = r'D:\Dataset\labels' # 保存的路径image_root=r'D:\Dataset\imgs'for filename in os.listdir(json_root):json_file=json_root+'\\'+filenamedata = json.load(open(json_file, 'r',encoding='utf-8'))image_file=image_root+'\\'+filename.split('.json')[0]+'.jpg'# if os.path.exists(image_file)==False:image=cv2.imdecode(np.fromfile(image_file, dtype=np.uint8), -1)print(image.shape)print('image_file',image_file)width=image.shape[1]heigth=image.shape[0]if not os.path.exists(ana_txt_save_path):os.makedirs(ana_txt_save_path)save_txt(data,ana_txt_save_path,obb_cls_kpt,obb_cls,width,heigth)
四、运行命令
yolo obb_pose mode=train model=ultralytics/cfg/models/v8/yolov8n-obb-pose.yaml data=ultralytics/cfg/datasets/project/kpt/obb_kpt.yaml batch=8 epochs=100 imgsz=640 workers=0 device=0yolo task=obb_pose mode=predict model=runs/obb_pose/train/weights/best.pt source=images/train
相关文章:
yolov8旋转框+关键点检测
一、Yolov8obb_kpt -----------------------------------现已在v8官方库上更新旋转框分割算法和旋转框关键点检测算法-------------------------- ------------------------------------------- https://github.com/yzqxy/ultralytics-obb_segment---------------------------…...
Qt-QWidget的windowTitle属性(13)
目录 描述 相关API 使用观察 描述 这个我们之前用过很多次了,就不再赘述了,简单说就是可以给那个边框设置标题,但是这里有一个小细节需要我们注意,就是谁的窗口谁设置 相关API 使用观察 我们这样写的话会发现一个问题&#x…...
RCE编码绕过--php://filter妙用
目录 代码 如何绕过 payload构造 代码 <?php $content <?php exit; ?>; $content . $_POST[txt]; file_put_contents($_POST[filename],$content); 当你想要输入代码的时候前面会有<?php exit;?>;,代码没有办法执行下去,所以…...
FactoryBean 与 BeanFactory
首先从字面理解: FactoryBean -->工厂Bean; BeanFactory -->Bean工厂。 即: FacttoryBean 是一个bean, BeanFactory 是bean的工厂。 使用: 1、BeanFactory: 提供获取bean的API。 2、FactoryBean: p…...
【迅为RK3568开发板】OpenHarmony学习开发系列教程(第2期 南向基础篇一)
P1P1_搭建Ubuntu开发环境-8:23 P2P2_获取OpenHarmony源码-10:21 P3P3_初次编译OpenHarmony源码-7:11 P4P4_OpenHarmony镜像简介以及烧写工具配置-9:18 P5P5_优化开发流程-搭建windows开发环境-5:34 P6P6_优化开发流程-搭建ubuntu开发环境-2:09 P7P7_优化开发流程-配置远程访问环…...
编程修炼之Hibernate--- springboot启动初始化ddl过程与如何自定义修改 table 字段长度
文章目录 springboot启动初始化ddl过程如何自定义修改 table springboot启动初始化ddl过程 跟踪Springboot整合hibernate的启动代码: SessionFactoryImpl 的初始化里做了非常多的事情,初始化各种资源,并调用 SchemaManagementToolCoordinat…...
TOMCAT入门到精通
目录 一 WEB技术 1.1 HTTP协议和B/S 结构 1.2 前端三大核心技术 1.2.1 HTML 1.2.2 CSS(Cascading Style Sheets)层叠样式表 1.2.3 JavaScript 二 WEB框架 2.2后台应用架构 2.2.1单体架构 2.2.2微服务 2.2.3单体架构和微服务比较 三 tomcat的…...
Android笔试面试题AI答之Kotlin(18)
文章目录 86. 阐述Kotlin中性能优化之局部函数 ?局部函数的优点间接的性能优化注意事项 87. 简述Kotlin中性能优化之数组使用 ?1. 选择合适的数组类型2. 避免不必要的数组创建3. 优化数组访问4. 合理使用数组遍历方式5. 利用Kotlin的集合操作API6. 注意数…...
Linux基础知识学习(五)
1. 用户组管理 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理(开发、测试、运维、root)。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户…...
股票买卖的思路与代码
题目 1302:股票买卖 时间限制: 1000 ms 内存限制: 65536 KB 提交数:8660 通过数: 4290 【题目描述】 最近越来越多的人都投身股市,阿福也有点心动了。谨记着“股市有风险,入市需谨慎”,阿福决定先来研究一下简化版的股…...
Eureka Server与Eureka Client详解:服务注册与发现的交互机制
Eureka Server与Eureka Client详解:服务注册与发现的交互机制 Eureka 是 Netflix 开源的一个服务发现框架,它是 Spring Cloud 微服务架构中的核心组件之一。Eureka 主要由两个关键组件构成:Eureka Server 和 Eureka Client。它们之间通过一定…...
php-fpm 如何查看哪个正在执行死循环 并终止
php-fpm 如何查看哪个正在执行死循环 并终止 1. 检查 PHP-FPM 进程的 CPU 使用情况 首先,使用 top 或 htop 命令检查哪个 PHP-FPM 进程占用了大量的 CPU 资源。这个进程很可能是在死循环中。 top -c在 top 命令输出中,按 P 键可以按 CPU 使用率排序。…...
电脑硬盘坏了怎么恢复数据?
在数字化时代,电脑硬盘作为存储核心,承载着我们的工作文档、学习资料、家庭照片以及无数珍贵的回忆。然而,硬盘作为机械设备,也有其寿命和脆弱性,一旦出现故障,数据恢复便成为了一个紧迫而棘手的问题。本文…...
cdga|某大型企业数据治理的成功转型:构建数据驱动的竞争力新引擎
在当今这个数据爆炸的时代,数据已成为企业最宝贵的资产之一,其有效管理和利用直接关系到企业的核心竞争力。某大型企业,作为行业内的领军企业,面对海量数据带来的机遇与挑战,果断启动了一项全面而深入的数据治理项目&a…...
C#使用 ModeBusTCP读取汇川Easy521PLC
Modbus TCP是一种基于以太网TCP/IP的Modbus协议变种,它允许Modbus协议在以太网网络上运行,使得设备之间可以通过IP网络交换数据。Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准,广泛应用于工业自动化领域。 #regio…...
PostgreSQL的postgres主进程
PostgreSQL的postgres主进程 在PostgreSQL数据库系统中,主要的后台进程各司其职,保证数据库的高效运行。其中,主进程postgres(也称为Postmaster)是整个数据库的核心,它负责管理和协调所有其他后台进程&…...
Java实现K个排序链表的高效合并:逐一合并、分治法与优先队列详解
Java实现K个排序链表的高效合并:逐一合并、分治法与优先队列详解 在算法和数据结构的学习中,链表是一个非常基础但又极具挑战的数据结构。尤其是当面对合并多个排序链表的问题时,如何在保证效率的前提下实现代码的简洁与高效,往往…...
Xinstall揭秘:高效App推广背后的黑科技
在移动互联网时代,App的运营推广成为了开发者们最为关注的话题之一。然而,随着市场竞争的加剧,推广难度也越来越大。这时候,一款名为Xinstall的品牌走进了我们的视线,它以其独特的技术和解决方案,为App推广…...
星巴克VS瑞幸,新王、旧王之争给新CEO带来哪些启示
“变化是生命的元素,求变是生命的力量”,马克吐温曾这样解释生命。而商场上何尝不是如此,正因为世异则事异,求变也是企业的常态。 近日,星巴克官宣布莱恩尼科尔(Brian Niccol)将于9月9日接替拉什曼纳拉辛汉(Laxman Na…...
C语言 | Leetcode C语言题解之第354题俄罗斯套娃信封问题
题目: 题解: int cmp(int** a, int** b) {return (*a)[0] (*b)[0] ? (*b)[1] - (*a)[1] : (*a)[0] - (*b)[0]; }int maxEnvelopes(int** envelopes, int envelopesSize, int* envelopesColSize) {if (envelopesSize 0) {return 0;}qsort(envelopes, …...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
