目标检测之3维合成

现在有一系列的图片,图片之间可以按照z轴方向进行排列。图片经过了目标检测,输出了一系列的检测框,现在的需求是将检测框按类别进行合成,以在3维上生成检测结果。

思路:将图片按照z轴方向排列,以z轴索引作为检测框的z值。等同于输入为(x, y, w, h, z, class_id),可以计算得到每个检测框的中心点来标定这个框(x_center, y_center, z, class_id)。

然后可以通过聚类算法在4维空间上进行聚类,最后取出聚类出的每一类的点的xyz的最大值与最小值和class_id来生成聚类结果[x_min, y_min, z_min, x_max, y_max, z_max, class_id]。

代码展示:

from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

class BBoxClusterv3:
    def __init__(self, bbox_list):
        self.bbox_list = bbox_list
        self.clustering = None
        # self.color_map = plt.cm.get_cmap('hsv', len(set([bbox[5] for bbox in bbox_list])))

    def cluster(self, eps=100, min_samples=2):
        X = [[bbox[0]+bbox[2]/2, bbox[1]+bbox[3]/2, bbox[4], bbox[5]] for bbox in self.bbox_list]  # 中心点的x,y,z坐标和类别ID
        # breakpoint()
        self.clustering = DBSCAN(eps=eps, min_samples=min_samples).fit(X)

    def get_new_bbox_list(self):
        # self.cluster()
        labels = self.clustering.labels_
        print("聚类出的类别:",labels)
        new_bbox_list = []
        for label in set(labels):
            if label != -1:  # Ignore noise
                idxs = np.where(labels == label)[0]
                print("每一类的bboxes索引: ",idxs)
                bboxes = np.array(self.bbox_list)[idxs]
                print("每一类的bboxes集合: ",bboxes)
                x_min = np.min(bboxes[:, 0])
                y_min = np.min(bboxes[:, 1])
                x_max = np.max(bboxes[:, 0] + bboxes[:, 2])
                y_max = np.max(bboxes[:, 1] + bboxes[:, 3])
                z_min = np.min(bboxes[:, 4])
                z_max = np.max(bboxes[:, 4])
                class_id = bboxes[0, 5]
                new_bbox_list.append([x_min, y_min, z_min, x_max, y_max, z_max, class_id])
        return new_bbox_list

    def draw_bbox_2d(self, bbox, ax):
        x_min, y_min, w, h, z, class_id = bbox
        color = self.color_map(class_id)
        # print(color)
        for xi in [x_min, x_min+w]:
            for yi in [y_min, y_min+h]:
                ax.plot([xi, xi], [yi, yi], [z, z], color=color, linestyle='dashed')
        for xi in [x_min, x_min+w]:
            ax.plot([xi, xi], [y_min, y_min+h], [z, z], color=color, linestyle='dashed')
        for yi in [y_min, y_min+h]:
            ax.plot([x_min, x_min+w], [yi, yi], [z, z], color=color, linestyle='dashed')

    def draw_bbox_3d(self, bbox, ax):
        x_min, y_min, z_min, x_max, y_max, z_max, class_id = bbox
        color = self.color_map(class_id)
        for xi in [x_min, x_max]:
            for yi in [y_min, y_max]:
                ax.plot([xi, xi], [yi, yi], [z_min, z_max], color=color)
        for xi in [x_min, x_max]:
            for zi in [z_min, z_max]:
                ax.plot([xi, xi], [y_min, y_max], [zi, zi], color=color)
        for yi in [y_min, y_max]:
            for zi in [z_min, z_max]:
                ax.plot([x_min, x_max], [yi, yi], [zi, zi], color=color)

    def visualize(self, bbox_list=None, new_bbox_list=None):
        fig = plt.figure()
        ax = fig.add_subplot(111, projection='3d')

        for bbox in bbox_list:
            self.draw_bbox_2d(bbox, ax)

        for bbox in new_bbox_list:
            self.draw_bbox_3d(bbox, ax)

        plt.show()

    def draw(self):
        new_bbox_list = self.get_new_bbox_list()
        print(bbox_list,new_bbox_list)
        self.visualize(bbox_list, new_bbox_list)

    def color_map(self, class_id):
        # 假设这里使用映射字典将类别 ID 映射到不同的颜色
        color_mapping = {0: 'red', 1: 'blue', 2: 'green'}
        return color_mapping.get(class_id, 'black')  # 默认为黑色

if __name__ == "__main__":
    bbox_list = [
        #-------------------------#
        #[x, y, w, h, z, class_id]#
        #-------------------------#
        [100, 200, 50, 50, 0, 0],
        [110, 210, 50, 50, 1, 0],
        [120, 220, 50, 50, 2, 0],
        [130, 230, 50, 50, 3, 0],
        [140, 240, 50, 50, 4, 0],
        [200, 300, 60, 60, 0, 1],
        [210, 310, 60, 60, 1, 1],
        [220, 320, 60, 60, 2, 1],
        [300, 400, 70, 70, 6, 0],
        [310, 410, 70, 70, 7, 0],
        [320, 420, 70, 70, 8, 0],
        [400, 500, 80, 80, 9, 1],
        [410, 510, 80, 80, 10, 1],
        [420, 520, 80, 80, 11, 2]
    ]
    bbox_cluster = BBoxClusterv3(bbox_list)
    bbox_cluster.cluster()
    bbox_cluster.draw()

假如有以下几类框

最终聚类效果:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

E2E工程问题:小周期转大周期Gateway

摘要: 本文讨论一个具体的工程问题,E2E报文对应的信号,由小周期转大周期导致的E2E校验失败问题。 工程中,网关节点很重要的一个功能就是路由。当然,E2E(End to End)报文也可路由,但…

flask 点赞系统

dianzan.html页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>点赞系统</title> </head> <body><h2>这是一个点赞系统</h2><table border"1"><…

从零开始搭建Vue3框架(二):Vue-Router4.0使用与配置

前言 上篇文章我们创建了模板项目并成功运行&#xff0c;但是运行后的页面只是一个静态页面&#xff0c;并没有页面间跳转。 对于Vue这种单页应用来说&#xff0c;最要紧的就是控制整个系统的页面路由。因为我们使用Vue3的框架&#xff0c;所以这里使用Vue-Router4.0版本。 …

产品经理:如何做好项目需求管理

产品经理每天都要接触各种不同的需求&#xff0c;只有对这些需求进行分析&#xff0c;才能更好地了解问题&#xff0c;从而制定相应的解决方案。那么&#xff0c;怎么做需求分析呢&#xff1f; 一、需求确定 选择需求是很重要的&#xff0c;先做出选择&#xff0c;才会有对应的…

Spark性能调优指南来了!

1、什么是Spark Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Spark Core&#xff1a;实现了Spark的基本功能&#xff0c;包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core中还包含了对弹性分布式数据集(Resilient Distributed Dat…

农业中的计算机视觉 2023

物体检测应用于检测田间收割机和果园苹果 一、说明 欢迎来到Voxel51的计算机视觉行业聚焦博客系列的第一期。每个月&#xff0c;我们都将重点介绍不同行业&#xff08;从建筑到气候技术&#xff0c;从零售到机器人等&#xff09;如何使用计算机视觉、机器学习和人工智能来推动…

爆肝整理,接口自动化测试-数据驱动框架封装(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口自动化框架—…

Java版本spring cloud 工程项目管理系统源码

​ ​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈&#xff0c;内卷严重&#xff0c…

VScode的简单使用

一、VScode的安装 Visual Studio Code简称VS Code&#xff0c;是一款跨平台的、免费且开源的现代轻量级代码编辑器&#xff0c;支持几乎主流开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段提示、代码对比等特性&#xff0c;也拥有对git的开箱…

00|Oracle学习(卸载、安装、创建删除数据库/数据库实例)

Oracle 12c卸载 1 如果数据库配置了自动存储管理&#xff08;ASM&#xff09;先删除聚类同步服务CSS。DOS指令&#xff1a; localconfig delete2 进入“任务管理器”&#xff08;ctrlshiftEsc&#xff09;&#xff0c;将所有运行中的Oracle进程全关闭。 3 在开始菜单中&#…

NPOI库:C#中使用的强大工具箱,从入门到精通

*引言&#xff1a; 在软件开发中&#xff0c;Excel文件是一种常见且重要的数据存储和处理方式。为了简化Excel文件的读写操作&#xff0c;C --------------------------目录-------------------------- 一、安装NPOI库二、引入命名空间三、Excel文件的读取1. 打开Excel文件2. 读…

【数据挖掘竞赛】——科大讯飞:锂离子电池生产参数调控及生产温度预测挑战赛

🤵‍♂️ 个人主页:@Lingxw_w的个人主页 ✍🏻作者简介:计算机科学与技术研究生在读 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ ​ 【科大讯飞】报名链接:https://challenge.xfyun.cn?invitaC…

公众号套图制作教你打造独特商品宣传海报风格

在公众号的运营中&#xff0c;一个精美的海报设计可以吸引更多的关注和转发&#xff0c;提升文章的曝光度和传播效果。然而&#xff0c;对于没有设计经验的人来说&#xff0c;制作一个令人惊艳的海报可能是一项挑战。但是&#xff0c;现在有了乔拓云这个强大的工具&#xff0c;…

QT编写的串口助手

QT编写的串口助手 提前的知识 创建UI界面工程 找帮助文档 添加串口的宏

[STL]详解list模拟实现

[STL]list模拟实现 文章目录 [STL]list模拟实现1. 整体结构总览2. 成员变量解析3. 默认成员函数构造函数1迭代器区间构造函数拷贝构造函数赋值运算符重载析构函数 4. 迭代器及相关函数迭代器整体结构总览迭代器的模拟实现begin函数和end函数begin函数和end函数const版本 5. 数据…

DevOps-Git

DevOps-Git 版本控制软件提供完备的版本管理功能&#xff0c;用于存储&#xff0c;追踪目录&#xff08;文件夹&#xff09;和文件的修改历史。版本控制软件的最高目标是支持公司的配置管理活动&#xff0c;最终多个版本的开发和维护活动&#xff0c;即使发布软件。 git安装 h…

Eureka注册中心 与 OpenFeign调用接口

需求 一个应用通过接口&#xff0c;调用另一个应用的接口。使用OpenFeign来实现接口调用。 说明 通过OpenFeign&#xff08;本文接下来简称Feign&#xff09;调用远程接口&#xff0c;需要Eureka注册中心的支持。 OpenFeign调用接口的逻辑如下&#xff1a; 提供接口的应用…

笔记本触摸板没反应怎么办?只需要4个方法!快速解决!

“大家知道为什么笔记本触摸板没反应吗&#xff1f;我的鼠标不见了现在触摸板也没反应&#xff0c;根本就用不了电脑了&#xff0c;有什么方法可以解决吗&#xff1f;” 触摸板是笔记本电脑上最重要的输入设备之一&#xff0c;它可以提供便捷的操作方式。对于很多朋友来说&…

原型模式——对象的克隆

1、简介 1.1、概述 可以通过一个原型对象克隆出多个一模一样的对象&#xff0c;该模式被称为原型模式。 在使用原型模式时&#xff0c;需要首先创建一个原型对象&#xff0c;再通过复制这个原型对象来创建更多同类型的对象。 1.2、定义 原型模式&#xff08;Prototype Patt…

前端试用期工作总结范文5篇

前端试用期工作总结 &#xff08;篇1&#xff09; 时间飞逝&#xff0c;转眼间&#xff0c;做为一名Web前端开发的正式员工已经有两个月之久。在这个难忘而又夸姣的 日子里&#xff0c;我深入体会到了公司的积极氛围和各个部门的巨大魅力&#xff0c;目睹了公司一步步走向成熟…