YOLOV5代码理解——类权重系数和图像权重系数

YOLOV5代码理解——类权重系数和图像权重系数

  • 摘要 当训练图像的所有类个数不相同时,我们可以更改类权重, 即而达到更改图像权重的目的.然后根据图像权重新采集数据,这在图像类别不均衡的数据下尤其重要。
    使用yolov5训练自己的数据集时,各类别的标签数量难免存在不平衡的问题,在训练过程中为了就减小类别不平衡问题的影响,yolov5中引入了类别权重和图像权重的设置。

类别权重

若类别权重已经更改了,每张图像包含了多个类,因此对应图像的权重也会随之而变. 默认的图像权重都为1.
计算每个图像所有类权重之和,即为图像权重

model.class_weights = labels_to_class_weights(dataset.labels, nc).to(device)
def labels_to_class_weights(labels, nc=80):
    # Get class weights (inverse frequency) from training labels
    if labels[0] is None:  # no labels loaded
        return torch.Tensor()

    labels = np.concatenate(labels, 0)  # labels.shape = (866643, 5) for COCO
    classes = labels[:, 0].astype(np.int)  # labels = [class xywh]
    weights = np.bincount(classes, minlength=nc)  # occurrences per class返回0-25每类出现的次数

    # Prepend gridpoint count (for uCE training)
    # gpi = ((320 / 32 * np.array([1, 2, 4])) ** 2 * 3).sum()  # gridpoints per image
    # weights = np.hstack([gpi * len(labels)  - weights.sum() * 9, weights * 9]) ** 0.5  # prepend gridpoints to start

    weights[weights == 0] = 1  # replace empty bins with 1,出现出现次数为0的类,将其设为1
    weights = 1 / weights  # number of targets per class
    weights /= weights.sum()  # normalize
    return torch.from_numpy(weights)

图像权重

在训练过程中,当设置参数–image_weights为True时,会计算图像采集的权重,若图像权重越大,那么该图像被采样的概率也越大。后面遍历图像时,则按照重新采集的索引dataset.indices进行计算。

parser.add_argument('--image-weights', action='store_true', default=True, help='use weighted image selection for training')  # 加载图像权重
        if opt.image_weights:
            # Generate indices
            if rank in [-1, 0]:
                cw0 = model.class_weights.cpu().numpy()  # ([0.64486, 0.12426, 0.23088])
                cw = cw0*(1 - maps) ** 2  # class weights
                iw = labels_to_image_weights(dataset.labels, nc=nc, class_weights=cw)  # image weights
                """indices[7, 49, 44, 14, 29, 26, 38, 46, 5, 1, 48, 25, 44, 0, 26, 42, 13, 54, 
                52, 1, 1, 31, 54, 22, 12, 24, 1, 12, 25, 29, 13, 13, 12, 26, 17, 1, 48, 32, 37, 
                10, 57, 50, 6, 19, 42, 41, 54, 24, 48, 39, 17, 34, 51, 49, 29, 34, 1, 14]"""
                dataset.indices = random.choices(range(dataset.n), weights=iw, k=dataset.n)  # rand weighted idx
  • 10
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
YOLOv5中,权重是一种用来处理数据集中别不平衡问题的策略。具体实现思路是对整个数据集的图像目标进行别统计,然后根据别数量来确定权重的大小关系,即别数量越大,权重越小。然后将这些权重与每张图像权重进行叠加,以决定采样的顺序。代码实现中,权重是按照从大到小的顺序进行排序的。 如果权重已经更改了,那么每张图像包含的权重也会随之变化。默认情况下,每张图像权重都为1。计算图像权重的方法是将每个图像中所有别的权重相加,即为该图像权重。在YOLOv5代码实现中,可以通过model.class_weights = labels_to_class_weights(dataset.labels, nc).to(device)来计算图像权重。 总结起来,YOLOv5通过权重图像权重的设置来处理数据集中的别不平衡问题。权重根据别数量确定,图像权重则是根据每个图像中所有别的权重之和计算得出的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [YOLOV5代码理解——权重系数图像权重系数](https://blog.csdn.net/l13022736018/article/details/118354053)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [YOLOv5的Tricks | 【Trick8】图片采样策略——按数据集各权重采样](https://blog.csdn.net/weixin_44751294/article/details/125224472)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值