主要是对下面这一部分的整理:
一、
选取了两张图片做了一个简单的实验:
第一张是文件名为:000027.jpg ,x1,y1,x2,y2 坐标为:174,101,349,351,类别数为:14,即人这一个类别;第二张是文件名为:000018.jpg,x1,y1,x2,y2坐标为:31,30,358,279,类别数为:11,即狗这一个类别。第一个图片宽度:486,高度:500;第二个图片宽度:380,高度:285
二、debug代码
1、首先,一共20个类比
2、两个图片的bbox的位置x1,y1,x2,y2
3、将图片的bbox位置进行归一化,即每一个bbox坐标分别除以图片的高度和宽度
4、下面是标签的tensor:
5、定义grid cell大小为 7*7,最后输出的target为 7*7*30,cell_size = 1/7
6、计算每一张图片的bbox的宽度和高度,这是归一化之后的高度和宽度,即归一化之后的bbox的坐标对应相减,x2-x1,y2-y1
7、计算bbox的中心点坐标,用归一化后的bbox坐标去计算
8、
# x.size()[0]这里的[0]就是表示维度,cxcy.size()[0] = 2,即有两个bbox for i in range(cxcy.size()[0]): # cxcy_sample = tensor([0.5400, 0.4500]) cxcy_sample = cxcy[i] # 中心坐标 1*1 # .ceil()函数返回一个大于或等于 x 的的最小整数 # ij = tensor([3., 3.]) ij = (cxcy_sample / cell_size).ceil() - 1 # 左上角坐标 (7*7)为整数 # 第一个框的置信度 # target.size() = [7, 7, 30] # target[3,3,4] = 1,即第一个bbox的置信度为 1 target[int(ij[1]), int(ij[0]), 4] = 1 # target[3,3,9] = 1,即第二个bbox的置信度为 1 target[int(ij[1]), int(ij[0]), 9] = 1 # target[3,3,24] = 1,即该网格单元对应的类别为1 target[int(ij[1]), int(ij[0]), int(labels[i]) + 10] = 1 # 20个类别对应处的概率设置为1 # xy = [3,3]*1/7 = tensor([0.4286, 0.4286]) xy = ij * cell_size # 归一化左上坐标 (1*1) # delta_xy = ([0.5400, 0.4500] - [0.4286, 0.4286] )/ (1/7) = tensor([0.7800, 0.1500]) delta_xy = (cxcy_sample - xy) / cell_size # 中心与左上坐标差值 (7*7) # 坐标w,h代表了预测的bounding box的width、height相对于整幅图像width,height的比例 # 第一个bbox的宽度和高度,即wh[i] = tensor([0.3600, 0.5000]) # 中心坐标其实是相对左上角顶点的偏移, # 因此在进行预测的时候还需要进行解码,delta_xy = tensor([0.7800, 0.1500]) target[int(ij[1]), int(ij[0]), 2:4] = wh[i] # w1,h1 target[int(ij[1]), int(ij[0]), :2] = delta_xy # x1,y1 # 第二个bbox的宽度和高度,即wh[i] = tensor([0.3600, 0.5000]) # -----》初始化时两个bbox的w,h是相等的 target[int(ij[1]), int(ij[0]), 7:9] = wh[i] # w2,h2 # 由此可得其实返回的中心坐标其实是相对左上角顶点的偏移,因此在进行预测的时候还需要进行解码 # delta_xy = tensor([0.7800, 0.1500]) target[int(ij[1]), int(ij[0]), 5:7] = delta_xy # 表示x2,y2 # target.size() = [7, 7, 30] print(target) # (xc,yc) = 7*7 (w,h) = 1*1
三、
1、
2、
3、
4、
5、