YOLOV5 general.py注释与解析

YOLOv5代码注释版更新啦,注释的是最近的2021.07.14的版本,且注释更全
github: https://github.com/Laughing-q/yolov5_annotations

YOLOV5 general.py注释与解析

yolov5其他代码解析

暂时只做了build_targets和compute_loss函数的注释,主要是今天正好对yolov5的边框回归方式看了一下;
有时间再更新其它函数;
build_targets函数中有对yolov5边框回归的详细说明,毕竟现在也没有发paper,只能通过代码自己研究,要是有错误,欢迎指正。

def build_targets(p, targets, model):
    """
    Args:
        p: 网络输出,List[torch.tensor * 3], p[i].shape = (b, 3, h, w, nc+5), hw分别为特征图的长宽,b为batch-size
        targets: targets.shape = (nt, 6) , 6=icxywh,i表示第一张图片,c为类别,然后为坐标xywh
        model: 模型

    Returns:

    """
    # Build targets for compute_loss(), input targets(image,class,x,y,w,h)
    # 获取每一个(3个)检测层
    det = model.module.model[-1] if is_parallel(model) else model.model[-1]  # Detect() module
    # anchor数量和标签框数量
    na, nt = det.na, targets.shape[0]  # number of anchors, targets
    tcls, tbox, indices, anch = [], [], [], []
    gain = torch.ones(7, device=targets.device)  # normalized to gridspace gain
    # ai.shape = (na, nt) 生成anchor索引
    ai = torch.arange(na, device=targets.device).float().view(na, 1).repeat(1, nt)  # same as .repeat_interleave(nt)
    # targets.shape = (na, nt, 7)
    targets = torch.cat((targets.repeat(na, 1, 1), ai[:, :, None]), 2)  # append anchor indices

    # 设置偏移量
    g = 0.5  # bias
    # (5, 2)
    off = torch.tensor([[0, 0],
                        [1, 0], [0, 1], [-1, 0], [0, -1],  # j,k,l,m
                        # [1, 1], [1, -1], [-1, 1], [-1, -1],  # jk,jm,lk,lm
                        ], device=targets.device).float() * g  # offsets
    # 对每个检测层进行处理
    for i in range(det.nl):
        anchors = det.anchors[i]
        # 得到特征图的坐标系数
      
YOLOv5 ,删除锚框并得到目标的心点坐标的代码如下所示: ```python import torch import cv2 from models.experimental import attempt_load from utils.general import non_max_suppression # 加载模型 weights = 'path/to/weights.pt' img_size = 640 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = attempt_load(weights, map_location=device) model.to(device).eval() # 加载图像 img_path = 'path/to/image.jpg' img0 = cv2.imread(img_path) # BGR img = cv2.resize(img0, (img_size, img_size)) img = img[:, :, ::-1].transpose(2, 0, 1) # RGB img = torch.from_numpy(img).to(device).float() img /= 255.0 if img.ndimension() == 3: img = img.unsqueeze(0) # 进行目标检测 pred = model(img) pred = non_max_suppression(pred, conf_thres=0.25, iou_thres=0.45) # 处理预测结果 for i, det in enumerate(pred): if det is not None and len(det): det[:, :4] = det[:, :4].clamp(min=0, max=img_size) for *xyxy, conf, cls in reversed(det): x, y, w, h = (xyxy[0] + xyxy[2]) / 2, (xyxy[1] + xyxy[3]) / 2, xyxy[2] - xyxy[0], xyxy[3] - xyxy[1] print('Object {}: center point = ({}, {})'.format(i, x, y)) ``` 在上面的代码,我们首先加载了 YOLOv5 模型和待检测的图像,然后通过模型进行目标检测,并使用 `non_max_suppression` 函数进行非极大值抑制,得到预测结果 `pred`。接着,我们遍历预测结果,计算每个预测框的心点坐标,并输出到控制台上。 需要注意的是,在上面的代码,我们使用了非极大值抑制函数 `non_max_suppression` 来过滤掉重叠的预测框,如果您不需要使用非极大值抑制,可以将 `non_max_suppression` 函数的参数 `conf_thres` 和 `iou_thres` 设置为 0。
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值