当前位置: 首页 > news >正文

无锡正规网站seo公司wordpress 图片边框

无锡正规网站seo公司,wordpress 图片边框,网站优化建设,淮北官方网站一. 参考资料 《YOLO目标检测》 by 杨建华博士 本篇文章的主要内容来自于这本书#xff0c;只是作为学习记录进行分享。 二. 环境搭建 (1) ubuntu20.04 anaconda安装方法 (2) 搭建yolo训练环境 # 首先#xff0c;我们建议使用Anaconda来创建一个conda的虚拟环境 conda cre… 一. 参考资料 《YOLO目标检测》 by 杨建华博士 本篇文章的主要内容来自于这本书只是作为学习记录进行分享。 二. 环境搭建 (1) ubuntu20.04 anaconda安装方法 (2) 搭建yolo训练环境 # 首先我们建议使用Anaconda来创建一个conda的虚拟环境 conda create -n yolo python3.6 # 然后, 请激活已创建的虚拟环境 conda activate yolo # 接着配置环境: pip install -r requirements.txt # 项目作者所使用的环境配置:PyTorch 1.9.1 Torchvision 0.10.1 # 为了能够正常运行该项目的代码请确保您的torch版本为1.x系列。 三. YOLOv1代码解读 3.1 YOLOv1整体框架 # YOLO_Tutorial/models/yolov1/yolov1.py # -------------------------------------------------------- ...class YOLOv1(nn.Module):def __init__(self, cfg, device, input_size, num_classes, trainable, conf_thresh, nms_thresh):super(YOLOv1, self).__init__()self.cfgcfg # 模型配置文件self.devicedevice # 设备、CUDA或CPUself.num_classesnum_classes # 类别的数量self.trainabletrainable # 训练的标记self.conf_threshconf_thresh # 得分阈值self.nms_threshnms_thresh # NMS阈值self.stride32 # 网络的最大步长# 主干网络 # TODO: 构建我们的backbone网络# self.backbone?# 颈部网络 # TODO: 构建我们的neck网络# self.neck?# 检测头 # TODO: 构建我们的detection head 网络# self.head?# 预测层 # TODO: 构建我们的预测层# self.pred?def create_grid(self, input_size):# TODO: 用于生成网格坐标矩阵def decode_boxes(self, pred):# TODO: 解算边界框坐标def nms(self, bboxes, scores):# TODO: 非极大值抑制操作def postprocess(self, bboxes, scores):# TODO: 后处理, 包括得分阈值筛选和NMS操作torch.no_grad()def inference(self, x):# TODO: YOLOv1前向推理def forward(self, x, targetsNone):# TODO: YOLOv1的主体运算函数 3.2 YOLOv1主干网络 作者改进的YOLOv1使用较轻量的ResNet-18作为主干网络。由于PyTorch官方已提供了ResNet的源码和相应的预训练模型因此这里就不需要我们自己去搭建ResNet的网络和训练了。为了方便调用和查看ResNet的代码文件放在项目中models/yolov1/yolov1_backbone.py文件下感兴趣的读者可以打开该文件来查看ResNet网络的代码。在确定了主干网络后我们只需在YOLOv1框架中编写代码即可调用ResNet-18网络如代码4-5所示。 # 主干网络 # TODO:构建我们的backbone网络 self.backbone,feat_dimbuild_backbone(cfg[backbone],trainablecfg[pretrained]) 在代码4-5中cfg是模型的配置文件feat_dim变量是主干网络输出的特征图的通道数这在后续的代码会使用到。我们通过trainablecfg[pretrained]的组合来决定是否加载预训练权重。代码4-6展示了模型的配置文件所包含的一些参数包括网络结构的参数、损失函数所需的权重参数、优化器参数以及一些训练配置参数等每个参数的含义都已标注在注释中。 # YOLO_Tutorial/config/mode1_config/yolov1_config.py # -------------------------------------------------------- ...yolov1_cfg{# inputtrans_type: ssd, # 使用SSD风格的数据增强multi_scale: [0.5, 1.5], # 多尺度的范围# modelbackbone: resnet18, # 使用ResNet-18作为主干网络pretrained: True, # 加载预训练权重stride: 32, # P5 # 网络的最大输出步长# neckneck: sppf, # 使用SPP作为颈部网络expand_ratio: 0.5, # SPP的模型参数pooling_size: 5, # SPP的模型参数neck_act: lrelu, # SPP的模型参数neck_norm: BN, # SPP的模型参数neck_depthwise: False, # SPP的模型参数# headhead: decoupled_head, # 使用解耦检测头head_act: lrelu, # 检测头所需的参数head_norm: BN, # 检测头所需的参数num_cls_head: 2, # 解耦检测头的类别分支所包含的卷积层数num_reg_head: 2, # 解耦检测头的回归分支所包含的卷积层数head_depthwise: False, # 检测头所需的参数# loss weightloss_obj_weight: 1.0, # obj损失的权重loss_cls_weight: 1.0, # cls损失的权重loss_box_weight: 5.0, # box损失的权重# training configurationno_aug_epoch: -1, # 关闭马赛克增强和混合增强的节点# optimizeroptimizer: sgd, # 使用SGD优化器momentum: 0.937, # SGD优化器的momentum参数weight_decay: 5e-4, # SGD优化器的weight_decay参数clip_grad: 10, # 梯度剪裁参数# model EMAema_decay: 0.9999, # 模型EMA参数ema_tau: 2000, # 模型EMA参数# lr schedulescheduler: linear, # 使用线性学习率衰减策略lr0: 0.01, # 初始学习率lrf: 0.01, # 最终的学习率lr0 * lrfwarmup_momentum: 0.8, # Warmup阶段, 优化器的momentum参数的初始值warmup_bias_lr: 0.1, # Warmup阶段, 优化器为模型的bias参数设置的学习率初始值 } 3.3 YOLOv1颈部网络 作者改进的YOLOv1选择SPP模块作为颈部网络。SPP网络的结构非常简单仅由若干不同尺寸的核的最大池化层所组成实现起来也非常地简单相关代码我们已经在前面展示了。而在YOLOv1中我们直接调用相关的函数来使用SPP即可如代码4-7所示。 # 颈部网络 # TODO: 构建我们的颈部网络 self.neckbuild_neck(cfg, feat_dim, out_dim512) head_dimself.neck.out_dim 3.4 YOLOv1检测头 有关检测头的代码和预测层相关的代码已经在前面介绍过了这里我们只需要调用相关的函数来使用解耦检测头然后再使用卷积创建预测层如代码4-8所示。 # 检测头 # TODO: 构建我们的detection head 网络 ## 检测头 self.headbuild_head(cfg, head_dim, head_dim, num_classes)# 预测层 # TODO: 构建我们的预测层 self.obj_prednn.Conv2d(head_dim, 1, kernel_size1) self.cls_prednn.Conv2d(head_dim, num_classes, kernel_size1) self.reg_prednn.Conv2d(head_dim, 4, kernel_size1) 3.5 YOLOv1前向推理函数 在上述所示的推理代码中作者对pred操作执行了view操作将和两个维度合并到一起由于这之后不会再有任何卷积操作了而仅仅是要计算损失因此将输出张量的维度从调整为的目的仅是方便后续的损失计算和后处理而不会造成其他不必要的负面影响。 def forward(self, x):if not self.trainable:return self.inference(x)else:# 主干网络featself.backbone(x)# 颈部网络featself.neck(feat)# 检测头cls_feat, reg_featself.head(feat)# 预测层obj_predself.obj_pred(cls_feat)cls_predself.cls_pred(cls_feat)reg_predself.reg_pred(reg_feat)fmp_sizeobj_pred.shape[-2:]# 对pred 的size做一些调整, 便于后续的处理# [B, C, H, W] - [B, H, W, C] - [B, H*W, C]obj_predobj_pred.permute(0, 2, 3, 1).contiguous().flatten(1, 2)cls_predcls_pred.permute(0, 2, 3, 1).contiguous().flatten(1, 2)reg_predreg_pred.permute(0, 2, 3, 1).contiguous().flatten(1, 2)# 解耦边界框box_predself.decode_boxes(reg_pred, fmp_size)# 网络输出outputs{pred_obj: obj_pred, # (Tensor) [B, M, 1]pred_cls: cls_pred, # (Tensor) [B, M, C]pred_box: box_pred, # (Tensor) [B, M, 4]stride: self.stride, # (Int)fmp_size: fmp_size # (List) [fmp_h, fmp_w]}return outputs 另外在测试阶段我们只需要推理当前输入图像无须计算损失所以我们单独实现了一个inference函数如代码4-10所示。 torch.no_grad() def inference(self, x):# 主干网络featself.backbone(x)# 颈部网络featself.neck(feat)# 检测头cls_feat, reg_featself.head(feat)# 预测层obj_predself.obj_pred(cls_feat)cls_predself.cls_pred(cls_feat)reg_predself.reg_pred(reg_feat)fmp_sizeobj_pred.shape[-2:]# 对pred 的size做一些调整, 便于后续的处理# [B, C, H, W] - [B, H, W, C] - [B, H*W, C]obj_predobj_pred.permute(0, 2, 3, 1).contiguous().flatten(1, 2)cls_predcls_pred.permute(0, 2, 3, 1).contiguous().flatten(1, 2)reg_predreg_pred.permute(0, 2, 3, 1).contiguous().flatten(1, 2)# 测试时, 默认batch是1# 因此, 我们不需要用batch这个维度, 用[0]将其取走obj_predobj_pred[0] # [H*W, 1]cls_predcls_pred[0] # [H*W, NC]reg_predreg_pred[0] # [H*W, 4]# 每个边界框的得分scorestorch.sqrt(obj_pred.sigmoid() * cls_pred.sigmoid())# 解算边界框, 并归一化边界框: [H*W, 4]bboxesself.decode_boxes(reg_pred, fmp_size)# 将预测放在CPU处理上, 以便进行后处理scoresscores.cpu().numpy()bboxesbboxes.cpu().numpy()# 后处理bboxes, scores, labelsself.postprocess(bboxes, scores)return bboxes, scores, labels 在上面的用于推理的代码中装饰器torch.no_grad()表示该inference函数不会存在任何梯度因为推理阶段不会涉及反向传播无须计算变量的梯度。在这段代码中多了一个后处理postprocess函数的调用将在后续进行说明。 至此我们搭建完了YOLOv1的网络只需将上面的单独实现分别对号入座地加入YOLOv1的网络框架里。最后我们就可以获得网络的3个预测分支的输出。但是这里还遗留下了以下3个问题尚待处理。 (1) 如何有效地计算出边界框的左上角点坐标和右下角点坐标。 (2) 如何计算3个分支的损失。 (3) 如何对预测结果进行后处理。 3.6 YOLOv1的后处理 (1) 求解预测边界框的坐标 对于某一处的网格YOLOv1输出的边界框的中心点偏移量预测为和宽和高的对数映射预测为和我们使用公式(4-6)即可解算出边界框的中心点坐标和与宽高和 其中是Sigmoid函数。从公式中可以看出为了计算预测的边界框的中心点坐标我们需要获得网格的坐标因为我们的YOLOv1也是在每个网格预测偏移量从而获得精确的边界框中心点坐标。直接的方法就是遍历每一个网格以获取网格坐标然后加上此处预测的偏移量即可获得此处预测出的边界框中心点坐标但是这种for循环操作的效率不高。在一般情况下能用矩阵运算来实现的操作就尽量避免使用for循环因为不论是GPU还是CPU矩阵运算都是可以并行处理的开销更小因此这里我们采用一个讨巧的等价方法。 在计算边界框坐标之前先生成一个保存网格所有坐标的矩阵其中和是输出的特征图的空间尺寸2是网格的横纵坐标。就是输出特征图上处的网格坐标即如图4-7所示。 所以在清楚了G矩阵的含义后我们便可以编写相应的代码来生成G矩阵如代码4-11所示。 def create_grid(self, input_size):# 输入图像的宽和高w, hinput_size, input_size# 特征图的宽和高ws, hsw // self.stride, h // self.stride# 生成网格的x坐标和y坐标grid_y, grid_xtorch.meshgrid([torch.arange(hs), torch.arange(ws)])# 将x和y两部分的坐标拼起来[H, W, 2]grid_xytorch.stack([grid_x, grid_y], dim-1).float()# [H, W, 2] - [HW, 2]grid_xygrid_xy.view(-1, 2).to(self.device)return grid_xy 注意为了后续解算边界框的方便将grid_xy的维度调整成的形式因为在讲解YOLOv1的前向推理的代码时输出的txtytwth_pred的维度被调整为的形式这里我们为了保持维度一致也做了同样的处理。在得到了G矩阵之后我们就可以很容易计算边界框的位置参数了包括边界框的中心点坐标、宽、高、左上角点坐标和右下角点坐标代码4-12展示了这一计算过程。 def decode_boxes(self, pred, fmp_size):将txtytwth转换为常用的x1y1x2y2形式# 生成网格坐标矩阵grid_cellself.create_grid(fmp_size)# 计算预测边界框的中心点坐标、宽和高pred_ctr(torch.sigmoid(pred[..., :2]) grid_cell) * self.stridepred_whtorch.exp(pred[..., 2:]) * self.stride# 将所有边界框的中心点坐标、宽和高换算成x1y1x2y2形式pred_x1y1pred_ctr - pred_wh * 0.5pred_x2y2pred_ctr pred_wh * 0.5pred_boxtorch.cat([pred_x1y1, pred_x2y2], dim-1)return pred_box 最终我们会得到边界框的左上和右下角点坐标。 3.7 后处理 当我们得到了边界框的位置参数后我们还需要对预测结果做进一步的后处理滤除那些得分低的边界框和检测到同一目标的冗余框。因此后处理的主要作用可以总结为两点 (1)滤除得分低的低质量边界框 (2)滤除对同一目标的冗余检测结果即非极大值抑制(NMS)处理。在清楚了后处理的逻辑和目的后我们就可以编写相应的代码了如代码4-13所示。 def postprocess(self, bboxes, scores):# 将得分最高的类别作为预测的类别标签labelsnp.argmax(scores, axis1)# 预测标签所对应的得分scoresscores[(np.arange(scores.shape[0]), labels)]# 阈值筛选keepnp.where(scores self.conf_thresh)bboxesbboxes[keep]scoresscores[keep]labelslabels[keep]# 非极大值抑制keepnp.zeros(len(bboxes), dtypenp.int)for i in range(self.num_classes):indsnp.where(labelsi)[0]if len(inds)0:continuec_bboxesbboxes[inds]c_scoresscores[inds]c_keepself.nms(c_bboxes, c_scores)keep[inds[c_keep]]1keepnp.where(keep 0)bboxesbboxes[keep]scoresscores[keep]labelslabels[keep]return bboxes, scores, labels 我们采用十分经典的基于Python语言实现的代码作为本文的非极大值抑制。在入门阶段希望读者能够将这段代码烂熟于心这毕竟是此领域的必备算法之一。相关代码如代码4-14所示。 def nms(self, bboxes, scores):Pure Python NMS baseline.x1bboxes[:, 0] #xminy1bboxes[:, 1] #yminx2bboxes[:, 2] #xmaxy2bboxes[:, 3] #ymaxareas(x2 - x1) * (y2 - y1)orderscores.argsort()[::-1]keep[]while order.size 0:iorder[0]keep.append(i)# 计算交集的左上角点和右下角点的坐标xx1np.maximum(x1[i], x1[order[1:]])yy1np.maximum(y1[i], y1[order[1:]])xx2np.minimum(x2[i], x2[order[1:]])yy2np.minimum(y2[i], y2[order[1:]])# 计算交集的宽和高wnp.maximum(1e-10, xx2 - xx1)hnp.maximum(1e-10, yy2 - yy1)# 计算交集的面积interw * h# 计算交并比iouinter / (areas[i] areas[order[1:]] - inter)# 滤除超过NMS阈值的边界框indsnp.where(iou self.nms_thresh)[0]orderorder[inds 1]return keep 经过后处理后我们得到了最终的3个输出变量 (1)变量bboxes包含每一个边界框的左上角坐标和右下角坐标 (2)变量scores包含每一个边界框的得分 (3)变量labels包含每一个边界框的类别预测。 至此我们填补了之前留下来的空白只需要将上面实现的每一个函数放置到YOLOv1的代码框架中即可组成最终的模型代码。读者可以打开项目中的models/yolov1/yolov1.py文件来查看完整的YOLOv1的模型代码。 四.代码 https://github.com/Tipriest/Lessons/tree/master/YOLO/YOLO_Tutorialhttps://github.com/Tipriest/Lessons/tree/master/YOLO/YOLO_Tutorialhttps://github.com/Tipriest/Lessons/tree/master/YOLO/YOLO_Tutorialhttps://github.com/Tipriest/Lessons/tree/master/YOLO/YOLO_Tutorialhttps://github.com/Tipriest/Lessons/tree/master/YOLO/YOLO_Tutorialhttps://github.com/Tipriest/Lessons/tree/master/YOLO/YOLO_Tutorialhttps://github.com/Tipriest/Lessons/tree/master/YOLO/YOLO_Tutorial
http://www.hkea.cn/news/14442996/

相关文章:

  • 鄂州商城网站建设建一个个人网站一年多少钱
  • 什么是网站网页主页网络营销培训班
  • 企业网站seo手机青岛建站价格
  • 室内设计公司 网站建设办公软件开发公司
  • 重庆手机网站推广价格搭建网站大概需要多少钱
  • 企慕网站建设网络推广wordpress 浮动播放器
  • 江苏省建设厅网站 杨洪海网站建设与网页制作教程
  • 广州网站运营十年乐云seo唐山网站建设哪家好
  • 免费视频课程网站模板户县建设局网站
  • 如何创建div做网站做餐饮公司网站
  • 海南网站建设优化排名上海外贸公司工资一般多少
  • wordpress站点标题副标题换行网站后台怎么修改文字
  • 浙江城乡住房建设厅网站首页广东网站建设公司有哪些
  • 网站建设技术jsp课程设计可信网站服务
  • 国外优秀的网站设计平台网站建设源码
  • 做个手机网站有必要吗外国外贸论坛
  • php做电影网站网站安全建设申请
  • 如何申请一个网站 做视频直播网站制作需要多少钱k
  • 一般网站的后台怎么做的买了一个域名如何做网站
  • 传媒网站建设价格永久建站空间购买
  • 手机网站导航栏特效做网站怎么与客户谈判
  • 触屏网站开发wordpress如何做淘宝客
  • 网站集群建设网站建设 通知
  • 免费 网站管理系统网站推广120
  • 网站建设方法牜金手指下拉覀wordpress登录页样式美化
  • 模板网站制作服务wordpress链接 数据库文件
  • 滨海新区做网站电话成都网站关键词排名
  • 网络安全公司排名前十名吐鲁番seo招聘
  • vs2008网站开发网站开发建设推荐
  • 想自己做点飘纱素材到网站上买科技公司网站设计方案