网站与建设实训报告xin主题wordpress
web/
2025/9/29 2:47:33/
文章来源:
网站与建设实训报告,xin主题wordpress,怎么做创意短视频网站,网站漂浮代码Anchor生成机制 YOLOv1YOLOv2YOLOv4模型输出decode1.维度变换2.读取位置信息3.坐标变换4.构建网格5. 计算实际偏移量6.得到输出 YOLOv1
利用全连接层直接对边界框进行预测
YOLOv2
YOLOv2通过缩减网络#xff0c;使用416x416的输入#xff0c;模型下采样的总步长为32#… Anchor生成机制 YOLOv1YOLOv2YOLOv4模型输出decode1.维度变换2.读取位置信息3.坐标变换4.构建网格5. 计算实际偏移量6.得到输出 YOLOv1
利用全连接层直接对边界框进行预测
YOLOv2
YOLOv2通过缩减网络使用416x416的输入模型下采样的总步长为32最后得到13x13的特征图然后对13x13的特征图的每个cell预测5个anchor boxes对每个anchor box预测边界框的位置信息、置信度和一套分类概率值。使用anchor boxes之后YOLOv2可以预测13x13x5845个边界框
YOLOv4
完成cfg文件的解析模型的创建与权重文件的加载之后现在要做的就是执行检测操作主要调用了utils/utils.py中的do_detect() 函数在demo.py中
boxes do_detect(m, sized, 0.5, 0.4, use_cuda)模型forward后输出结果存在list_boxes中因为有3个yolo输出层所以这个列表list_boxes中又分为3个子列表
其中list_boxes[0]中存放的是第一个yolo层输出其特征图大小对于原图缩放尺寸为8即strides[0], 对于608x608图像来说该层的featuremap尺寸为608/876则该层的yolo输出数据维度为[batch, (classnum41)*num_anchors, feature_h, feature_w] , 对于80类的coco来说测试图像为1每个yolo层每个特征图像点有3个锚点该yolo层输出是[1,255,76,76]对应锚点大小为[1.5,2.0,2.375,4.5,5.0,3.5]; (这6个数分别是3个锚点的w和h,按照 w 1 , h 1 , w 2 , h 2 , w 3 , h 3 w_1,h_1,w_2,h_2,w_3,h_3 w1,h1,w2,h2,w3,h3排列)
第二个yolo层检测结果维度为[1,255,38,38],对应锚点大小为[2.25,4.6875,4.75,3.4375,4.5,9.125], 输出为 [1,255,38,38]第三个yolo层检测维度为[1,255,19,19]对应锚点大小为[4.4375,3.4375,6.0,7.59375,14.34375,12.53125] 输出为 [1,255,19,19]
do_detect() 函数中主要是调用了 get_region_boxes1(output, conf_thresh, num_classes, anchors, num_anchors, only_objectness1, validationFalse) 这个函数对forward后的output做解析并做nms操作
每个yolo层输出数据分析对于第一个yolo层输出维度为[1,85*3,76,76 ]; 会将其reshape为[85, 1*3*76*76],即有1*3*76*76个锚点在预测每个锚点预测信息有80个类别的概率和4个位置信息和1个是否包含目标的置信度
yolov4的输出需要包含的信息有物体的位置信息、有物体的概率、物体的分类可以写为 t x , t y , t w , t h , o b j , c l s t_x, t_y, t_w, t_h, obj, cls tx,ty,tw,th,obj,cls其中前四个是物体的位置信息最后一个cls根据分类的类别数维度不同如果只有1个类别那就只占1个位置如果是2个类别就是2个位置使用one-hot编码。
而在实际的yolov4的最终输出之前是19,19,1024通过蓝色的18个(当只有1个分类类别的时候如果有2个那就是19个卷积核)111024的卷积核得到19,19,18最后reshape成3,19,19,tx, ty, tw, th, obj, cls。后面的是检测的物体信息而前面的3,19,19的理解如下
19*19个特征点等同于把原图分成了19 *19个网格原图的输入是608 *608的那么每一个网格的大小就是608/1932每一个特征点只关注对应的网格判断对应的网格是否有物体。
模型输出decode
模型的输出有三个分别是(B, 255, 19, 19),(B, 255, 38, 38),(B, 255, 76, 76)因此需要对这三个输出分别解码。
1.维度变换
首先需要将输出view成(B, A, n_ch, H, W)的形式其中H和W就是输出的尺寸A是锚框数量n_ch是包含了bx, by, bw, bh, obj, cls的信息维度为418085。之后再进行一个维度变换最终得到(B, 3, 19, 19, 85)的维度以第一个为例。此时最后一个维度85包含了我们解码所需的所有信息也就是说我们需要对前面B319*19这么多的数据都进行同样方式的解码。
2.读取位置信息
接下来我们取出来bx, by, bw, bh, obj, cls。注意此时除了cls之外其他所有的维度都减少了一维变成了(B, 3, 19, 19)因为cls是以切片形式取的所以维度数量不变是(B, 3, 19, 19, 80)。
# 取出来 bx, by, bw, bh
bx, by output[..., 0], output[..., 1]
bw, bh output[..., 2], output[..., 3]
# 取出来obj和cls
obj output[..., 4]
cls output[..., 5:]3.坐标变换
我们需要先把bx, by取一个sigmoid把bw和bh取一个exp。这里加上了缩放因子据说当图片中的目标既有大又有小的时候会起作用暂时没见到实际起作用的情况不过先加上了当缩放因子为1的时候相当于不起作用。这里我们同时也对物体以及分类的置信度取sigmoid。 # 进行初步转换bx torch.sigmoid(bx)by torch.sigmoid(by)bw torch.exp(bw) * scale_x_y - 0.5 * (scale_x_y - 1)bh torch.exp(bh) * scale_x_y - 0.5 * (scale_x_y - 1)# 对物体置信度分类置信度也取sigmoiddet_confs torch.sigmoid(obj)cls_confs torch.sigmoid(cls)4.构建网格
目标是找到点相对于整张图的偏移的比例但由于我们分了网格因此先找相对于网格的偏移比例。
这里图像被分成了19*19个网格假如中心点在第2行第3列的网格里面。
相对网格的偏移量肯定是小数比如在x轴方向上偏移是0.5在y轴上偏移是0.2也就是在网格中间偏上的位置。
那么以网格为单位相对于所有网格来说中心点的实际偏移量
在x轴方向的0.5加上偏移的网格数也就是2从0开始计数那么得到了2.5就是以网格为单位相对于整张网格图的x轴偏移量。同理y轴方向上相对于y轴的就是1.5。
因此我们需要把x和y方向上的网格数量构建一下并找到以网格为单位的偏移量。 # 构建网格grid_x和grid_ygrid_x torch.arange(W, dtypetorch.float).repeat(1, 3, W, 1).to(device)grid_y torch.arange(W, dtypetorch.float).repeat(1, 3, H, 1).permute(0, 1, 3, 2).to(device)# 求bx和bybx bx grid_xby by grid_y5. 计算实际偏移量
既然找到了相对于网格的偏移量那么偏移的比例就是偏移量除以网格长度这个比例就是相对于网格的偏移比例同时也是相对于整张图的偏移比例。另外根据解码图我们对于w和h还需要乘上先验框的宽、高得到最终的bw和bh。 # 取每个anchor的长和宽求bw和bhfor i in range(num_anchors):bw[:, i, ...] * anchors[i * 2]bh[:, i, ...] * anchors[i * 2 1]# 对数据转换除以网格数量得到相对整张图的偏移的比例并增加一个维度bx (bx / W).unsqueeze(-1)by (by / H).unsqueeze(-1)bw (bw / W).unsqueeze(-1)bh (bh / H).unsqueeze(-1)6.得到输出
现在对于中心点相对于原图的偏移量以及宽高都得到了我们把这四个数据结合起来再把obj和cls的置信度都合在一起就得到了我们最终解码后的输出用于后续的画图等计算。 # 四个数据拼接起来并reshape成[B, -1, 4]的形状boxes torch.cat([bx, by, bw, bh], dim-1).reshape(B,A*W*H, 4)det_confs det_confs.unsqueeze(-1).reshape(B,A*W*H, 1)cls_confs cls_confs.reshape(B,A*W*H, num_classes)outputs torch.cat([boxes, det_confs, cls_confs], dim-1)注网格生成
grid_x torch.linspace(0, input_width - 1, input_width).repeat(input_height, 1).repeat(batch_size * len(self.anchors_mask[i]), 1, 1).view(x.shape).type(FloatTensor)
#先生成一行(width),在重复一列(height),再扩充维度最后view成[batchsize, 3, h, w]grid_y torch.linspace(0, input_height - 1, input_height).repeat(input_width, 1).t().repeat(batch_size * len(self.anchors_mask[i]), 1, 1).view(y.shape).type(FloatTensor)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83652.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!