【yolov8系列】yolov8的目标检测、实例分割、关节点估计的原理解析

1 YOLO时间线

这里简单列下yolo的发展时间线,对每个版本的提出有个时间概念。
在这里插入图片描述

2 yolov8 的简介

工程链接:https://github.com/ultralytics/ultralytics


2.1 yolov8的特点

  1. 采用了anchor free方式,去除了先验设置可能不佳带来的影响
  2. 借鉴Generalized Focal Loss,使用任务解耦,分别学习box,class。并将box边框的学习,从回归的形式更换成交叉熵的形式
  3. 增加了实例分割的功能,该模块借鉴了 YOLACT 的思想

2.2 yolov8 的相关参数

在这里插入图片描述
以上为官方视图:

  1. YOLOv8 相比 YOLOv5,mAP提升较多
  2. 左图可得: N/S/M 模型相应的参数量和 FLOPs 都增加了不少
  3. 右图可得:相比 YOLOV5,YOLOv8 大部分模型推理速度变慢


其中目标检测模型的相关参数如下图,更多的看查阅工github的官方工程:
在这里插入图片描述
以下章节分别对yolov8的目标检测、实例分割、关键点估计、目标跟踪进行介绍

3 yolov8 目标检测


3.1 网络结构

3.1.1 网络结构

在这里插入图片描述

  • 【backbone】C2f、SPPF、Conv_BN_SiLU(strides=2,用于下采样)
  • 【neck】FPN(特征金字塔网络)、PAN(路径聚合网络)
  • 【head】Conv_BN_SiLU的堆叠分别输出:box、cls

在这里插入图片描述

  • 【backbone】
    第一个Conv的kernel:6*6 --> 3*3;
    C3模块替换了C2f,其数量从3-6-9-3,变成了3-6-6-3。
  • 【neck】
    FPN中去除第一个的卷积;
    yolov8中的N/S、M、L/X 三组网络中最后的C2f输出通道不同,分别为1024,768,512。
  • 【head】
    yolov5中单个Conv_BN_SiLU,同时输出三个信息:obj、cls、box
    yolov8中使用Conv_BN_SiLU的堆叠,并分支输出两个信息:box、cls。
3.1.2 C3 & C2f

C2f相较于C3,有更多的跳层连接,与更多的特征的concat,梯度流更丰富。有助于更为丰富的特征的融合和提取
在这里插入图片描述

3.1.3 SPP & SPPF 空间金字塔池化
  1. 上图是SPPNET原论文中提出的:提取并融合更多尺度的特征,使用fc_layer的同时并能够适应不同尺寸的输入
    在这里插入图片描述
  2. 下左图是YOLOV5、YOLOV8中使用的SPP:继承了原SPP的提取更多尺度的特征,但结构上已更新
  3. 下右图是fast SPP,对SPP进行了改进,减小参数的、增加运算速度,但不改变计算结果
    在这里插入图片描述
3.1.4 head

yolov5的head 的每层中分别为一个分支,同时预测3个内容:检测框质量( 1 是否为目标 ∗ i o u p r e d , l a b e l 1_{是否为目标}*iou_{pred,label} 1是否为目标ioupred,label)、类别的onehot、box的xywh。
与yolov5不同,yolov8的目标检测解耦了目标框和类别的预测,每层有两个分支,分别预测:类别的 o n e h o t ∗ i o u p r e d , l a b e l onehot*iou_{pred,label} onehotioupred,label、box的xywh。
在这里插入图片描述


3.2 目标检测的head输出

yolov8 的目标检测头,采用了Generalized Focal Loss,详细的内容可以看链接中的论文阅读,这里说明下关键点

3.2.1 定位质量与类别
  • 已有工作问题:训练和测试之间的差距,并可能会降低检测性能
    在这里插入图片描述
  • GFL工作解决:分类IoU联合表示
    分类onehot向量的标签 在真实类别位置上的是其相应的定位质量(预测box与标签box的iou)。也就是:类别的 o n e h o t ∗ i o u p r e d , l a b e l onehot*iou_{pred,label} onehotioupred,label
    训练时和测试时使用相同的规则,它消除了训练-测试的不一致性,并使定位质量和分类之间具有最强的相关性。
    在这里插入图片描述
  • 举例子:
    左边为已有工作,右边为GFL,针对分类项目可称为QFL在这里插入图片描述
3.2.1 box的预测

在这里插入图片描述

  • 已有工作:
    边界框表示是唯一确定的位置,为一个简单的狄拉克分布,并采用回归方式进行训练。
    问题:但是,它没有考虑到数据集的模糊性和不确定性。如下图中的边界不清晰,因此真实标签(白色框)有时不可信,狄拉克分布无法很好的表示这些问题。
  • GFL工作:
    对于边界框表示,直接学习box位置上的离散概率分布,而不引入任何其他更强的先验(比如统计出来的anchor)。因此,我们可以获得更可靠和准确的边界框估计,同时了解它们的各种潜在分布。
    给定标签y的范围为 y 0 ≤ y ≤ y n , n ∈ N + y_0≤y≤y_n,n∈N^+ y0yynnN+,我们可以从模型中得到估计值 y ^ \hat{y} y^, 也满足 y 0 ≤ y ^ ≤ y n y_0≤\hat{y}≤y_n y0y^yn y ^ = ∫ − ∞ + ∞ P ( x ) x d x = ∫ y 0 y n P ( x ) x d x \hat{y}=\int_{-\infty }^{+\infty }P(x)xdx=\int_{y_0}^{y_n}P(x)xdx y^=+P(x)xdx=y0ynP(x)xdx为了与卷积神经网络保持一致,我们将连续域上的积分转换为离散表示,从离散范围[y0,yn]到一个集合 { y 0 , y 1 , . . . , y i , y i + 1 . . . , y n − 1 , y n } \{y0,y1,...,y_i,y_{i+1}...,y_{n−1},y_n\} {y0y1...yiyi+1...yn1yn},其间隔∆=1。因此,给定离散分布性质 ∑ i = 0 n P ( y i ) = 1 \sum_{i=0}^{n}P(y_i)=1 i=0nP(yi)=1,估计的回归值 y ^ \hat{y} y^可以表示为: y ^ = ∑ i = 0 n P ( y i ) y i \hat{y}=\sum_{i=0}^{n}P(y_i)y_i y^=i=0nP(yi)yi
    尝试多种分布,最终发现下图第三种效果最好
    在这里插入图片描述
  • 举例子:
    左边为已有工作,右边为GFL,针对分类项目可称为DFL
    在这里插入图片描述
  • 算法具体实现:
    主要的公式为: ∑ i = 0 n P ( y i ) = 1 \sum_{i=0}^{n}P(y_i)=1 i=0nP(yi)=1 y ^ = ∑ i = 0 n P ( y i ) y i \hat{y}=\sum_{i=0}^{n}P(y_i)y_i y^=i=0nP(yi)yi。然后我们仅使用边界的浮点型位置,使用项链的两个整形表达。

    假设第三个输出层的尺寸上的标签(6.25, 4.75, 18.375, 12.875),此时框的中心设为(11,9),左边框距离anchor为5.75= 11-6.25。则用长度为16的向量表示该距离 d l d_l dl:[0,0,0,0,0.25, 0.75,0,0,0,0, 0,0,0,0,0, 0]。该向量满足内容为: ∑ i n d e x ∗ v a l u e = 5.75 \sum index*value=5.75 indexvalue=5.75 ∑ v a l u e = 1 \sum value=1 value=1

在这里插入图片描述
在这里插入图片描述
长度为16的向量最大可表达像素距离为15,那么这种表达方式,像素级最大可表达30*30的框。当模型共有5层,在第三个输出层是下采样了32倍,则30*30的框,在原尺寸上的大小为960*960。
所以只要网络输入尺寸<= 960,用四个长度为16的向量来表示框的四个边距离base点的距离,都可正确表达。若图片>960,理论上就需要增加向量的长度,但实际情况会现将图片先进行切割,然后多次预测,结果再转换到原图尺寸上。


3.3 正样本分配

yolov5中的正样本分配 是在训练之前已经完全确定了。
yolov8 中的正样本分配 TaskAlignedAssigner,属于动态分配,会根据当前网络输出的信息动态匹配 需要监督的标签。

  1. 计算box在每一层的每个grid ceil上的iou、对齐衡量指标(匹配得分)。 a l i g n _ m e t r i c = s α ∗ u β align\_metric =s^{\alpha }*u^{\beta} align_metric=sαuβ 其中 s 和 u 分别表示分类得分和IoU,α 和 β 是权重系数用来控制两个任务对匹配得分的影响大小
  2. 获取box内top10的 align_metric 的位置的mask,如图2。
  3. 一个预测框与多个真实框匹配测情况进行处理,保留ciou值最大的真实框。如图3。
  4. 得到 target_bboxes, target_scores, fg_mask
    在这里插入图片描述

3.4 损失函数

  • 分类的gt_class --> target_class
    target_class的转换(分类IoU联合表示):分类的onehot * iou(pred_box, label_box)。pred_class为长度为分类数量的向量。
    则分类IoU联合表示的损失函数:sigmoid交叉熵。在代码中为:nn.BCEWithLogitsLoss

            self.bce = nn.BCEWithLogitsLoss(reduction='none')loss[1] = self.bce(pred_scores, target_scores.to(dtype)).sum() / target_scores_sum  # BCE
    

    这里补充下在pytorch中的损失函数的一些api

    nn接口function接口
    nn.NLLLossF.nll_loss
    nn.BCELossF.binary_cross_entropy
    nn.BCEWithLogitsLossF.binary_cross_entropy_with_logits
    nn.CrossEntropyLoss = softmax + log + NLLlossF.cross_entropy

    我们使用 ℓ ( x , y ) \ell(x,y) (x,y)来表示损失函数,则有 ℓ ( x , y ) = L = { l 1 , … , l N } ⊤ \ell(x, y) = L = \{l_1,\dots,l_N\}^\top (x,y)=L={l1,,lN}其中【N】batch、【x】input(在使用中一般为网络输出的内容)、【y】target、【 x n , y n x_{n,y_n} xn,yn】表示对应target那一类的概率。

    • - nn.NLLLoss()
      l n = − w y n x n , y n l_n = - w_{y_n} x_{n,y_n} ln=wynxn,yn
    • nn.BCELoss中:
      l n = − w n [ y n ⋅ log ⁡ ( x n ) + ( 1 − y n ) ⋅ log ⁡ ( 1 − x n ) ] l_n = - w_n \left[ y_n \cdot \log (x_n) + (1 - y_n) \cdot \log (1 - x_n) \right] ln=wn[ynlog(xn)+(1yn)log(1xn)]
    • nn.BCEWithLogitsLoss = sigmoid + BCELoss
      l n = − w n [ y n ⋅ log ⁡ 1 1 + exp ⁡ ( − x n ) + ( 1 − y n ) ⋅ log ⁡ ( 1 − 1 1 + exp ⁡ ( − x n ) ) ] l_n = - w_n \left[ y_n \cdot \log \frac{1}{1+\exp(-x_n)} + (1 - y_n) \cdot \log (1 - \frac{1}{1+\exp(-x_n)}) \right] ln=wn[ynlog1+exp(xn)1+(1yn)log(11+exp(xn)1)]
    • CrossEntropyLoss = softmax + log + NLLloss
      l n = − ∑ c = 1 C w c log ⁡ exp ⁡ ( x n , c ) exp ⁡ ( ∑ i = 1 C x n , i ) y n , c l_n = - \sum_{c=1}^C w_c \log \frac{\exp(x_{n,c})}{\exp(\sum_{i=1}^C x_{n,i})} y_{n,c} ln=c=1Cwclogexp(i=1Cxn,i)exp(xn,c)yn,c
      N L L ( l o g ( s o f t m a x ( i n p u t ) ) , t a r g e t ) = − Σ i = 1 n O n e H o t ( t a r g e t ) i × l o g ( s o f t m a x ( i n p u t ) i ) ( i n p u t ∈ R m × n ) \large \mathbf{NLL(log(softmax(input)),target) = -\Sigma_{i=1}^n OneHot(target)_i\times log(softmax(input)_i)} (input∈Rm×n) NLL(log(softmax(input)),target)=Σi=1nOneHot(target)i×log(softmax(input)i)(inputRm×n)
  • box 的 gt_class --> target_class

    • CIOU:以往box检测框的损失函数都会使用的一项。
      考虑三种几何参数:重叠面积、中心点距离、长宽比。CIoU就是在DIoU的基础上增加了检测框尺度的loss,增加了长和宽的loss,这样预测框就会更加的符合真实框。
    • Distribution Focal Loss (DFL):使用向量表达边界与基准点的距离,然后结合softmax交叉熵计算得DFL项的loss
      将边界距离基准点的距离记为y,则可将基准点转换为(tl, tr),两者对应的权重为(wl, wr)。y.shape = tl.shape = tr.shape= [batch, n, 4]。
      tl.view(-1).shape = tr.view(-1).shape = [batc*n*4](假设左边界距离y=5.6,则 t l = 5 tl=5 tl=5 t r = 6 tr=6 tr=6 t l = 0.4 tl=0.4 tl=0.4 w r = 0.6 wr=0.6 wr=0.6
      此时网络输出的边界为pred_dist,pred_dist.shape=[batc*n*4,16]。则损失函数如下,:
      loss =  (F.cross_entropy(pred_dist, tl.view(-1), reduction='none').view(tl.shape) * wl +F.cross_entropy(pred_dist, tr.view(-1), reduction='none').view(tl.shape) * wr).mean(-1, keepdim=True)
      

4 yolov8 实例分割

4.1 网络结构

从工程实现中可以看到,分割的网络结构与目标检测的网络结构,主干网络、neck模块都是完全一致的,只有在任务侧 有所差异。
在这里插入图片描述
在这里插入图片描述

分割的head(coef) 与目标检测的head是基本一致的,仅最后一层的输出维度有所差异。
在这里插入图片描述

阅读源码并绘制网络结构图如上,可发现 在目标检测的head模块基础上,额外添加了segment的分支:掩码系数分支、原型分支。接下来会介绍该分割分支的具体使用。


3.2 分割的head输出

该部分内容借鉴了论文 YOLACT Real-time Instance Segmentation。

  • 【Proto的输出】
    网络会在第一个输出层中,输出一组mask原型,其数量工程中设置为32。不同mask为网络学习到不同的掩码信息,值得注意的是单张mask并不意味着mask中只有一个目标的mask。将mask可视化如下图,第一张mask仅人体,第二张为人体+羽毛球拍,第三张为另一张人体mask,第四张为球拍。
    在这里插入图片描述
    需将所有的mask线性叠加然后得到当前目标的最终掩码信息。下图当中示意了默认系数为1的线性叠加,但实际该掩码系数不可能同时为1。则安排了神经网络预测该系数,也就是mask_coef分支。
    在这里插入图片描述
  • 【mask_coef】
    网络每个gridceil都有3个输出信息:cls + box + mask_coef。对前两者进行解析可得到,有效的gridceil预测出了目标的类别 和 目标的box,此时可以很容易获取该gridceil中的目标的mask_coef,维度为32,刚好与Proto输出的channel维度32相一致。
  • 【gridceil中目标的mask的计算】
    1 通过mask_coef 和 Proto的线性叠加求出mask,其中 n 为 第n个检出结果: m a s k n = ∑ i = 0 32 m a s k _ c o e f i ∗ P r o t o i mask_n = \sum_{i=0}^{32}mask\_coef_{i}*Proto_{i} maskn=i=032mask_coefiProtoi2 仅保留该gridceil检测出的box内的mask,然后再对mask框内的mask的每个像素进行阈值过滤(工程中阈值设为0.5),即得到该目标的最终的mask。
    在这里插入图片描述

3.3 mask的损失函数

网络的输出经过 3.2 章节的处理后,得到解析后的mask信息

  • 训练时,mask与标签进行计算损失函数。也就是并不会对 Proto 和 mask_coef 直接进行监督;仅对每个box内有效的处理后的mask做损失函数的计算。
  • 预测时,mask通过阈值处理为2值图,像素=0为背景,像素=1为目标。不包含类别信息,类别信息由head_cls分支的输出提供。

训练时候的损失函数为

   def single_mask_loss(self, gt_mask, pred, proto, xyxy, area):"""Mask loss for one image."""## gt_mask: mask的标签## pred: 预测的mask_coef## proto:预测的32个原型mask## xyxy:目标检测框标签,用于选中有效区域的mask## area:目标检测框标签的面积,计算了box内的mask损失,要除以面积以为了平衡大小目标对最终损失的影响。pred_mask = (pred @ proto.view(self.nm, -1)).view(-1, *proto.shape[1:])  # (n, 32) @ (32,80,80) -> (n,80,80)loss = F.binary_cross_entropy_with_logits(pred_mask, gt_mask, reduction='none')return (crop_mask(loss, xyxy).mean(dim=(1, 2)) / area).mean()

5 关节点估计

有待补充完善。。。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

液压自动化成套设备比例阀放大器

液压电气成套设备的比例阀放大器是一种电子控制设备&#xff0c;用于控制液压动力系统中的液压比例阀1。 比例阀放大器通常采用电子信号进行控制&#xff0c;以控制比例阀的开度和流量&#xff0c;以实现液压系统的可靠控制。比例阀放大器主要由以下组成部分&#xff1a; 驱动…

Ps:变形

Ps菜单&#xff1a;编辑/变换/变形 Edit/Transform/Warp 变形 Warp是自由变换的一种模式&#xff0c;不仅可以用于物体的伸缩扭曲&#xff0c;也可用于人体的局部塑形。 除了从菜单打开&#xff0c;通常情况下&#xff0c;按 Ctrl T 进入自由变换&#xff0c;然后在画面上右击…

专题三:穷举、暴搜、深搜、回溯、剪枝【递归、搜索、回溯】

1、全排列 class Solution { public:vector<vector<int>> ret;vector<int> path;bool check[7];void dfs(vector<int>& nums){if(nums.size() path.size()) {ret.push_back(path);return;}for(int i 0;i < nums.size();i){if(check[i] fals…

Android查看签名信息系列 · 使用Android Studio获取签名

前言 Android查看签名信息系列 之使用Android Studio获取签名&#xff0c;通过Android Studio自带的gradle来获取签名信息。 优点&#xff1a;此法可查看 MD5、SHA1 等信息。 缺点&#xff1a;升级某个Studio版本后&#xff0c;没有签名任务了&#xff0c;特别不方便。 实现…

VulnHub lazysysadmin

一、信息收集 1.nmap扫描开发端口 开放了&#xff1a;22、80、445 访问80端口&#xff0c;没有发现什么有价值的信息 2.扫描共享文件 enum4linux--扫描共享文件 使用&#xff1a; enum4linux 192.168.103.182windows访问共享文件 \\192.168.103.182\文件夹名称信息收集&…

以烟草行业为例,聊聊如何基于 PLC + OPC + TDengine,快速搭建工业生产监测系统

在烟草工业场景里&#xff0c;多数设备的自动控制都是通过 PLC 可编程逻辑控制器来实现的&#xff0c;PLC 再将采集的数据汇聚至 OPC 服务器。传统的 PI System、实时数据库、组态软件等与 OPC 相连&#xff0c;提供分析、可视化、报警等功能&#xff0c;这类系统存在一些问题&…

Compose 实战之为下拉刷新添加自定义指示器

前言 在安卓开发中&#xff0c;下拉刷新是一个非常常用的功能&#xff0c;几乎只要是涉及到列表展示数据的界面都会用到它。 而 Compose 却直到 2022年10月份才在 compose.material:1.3.0 中添加了对下拉刷新的支持&#xff1a;Modifier.pullRefresh 。 在此之前&#xff0c…

RTSP协议

1 前言 RTSP协议作为音视频实时监控一个非常重要的协议&#xff0c;具有非常广泛的应用。RTSP由RFC 2326规范化&#xff0c;它允许客户端通过请求不同的媒体资源来控制流媒体服务器。RTSP是一种应用层协议&#xff0c;通常基于TCP连接&#xff0c;用于建立和控制媒体会话。这使…

pyqt5-tools的安装(深度学习)

本篇主要解决上篇深度学习pyqt安装失败的问题 PyQt是一个创建GUI应用程序的工具包。它是Python编程语言和Qt库的成功融合。Qt库是最强大的库之一。PyQt是由Phil Thompson 开发。在使用labelimg对图片做标签时&#xff0c;需要用到pyqt5-tools工具&#xff0c;尝试以下下载方式&…

10数据库-基础

四、数据库 15、MySQL 数据库优化 SQL优化 mysql优化 一、避免不走索引的场景尽量避免在字段开头模糊查询&#xff0c;会导致数据库引擎放弃索引进行全表扫描。尽量避免使用not in&#xff0c;会导致引擎走全表扫描。尽量避免使用 or&#xff0c;会导致数据库引擎放弃索引进行…

YUV图片常见格式

YUV图像 1个亮度量Y2个色度量(UV) 兼容黑白电视 可以通过降低色度的采样率而不会对图像质量影响太大的操作&#xff0c;降低视频传输带宽 有很多格式&#xff0c;所以渲染的时候一定要写对&#xff0c;不然会有很多问题&#xff0c;比如花屏、绿屏 打包格式 一个像素点一…

77.每日一练:迭代器遍历容器(牛客)

目录 问题描述&#xff1a; 代码解决以及思想 知识点 问题描述&#xff1a; 代码解决以及思想 #include <iostream> // write your code here...... #include <vector>using namespace std;int main() {// write your code here......vector<int> v;for (…

怎么使用动态代理IP提升网络安全,动态代理IP有哪些好处呢

随着互联网的普及和数字化时代的到来&#xff0c;网络安全问题越来越受到人们的关注。动态代理IP作为网络安全中的一种技术手段&#xff0c;被越来越多的人所采用。本文将介绍动态代理IP的概念、优势以及如何应用它来提升网络安全。 一、动态代理IP的概念 动态代理IP是指使用代…

六、DHCP实验

拓扑图&#xff1a; DHCP协议&#xff0c;给定一个ip范围使其自动给终端分配IP&#xff0c;提高了IP分配的效率 首先对PC设备选择DHCP分配ip 首先先对路由器的下端配置网关的ip 创建地址池&#xff0c;通过globle的方式实现DHCP ip pool 地址池名称 之后设置地址池的网关地址…

【马蹄集】—— 概率论专题

概率论专题 目录 MT2226 抽奖概率MT2227 饿饿&#xff01;饭饭&#xff01;MT2228 甜甜花的研究MT2229 赌石MT2230 square MT2226 抽奖概率 难度&#xff1a;黄金    时间限制&#xff1a;1秒    占用内存&#xff1a;128M 题目描述 小码哥正在进行抽奖&#xff0c;箱子里有…

抓包工具charles修改请求和返回数据

数据篡改的主要使用场景&#xff1a; &#xff08;1&#xff09;mock场景&#xff0c;mock入参和返回值参数&#xff0c;实现mock测试 &#xff08;2&#xff09;安全测试&#xff0c;对于支付金额等比较重要的字段&#xff0c;可以修改请求参数来进行安全测试 1.首先选择要…

信息系统项目管理师第四版学习笔记——组织通用治理

组织战略 组织战略是组织高质量发展的总体谋略&#xff0c;是组织相关干系方就其发展达成一致认识的重要基础。组织战略是指组织针对其发展进行的全局性、长远性、纲领性目标的策划和选择。 战略目标是组织在一定的战略期内总体发展的总水平和总任务。它决定了组织在该战略期…

程序员,今天你被“投毒”了么?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 产品统筹 / bobo 联合制作 / RTE开发者社区 录音间 / 声湃轩北京站 近日&#xff0c;安恒信息 CERT 监测到一起 LNMP 遭受供应链投毒攻击事件。我们发现&#xff0c;在 lnmp.org …

Linux小程序---进度条

一&#xff1a;\r 和 \n \r --- 回车 --- 使光标回到这一行的开头 \n --- 换行 --- 会来到下一行与之平行的位置 缓冲区的问题&#xff1a; <1>: \n 的示例 正常输出 hehehehe 。 <2>: \r 的示例 为了方便观察&#xff0c;加入一个 sleep &#xff08;休眠函数…

IDEA Gradle Lombok错误:找不到符号 setter getter方法没有

今天IDEA2022.3.3开个Gradle&#xff08;7.5版本&#xff09;项目&#xff0c;加入了Lombok依赖&#xff0c;依赖如下&#xff1a; dependencies {implementation group: org.springframework.boot, name: spring-boot-starter-web, version: 3.1.4compileOnly group: org.pro…