数据预处理

对于物体检测的结果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 实现非极大值抑制相关推荐

  1. Non-Maximum Suppression,NMS非极大值抑制

    Non-Maximum Suppression,NMS非极大值抑制 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜 ...

  2. 【目标检测系列】非极大值抑制(NMS)的各类变体汇总

    关注上方"深度学习技术前沿",选择"星标公众号", 技术干货,第一时间送达! [导读]前面已经先后为大家详细介绍过了目标检测领域的基础知识:[目标检测基础积累] ...

  3. 非极大值抑制_非极大值抑制(Non-Maximum Suppression)

    文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 1. 什么是非极大值抑制 非极大值抑制,简称为NMS算法,英文为Non-Maximum Suppression.其思想是搜 ...

  4. 3.7 非极大值抑制-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.6 交并比 回到目录 3.8 Anchor Boxes 非极大值抑制 (Non-max Suppression) 到目前为止你们学到的对象检测中的一个问题是,你的算法可能 ...

  5. array python 交集_NMS原理(非极大值抑制)+python实现

    1.先解释什么叫IoU(intersection-over-union).IoU表示(A∩B)/(A∪B) 即交并比. 非极大值抑制:图一 --> 图二 ,剔除同一个目标上的重叠建议框,最终一个 ...

  6. sklearn逻辑回归 极大似然 损失_收藏!攻克目标检测难点秘籍二,非极大值抑制与回归损失优化之路...

    点击上方"AI算法修炼营",选择加星标或"置顶" 标题以下,全是干货 前面的话 在前面的秘籍一中,我们主要关注了模型加速之轻量化网络,对目标检测模型的实时性难点 ...

  7. 非极大值抑制(Non-maximum suppression)在物体检测领域的应用

    转载自:http://blog.csdn.net/pb09013037/article/details/45477591 一.Nms主要目的 在物体检测非极大值抑制应用十分广泛,主要目的是为了消除多余 ...

  8. NMS 非极大值抑制

    非极大值抑制(non maximum suppression,NMS),顾名思义就是抑制不是极大值的元素,搜索局部的极大值. 定位一个车辆时,算法可能会找出一堆候选框,为了从中找出最佳候选框,非极大值 ...

  9. yunyang tensorflow-yolov3 NMS:non maximum suppression 非极大值抑制方法

    文章目录 NMS: non maximum suppression 非极大值抑制的背景 非极大值抑制的步骤 NMS: non maximum suppression 非极大值抑制的背景 生成器对一张图 ...

最新文章

  1. DELL equallogic 的MPIO配置
  2. 计算机三级数据库应用题设计题,2017年计算机三级《数据库技术》模拟应用题及答案...
  3. SCCM 2007系列4 播发操作系统上
  4. 计算机组成原理:中央处理器
  5. VTK:几何对象之Circle
  6. 计算机文化基础重点知识归纳,计算机文化基础_第二章重点知识总结(考试必备!!!)...
  7. Web前端期末大作业--绿色自适应医疗健康医院网页设计(HTML+CSS+JavaScript+)实现
  8. ECMAscript6(ES6)新特性语法总结(一)
  9. 志愿者公交车上当导游(图)
  10. 值得关注!2021音视频人才成长路线图发布了
  11. Python os 标准库使用
  12. 明解C语言第七章习题
  13. android js下载地址,js点击下载跳转iOS或安卓
  14. split(),slice(),splice()的区别与应用
  15. 金融风控之贷款违约预测
  16. 新款 iMac2021上手体验,这次你心动了吗
  17. 拓嘉辰丰电商:拼多多店铺指标有哪些对于参加活动比较重要
  18. python get方法列表参数_python中requests库get方法带参数请求
  19. Excel如何快速简单的设置3级下拉菜单?
  20. 41.Java HashMap有序集合

热门文章

  1. 酷Q插件_SDK———入门与使用
  2. post 与get 区别,为什么现在的HTTP通信中大多数请求还是使用get?
  3. 网络对抗 Exp4 恶意代码分析 20154311 王卓然
  4. 《王者圣域》2.23上线链游玩家|放置塔防、趣味竞技
  5. R语言caret机器学习(一)数据可视化:绘制特征变量图
  6. TransReID学习记录
  7. python 生成英文字母对应顺序字典
  8. LaTex入门【记录】
  9. SDWebImage使用详解
  10. 先序序列和后序序列并不能唯一确定二叉树