欢迎来到科技玩吧!
目标检测中的非最大值抑制算法
发布日期:2023-03-19 12:22:44 | 来源:磐创AI | 作者:磐创AI

计算机视觉是人工智能的一个重要领域,它可以识别和理解图像和场景。

它包括图像识别、目标检测、图像分割、图像生成、图像超分辨率等多个子领域。由于大量的实际用例,目标检测可能应用地最广。

目标检测

目标检测是指计算机系统定位图像中的目标并识别每个目标的能力。目标检测已广泛应用于人脸检测、车辆检测、行人计数、安全系统和自动驾驶汽车。

目标检测模型从端到端学习范式的发展中受益匪浅:建议、特征和分类器成为一个神经网络,使一般目标检测的结果提高了两倍[1]通常,所有现代目标检测模型都遵循三个步骤:

1. 建议窗口的搜索空间(通过滑动窗口或使用建议的稀疏窗口)。

2. 使用分类器/回归器对窗口评分。

3. 组合可能属于同一对象的窗口。

最后一步称为“非最大抑制”

边界框

在目标检测中,我们通常使用边界框来描述目标在图像中的空间位置。

边界框是一个矩形,使用左上角和右下角坐标绘制。另一种常用的边界框表示法包含矩形的中心以及矩形的高度和宽度。

非最大值算法(NMS)

可以使用以下步骤解释该算法:

输入:边界框列表以及类名称和检测到的每个对象的输出概率。

1. 删除输出概率得分小于指定阈值的边界框。

2. 按输出概率的降序排列剩余边界框的列表。

3. 遍历已排序的边界框列表,直到至少剩下一个元素。

4. 从列表中删除第一个边界框,并将其标记为“当前元素”。此外,检查交并比(IOU)。如果IOU高于指定的阈值,则从列表中删除该元素,并将当前元素附加到“最终列表”中

5. 重复步骤3和4。

6. 返回“最终列表”

NMS算法试运行

假设下面的图像(图1)包含两条狗(左一条:Maya,右一条:Zoro),我们有一个对象检测模型,可以区分图像中的Maya和Zoro。

在使用上图对我们的目标检测模型(无NMS)进行推断时,我们将得到如图2所示的输出。在这里,我们可以看到,我们在单个对象上得到了多个具有各自概率分数的边界框。

我们的目标是为对象选择最合适的边界框。换句话说,我们必须从概率为0.94、0.68和0.47的三个框中选择一个Maya边界框。同样,我们也必须从概率为0.9和0.58的两个边界框中找到Zoro的最佳边界框。

根据算法,我们将首先丢弃所有概率分数低于指定阈值的边界框。例如,如果我们将阈值设置为0.5,我们将丢弃Maya概率为0.47的边界框。

此外,我们将找到概率得分最高的边界框,并将其IOU与同类的所有其他边界框进行检查。如果IOU高于阈值(表示相同的对象),则丢弃概率分数较低的边界框。

同样,我们将对图像中所有检测到的对象执行以下步骤。最终输出如图3所示。

代码

首先,我们将初始化概率置信阈值和IOU阈值。例如,如果一个边界框的概率低于概率置信阈值,那么我们将丢弃该边界框。同样,如果IOU分数高于定义的阈值,我们不会考虑输出概率低的边界框。

import cv2
  class NMS:
      def __init__(self) -> None:
      self.conf = 0.5
      self.iou_threshsold = 0.4

下面截取的代码中的IOU函数计算两个区域的IOU。IOU是两个区域的相交面积与两个区域的并集的比率。在IOU函数中,bboxes1和bboxes2是一个包含以下四个元素的列表:

[ X(top-left), Y(top-left), X(bottom-right), Y(bottom-right) ]

def IOU(self, bboxes1, bboxes2):
     bboxes1 = [int(i) for i in bboxes1]
     bboxes2= [int(i) for i in bboxes2]
 
     xA = max(bboxes1[0], bboxes2[0])
     yA = max(bboxes1[1], bboxes2[1])
     xB = min(bboxes1[2], bboxes2[2])
     yB = min(bboxes1[3], bboxes2[3])
     intersection_area = max(0, xB - xA + 1) * max(0, yB - yA + 1)
     box1_area = (bboxes1[2] - bboxes1[0] + 1) * (bboxes1[3] - bboxes1[1] + 1)
     box2_area = (bboxes2[2] - bboxes2[0] + 1) * (bboxes2[3] - bboxes2[1] + 1)

     iou = intersection_area / float(box1_area + box2_area - intersection_area)
 
     return iou

下面的代码在图像上绘制边界框,并将概率分数放在框的顶部。参数“images”是图像对象,“bboxes_list”包含检测到的对象的坐标、类和概率输出。

bboxes_list = [class, X(top-left), Y(top-left), X(bottom-right), Y(bottom-right), output_probability]
  Sample values:
  0 187 90 586 607 0.94
  0 120 116 600 370 0.68
  1 511 185 961 418 0.58
  0 340 145 568 478 0.47
  1 524 70 920 565 0.92

def draw_overlay(self, image, bboxes_list):
      overlay_color = {
        '0' : (0, 255, 0),
        '1' : (255, 0, 0)
      }
      overlay_thickness = 3
      font = cv2.FONT_HERSHEY_SIMPLEX
      for coord in bboxes_list:
        class_name = coord[0]
        start_point = (int(coord[1]), int(coord[2]))
        end_point = (int(coord[3]), int(coord[4]))
        prob = float(coord[5])
        text_start_point = (int(coord[1]), int(coord[2]) - 10)
 
        image = cv2.rectangle(image, start_point, end_point,
             overlay_color[class_name], overlay_thickness)
        image = cv2.putText(image, str(prob), text_start_point,
           font, 0.8, overlay_color[class_name], overlay_thickness - 1, cv2.LINE_AA)
 
      cv2.imshow("im", image)
      cv2.waitKey(0)
      cv2.destroyAllWindows()

以下函数是上述NMS算法的实现。此函数用于在应用非最大值抑制算法后返回所需的边界框。

def nms(self, image, bboxes_list):
    req_bboxes, final_boxes = [], []
    for coord in bboxes_list:
       prob = float(coord[5])
       if prob > self.conf:
        req_bboxes.append(coord)
   # sorting the bounding boxes based on probability score
   bboxes_sorted = sorted(req_bboxes, reverse=True, key=lambda x: x[5])
   while len(bboxes_sorted) > 0:
     # removing the best probability bounding box
     box = bboxes_sorted.pop(0)
     for b in bboxes_sorted:
    # comparing with the same class
     if box[0] == b[0]:
      iou = self.IOU(box[1:-1], b[1:-1])
      if iou >= self.iou_threshsold:
       # if IOU is large then discard the box with lowest probability
       bboxes_sorted.remove(b)
     print(len(bboxes_sorted))
     final_boxes.append(box)
  return final_boxes

以下是NMS类的驱动程序代码。我们首先读取coordinates.txt获取边界框的坐标和其他详细信息;然后,我们应用NMS算法来获得所需的边界框。

if __name__ == "__main__":
      image = cv2.imread("zoraya.jpg")
      with open("coordinates.txt", 'r') as f:
         data = f.readlines()
      data = [i[:-1].split(' ') for i in data]
      obj = NMS()
      obj.draw_overlay(image, data)
      final_boxes = obj.nms(image, data)
      obj.draw_overlay(image, final_boxes)

coordinates.txt
   0 187 90 586 607 0.94
   0 120 116 600 370 0.68
   1 511 185 961 418 0.58
   0 340 145 568 478 0.47
   1 524 70 920 565 0.92

结论

本文概述了对非最大值抑制算法的需求以及python实现。此外,我们还使用一个图像示例解释了该算法。

网站简介

科技玩吧是一个聚焦科技与创新的资讯平台,我们将提供有趣而专业的内容,包括家电数码、人工智能、区块链、物联网、云计算、科技生活等相关讯息,拥有科技内容报道、科技时事热评、新品评测等内容形式,覆盖核心新媒体平台。

科技玩吧运营主体为天津笔尖文化传媒有限公司,隶属于亿媒汇(北京)整合营销顾问有限公司。亿媒汇(北京)整合营销顾问有限公司是一家植根于新媒体时代,深耕于网络整合营销十数年的新型网络公关公司,截至目前,公司凭借自身优势和丰富传播实践,业务范围已覆盖全国32个地区,服务逾2000家企业,拥有全国五大中心,数百起行业案例典范和独家优势资源,是在中国传播业内拥有良好声誉的整合营销服务公司。

联系我们

意见反馈:zhangmiao@bjyimeihui.com.cn

稿件投诉:zhangmiao@bjyimeihui.com.cn

内容合作QQ:852324779

商务合作:BD@bjyimeihui.com.cn

微信公众号

Copyright ©2021 天津笔尖文化传媒有限公司 iyiou.com. All Rights Reserved            ICP许可证:京B2-20190160 | 津ICP备2021006600号-1 | 京公网安备11010502039453号

忘记密码?
*用户名
*手机号
*输入验证码
*设置密码(6位数以上+字母)
*再次输入密码
找回密码
*手机号
*输入验证码
*设置密码(6位数以上+字母)
*再次输入密码
科技玩吧用户注册协议与隐私政策

请您细阅此重要提示,并完整阅读根据您的具体情况进行选择。


请您确认您或您所代表的机构是符合《中华人民共和国证券投资基金法》、《中华人民共和国信托法》、《私募投资基金监督管理暂行办法》、《信托公司集合资金信托计划管理办法》、《证券公司客户资产管理业务管理办法》、《证券公司集合资产管理业务实施细则》、《基金管理公司特定客户资产管理业务试点办法》及其他相关法律法规所认定的合格投资者。


一、根据我国《私募投资基金监督管理暂行办法》的规定,私募基金合格投资者的标准如下:

1、具备相应风险识别能力和风险承担能力,投资于单只私募基金的金额不低于100万元且符合下列相关标准的单位和个人:

(1)净资产不低于1000万元的单位;

(2)个人金融资产不低于300万元或者最近三年个人年均收入不低于50万元。(前款所称金融资产包括银行存款、股票、债券、基金份额、资产管理计划、银行理财产品、信托计划、保险产品、期货权益等。)

2、下列投资者视为合格投资者:

(1)社会保障基金、企业年金、慈善基金;

(2)依法设立并受国务院金融监督管理机构监管的投资计划;

(3)投资于所管理私募基金的私募基金管理人及其从业人员;

(4)中国证监会规定的其他投资者。


二、根据我国《信托公司集合资金信托计划管理办法》的规定,信托计划合格投资者的标准如下:

1、投资一个信托计划的最低金额不少于100万元人民币的自然人、法人或者依法成立的其他组织;

2、个人或家庭金融资产总计在其认购时超过100万元人民币,且能提供相关财产证明的自然人;

3、个人收入在最近三年内每年收入超过20万元人民币或者夫妻双方合计收入在最近三年内每年收入超过30万元人民币,且能提供相关收入证明的自然人。


三、根据我国《证券公司客户资产管理业务管理办法》的规定,集合资产管理计划合格投资者的标准如下:

1、个人或者家庭金融资产合计不低于100万元人民币;

2、公司、企业等机构净资产不低于1000万元人民币。


依法设立并受监管的各类集合投资产品视为单一合格投资者。


如果确认您或您所代表的机构是一名“合格投资者”,并将遵守适用的有关法规请点击“接受”键以继续浏览本公司网站。如您不同意任何有关条款,请直接关闭本网站。


“本网站”指由上海景林资产管理有限公司(以下简称“本公司”)所有并及其网站内包含的所有信息及材料。本网站所发布的信息、观点和数据有可能因所基于的信息发布日之后的情势或其他因素的变更而不再准确或失效,本公司不承诺及时更新不准确或过时的信息、观点以及数据。


本网站介绍的信息、观点和数据仅供一般性参考,不应被视为购买或销售任何金融产品的某种要约,亦非对任何交易的正式确认。投资有风险,投资产品的过往业绩并不预示其未来表现,本公司不对产品财产的收益状况做出任何承诺或担保,投资者不应依赖本网站所提供的数据做出投资决策,在做出投资决策前应认真阅读相关产品合同及风险揭示等宣传推介文件,并自行承担投资风险。