目标检测之3维合成

news2024/11/15 17:37:37

现在有一系列的图片,图片之间可以按照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()

假如有以下几类框

最终聚类效果:

 

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

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

相关文章

机器学习:提取问题答案

模型BERT 任务:提取问题和答案 问题的起始位置和结束位置。 数据集 数据集 DRCDODSQA 先分词,然后tokenize 文章长度是不同的,bert的token的长度有限制,一般是512, self-attention的计算量是 O ( n 2 ) O(n^2) O(n…

Netty学习(三)

文章目录 三. Netty 进阶1. 粘包与半包1.1 粘包现象服务端代码客户端代码 1.2 半包现象服务端代码客户端代码 1.3 现象分析粘包半包缘由滑动窗口MSS 限制Nagle 算法 1.4 解决方案方法1,短链接方法2,固定长度方法3,固定分隔符方法4&#xff0c…

Stable Diffusion 开源模型 SDXL 1.0 发布

关于 SDXL 模型,之前写过两篇: Stable Diffusion即将发布全新版本Stable Diffusion XL 带来哪些新东西? 一晃四个月的时间过去了,Stability AI 团队终于发布了 SDXL 1.0。当然在这中间发布过几个中间版本,分别是 SDXL …

c++ 类

类的引入 c 语言的结构体只能定义变量 但是 c的结构体除了定义变量之外,还可以定义函数。 感受感受: #define _CRT_SECURE_NO_WARNINGS 1//我们声明一个结构体 struct Stack {// c可以把函数写在结构体中//叫成员函数:// 如下://c的写法&am…

【Git】分支管理-创建切换合并删除分支冲突

文章目录 分支管理创建分支切换分支合并分支删除分支分支冲突 分支管理 在版本库当中有一个head指针,指向master分支。master存储的是最新一次提交的commit id(版本号) >对应的是版本库当中对象库的一个对象的索引 在版本回退⾥&#xff…

【MySQL 基于Amoeba读写分离】

目录 一、读写分离是什么? 二、常见的MySQL读写分离方案 1.基于程序代码内部实现 2.基于中间代理层实现 3.Amoeba 三、分离步骤 1.在主机Amoeba上安装java环境 2.安装并配置Amoeba 3.配置Amoeba读写分离,两个Slave读负载均衡 4.测试 4.1 在Cl…

大数据Flink(五十三):Flink流处理特性、发展历史以及Flink的优势

文章目录 Flink流处理特性、发展历史以及Flink的优势 一、Flink流处理特性 二、发展历史

javascript数据类型详解

文章和代码已经归档至【Github仓库:https://github.com/timerring/front-end-tutorial 】或者公众号【AIShareLab】回复 javascript 也可获取。 文章目录 数据类型数据类型的分类基本数据类型Number数字型进制数字型范围三个特殊值IsNaN () String字符串转义符字符串…

matplotlib绘图中可选标记

文章目录 简介所有可用的绘图标记绘图函数标记绘制 简介 前面的博客简要介绍了matplotlib中的绘图标记,并列举出了部分可用标记点的类型,并画了个图作为示例,如下图下表所示。本文则将所有标记点的类型均绘制一遍 字符类型字符类型字符类型…

C++ | 红黑树以及map与set的封装

目录 前言 一、红黑树 1、红黑树的基本概念 2、红黑树相关特性 3、红黑树结点的定义 4、红黑树的查找 5、红黑树的插入 6、二叉树的拷贝构造与析构 7、红黑树的检测 8、红黑树总结 二、map与set的封装 1、红黑树的结点 2、红黑树迭代器 3、set的封装 4、map的封…

error:0308010C:digital envelope routines::unsupported(Vue2报错)

原因:node.js版本过高, 解决方案,在终端输入以下命令 set NODE_OPTIONS--openssl-legacy-provider 然后再package.json里面添加一行 "dev_t": "set NODE_OPTIONS\"--openssl-legacy-provider\" & npm run dev\n" 然后…

又一个产业即将被中国超越,韩国急了,将提供1.2万亿支持

日前韩媒报道指韩国计划推出1.2万亿韩元的OLED面板产业资助计划,希望帮助韩国两大OLED面板企业三星和LGD巩固OLED面板的技术领先优势,主要是因为它们正面临中国面板厂商的狙击,即将被超越。 据悉韩国推出的1.2万亿韩元资助计划,其…

在EF Core中为数据表按列加密存储

假设有User表 public class User : Entity<int> {public int Id { get; set; }public string UserName { get; set; }public string Name { get; set; }public string IdentificationNumber { get; set; } }其中有身份证号码IdentificationNumber列&#xff0c;需要加密…

计算机网络知识点汇总(持续更新)

文章目录 第一章 概述1.1 计算机网络在信息时代的作用信息服务基础设施我国互联网发展状况 1.2 因特网概述网络、互联网、因特网的基本概述因特网发展的三个阶段因特网的标准化工作 1.3 三种交换方式电路交换分组交换报文交换 1.4 计算机网络的定义和分类定义分类按交换技术按使…

【雕爷学编程】Arduino动手做(175)---机智云ESP8266开发板模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

互联网广告投放算法是怎么回事?这本书给你答案

目录 内容简介 作者简介 读者对象 书本目录 文末自购链接 广告平台的建设和完善是一项长期工程。例如&#xff0c;谷歌早于2003年通过收购Applied Semantics开展Google AdSense 项目&#xff0c;而直到20年后的今天&#xff0c;谷歌展示广告平台仍在持续创新和提升。广告平…

QT编写的串口助手

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

list与erase()

运行代码&#xff1a; //list与erase() #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;Item():name(" "),iid(0),value(0.0){}Item(string ss,int ii,double vv):name(ss),iid(ii),value(vv){}friend istr…

2023-07-11——华中科技大计算机组成原理

windows下用nginx配置https服务器 1.安装nginx 先到nginx官网下在nginx http://nginx.org/en/download.html 将下载好的文件解压出来修改文件名为 nginx ,然后拷贝到C盘下&#xff0c;目录如下&#xff1a; 运行 nginx start nginx 验证 在浏览器中输入 localhost 访问即可&a…

随笔:信息系统项目管理师(软考高级2023)考试指南

1、软考的级别设置 1、全国计算机软件资格考试设三个级别层次&#xff0c;五个专业&#xff0c;共有27种岗位资格考试 2、除了初级信息处理技术员为上机考试&#xff0c;其他均为笔试 3、信息系统项目管理师、系统规划与管理师、系统集成项目管理工程师考试形式相对考验记忆…