nms-python和C

2023-10-31

代码

import  numpy as np

def nms(bboxes, iou_threshold):
    x1 = bboxes[:, 0]
    y1 = bboxes[:, 1]
    x2 = bboxes[:, 2]
    y2 = bboxes[:, 3]
    score = bboxes[:, 4]
    area = (x2 - x1 + 1) * (y2 - y1 + 1)
    index = area.argsort()[::-1]
    res = []
    while index.size > 0:
        i = index[0]
        res.append(i)
        xx1 = np.maximum(x1[i], x1[index[1:] ])
        yy1 = np.maximum(y1[i], y1[index[1:] ])
        xx2 = np.minimum(x2[i], x2[index[1:] ])
        yy2 = np.minimum(y2[i], y2[index[1:] ])
        width = np.maximum(0, (xx2 - xx1 + 1))
        height = np.maximum(0, (yy2 - yy1 + 1))
        o_area = width * height
        print("o_area ", o_area)
        iou = o_area / (area[i] + area[index[1:]] - o_area)
        print("iou ", iou)
        ne_inde = np.where(iou <= iou_threshold)[0]
        index = index[ne_inde +1]
    return res

off = 10
print(off)
#
bboxes = np.array([[10, 10, 10 + off, 10 + off, 0.91], [12, 12, 12 + off, 12 + off, 0.9] , [14, 14, 14+off, 14+ off, 0.7], [15, 15, 15+off, 15+ off, 0.8]])
res = nms(bboxes, 0.3)
print(res)



/*
 ============================================================================
 Name        : NMS.c
 Author      : yiqun
 Version     :
 Copyright   : Your copyright notice
 Description : NMS in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <iostream>

#define MAX(a,b)(a>b?a:b)
#define MIN(a,b)(a<=b?a:b)
#define BOX_SIZE 4
#define THRESH 0.3f

//候选框
typedef struct {
    float lx, ly, rx, ry;	//左上角x  左上角y	 右下角x	 右下角y
    float cfd;	//置信度 Confidence
    int supression; //是否被抑制
} box;

//float overlap(float a_l, float a_r, float b_l, float b_r);
//
传入两个候选框变量某一维度坐标值,返回重叠部分的宽和高
//float overlap(float a_l, float a_r, float b_l, float b_r) {	//返回值是否可以优化??//传入指针是否更快??
//    //printf("a左边: %f,a右边: %f,b左边: %f,b右边: %f", a_l, a_r, b_r, b_r);
//    float sum_sides = a_r - a_l + b_r - b_l;	//同一方向两个边长之和	//是否要绝对值
//    float new_sides = MAX(a_r, b_r) - MIN(a_l, b_l);	//同一方向长度并集 //用max还是绝对值??优化。
//    return  sum_sides - new_sides;
//}

传入两个候选框变量a、b,返回相交面积值
//float box_intersection(box *a, box *b)	//传入指针是否更快??
//{
//    float w = overlap(a->lx, a->rx, b->lx, b->rx);
//    float h = overlap(a->ly, a->ry, b->ly, b->ry);
//    //printf("w: %f, h: %f", w, h);
//    if (w <= 0 || h <= 0) return 0;
//    float area = w * h;	//直接返回 不创建变量??
//    return w * h;
//}

传入两个候选框变量a、b,返回并集面积值
//float box_union(box *a, box *b) {	//传入指针是否更快??
//    float insersection = box_intersection(a, b);	//减少函数调用还是开辟变量空间进行优化??
//    float areaA = (a->rx - a->lx) * (a->ly - a->ry);	//是否使用绝对值??
//    float areaB = (b->rx - b->lx) * (b->ly - b->ry);
//    float area = areaA + areaB - insersection;	//直接返回 不创建变量??
//    return area;
//}


float box_area(box *a){
    float w = MAX((a->rx - a->lx + 1), 0);
    float h = MAX((a->ry - a->ly + 1), 0);
    return w * h;
}

float box_com(box *a, box *b){
    float x1 = MAX(a->lx, b->lx);
    float y1 = MAX(a->ly, b->ly);
    float x2 = MIN(a->rx, b->rx);
    float y2 = MIN(a->ry, b->ry);
    float w = MAX(0, (x2 - x1 + 1));
    float h = MAX(0, (y2 - y1 + 1));
    float o_area = w * h;
    return o_area;
}


float box_iou2(box *a, box *b){
    float o_area = box_com(a, b);
    float a_a = box_area(a);
    float b_a = box_area(b);
    float iou = o_area / (a_a + b_a  - o_area);
    return iou;
}
//传入两个候选框变量a、b,返回交并比值
//float box_iou(box *a, box *b) //传入指针是否更快??
//{
//    std::cout << box_intersection(a, b) << std::endl;
       iou = o_area / (area[i] + area[index[1:]] - o_area)
//    return box_intersection(a, b)/box_union(a, b);	//dsp可进行除法优化!!
//}

//归并排序
void merge(box* B, box* temp, int l, int mid, int r) {
    int i = l, j = mid + 1, m = 1, k = 1;
    while (i <= mid && j <= r) {
        if ((B + i)->cfd < (B + j)->cfd)
            *(temp + m++) = *(B + j++);
        else
            *(temp + m++) = *(B + i++);
    }
    while (i <= mid)
        *(temp + m++) = *(B + i++);
    while (j <= r)
        *(temp + m++) = *(B + j++);
    for (k = 1; k <= r - l + 1; k++)
        *(B + l + k - 1) = *(temp + k);
}

//按照置信度从大到小排序
void sort_nms(box* B, box* temp, int l, int r) {		//(数组查找和链表删除哪个费时)C++ ERASE()源码改写
    if (l < r) {
        int mid = (l + r) / 2;
        sort_nms(B, temp, l, mid);
        sort_nms(B, temp, mid + 1, r);
        merge(B, temp, l, mid, r);
    }
}

//NMS算法,传入出入候选框集合、输入候选框对应置信度集合、阈值,返回输出候选框个数
int do_nms(box* B, box*D, float Nt) {
    int i;
    for (i = 0; i < BOX_SIZE; i++)
        printf("d: %.2f\n", (B + i)->cfd);

    box* temp = (box*)malloc(sizeof(box) * (BOX_SIZE+1));
    sort_nms(B, temp, 0, (BOX_SIZE - 1));
    free(temp);

    for (i = 0; i < BOX_SIZE; i++)
        printf("d: %.2f\n", (B + i)->cfd);

    int max_index = 0, current_index = 0;
    int j;
    float iou;
    while (current_index< BOX_SIZE) {	//探究一轮循环的方法,与所以输出框比较,递归??
        printf("current_index: %d\n", current_index);
        if (!((B+current_index)->supression)) {
            *(D + max_index) = *(B + current_index);
            (B + current_index)->supression = 1;
            for (j = current_index+1; j < BOX_SIZE; j++) {
                iou = box_iou2(D + max_index, B + j);
                printf("iou: %f\n", iou);
                if (iou >= Nt)
                    (B + j)->supression = 1;
            }
            max_index++;
        }
        current_index++;
    }
    return max_index;
}

//数据集分配处理
void data_clean(box* b) {
    b[0].lx = 10.0;
    b[0].ly = 10.0;
    b[0].rx = 20.0;
    b[0].ry = 20.0;
    b[0].cfd = 0.91f;
    b[0].supression = 0;

    b[1].lx = 12.0;
    b[1].ly = 12.0;
    b[1].rx = 22.0;
    b[1].ry = 22.0;
    b[1].cfd = 0.90f;
    b[1].supression = 0;

    b[2].lx = 14.0;
    b[2].ly = 14.0;
    b[2].rx = 24.0;
    b[2].ry = 24.0;
    b[2].cfd = 0.70f;
    b[2].supression = 0;

    b[3].lx = 15.0;
    b[3].ly = 15.0;
    b[3].rx = 25.0;
    b[3].ry = 25.0;
    b[3].cfd = 0.80f;
    b[3].supression = 0;
}





int main(void) {
    box* b = (box*)malloc(sizeof(box) * BOX_SIZE);
//	float* s = (float*)malloc(sizeof(float) * BOX_SIZE);
    box* d = (box*)malloc(sizeof(box) * BOX_SIZE);
    data_clean(b);
    //计时器
    long i = 10000000L;
    clock_t start, finish;
    double duration;
    int count = 0;
    start = clock();
    /*******************/
    //while (i--) {
    count = do_nms(b, d, THRESH);
    printf("count: %d\n", count);
    //iou = box_iou(b+0,b+1);
    //}
    /*******************/
    finish = clock();
    duration = (finish - start) / CLOCKS_PER_SEC;
    printf("%f seconds\n", duration);
    //printf("IoU: %f\n", iou);
    //printf("s1: %f, s2: %f",*(s+0), *(s+1));
    if (d) {
        for (i = 0; i < count; i++)
            printf("d: %.2f\n", (d + i)->cfd);
    }
    free(b);
    free(d);
    system("pause");
    return EXIT_SUCCESS;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nms-python和C 的相关文章

  • 从面试官角度看Handler:掌握技巧,事半功倍!

    引言 在Android开发领域 Handler是一项关键技能 尤其在面试中 对Handler的深刻理解和熟练运用往往是衡量一位Android开发者水平的重要标志 本文将从面试官的角度出发 针对Android Handler技术展开详细的解析
  • 2024java面试看完这篇笔记薪资和offer稳了!

    新的一年抓住机会 不管跳槽涨薪 还是学习提升 这篇笔记你都不应该错过 为了帮大家节约时间 整理了这篇 Java面试 核心知识点整理 以及 金三银四高频面试合集 希望大家在新的一年都能拿到理想的薪资和offer 内容涵盖 计算机基础 Java
  • Java面试八股文及答案整理( 2023年 12月最新版,持续更新)

    一 Java 基础 1 JDK 和 JRE 有什么区别 JDK Java Development Kit 的简称 java 开发工具包 提供了 java 的开发环境和运行环境 JRE Java Runtime Environment 的简称
  • 年前去面了 6 家大厂,拿下 5 家 offer,进大厂好像也没有那么难吧......

    前言 十一月份的时候因为换工作的缘故 陆续参加了华为 阿里巴巴 字节跳动 拼多多 百度 Paypal 的社招面试 除了字节跳动流程较长 我主动结束面试以外 其他的都顺利拿到了 Offer 最近时间稍微宽裕点了 写个面经 希望对大家找工作有所
  • 面试vue3必知的八种周期

    Vue js 是一款流行的前端 JavaScript 框架 它提供了一套完整的响应式数据绑定和组件化的开发模式 Vue js 的生命周期指的是组件实例在创建 更新和销毁过程中所经历的一系列阶段 Vue js 的生命周期可以分为以下八个阶段
  • JavaOOP篇----第四篇

    系列文章目录 文章目录 系列文章目录 前言 一 Char类型能不能转成int类型 能不能转化成string类型 能不能转成double类型 二 什么是拆装箱 三 Java中的包装类都是那些 前言 前些天发现了一个巨牛的人工智能学习网站 通俗
  • 全网最全pytest大型攻略,单元测试学这就够了

    pytest 是一款以python为开发语言的第三方测试 主要特点如下 比自带的 unittest 更简洁高效 兼容 unittest框架 支持参数化 可以更精确的控制要测试的测试用例 丰富的插件 已有300多个各种各样的插件 也可自定义扩
  • 为什么要编写测试用例,测试用例写给谁看?

    为什么要编写测试用例 测试用例写给谁看 这个问题看似简单 但却涵盖了一系列复杂的考虑因素 并不太好回答 为了向各位学测试的同学们解释清楚 为什么编写测试用例是至关重要的 我将通过以下5个方面进行展开 1 为什么要写测试用例 2 测试用例写给
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • 为什么要编写测试用例,测试用例写给谁看?

    为什么要编写测试用例 测试用例写给谁看 这个问题看似简单 但却涵盖了一系列复杂的考虑因素 并不太好回答 为了向各位学测试的同学们解释清楚 为什么编写测试用例是至关重要的 我将通过以下5个方面进行展开 1 为什么要写测试用例 2 测试用例写给
  • 外包干了2个月,技术退步明显了...

    先说一下自己的情况 大专生 19年通过校招进入湖南某软件公司 干了接近4年的功能测试 今年8月份 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋
  • 从外卖员到程序员,自学3年终于转行成功,三面“拿下”拼多多

    前言 先来自我介绍 老家农村 家里好不容易把我送到大城市读书 大学非985 211 但在我们老家 能出一个本科大学生也是非常不容易的 因为农村信息的相对闭塞 我对大学专业一无所知 加上分数并非前茅 最后被调剂一个我并不喜欢的专业 这里就不透
  • 史上最全的中高级Java工程师面试题汇总有哪些?

    你有面试机会了吗 近期 肯定有很多小伙伴 投出去的简历HR基本上都是已读不回 甚至都没有任何回复 或者平台默认筛选 你的简历HR根本就看不到 即使有些小伙伴简历通过 收到面试邀请了 结果被通知不用面试了 还有些小伙伴 有面试机会了 甚至已经
  • 2024年最热门的15个科技工作岗位

    1 系统安全管理员 系统安全管理员的任务是确保公司的网络 数据和系统免受网络安全威胁 方法是确保有适当的安全战略并保持最新的合规性和策略 要求 应聘者应具有网络安全职位的工作经验 并对合规性和安全协议的最佳实践有坚实的基础 这个职位通常需要
  • 做好这几件事,30岁的你也能转行鸿蒙(HarmonyOS)?

    当你年过30 不管你愿不愿意承认 你的精力都在走下坡路 25岁熬一个通宵能写出来的代码 30岁有可能需要一整天 当然你也可以选择不拼精力和体力 当自身的一线经验积累到一定程度后 就会选择慢慢过渡到管理者的角色 通过经验分享及任务分配来参与项
  • 程序员找工作难!拿到外包公司的 offer 我应该去么?

    引言 前一阵子有一个帖子引起了非常广泛的讨论 描述的就是一个公司的外包工作人员 加班的时候因为吃了公司给员工准备的零食 被公司的HR当场批评 这个帖子一发出来 让现在测试行业日益新增的外包公司备受关注 那么外包公司和非外包公司有什么样的不一
  • 最新整理Java面试八股文,大厂必备神器

    在此 我采访了数十名大厂的面试官和上百的的面试者 总结出了这一套Java面试八股文 这套八股文已经帮助了上百人拿到自己心仪的offer 我们先来看看这套八股文 Java基础面试八股文 操作系统中 heap 和 stack 的区别 什么是基于
  • 外包干了2个月,技术倒退2年。。。

    先说一下自己的情况 本科生 20年通过校招进入深圳某软件公司 干了接近4年的 功能测试 今年国庆 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了3年的女朋
  • net-snmp解析代码,如何解析MIB?

    我在学习代码库 解析MIB In parse c and parse h代码保留一个哈希桶 indexed bucket tree list 还有一个树结构 其中包含一个指向的next指针Next node in hashed list o
  • ActiveMQ NMS:当代理关闭时,connection.start() 会因故障转移协议而挂起

    我有使用 nms activemq 1 5 0 的 C 应用程序 当我的应用程序启动时 它尝试使用故障转移协议连接到代理 我有两个主从配置的代理 如果两个经纪人都关闭了 我的应用程序就会因为以下原因而陷入等待状态 connection st

随机推荐

  • 再见Xshell,这款免费开源的终端工具真香~

    作为一名后端开发 在日常工作中肯定是要和服务器打交道的 自然也就需要使用终端工具 在 Windows 系统的电脑上我一直是使用 Xshell 以前还挺好用的 后面这款工具竟然把 ftp 功能给剥离出去了 单独搞了个 Xftp 这让我使用起来
  • 4.1-支持向量机

    文章目录 一 铰链损失 Hinge loss 二 核方法 Kernel Method 2 1 径向基函数核 Radial Basis Function Kernel 2 2 Sigmoid Kernel 三 支持向量机相关方法 SVM re
  • PyTorch学习日志_20201030_ Autograd 包

    日期 2020 10 30 主题 PyTorch入门 内容 根据PyTorch官方教程文档 学习PyTorch中所有神经网络的核心 Autograd 包的基础操作 主要与张量相关 根据自己的理解和试验 为代码添加少量注解 具体代码如下 fr
  • TCP往返传输时间(RTT)的估计

    TCP往返传输时间 RTT 的估计1 TCP传输往返时间是指发送端从发送TCP包开始到接收到它的立即响应所耗费的传输时间 当接收端和发送端同时支持TCP时戳选项时 发送端记录在TCP包头选项内的时戳可以被接收端随响应反射回来 发送端就可以利
  • Windows下OMNET++的安装和各种架构调试心得

    以下所述的为windows平台下OMNET 集成在MSVC6 0环境下的使用方法 一 OMNET的安装 1 到OMNET官方网站下载windows平台下的安装程序 当前版本为omnetpp 3 2p1 win32 下载Ghostscript
  • smart检测指标详解

    一 SMART概述 要说Linux用户最不愿意看到的事情 莫过于在毫无警告的情况下发现硬盘崩溃了 诸如RAID的备份和存储技术可以在任何时候帮用户恢复数据 但为预防硬件崩溃造成数据丢失所花费的代价却是相当可观的 特别是在用户从来没有提前考虑
  • linux下socket编程处理TCP粘包

    一 数据接收时会出现以下几种情况 一次接收到了客户端发送过来的一个完整的数据包 一次接收到了客户端发送过来的 N 个数据包 由于每个包的长度不定 无法将各个数据包拆开 一次接收到了一个或者 N 个数据包 下一个数据包的一部分 还是很悲剧 无
  • Redis内存数据库

    Redis内存数据库 NoSQL数据库简介 Redis简介 Redis应用场景 windows下安装和使用Redis 在linux下安装redis Redis数据可视化RedisDesktopManager Redis配置 Redis 数据
  • 无人机(总结的一个报告)

    无人机系统是配备了必要的数据处理单元 传感器 自动控制和通信系统 并且能够自动执行任务的系统 脑 能源 传感器 执行机构 无人系统分为 区域 无人空中系统 UAS 无人地面系统 UGS 无人海上系统 UMS 那么军用无人机系统未来的发展从哪
  • 如何用Jenkins和Perforce Helix Core搭建CI/CD管道

    Jenkins是常用的CI CD管道支持工具 在这一篇文章中 我们将详细讨论Jenkins对于CI CD管道的重要性 以及如何用Jenkins和Perforce Helix Core搭建CI CD管道 什么是Jenkins搭建的CI CD管
  • 使用Cmake封装API接口成Package方法

    本文是个人探究API封装成Package以让他人像使用OpeCV PCL等第三方库那样方便时所总结的经验 一 CmakeLists txt的编写 1 基本工程实现 cmake minimum required VERSION x x 最小C
  • c语言push操作的作用,C语言对栈的实现基本操作

    c语言中栈是一种数据结构 后进先出 即最后进入栈的数据最先弹出 c语言中没有栈这种数据类型 需要自己编程构建 下面我们就一起来了解一下c语言中栈的基本操作 C语言对栈的实现基本操作 操作如下 include include include
  • 重新学javaweb---路径专题

    绝对路径 以 开头的路径就叫做绝对路径 绝对路径在相对于的路径上直接拼接得到最终的路径 相对路径 不以 开头的路径就叫做相对路径 相对路径基于当前所在的路径计算的到最终的路径 硬盘路径 以盘符开头的路径就叫做硬盘路径 是哪个路径就是哪个路径
  • AKM项目轶事之客户南沙工厂Kick-off大会

    AKM项目轶事之客户南沙工厂Kick off大会 2014 10 29我们项目组一行十多号人 从上海飞往广州 参加客户在广州南沙工厂的项目Kick off meeting 项目启动大会 第二天 我们提前赶到客户办公室 在一个大会议室里面 我
  • 智能合约及其web3共识机制

    目录 什么是共识 什么是共识机制 共识机制的目标 为什么需要共识机制 如何评价一个共识机制的优劣 共识机制分类 PoW Proof of Work 工作量证明 多劳多得 PoS Proof of Stake 股权证明算法 持有越多 获得越多
  • 空域图像增强-图像灰度变换

    1 图像灰度变换 自选一张图片 完成以下图像处理 显示图像的灰度直方图 直方图均衡化 对比变化前后的图像和灰度直方图 对图像进行线性灰度变换 对某部分灰度值进行扩展 压缩其它灰度值区域 对比变化前后的图像和灰度直方图 图像增强 图像不清晰
  • CentOS7下安装helm

    1 先下载2 11 0版本 记住就下这个版本 其他版本要确认你有相应的镜像源 否则装不上 wget https get helm sh helm v2 11 0 linux amd64 tar gz tar xf helm v2 15 2
  • mybatis以及mybatisplus批量插入问题

    1 思路分析 批量插入是我们日常开放经常会使用到的场景 一般情况下我们也会有两种方案进行实施 如下所示 方案一 就是用 for 循环循环插入 优点 JDBC 中的 PreparedStatement 有预编译功能 预编译之后会缓存起来 后面
  • 嵌入式驱动那年的笔试面试-有干货

    面试简述 从9月份开始即吹响了找工作的号角 众说纷纭 有老师说9月份的没有必要 因为面向学历招聘 很抱歉啊 博主第一学历太渣了 研究生学历还可以把 有学生也因为数次的碰壁而退居幕后 准备这十月份的再次重来 但是残酷的现实证明 没有经过9月分
  • nms-python和C

    代码 import numpy as np def nms bboxes iou threshold x1 bboxes 0 y1 bboxes 1 x2 bboxes 2 y2 bboxes 3 score bboxes 4 area x