ByteTrack多目标跟踪——YOLOX详解

文章目录

  • 1 before train
    • 1.1 dataset
    • 1.2 model
  • 2 train
    • 2.1 Backbone
    • 2.2 PAFPN
    • 2.3 Head
      • 2.3.1 Decoupled Head
      • 2.3.2 anchor-free
      • 2.3.3 标签分配
        • ① 初步筛选
        • ② simOTA
      • 2.3.4 Loss计算

项目地址: ByteTrack
ByteTrack使用的检测器是YOLOX,是一个目前非常流行并且效果非常好的检测器,ByteTrack的跟踪效果也完全离不开YOLOX的检测性能。

1 before train

训练之前的准备,主要是初始化模型以及数据集。

1.1 dataset

在ByteTrack中图像输入大小为:(896,1600)

1.2 model

初始化
YOLOXPAFPN
YOLOXHead

2 train

2.1 Backbone

采用Darknet-53

self.backbone = CSPDarknet(depth, width, depthwise=depthwise, act=act)

backbone的输入input为一个batch的图片 (B,C,H,W)

out_features = self.backbone(input)

out_features的输出为3个特征层(分别为’dark3’,‘dark4’,‘dark5’)组成的字典,举个例子,各特征层的shape如下:

{‘dark3’:(B,320,112,200),
‘dark4’:(B,640,56,100),
‘dark5’:(B,1280,28,50)}
均为(B,C,H,W),只是尺寸和特征维度不同。

2.2 PAFPN


在Neck结构中,Yolox采用PAFPN的结构进行融合。如下图所示,将高层的特征信息,先通过上采样的方式进行传递融合,再通过下采样融合方式得到预测的特征图,最终输出3个特征层组成的元组结果,各特征层的shape如下:

{‘dark3’:(B,320,112,200),
‘dark4’:(B,640,56,100),
‘dark5’:(B,1280,28,50)}
均为(B,C,H,W),只是尺寸和特征维度不同。

2.3 Head

2.3.1 Decoupled Head

在Yolox中,作者增加了三个Decoupled Head,俗称“解耦头”。

总共有三个分支:

  • cls_output:主要对目标框的类别,预测分数。因为只有行人一个类别,所以大小为1,这里为(B,1,112,200)。
  • obj_output:主要判断目标框是前景还是背景,这里为(B,1,112,200)。
  • reg_output:主要对目标框的坐标信息(x,y,w,h)进行预测,这里为(B,4,112,200)。

![[yolox网络图.png]]

2.3.2 anchor-free

首先,相对anchor-based参数量大大减小。

举个例子,最后8400个预测框中,其中有400个框,所对应锚框的大小,为32*32。中间的分支,最后有1600个预测框,所对应锚框的大小,为16*16。最下面的分支,最后有6400个预测框,所对应锚框的大小,为8*8。

当有了29400个预测框的信息,每张图片也有标注的目标框的信息。
这时的锚框,就相当于桥梁。
这时需要做的,就是将29400个锚框,和图片上所有的目标框进行关联,挑选出正样本锚框
而相应的,正样本锚框所对应的位置,就可以将正样本预测框,挑选出来。
这里采用的关联方式,就是标签分配

2.3.3 标签分配

① 初步筛选

yolo_head.py的get_in_boxes_info函数中,如果 anchor bbox 中心落在 groundtruth bbox或 fixed bbox,则被选中为候选正样本。

  1. 根据中心点判断

anchor box的中心点落在人工标注框(Ground Truth Boxes)的矩形范围中的所有anchor;

  • 通过groundtruth的[x_center,y_center,w,h],计算出每张图片的每个groundtruth的左上角、右下角坐标
gt_bboxes_per_image_l = (
      (gt_bboxes_per_image[:, 0] - 0.5 * gt_bboxes_per_image[:, 2]).unsqueeze(1)
      .repeat(1, total_num_anchors)
)   # [n_gt, n_anchor]
gt_bboxes_per_image_r = (
      (gt_bboxes_per_image[:, 0] + 0.5 * gt_bboxes_per_image[:, 2]).unsqueeze(1)
      .repeat(1, total_num_anchors)
)   # [n_gt, n_anchor]
gt_bboxes_per_image_t = (
      (gt_bboxes_per_image[:, 1] - 0.5 * gt_bboxes_per_image[:, 3]).unsqueeze(1)
      .repeat(1, total_num_anchors)
)   # [n_gt, n_anchor]
gt_bboxes_per_image_b = (
      (gt_bboxes_per_image[:, 1] + 0.5 * gt_bboxes_per_image[:, 3]).unsqueeze(1)
       .repeat(1, total_num_anchors)
)   # [n_gt, n_anchor]
  • 前4行代码计算锚框中心点(x_center,y_center)和gt标注框左上角(gt_l,gt_t),右下角(gt_r,gt_b)两个角点的相应距离。
b_l = x_centers_per_image - gt_bboxes_per_image_l
b_r = gt_bboxes_per_image_r - x_centers_per_image
b_t = y_centers_per_image - gt_bboxes_per_image_t
b_b = gt_bboxes_per_image_b - y_centers_per_image
bbox_deltas = torch.stack([b_l, b_t, b_r, b_b], 2)
is_in_boxes = bbox_deltas.min(dim=-1).values > 0.0
is_in_boxes_all = is_in_boxes.sum(dim=0) > 0
  • 而在第五行,将四个值叠加之后,通过第六行,判断是否都大于0?就可以将落在groundtruth矩形范围内的所有anchors,都提取出来了。因为ancor box的中心点,只有落在矩形范围内,这时的b_l,b_r,b_t,b_b都大于0。
  1. .根据目标框来判断

以Ground Truth Boxes中心点为基准,四周向外扩展2.5倍stride,构成边长为5倍stride的正方形,挑选anchor box中心点落在正方形内的所有锚框。

  • 以groundtruth中心点为基准,设置边长为5的正方形,挑选在正方形内的所有锚框。
  • 如果图片的尺寸为 640 × 640,且当前特征图的尺度为 80 × 80,则此时stride为 8, 将 5 × 5 的正方形映射回原图,fixed bbox 尺寸为 400 × 400。
  • 找出所有中心点(x_center,y_center)在正方形内的锚框。
  • 未选中的预测框为负样本,直接打上负样本标签。

总体来说get_in_boxes_info返回两个值,fg_mask和is_in_boxes_and_center,fg_mask为29400维数组,即29400个框的正负性,用ture和false表示,is_in_boxes_and_center为[gt_num, 正样本个数]

② simOTA

假定图片上有3个目标框,即3个groundtruth,且检测类别为1。
上一节中,我们知道有29400个锚框,但是经过初步筛选后,假定有1000个锚框是正样本锚框。

  1. 初筛正样本信息提取

根据位置,可以将网络预测的候选检测框位置bboxes_preds、前景背景目标分数obj_preds、类别分数cls_preds等信息,提取出来。

 bboxes_preds_per_image = bboxes_preds_per_image[fg_mask] # [1000, 4]
cls_preds_ = cls_preds[batch_idx][fg_mask] # [1000, 1]
obj_preds_ = obj_preds[batch_idx][fg_mask] # [1000, 1]
num_in_boxes_anchor = bboxes_preds_per_image.shape[0] # 1000
  1. Loss函数计算

针对筛选出的1000个候选检测框,和3个groundtruth计算Loss函数。

  • 首先是位置信息的loss值:pair_wise_ious_loss [3,1000]
pair_wise_ious = bboxes_iou(gt_bboxes_per_image, bboxes_preds_per_image, False)  # [gt_num, matched_anchor]
gt_cls_per_image = ( # [gt_num, matched_anchor, class_num]
            F.one_hot(gt_classes.to(torch.int64), self.num_classes)
            .float().unsqueeze(1)
            .repeat(1, num_in_boxes_anchor, 1)
)
pair_wise_ious_loss = -torch.log(pair_wise_ious + 1e-8)
  • 然后是综合类别信息和目标信息的loss值:pair_wise_cls_loss [3,1000]
cls_preds_ = (  # [gt_num, matched_anchor, 1]
        cls_preds_.float().unsqueeze(0).repeat(num_gt, 1, 1).sigmoid_() # [gt_num, matched_anchor, 1]
        * obj_preds_.float().unsqueeze(0).repeat(num_gt, 1, 1).sigmoid_() # [gt_num, matched_anchor, 1]
)
pair_wise_cls_loss = F.binary_cross_entropy( # [gt_num, matched_anchor]
        cls_preds_.sqrt_(), gt_cls_per_image, reduction="none"
).sum(-1)
  1. cost成本计算

有了reg_loss和cls_loss,就可以将两个损失函数加权相加,计算cost成本函数了。

cost = (
      pair_wise_cls_loss
      + 3.0 * pair_wise_ious_loss
      + 100000.0 * (~is_in_boxes_and_center)
)
  1. SimOTA

采用一种简化版的SimOTA方法,求解近似最优解。这里对应的函数,是get_assignments函数中的self.dynamic_k_matching

num_fg,gt_matched_classes, gt_matched_ids, pred_ious_this_matching, matched_gt_inds,) 
= self.dynamic_k_matching(cost, pair_wise_ious, gt_classes, gt_ids, num_gt, fg_mask) 

此部分详见深入浅出Yolo系列之Yolox核心基础完整讲解

2.3.4 Loss计算

loss_iou = (self.iou_loss(bbox_preds.view(-1, 4)[fg_masks], reg_targets) # [matched_anchor, 4]
).sum() / num_fg
loss_obj = (self.bcewithlog_loss(obj_preds.view(-1, 1), obj_targets)  # [all_anchor, 1]
 ).sum() / num_fg
loss_cls = (self.bcewithlog_loss(
      cls_preds.view(-1, self.num_classes)[fg_masks], cls_targets # [matched_anchor, 1] )
).sum() / num_fg

在前面精细化筛选中,使用了reg_loss和cls_loss,筛选出和目标框所对应的预测框。
因此这里的iou_loss和cls_loss,只针对目标框和筛选出的正样本预测框进行计算。
而obj_loss,则还是针对29400个预测框。

参考:
深入浅出Yolo系列之Yolox核心基础完整讲解
目标检测: 一文读懂 YOLOX

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474821.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ceres求解非线性优化问题步骤与示例

【版权声明】 本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。 在计算机视觉和机器人领域,经常需要解决非线性优化问题来估计相机姿态或运动模型。Ceres Solver是一个开源的C库,专门用于解决最小二乘问题&am…

Linux系统如何使用tcpdump实时监控网络速度:方法与技巧解析

在网络管理和故障排查中,了解网络速度是一个重要的环节。而tcpdump,作为一个强大的网络数据包分析工具,不仅可以用于分析数据包的内容,还能用于实时监控网络速度。本文将介绍Linux系统如何使用tcpdump来实时监控网络速度。 首先&…

智能型程控直流电子负载特点和特性

智能型程控直流电子负载是高精度、高稳定性的电源测试设备,主要用于对电源、电池、充电器等直流电源设备的输出性能进行测试。它具有以下特点和特性: 智能型程控直流电子负载采用先进的控制算法和高精度的ADC,能够实现对电流、电压、功率等参…

【EOJ】2985.圆和正方形

单点时限: 2.0 sec 内存限制: 256 MB 小王首先在平面上画一个边长为 K 的正方形 S1,然后又画一个 S1 的内切圆 C1,这算做一次操作。然后接着画 C1 的一个内切正方形 S2,和 S2 的一个内切圆 C2,这算第二次操作。他一直进行了 K 次…

前端学习笔记 | JS进阶

一、作用域 1、局部作用域 (1)函数作用域 (2)块作用域 let和const会产生块作用域 ,而var不会产生块作用域 2、全局作用域 script标签和js文件的【最外层】变量 3、作用域链 本质:底层的变量查找机制 4、JS…

AI时代,我靠2个页面,一个AI产品开始变现

大家好,我是AI时间线的作者,AI时间线这个产品是我利用过年期间半天时间开发出来的一个产品。 产品地址:http://www.ai-timeline.top/ 核心功能主要是根据关键词生成时间线,大家可以看看产品上使用教程,非常简单 当然幸运的是目前产…

解决:springboot项目访问hdfs文件提示guava版本不兼容

1、问题描述 版本说明:我用的hadoop版本:3.1.3 项目可以正常启动,但是调用访问hdfs的服务时候报错,报错消息如下:com.google.common.base.preconditions.checkArgument(ZL java/lang/String;Ljava/lang/Object:)V 原因分析&#x…

安科瑞保护测控产品在新能源行业中应用【峰谷套利 动态扩容 需求侧响应】

背景 2 月 10 日发布《关于完善能源绿色低碳转型体制机制和措施的意见》明确,鼓励建设源网荷储一体化、多能互补的智慧能源系统和微电网。 分布式光伏优势 近年来,随着光伏产业规模不断扩大,技术迭代升级不断加快,智能制造迅速推…

如何让工作计划显示在桌面上面?电脑桌面日程安排软件

作为一名忙碌的上班族,我每天都要面对繁多的工作任务,如何确保每一项任务都能按时完成,避免遗漏或忘记,成为了我必须面对的挑战。提前列出工作计划固然有效,但如果能将这些计划直接显示在电脑桌面上,无疑将…

uniapp_微信小程序客服

一、调用api 二、代码 <button open-type"contact">客服</button> 三、小程序后台添加客服人员就行

应急响应靶机训练-Web3题解

前言 接上文&#xff0c;应急响应靶机训练-Web3。 前来挑战&#xff01;应急响应靶机训练-Web3 题解 首先登录用户administrator 寻找隐藏用户 找到隐藏用户hack6618$ 然后去找apache的日志文件 分析得出两个IP地址 192.168.75.129 192.168.75.130 然后更换hack6618$的…

几个好用的AI网站(视频/图片/论文/PPT生成)直接给链接

引入 随着人工智能技术的飞速发展&#xff0c;越来越多的AI创作工具开始涌现&#xff0c;它们不仅能够帮助我们提升写作效率&#xff0c;更能激发创作灵感。今天&#xff0c;就让我们一起来探索十个值得一试的AI网站&#xff0c;它们分别是sora、mused.org、英伟达本地AI、瑞达…

将MySQL数据库在idea中引入

输入SQL语句后运行即可

单片机第四季-第二课:uCos2源码-BSP

1&#xff0c;初始uCos2 文件中uC开头的为uCos相关的。 2&#xff0c;uCos2源码工程建立 建立Source Insight工程 寻找main函数 (1)RTOS其实就是一个大的裸机程序&#xff0c;也是从main开始运行的 (2)main之前也是有一个汇编的启动文件的 (3)main中调用了很多初始化函数 bsp部…

智慧交通运维合集:基于图扑数字孪生技术的解决方案

城市交通作为城市与区域交通体系的核心&#xff0c;其完善程度和发展水平是评价城市现代化水准的关键指标之一。 城市交通数字孪生技术正在成为城市交通管理的关键工具&#xff0c;支持系统的高效运行和安全保障。随着互联网、大数据和人工智能技术的进步&#xff0c;城市交通…

自写系统运行windows程序

运行已经基本正常了。 源代码在 https://gitee.com/enrique11/cxos.git

C++除了Qt还有什么GUI库?

C除了Qt还有什么GUI库&#xff1f; 先&#xff0c;不要折腾&#xff0c;不要想着用 C 来做 App 类的 GUI 开发。 所以你问用 c gui 库&#xff0c;本来确实有很多&#xff0c;但是经过几十年的沉淀&#xff0c;最后只留下一个 qt quick 和其他特殊需求的库&#xff08;包括 qt…

2023年蓝桥杯省赛——平方差

目录 题目链接&#xff1a;1.平方差 - 蓝桥云课 (lanqiao.cn) 思路 暴力偷分 发现规律 发现蹊跷 总结 题目链接&#xff1a;1.平方差 - 蓝桥云课 (lanqiao.cn) 思路 咱就是说&#xff0c;写蓝桥杯的题目的第一件事情是什么&#xff0c;那就是不管三七二十一先暴力一下把能…

图像分类神经网络综述

一、图像分类神经网络发展的四个阶段 经典深度卷积神经网络模型注意力机制卷积神经网络模型轻量级卷积神经网络模型神经网络架构搜索模型 二、深度卷积神经网络模型 1、LeNet 其包含 3 个卷积层 、2 个池化层和 2 个全连接层 , 每个卷积层和全连接层均有可训练的参数, 为深…

Xftp传输文件名乱码问题

背景 项目有个静态文件下载时是几天前的老文件&#xff0c;最新文件不下载。检查路径啥的都没问题后&#xff0c;确定就是当前文件夹。 发现 正当纳闷时候&#xff0c;当前文件中有一个乱码文件&#xff0c;没多想&#xff0c;让同事看一下&#xff0c;他看到老文件名是正常的…