根据keypoint生成heatmap

news2024/11/25 20:24:55

这里keypoint是有类别的,生成的heatmap是每个通道对应每个类别的heatmap

第一种会比较慢,第二种会比较快

第一种

def generate_heatmap(heatmap_size, sigma, class_num, keypoints, normalization):   
    """
    generate gaussian heatmap

    :param heatmap_size: (h, w)
    :param sigma: radius
    :param class_num: num of classes
    :param keypoints: [(x, y, class_id)...]
    :param normalization: divide by the max

    :return gaussian heatmap (c, h, w)
    """

    h, w = heatmap_size
    heatmap = np.zeros((class_num, h, w))
    if keypoints is None:
        return heatmap
    for x, y, c in keypoints:
        if x < 0 or y < 0 or x >= w or y >= h:
            continue
        heatmap[int(c) - 1] += np.exp(-((np.arange(w)[None, :] - x) ** 2 + (np.arange(h)[:, None] - y) ** 2) / (2 * sigma ** 2))
    if normalization:
        heatmap /= heatmap.max(axis=(-1, -2), keepdims=True)
    return heatmap

调用

heatmap = generate_heatmap((256, 256), 7, 2, [
    (100, 50, 1),
    (150, 150, 1),
    (200, 50, 2),
    (50, 200, 2),
    (180, 180, 1)
], True)

最后产生的效果

在这里插入图片描述
在这里插入图片描述

第二种

def generate_gaussian(sigma, radius=None):
    """

    :param sigma: sigma
    :param radius: radius

    :return: generate function
    """    
    if radius is None:
        size = int(6 * sigma + 3)
        radius = size // 2
    else:
        size = 2 * radius + 1
    x = np.arange(size)
    y = x[:, None]
    x0, y0 = size // 2, size // 2
    gaussian_kernel = np.exp(-((x - x0) ** 2 + (y - y0) ** 2) / (2.0 * sigma ** 2))

    def generate(heatmap_size, class_num, keypoints, normalization):
        """
        generate heatmap

        :param heatmap_size: (h, w)
        :param class_num: class num
        :param keypoints: [(x, y, c)]
        :param normalization: do normalization

        :return: gaussian heatmap(c, h, w)
        """
        h, w = heatmap_size
        result = np.zeros((class_num, h, w))
        if keypoints is None:
            return result
        
        for x, y, class_id in keypoints:
            if y < 0 or x < 0 or y >= h or x >= w:
                continue
            x = int(x)
            y = int(y)
            class_id = int(class_id)
            ul = int(y - radius), int(x - radius)
            br = int(y + radius), int(x + radius)
            
            a, b = max(0, -ul[0]), min(br[0], h) - ul[0]
            c, d = max(0, -ul[1]), min(br[1], w) - ul[1]

            aa, bb = max(0, ul[0]), min(br[0], h)
            cc, dd = max(0, ul[1]), min(br[1], w)

            result[class_id - 1, aa:bb, cc:dd] = gaussian_kernel[a:b, c:d]
        if normalization:
            result /= result.max(axis=(-1, -2), keepdims=True) + 1e-6
            result[result > 1] = 0

        return result

    return generate

调用

h, w = 256, 256
sigma = 1
radius = 7
size = 2 * radius + 1
keypoints = [
    (100, 50, 1),
    (150, 150, 1),
    (200, 50, 2),
    (50, 200, 2),
    (180, 180, 1)
]
gen = generate_gaussian(sigma, radius)
heatmap = gen((h, w), 2, keypoints, True)

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

0.96寸OLED屏显示测试和代码详细分析SPI通信

第一次尝试点亮 程序代码地址,密码&#xff1a;1234。 买了一个两色的oled&#xff0c;然后下载了资料&#xff0c;手里有一个8266的arduino&#xff0c;所以为了方便就直接用了。使用arduino主要原因&#xff0c;单片机keil太大&#xff0c;来回找文件修改引脚比较麻烦。实际…

在ubuntu20下使用花生壳映射vscode SSH

1、在ubuntu20下安装花生壳 下载花生壳&#xff1a;花生壳客户端官方下载 - 贝锐花生壳官网 选择ubuntu 或者 wget "https://dl.oray.com/hsk/linux/phddns_5.2.0_amd64.deb" -O phddns_5.2.0_amd64.deb 安装 :sudo dpkg -i phddns_5.2.0_amd64.deb" -O phddns…

【sgGoogleTranslate】自定义组件:基于Vue.js用谷歌Google Translate翻译插件实现网站多国语言开发

sgGoogleTranslate源码 <template><div :id"$options.name"> </div> </template> <script> export default {name: "sgGoogleTranslate",props: ["languages", "currentLanguage"],data() {return {//…

图解曲线积分的对称性

1.图解曲线积分的对称性 1.1 第一类曲线积分的一般对称性 二重积分、三重积分、第一类曲线积分、第一类曲面积分的一般对称性其原理都类似 平面曲线和空间曲线的原理一样&#xff0c;以下内容以空间曲线为例 图中所示为积分区域 Γ \Gamma Γ&#xff0c;函数 f ( x , y , z…

利用 Python PyPDF2库轻松提取PDF文本(及其他高级操作)

当需要从PDF文件中提取文本时&#xff0c;Python中的PyPDF2库是一个非常有用的工具。无论您是需要分析PDF文档中的内容还是需要在文档中搜索特定的信息&#xff0c;PyPDF2都可以帮助您轻松实现这些任务。 在本文中&#xff0c;我们将探讨如何使用PyPDF2库提取PDF文件中的文本&…

vue学习之vue cli创建项目

安装 node.js https://nodejs.org/en 安装 vue cli npm install -g @vue/cli --registry=https://registry.npm.taobao.org创建项目 执行创建命令,回车vue create vue-cli-learning选择 “Manually select features”,回车 “空格” 关闭 Linter / Formatter 选项,回车

开源库源码分析:OkHttp源码分析(二)

开源库源码分析&#xff1a;OkHttp源码分析&#xff08;二&#xff09; 导言 上一篇文章中我们已经分析到了OkHttp对于网络请求采取了责任链模式&#xff0c;所谓责任链模式就是有多个对象都有机会处理请求&#xff0c;从而避免请求发送者和接收者之间的紧密耦合关系。这篇文章…

【数据结构】链表面试题

203.移除链表元素 206.反转链表 876.链表的中间结点 牛客.链表中倒数第k个结点 21.合并两个有序链表 牛客.链表分隔 牛客.链表的回文结构 160.相交链表 141.环形链表 142.环形链表2 1. 移除链表元素 题目描述 思路&#xff1a; 定义一个指针cur遍历整个链表&#xff0c;一个ta…

阿里云 linux 的nginx 配置uni-app的H5前端项目vue,后端接口阿里云。

背景 vue项目调用接口是阿里云的&#xff0c;H5网站也要部署到阿里云&#xff0c;2个不同的服务器&#xff0c;需要做nginx部署与api代理。 端口配置 首先当然是买个阿里云服务器&#xff0c;这里是配置是linux系统&#xff0c;配置访问的域名 &#xff0c;再接着&#xff1…

【李沐深度学习笔记】数据操作

本课观看地址 数据操作p1 N维数组样例 N维数组是机器学习和神经网络的主要数据结构 1-d向量就是样本的各特征抽象成一个向量&#xff1b;2-d矩阵的每一行是一个样本&#xff0c;每一行都是一个样本的特征向量 3-d可以表示RGB图片&#xff0c;RGB图像是一个三维数组&#xff…

MarkText如何实现图床-解决md上传到csdn图片不显示的问题

安装picgo-core-这样做无法自动上传截图 npm install picgo -g配置-此处以github为例 picgo set uploader github生成token settings>Developer settings>Personal access tokens>Token(classic) 配置MarkText 点击左下角的设置在弹出的窗口后选择左边的Image在右…

学习Bootstrap 5的第十三天

目录 提示框 如何创建提示框 实例 指定提示框的位置 实例 弹出框 如何创建弹出框 实例 指定弹出框的位置 实例 关闭弹出框 实例 提示框 提示框是一个小小的弹窗&#xff0c;在鼠标移动到元素上显示&#xff0c;鼠标移到元素外就消失。 如何创建提示框 Bootstrap…

VIRTIO-SCSI代码分析(2)VIRTIO 驱动分析

QEMU模拟出VIRTIO SCSI设备后&#xff0c;在虚拟机中呈现SCSI设备和PCIE设备。而在虚拟机中&#xff0c;PCIE设备与VIRTIO PCI驱动匹配触发virtio_pci_probe()注册生成virtio设备&#xff0c;而virtio设备与虚拟机中的virtio驱动匹配触发对应probe函数最终注册对应的驱动。 这里…

T5 和 mT5

T5Architecture&#xff1a;The Best One1. Main Body2. Embedding3. Pertrain and Finetune4. Multi-Task Pertrain and Finetune5. T5总结 mT5 T5&#xff1a;https://arxiv.org/pdf/1910.10683.pdf T5 blog: https://ai.googleblog.com/2020/02/exploring-transfer-learning…

无涯教程-JavaScript - AGGREGATE函数

描述 返回列表或数据库中的聚合。 AGGREGATE函数可以将不同的聚合函数应用于列表或数据库,并且可以选择忽略隐藏的行和错误值。 AGGREGATE函数具有两种不同的格式- 参考格式数组格式 参考格式 语法 AGGREGATE (function_num, options, ref1, [ref2] …)争论 Argument描述…

Linux驱动中断与时间篇——中断下半部的三种方法

文章目录 什么是中断下半部softirq软中断实例 tasklettasklet使用tasklet实例 work queue 什么是中断下半部 当产生一个中断时&#xff0c;会进入中断处理程序。 但中断处理程序必须快速、异步、简单的对硬件做出迅速响应并完成那些时间要求很严格的操作。 因此&#xff0c;对…

课程学习成绩评分F2计算器

前言&#xff1a; 由于大二的时候计算成绩太麻烦了&#xff0c;特别是综测评定小组还需要验证其他同学的是否正确&#xff0c;对于这种重复性高的工作&#xff0c;首先要想到的就是用计算机来实现&#xff0c;想起来上学期学了一点Java&#xff0c;就想简单的写一个程序。 C …

【PowerQuery】PowerBI Pro账户的自动刷新

在数据和模型通过发布或者上传方式上传到PowerBI Pro中,如何来进行数据刷新呢?数据源依然在本地,而数据模型已经发布到PowerBI Pro云端服务中。如果数据源更新,我们的模型如何进行自动刷新呢? PowerBI Pro如果需要基于本地数据源更新进行模型更新需要部署相应的数据网关服…

Pytorch学习笔记(模型训练)

模型训练 在同一个包下创建train.py和model.py&#xff0c;按照步骤先从数据处理&#xff0c;模型架构搭建&#xff0c;训练测试&#xff0c;统计损失&#xff0c;如下面代码所示 train.py import torch.optim import torchvision from torch import nn from torch.utils.da…

Leetcode165. 比较版本号

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码如下&#xff1a; class Solution {public int compareVersion(String version1, String version2) {int i 0, j 0;while(i < version1.length() || j < version2.length()){long num1 0…