非极大值抑制(PyTorch-YOLOv3代码解析一)

非极大值抑制之代码解析(utils.py)

代码github地址:GitHub - eriklindernoren/PyTorch-YOLOv3: Minimal PyTorch implementation of YOLOv3

1. 非极大值抑制函数代码

# reference: https://github.com/eriklindernoren/PyTorch-YOLOv3/blob/f917503ffe4a21d2b1148d8cb13b89b834517d76/utils/utils.py

def non_max_suppression(prediction, conf_thres=0.5, nms_thres=0.4):
    """
    剔除目标置信度小于conf_thres,以及通过非极大值抑制筛选预测的信息
    Return detections(预测):
        (x1, y1, x2, y2, object_conf, cls_conf, cls_idx)
    """

    # 把(center x, center y, width, height)转换成(x1, y1, x2, y2)
    prediction[..., :4] = xywh2xyxy(prediction[..., :4])
    output = [None for _ in range(len(prediction))]  # batch_size
    # prediction: [batch_size x 10647 x 85]
    for image_i, image_pred in enumerate(prediction):
        # 筛选置信度大于conf_thres的行
        image_pred = image_pred[image_pred[:, 4] >= conf_thres]
        # 过滤没有大于conf_thres的img_pred
        if not image_pred.size(0):
            continue
        # image_pred[:, 5:].max(1)[0]:取出每一行类别概率最大的值, 与筛选的目标置信度相乘
        score = image_pred[:, 4] * image_pred[:, 5:].max(1)[0]
        # image_pred按照score降序排列
        image_pred = image_pred[(-score).argsort()]
        # 得到每一行类别最大的概率与类别代号,keepdim: 保持与image_pred的维度相同
        class_confs, class_preds = image_pred[:, 5:].max(1, keepdim=True)
        # 获取detections:[x1,y1,x2,y2,object_conf,cls_conf,cls_idx],即预测的结果
        detections = torch.cat((image_pred[:, :5], class_confs.float(), class_preds.float()), 1)
        
        # 执行非极大值抑制
        keep_boxes = []
        while detections.size(0):
            # 其他框与score最大的框(第一个框)做交并比
            large_overlap = bbox_iou(detections[0, :4].unsqueeze(0), detections[:, :4]) > nms_thres
            # 第一行与每一行的类别代号相等的条件
            label_match = detections[0, -1] == detections[:, -1]
            # 与第一个框交并比大于阈值,且类别代号相同的条件
            invalid = large_overlap & label_match

            # 满足上面条件的行,通过目标置信度对box做加权平均处理
            weights = detections[invalid, 4:5]
            # 加权平均合并,赋值给第一行
            detections[0, :4] = (weights * detections[invalid, :4]).sum(0) / weights.sum()
            keep_boxes += [detections[0]]
            detections = detections[~invalid]  # 取剩余部分的预测值
        if keep_boxes:
            output[image_i] = torch.stack(keep_boxes)  # 非极大值抑制的结果

    return output

2. 目标置信度过滤

(1) 首先需要把预测的值[cx,cy,w,h]转换为左上角与右下角坐标[x1,y1,x2,y2],然后由预测的目标置信度大于某个阈值过滤预测的每一行,代码:

# [cx,cy,w,h]->[x1,y1,x2,y2]
prediction[...,:4] = xywh2xyxy(prediction[...,:4])

# 通过目标置信项筛选
img_pred = img_pred[img_pred[:,4]>=conf_thres]

(2) 置信度阈值筛选后,数据输出如下:

3. 降序排列与预测重组

(1) 排序的值:每一行的最大类别概率与目标置信度概率的乘积,代码:

# image_pred[:, 5:].max(1)[0]:取出每一行类别概率最大的值, 与筛选的目标置信度相乘
score = img_pred[:,4] * img_pred[:,5:].max(1)[0]
    
# 按照score降序排序
img_pred = img_pred[(-score).argsort()]

(2) 预测重组,在[x1,y1,x2,y2,object_conf]的后面添加类别概率、类别代号:cls_conf、cls_idx。添加的数据是类别概率最大的一个值。代码:

 # 得到每一行类别最大的概率与类别代号,keepdim: 保持与image_pred的维度相同
cls_confs, cls_idx = img_pred[:,5:].max(1,keepdim=True)
    
# 获取detections:[x1,y1,x2,y2,conf,cls_conf,cls_idx]
detections = torch.cat((img_pred[:, :5], cls_confs.float(), cls_idx.float()), 1)

(3) 执行结果:

4. 非极大值抑制:条件筛选

(1) 条件筛选:其他行与第一行交并比IoU大于阈值,且类别代号与第一行相等。代码:

# 其他行与第一行的交并比大于阈值,且类别代号与第一行相等的条件
large_overlap = bbox_iou(detections[0,:4].unsqueeze(0), detections[:,:4])>nms_thres
label_match = detections[0, -1] == detections[:, -1]
invalid = large_overlap & label_match

(2) 剔除满足invalid的行。

detections = detections[~invalid]

(3) 执行结果:

5. 非极大值抑制:目标置信度对box加权平均

(1)  目标置信度对box加权平均。

# 满足上面条件的行,通过目标置信度对box做加权平均处理
weights = detections[invalid, 4:5]
# 加权平均合并
detections[0, :4] = (weights * detections[invalid, :4]).sum(0) / weights.sum()
# 添加加权平均的detection
keep_boxes += [detections[0]]

(2) 执行结果:

(3) 最后output结果:

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果你想下载pytorch-yolov3源码,这里提供两种途径。第一种是从Github下载源码,这需要先安装Git。在终端输入以下指令: ``` git clone https://github.com/eriklindernoren/PyTorch-YOLOv3.git ``` 这将在当前目录下创建一个名为“PyTorch-YOLOv3”的文件夹,并将源码下载到该文件夹中。 第二种途径是在Github页面上直接下载压缩包。打开链接(https://github.com/eriklindernoren/PyTorch-YOLOv3),点击“Code”按钮,选择“Download ZIP”,将压缩包下载到本地。 下载完毕后,解压源码并进入该文件夹,在终端输入以下指令即可安装所需依赖: ``` pip install -r requirements.txt ``` 接着你可以通过以下指令进行训练或推理: ``` python train.py --data data/customdata/custom.data --batch-size 10 --epochs 100 --img-size 416 --cfg cfg/yolov3-custom.cfg --weights weights/yolov3.weights ``` ``` python detect.py --image-folder data/samples/ --cfg cfg/yolov3-custom.cfg --weights weights/yolov3-custom.pt ``` 其中,--data指定训练集路径,--batch-size指定批量大小,--epochs指定训练次数,--img-size指定图像大小,--cfg指定配置文件路径,--weights指定权重文件路径。对于detect.py,--image-folder指定待预测图片文件夹,--cfg和--weights同上。 ### 回答2: 要下载pytorch-yolov3源码,可以采取以下步骤: 1. 打开互联网浏览器,搜索pytorch-yolov3源码。 2. 在搜索结果中找到合适的代码存储库或网站,如GitHub、GitLab等。 3. 点击该存储库的链接,进入项目主页。 4. 在项目主页上找到代码的下载选项,通常是一个绿色的“Download”按钮或类似的指示。 5. 点击下载按钮,并选择保存代码的位置。可能需要等待一段时间,直到下载完成。 6. 一旦下载完成,解压缩源码文件。可以使用文件解压缩工具,如WinRAR、7-Zip等。 7. 打开解压缩后的文件夹,其中应该包含pytorch-yolov3源码的所有文件和文件夹。 8. 确认您已经安装了适用于pytorch的Python运行时环境。如果没有,请先安装pytorch和其他必要的依赖项。 9. 接下来,您可以使用任何您喜欢的文本编辑器或集成开发环境(IDE)打开源码文件。 10. 您可以阅读、修改和运行源码,或者将其用作您自己项目的基础。 希望以上步骤能帮助您成功下载pytorch-yolov3源码并进行后续的使用和探索。如果有任何问题,请随时提问。 ### 回答3: 要下载PyTorch-YOLOv3源码,可以按照以下步骤进行操作。 首先,打开GitHub网站,并搜索PyTorch-YOLOv3。找到相应的仓库后,点击进入。 在仓库主页上,找到并点击绿色的按钮,上面标有“Code”字样。点击后会弹出一个下拉菜单,在菜单中选择“Download ZIP”。 接下来,等待一段时间,直到ZIP文件下载完成。下载完成后,可以在电脑上的默认下载文件夹中找到这个ZIP文件。 找到ZIP文件后,双击打开它,将会解压缩成一个文件夹。进入解压后的文件夹,你将能够看到PyTorch-YOLOv3的所有源代码文件。 可以使用任何文本编辑器或者Python开发环境来打开和查看这些源代码文件。你可以在源码中学习和理解PyTorch-YOLOv3的实现细节,也可以根据自己的需求进行修改和拓展。 当然,这只是简单介绍如何下载PyTorch-YOLOv3的源码。如果你想要更深入地了解和使用这个项目,建议查阅官方文档或者相关教程,这样能够获得更详细的指导和指示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值