Py学习  »  机器学习算法

PyTorch深度学习实战(18)——目标检测基础

GIS研发 • 4 月前 • 100 次点击  

目标检测是计算机视觉领域中的重要任务,旨在识别图像或视频中的特定类别物体,并确定它们的位置。与图像分类任务只需判断整个图像属于哪个类别不同,目标检测还需要标记出目标在图像中的边界框。例如在自动驾驶场景中,不仅需要检测道路图像是否包含车辆、人行道和行人,还需要确定它们在图像中的位置。

1 创建目标检测数据集

2 区域提议

区域提议(Region Proposal)是目标检测中的一项重要技术,用于生成可能包含目标物体的候选区域。利用 SelectiveSearch生成区域提议:

3 生成区域提议

4 交并比概念

参考代码:

# 导入必要的库import selectivesearch          # 用于生成候选区域(selective search算法)from skimage.segmentation import felzenszwalb  # 基于图的图像分割算法import cv2                      # OpenCV,用于图像读取和颜色转换from matplotlib import pyplot as plt  # 绘图显示import numpy as np              # 数值计算import matplotlib.patches as mpatches  # 用于在图像上绘制矩形框
# ------------------- 第一部分:Felzenszwalb 图像分割 -------------------# 读取彩色图像(BGR格式)img_r = cv2.imread('18.png')# 将彩色图像转换为灰度图,用于分割算法(分割通常在灰度图上进行)img = cv2.cvtColor(img_r, cv2.COLOR_BGR2GRAY)
# 调用felzenszwalb分割算法# scale: 控制分割的粒度,值越大分割得到的区域越少、越大# 返回的 segments_fz 是一张与图像等大的整数标签图,每个像素的值代表它所属的区域编号segments_fz = felzenszwalb(img, scale=200)
# 显示原始图像和分割结果plt.figure(figsize=(10,10))plt.subplot(121)  # 第一个子图# OpenCV读入的是BGR,matplotlib显示需要RGB,所以转换颜色通道plt.imshow(cv2.cvtColor(img_r, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.subplot(122)  # 第二个子图# 分割结果是一张标签图,不同区域会显示为不同颜色(由matplotlib自动映射)plt.imshow(segments_fz)plt.title('Image post \nfelzenszwalb segmentation')plt.show()
# ------------------- 第二部分:Selective Search 生成候选区域 -------------------def extract_candidates(img):    """    使用选择性搜索(Selective Search)从图像中提取可能包含物体的候选矩形框    参数:        img: 彩色图像(BGR格式)    返回:        candidates: 列表,每个元素为 [x, y, w, h] 形式的候选框坐标和尺寸    """    # selective_search 返回两个值:    #   img_lbl: 与图像等大的整数标签图(不同区域不同值)    #   regions: 字典列表,每个字典包含一个候选区域的信息,如'rect'(矩形坐标)、'size'(区域像素数)    img_lbl, regions = selectivesearch.selective_search(img, scale=200, min_size=2000)
    # 图像总面积(像素数),用于过滤太小的候选区域    img_area = np.prod(img.shape[:2])  # 等价于 img.shape[0] * img.shape[1]    candidates = []    for r in regions:        # 去重:如果该矩形已经添加过,则跳过        if r['rect'] in candidates:            continue         # 过滤:候选区域面积小于图像面积的5%时忽略(可能是噪声或小物体,可根据需要调整)        if r['size'] < (0.05 * img_area):            continue        # 过滤:候选区域面积大于整个图像面积时忽略(无意义)        if r['size'] > (1 * img_area):            continue        # 提取矩形坐标和尺寸:x, y 左上角坐标,w 宽度,h 高度        x, y, w, h = r['rect']        candidates.append([x, y, w, h])  # 注意原代码中有个错误,应该是添加矩形列表,但原代码写成了 list(r['rect']) 也是可以的    return candidates
# 重新读取彩色图像(用于显示和候选框提取)img = cv2.imread('18.png')# 调用函数获取候选框candidates = extract_candidates(img)
# 在原图上绘制所有候选框(红色矩形)fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))for x, y, w, h in candidates:    # 创建矩形补丁,不填充、边框红色、线宽1    rect = mpatches.Rectangle(        (x, y), w, h,        fill=False,        edgecolor='red',        linewidth=1    )    ax.add_patch(rect)plt.show()
# ------------------- 第三部分:计算交并比(IoU)函数 -------------------def get_iou(boxA, boxB, epsilon=1e-5):    """    计算两个矩形框的交并比(Intersection over Union, IoU)    参数:        boxA, boxB: 矩形框,格式为 (x1, y1, x2, y2),即左上角(x1,y1)和右下角(x2,y2)的坐标        epsilon: 极小值,防止分母为零    返回:        iou: [0,1] 之间的浮点数,越大表示两个框重叠程度越高    """    # 计算交集矩形的左上角坐标 (x1, y1) 和右下角坐标 (x2, y2)    x1 = max(boxA[0], boxB[0])    y1 = max(boxA[1], boxB[1])    x2 = min(boxA[2], boxB[2])    y2 = min(boxA[3], boxB[3])
    # 交集矩形的宽度和高度    width = (x2 - x1)    height = (y2 - y1)
    # 如果没有重叠区域(宽度或高度为负),则 IoU = 0    if (width 0) or (height 0):        return 0.0    area_overlap = width * height
    # 计算两个矩形各自的面积    area_a = (boxA[2] - boxA[0]) * (boxA[3] - boxA[1])    area_b = (boxB[2] - boxB[0]) * (boxB[3] - boxB[1])
    # 并集面积 = 面积和 - 重叠面积    area_combined = area_a + area_b - area_overlap
    # 交并比 = 重叠面积 / 并集面积    iou = area_overlap / (area_combined + epsilon)    return iou
相关:
PyTorch深度学习实战(17)——多任务学习
PyTorch深度学习实战(16)——面部关键点检测

PyTorch深度学习实战(16)——面部关键点检测-add

PyTorch深度学习实战(13)—迁移学习

PyTorch深度学习实战(11)—卷积神经网络

PyTorch深度学习实战(10)—过拟合及其解决方法

PyTorch深度学习实战(8)—批归一化

PyTorch深度学习实战(7)—批大小对神经网络训练的影响

PyTorch深度学习实战(6)—神经网络性能优化技术(e)

PyTorch深度学习实战(6)—神经网络性能优化技术(d)-add

PyTorch深度学习实战(6)—神经网络性能优化技术(d)

PyTorch深度学习实战(6)—神经网络性能优化技术(c)

PyTorch深度学习实战(6)—神经网络性能优化技术(b)

PyTorch深度学习实战(6)—神经网络性能优化技术(a)

PyTorch深度学习实战(5)—计算机视觉基础

PyTorch深度学习实战(4)--常用激活函数和损失函数详解

PyTorch深度学习实战(3)—使用PyTorch构建神经网络(b)

PyTorch深度学习实战(3)—使用PyTorch构建神经网络(a)

PyTorch深度学习实战(2)-PyTorch基础

示例:反向传播和梯度下降的计算过程

AI基础 | 前向传播

AI基础 | 反向传播

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/196721