| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> YOLO-V3-SPP utils.py build_targets函数-详细解读(ultralytic版本) -> 正文阅读 |
|
[人工智能]YOLO-V3-SPP utils.py build_targets函数-详细解读(ultralytic版本) |
前言理论详解:YOLO-V3-SPP详细解析 build_targets讲解形式主要以流程图形式,逐流程详细解读每一行代码 代码以pytorch框架为基础 targets处理整体流程这里主要介绍了targets的来龙去脉,targets指的是数据集中标注好的GroundTruth的目标信息,,build_target这个函数主要是处理当前批次的所有图片的targets,将当前批次的所有targets经过:
博文主要讲解targets的筛选过程,主要讲清楚build_targets这个函数在做什么 build_targets源码
build_targets源码详解建议将上述源码复制到编译器后,边看代码边看解析 基础的参数解析
函数传入三个参数
p的shape为 ( Y o l o L a y e r _ n u m , b a t c h _ s i z e , a n c h o r _ n u m , g r i d _ y , g r i d _ x , x y w h + o b j _ c o n f i d e n c e + c l s _ n u m ) (YoloLayer\_num,batch\_size,anchor\_num,grid\_y,grid\_x,xywh+obj\_confidence+cls\_num) (YoloLayer_num,batch_size,anchor_num,grid_y,grid_x,xywh+obj_confidence+cls_num) targets的shape为 ( n u m _ g r o u n d t r u t h , 6 ) (num\_groundtruth,6) (num_groundtruth,6),其中数字6代表 i m g _ i n d e x + c l s _ i n d e x + x y w h img\_index+cls\_index+xywh img_index+cls_index+xywh
nt获取targets第一个维度
n
u
m
_
g
r
o
u
n
d
t
r
u
t
h
num\_groundtruth
num_groundtruth的数值
以上4组参数也是该build_targets所返回的参数
前面提到buildd_targets的输入参数p的作用,这里gain的作用就是将输入参数p的shape转化为tensor,后面会提到gain的操作,这里只是对gain进行初始化,初始化为一个6维都为数值1的tensor multi_gpu这里的处理代码我并没有了解,本人由于只使用了一个gpu,就没有去了解这相关的代码,感兴趣的请自行查阅相关库函数及处理
model.yolo_layers参数为model的成员变量,定义为yolo层索引list=[89, 101, 113] 上面提到的gain操作就是
p[i]表示第i个yolo_layer的输出,shape为
(
b
s
,
a
n
c
h
o
r
,
g
r
i
d
_
x
,
g
r
i
d
_
y
,
x
y
w
h
+
o
b
j
_
c
o
n
f
i
d
e
n
c
e
+
c
l
s
_
n
u
m
)
(bs,anchor,grid\_x,grid\_y,xywh+obj\_confidence+cls\_num)
(bs,anchor,grid_x,grid_y,xywh+obj_confidence+cls_num) na获取anchors第一个维度的值,即anchors的数量3 gt恢复到feature map尺度
a作target使用的anchor索引用 offsets默认为0,在获取当前gt所在的 g r i d _ c e l l grid\_cell grid_cell左上角坐标时会用到,但该函数offsets的设置一直为0,并没有什么作用 wh_IOU(宽高IOU筛选gt)思路:gt与当前yolo_layer分配到的三组anchor进行宽高IOU筛选
这里判断是否有gt,有的话对gt进行筛选,筛选方式是宽高IOU,宽高IOU的源码如下:
None的作用是增加一个维度,具体请见注释
j表示对所有gt的box与三组anchor的wh_iou是否满足超参数iou_t=0.2的布尔关系
a前面已经说过,表示筛选后的gt的anchor索引 t = t.repeat(na, 1, 1)[j]作用:前面提过t的shape为
(
n
t
,
6
)
(nt,6)
(nt,6),即
(
n
t
,
i
m
g
_
i
n
d
e
x
+
c
l
s
_
i
n
d
e
x
+
x
+
y
+
w
+
h
)
(nt,img\_index+cls\_index+x+y+w+h)
(nt,img_index+cls_index+x+y+w+h)
对筛选后的gt进行数值调整
t[:, :2].long().T对
t
=
(
n
t
,
i
m
g
_
i
n
d
e
x
+
c
l
s
_
i
n
d
e
x
+
x
+
y
+
w
+
h
)
t=(nt,img\_index+cls\_index+x+y+w+h)
t=(nt,img_index+cls_index+x+y+w+h)的第二个维度开始筛选前两个值,即img_index和cls_index 记住,这里的t是已经恢复到yolo_layer的feature map尺度的tensor了 gij = (gxy - offsets).long() 这里offsets为0,等于没有使用到,这里long()函数将gxy向下取整,刚好就能得到当前gt的所在的grid的左上角坐标,具体解释如下图: 返回参数
tcls:筛选出来的gt的类索引 总结build_targets的代码比较繁琐,基本都是tensor的操作比较多,读起来不太容易,但搞清楚了这个函数,你就能知道获取的gt的状态,从而了解到loss是如何计算的,包括loss的正负样本的判别。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/17 22:36:25- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |