java 实现非极大值抑制
数据预处理
对于物体检测的结果bbox[][] 和 scores[],假设输出结果有M个,bbox.shape = [M, 4],scores.shape =[M*N], N 为检测物体的类的数目。对于单类的物体检测,可以直接使用;若想应用于多类的物体检测,则需要对检测结果做一步处理,遍历scores数组,将每个结果的置信度最大值保存至一个长度为M的一维数组,同时存下对应的类至另一个数组(如第i个bbox对于苹果的置信度是0.3,对于香蕉的置信度是0.7,那就把0.7和香蕉分别保存到两个List里面)。
List<Float> bbox_max_scores = new ArrayList<>();
List<Integer> bbox_max_scores_classes = new ArrayList<>();//0表示apple,1表示bananafor (int i = 0; i < scores.length; i += 2) {if (score[i] > score[i + 1]) {bbox_max_scores_classes.add(0);bbox_max_scores.add(score[i]);} else {bbox_max_scores_classes.add(1);bbox_max_scores.add(score[i + 1]);}}
然后对bbox_max_scores进行非极大值抑制,得到结果后再查找对应下标,得到这个bbox对应的类是苹果还是香蕉。
非极大值抑制
给定阈值CONF_THRESH, 提取出所有置信度大于阈值的bbox的下标和值,按照置信度升序排列,开始:
1.循环取出得分最高的bbox,保存到pickList,计算剩余所有bbox与它的交并比,移除所有iou大于iou_thresh的bbox以及它本身;
2.在剩余的bbox中重复第一步的过程;
3.直到pickList里元素多于NUM_DETECTIONS,或者所有bbox都计算完毕,退出循环。
public List<Integer> single_class_non_max_suppression(float[][] bboxes, List<Float> confidences) {if (bboxes.length == 0)return null;List<Integer> conf_keep_idx = new ArrayList<>();//保存置信度大于CONF_THRESH的元素的下标List<Float> new_confidences = new ArrayList<>();//保存置信度大于CONF_THRESH的元素的值for (int i = 0; i < confidences.size(); i++) {float confidence = confidences.get(i);if (confidence> CONF_THRESH){conf_keep_idx.add(i);new_confidences.add(confidence);}}if (conf_keep_idx.isEmpty())return null;int alive_idx_size = conf_keep_idx.size();List<Idxs> idxsList = new ArrayList<>();//将置信度与下标对应for (int i = 0; i < alive_idx_size; i++) {Idxs idxs = new Idxs(conf_keep_idx.get(i), new_confidences.get(i));idxsList.add(idxs);}//按score升序排列Collections.sort(idxsList);float overlap_xmin, overlap_ymin, overlap_xmax, overlap_ymax;float overlap_w, overlap_h, overlap_area, overlap_ratio;//取出得分最高的bbox,计算剩下的bbox与它的交并比iou,去掉大于iou_thresh的bboxList<Integer> pickList = new ArrayList<>();while (idxsList.size() > 0) {sleep(20);int last = idxsList.size() - 1;if(pickList.size() >= NUM_DETECTIONS)//取置信度最高的NUM_DETECTIONS个结果break;int last_index = idxsList.get(last).getIndex();float last_area = (bboxes[last_index][2] -bboxes[last_index][0]) * (bboxes[last_index][3] -bboxes[last_index][1]);//area=(xmax-xmin)*(ymax-ymin)pickList.add(last_index);List<Idxs> idxs_to_remove = new ArrayList<>();//交并比过大需要移除的bboxfor (int i = 0; i < last; i++) {int i_index = idxsList.get(i).getIndex();overlap_xmin = Math.max(bboxes[last_index][0], bboxes[i_index][0]);overlap_ymin = Math.max(bboxes[last_index][1], bboxes[i_index][1]);overlap_xmax = Math.min(bboxes[last_index][2], bboxes[i_index][2]);overlap_ymax = Math.min(bboxes[last_index][3], bboxes[i_index][3]);overlap_w = Math.max(0, overlap_xmax - overlap_xmin);overlap_h = Math.max(0, overlap_ymax - overlap_ymin);overlap_area = overlap_w * overlap_h;float i_area = (bboxes[i_index][2] -bboxes[i_index][0]) * (bboxes[i_index][3] -bboxes[i_index][1]);overlap_ratio = overlap_area / ( last_area + i_area - overlap_area);//IOUif (overlap_ratio > IOU_THRESH)idxs_to_remove.add(idxsList.get(i));}idxs_to_remove.add(idxsList.get(last));idxsList.removeAll(idxs_to_remove);}return pickList;}
pickList里存放的是满足条件的bbox的下标,得到下标之后再去查找对应bbox的xmin, ymin, xmax, ymax和这个框的物体检测的类(class)和置信度(score)。
java 实现非极大值抑制相关推荐
- Non-Maximum Suppression,NMS非极大值抑制
Non-Maximum Suppression,NMS非极大值抑制 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜 ...
- 【目标检测系列】非极大值抑制(NMS)的各类变体汇总
关注上方"深度学习技术前沿",选择"星标公众号", 技术干货,第一时间送达! [导读]前面已经先后为大家详细介绍过了目标检测领域的基础知识:[目标检测基础积累] ...
- 非极大值抑制_非极大值抑制(Non-Maximum Suppression)
文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 1. 什么是非极大值抑制 非极大值抑制,简称为NMS算法,英文为Non-Maximum Suppression.其思想是搜 ...
- 3.7 非极大值抑制-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
←上一篇 ↓↑ 下一篇→ 3.6 交并比 回到目录 3.8 Anchor Boxes 非极大值抑制 (Non-max Suppression) 到目前为止你们学到的对象检测中的一个问题是,你的算法可能 ...
- array python 交集_NMS原理(非极大值抑制)+python实现
1.先解释什么叫IoU(intersection-over-union).IoU表示(A∩B)/(A∪B) 即交并比. 非极大值抑制:图一 --> 图二 ,剔除同一个目标上的重叠建议框,最终一个 ...
- sklearn逻辑回归 极大似然 损失_收藏!攻克目标检测难点秘籍二,非极大值抑制与回归损失优化之路...
点击上方"AI算法修炼营",选择加星标或"置顶" 标题以下,全是干货 前面的话 在前面的秘籍一中,我们主要关注了模型加速之轻量化网络,对目标检测模型的实时性难点 ...
- 非极大值抑制(Non-maximum suppression)在物体检测领域的应用
转载自:http://blog.csdn.net/pb09013037/article/details/45477591 一.Nms主要目的 在物体检测非极大值抑制应用十分广泛,主要目的是为了消除多余 ...
- NMS 非极大值抑制
非极大值抑制(non maximum suppression,NMS),顾名思义就是抑制不是极大值的元素,搜索局部的极大值. 定位一个车辆时,算法可能会找出一堆候选框,为了从中找出最佳候选框,非极大值 ...
- yunyang tensorflow-yolov3 NMS:non maximum suppression 非极大值抑制方法
文章目录 NMS: non maximum suppression 非极大值抑制的背景 非极大值抑制的步骤 NMS: non maximum suppression 非极大值抑制的背景 生成器对一张图 ...
最新文章
- DELL equallogic 的MPIO配置
- 计算机三级数据库应用题设计题,2017年计算机三级《数据库技术》模拟应用题及答案...
- SCCM 2007系列4 播发操作系统上
- 计算机组成原理:中央处理器
- VTK:几何对象之Circle
- 计算机文化基础重点知识归纳,计算机文化基础_第二章重点知识总结(考试必备!!!)...
- Web前端期末大作业--绿色自适应医疗健康医院网页设计(HTML+CSS+JavaScript+)实现
- ECMAscript6(ES6)新特性语法总结(一)
- 志愿者公交车上当导游(图)
- 值得关注!2021音视频人才成长路线图发布了
- Python os 标准库使用
- 明解C语言第七章习题
- android js下载地址,js点击下载跳转iOS或安卓
- split(),slice(),splice()的区别与应用
- 金融风控之贷款违约预测
- 新款 iMac2021上手体验,这次你心动了吗
- 拓嘉辰丰电商:拼多多店铺指标有哪些对于参加活动比较重要
- python get方法列表参数_python中requests库get方法带参数请求
- Excel如何快速简单的设置3级下拉菜单?
- 41.Java HashMap有序集合