目标检测——目标检测概述

目标检测

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

常用的开源数据集

PASCAL VOC数据集

在这里插入图片描述
下载地址
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MS COCO数据集

在这里插入图片描述

常用的评价指标

IOU(交并比)

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

import numpy as np

def IOU(box1,box2,wh=False):
    #判断表示方式
    if wh==False:
        #极坐标表示
        xmin1,ymin1,xmax1,ymax1=box1
        xmin2,ymin2,xmax2,ymax2=box2
    else:
        #中心点坐标表示
        #第一框
        xmin1,ymin1=int(box1[0]-box1[2]/2.0),int(box1[1]-box1[3]/2.0)
        xmax1,ymax1=int(box1[0]+box1[2]/2.0),int(box1[1]+box1[3]/2.0)
        #第二框
        xmin2,ymin2=int(box2[0]-box2[2]/2.0),int(box2[1]-box2[3]/2.0)
        xmax2,ymax2=int(box2[0]+box2[2]/2.0),int(box2[1]+box2[3]/2.0)
    #获取交集的左上角和右下角坐标
    xx1=np.max(xmin1,xmin2)
    yy1=np.max(ymin1,ymin2)
    xx2=np.min(xmax2,xmax1)
    yy2=np.min(ymax1,ymax2)
    #计算交集面积
    inter_area=(np.max(0,xx2-xx1))*(np.max(0,yy2-yy1))
    #计算并的面积
    area1=(xmax1-xmin1)*(ymax1-ymin1)
    area2=(xmax2-xmin2)*(ymax2-ymin2)
    union_area=area1+area2-inter_area
    #IOU
    IOU=inter_area/(union_area+1e-6)
    return IOU
import matplotlib.pyplot as plt
import matplotlib.patches as patches #给图像打上矩形框

#真是框 预测框
true_box=[100,35,398,400]
pre_box=[40,150,355,398]
#将框绘制在图像上
img=plt.imread('dog.jpeg')
fig=plt.imshow(img)
#将真实框和预测框绘制在图像上
fig.axes.add_patch(plt.Rectangle((true_box[0],
                                  true_box[1],
                                  width=true_box[2]-true_box[1],
                                  height=true_box[3]-true_box[1],
                                  fill=False,
                                  edgcolor='blue',
                                  linewidth=2)))
fig.axes.add_patch(plt.Rectangle((pre_box[0],
                                  pre_box[1],
                                  width=pre_box[2]-pre_box[1],
                                  height=pre_box[3]-pre_box[1],
                                  fill=False,
                                  edgcolor='red',
                                  linewidth=2)))

在这里插入图片描述

IOU(ture_box,pre_box)

0.5114435907762924

mAP(Mean Average Precision)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
voc2010前,求取Recall11个点对应的presion,求平均
voc2010后,使用分段函数的线下面积

NMS(非极大值抑制)

去除冗余检测框,保留最好的一个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

def nms(boxes,score,thre):
    #容错处理
    if (len(boxes)==0):
        return [],[]
    #类型转换
    #box使用极坐标
    boxes=np.array(boxes)
    score=np.array(score)
    #获取左上角和右下角坐标
    x1=boxes[:,0]
    y1=boxes[:,1]
    x2=boxes[:,2]
    y2=boxes[:,3]
    #计算面积
    areas=(x2-x1)*(y2-y1)
    #NMS
    picked_boxes=[]
    picked_socre=[]
    #排序:小->大
    order=np.argsort(score)
    while order.size>0:
        #获取score最大的索引
        index=order[-1]
        #保留下来
        picked_boxes.append(boxes[index])
        picked_score.append(score[index])
        #计算IOU
        #交的面积
        x11=np.maximum(x1[index],x1[order[:-1]])
        y11=np.maximum(y1[index],y1[order[:-1]])
        x22=np.maximum(x2[index],x2[order[:-1]])
        y22=np.maximum(y2[index],y2[order[:-1]])
        w=np.maximum(0.0,x22-x11)
        h=np.maximum(0.0,y22-y11)
        inter_area=w*h
        #交并比
        iou=inter_area/(areas[index]+areas[order[:-1]]-inter_area)
        #删除冗余框
        keep_boxes=np.where(iou<thre)
        #更新order
        order=order[keep_boxes]
    return picked_boxes,picked_score
bounding=[(187,82,337,317),(150,67,305,282),(246,121,368,304)]
confidence_score=[0.9,0.65,0.8]
threshold=0.5

box,score=nms(bounding,confidence_score,threshold)

目标检测方法分类

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

猜你喜欢

转载自blog.csdn.net/qq_40527560/article/details/131692076