首页 > 其他分享 >深度学习---目标检测网络YoloX

深度学习---目标检测网络YoloX

时间:2023-10-08 11:14:33浏览次数:37  
标签:__ YoloX py loss -- self YOLOX --- 深度

一、网络介绍

YoloX由旷视科技开源,以YoloV3(Darknet53作为backbone)作为基线,最大的区别在于 Decoupled Head,Data Aug,Anchor Free 和样本匹配(SimOTA)这几个方面,另外还提供了完善的代码,并很贴心的提供了部署脚本,真的很友好了。
PDF: https://arxiv.org/pdf/2107.08430.pdf
Code: https://github.com/Megvii-BaseDetection/YOLOX
参考:https://www.zhihu.com/question/473350307

1. Decoupled Head

将检测头解耦无疑会增加运算的复杂度,但经过权衡速度和性能上的得失,最终使用 1个1x1 的卷积先进行降维,并在分类和回归分支里各使用了 2个3x3 卷积,最终仅仅增加一点点参数,YOLOX 在 s,m,l,x 模型速度上的轻微下降也全源自于此。表面上看,解耦检测头提升了 YOLOX 的性能和收敛速度,但更深层次的,它为 YOLO 与检测下游任务的一体化带来可能。如:

  • YOLOX + Yolact/CondInst/SOLO ,实现端侧的实例分割
  • YOLOX + 34 层输出,实现端侧人体的 17 个关键点检测

2. Data Aug

数据增强方法Mosaic (主要思想是将四张图片进行随机裁剪,再拼接到一张图上作为训练数据,丰富背景的同时变相的增加了BatchSize)经过 YOLOv5 和 v4 的验证,已经证明了其能带来显著涨点。

YoloX为 Mosaic 配上 Copypaste,依然有不小的提升。这样做的原因是:当模型容量足够大的时候,相对于先验知识(各种 tricks,hand-crafted rules ),更多的后验(数据/数据增强)才会产生本质影响。可 Copypaste 的实现依赖于目标的 mask 标注,而 mask 标注在常规的检测业务上是稀缺的资源。而由于 MixUp 和 Copypaste 有着类似的贴图的行为,还不需要 mask 标注,因此可以让 YOLOX 在没有 mask 标注的情况下吃到 Copypaste 的涨点。不过YoloX中的 Mixup,没有原始 Mixup 里的 Bernoulli Distribution 和 Soft Label ,有的仅是 0.5 的常数透明度和 Copypaste 里提到的尺度缩放 ( scale jittering )。 YOLOX 里的 Mixup 有如此明显的涨点,大概是因为它在实现和涨点原理上更接近 Copypaste,而不是原版 Mixup。

注意:要在训练结束前的15个 epoch 关掉 Mosaic 和Mixup ,这可以避免让 YOLOX 训练结果偏离真实分布(Mosaic+Mixup 生成的训练图片,远远脱离自然图片的真实分布,并且 Mosaic 大量的 crop 操作会带来很多不准确的标注框)。
参考:https://github.com/ultralytics/yolov5/issues/2151

3. Anchor Free 与 Label Assignment

至于为什么 YoloX作为Anchor Free但性能不降反升,这与样本匹配有密不可分的联系

  • loss/quality/prediction aware
    基于网络自身的预测来计算 anchor box 或者 anchor point 与 gt 的匹配关系,充分考虑到了不同结构/复杂度的模型可能会有不同行为,是一种真正的 dynamic 样本匹配

  • center prior
    目标的质心都与目标的几何中心有一定的联系,将正样本限定在目标中心的一定区域内做 loss/quality aware 样本匹配能很好地解决收敛不稳定的问题

  • 不同目标设定不同的正样本数量( dynamic k )
    Dynamic k 的关键在于如何确定k,有些方法通过其他方式间接实现了动态 k ,比如 ATSS、PAA ,甚至 RetinaNet ,同时,k的估计依然可以是 prediction aware 的,我们具体的做法是首先计算每个目标最接近的10个预测,然后把这个 10 个预测与 gt 的 iou 加起来求得最终的k,很简单有效,对 10 这个数字也不是很敏感,在 5~15 调整几乎没有影响

二、网络实现

参照提供的代码:https://github.com/Megvii-BaseDetection/YOLOX

  • 主要网络结构
    在yolox目录下的models中找到yolox.py文件,

    主要包含YOLOXHead和YOLOPAFPN两块
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Copyright (c) Megvii Inc. All rights reserved.

import torch.nn as nn

from .yolo_head import YOLOXHead
from .yolo_pafpn import YOLOPAFPN


class YOLOX(nn.Module):
    """
    YOLOX model module. The module list is defined by create_yolov3_modules function.
    The network returns loss values from three YOLO layers during training
    and detection results during test.
    """

    def __init__(self, backbone=None, head=None):
        super().__init__()
        if backbone is None:
            backbone = YOLOPAFPN()
        if head is None:
            head = YOLOXHead(80)

        self.backbone = backbone
        self.head = head

    def forward(self, x, targets=None):
        # fpn output content features of [dark3, dark4, dark5]
        fpn_outs = self.backbone(x)

        if self.training:
            assert targets is not None
            loss, iou_loss, conf_loss, cls_loss, l1_loss, num_fg = self.head(
                fpn_outs, targets, x
            )
            outputs = {
                "total_loss": loss,
                "iou_loss": iou_loss,
                "l1_loss": l1_loss,
                "conf_loss": conf_loss,
                "cls_loss": cls_loss,
                "num_fg": num_fg,
            }
        else:
            outputs = self.head(fpn_outs)

        return outputs
  • nano tiny s m l x 不同格式模型
    YOLOX提供不同版本的模型,主要区别在于修改网络的depth和width,其对应的大小分别为:
self.depth = 0.33    # nano: 0.33, tiny:0.33,   s: 0.33, m: 0.67, l: 1.0, x: 1.33  # nano和tiny需调整self.input_size = (416, 416)
self.width = 0.50    # nano: 0.25, tiny: 0.375, s: 0.50, m: 0.75, l: 1.0, x: 1.25

最终影响的是YOLOPAFPN模块

  • 部署
    在Demo目录下还提供了不同的部署方式,可以依据实际需求进行选择。

    以NCNN平台为例,其关键点在于自定义实现YoloV5Focus层:

  • 效果


三、训练自己数据

参照docs目录下的train_custom_data.md,训练自己数据主要包含以下几个步骤:

1. 准备数据集

采用labelme标注 利用labelme工程中自带的转换脚本将其转换成coco数据样式

2. 数据存放格式

dataDir

  • annotations
    • annotations_train.json
    • annotations_val.json
  • JPEGImages
    • *.jpg

备注:按coco标准来讲,JPEGImages目录下还应分成train和val两个目录,这里修改了datasets/coco.py文件,所以没有再区分

# img_file = os.path.join(self.data_dir, self.name, file_name)
img_file = os.path.join(self.data_dir, file_name)
# print("********", os.path.isfile(img_file))
img_file = img_file.replace("\\", "/")

3. 新建自己参数脚本

在根目录下的exps目录下新建Tooth.py,依据实际情况设置相应参数

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import os

from yolox.exp import Exp as MyExp


class Exp(MyExp):
    def __init__(self):
        super(Exp, self).__init__()
        self.depth = 0.33    # s: 0.33, m: 0.67, l: 1.0, x: 1.33
        self.width = 0.50    # s: 0.50, m: 0.75, l: 1.0, x: 1.25
        self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]

        # Define yourself dataset path
        self.data_dir = "/home/heygears/jinhai_zhou/data/2D_detect/tooth"
        self.train_ann = "annotations_train.json"
        self.val_ann = "annotations_val.json"

        self.num_classes = 2   # include background

        self.max_epoch = 300
        self.data_num_workers = 4
        self.eval_interval = 1

        self.cls_names = (
            "background",
            "tooth",
        )

4.训练

进入根目录下的tools目录
执行:

python train.py -f ../exps/Tooth.py -d 0 -b 64 --fp16 -o -c /path/to/yolox_s.pth

其中-d后面数字表示GPU编号, -b 后面数字表示批量数据大小, --fp16表示混合精度训练 后面的pth文件为预训练权重

5.测试

修改tools目录下demo.py,添加demo==images参数,支持图片批量测试

执行以下命令进行测试

python demo.py images -f ../exps/Tooth.py -n Tooth -c ../weights/Tooth_s.pth --path ../assets/tooth --conf 0.55 --nms 0.45 --tsize 640 --save_result --device cpu

6.导出模型

在tools目录下,运行export_onnx.py文件

python export_onnx.py -f ../exps/Tooth.py -n Tooth -c ../weights/Tooth_s.pth --output-name ./tooth.onnx

四、常见错误

训练中出现的问题

wget https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-linux.zip
sudo unzip ninja-linux.zip -d /usr/local/bin/
sudo update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force 

标签:__,YoloX,py,loss,--,self,YOLOX,---,深度
From: https://www.cnblogs.com/xiaxuexiaoab/p/17748310.html

相关文章

  • 个人记录-Maven环境的配置
    安装背景:换了一台新电脑,需要安装Java开发环境,虽然记得大概的操作步骤但是具体的细节记得不清楚了,现在记录一下在网络上找到的Maven的安装步骤核心简要参数MAVEN_HOME%MAVEN_HOME%\binalimavenaliyunmavenhttp://maven.aliyun.com/nexus/content/groups/public/central......
  • CUDA C编程权威指南:2.1-CUDA编程模型
      本文主要通过例子介绍了CUDA异构编程模型,需要说明的是Grid、Block和Thread都是逻辑结构,不是物理结构。实现例子代码参考文献[2],只需要把相应章节对应的CMakeLists.txt文件拷贝到CMake项目根目录下面即可运行。1.Grid、Block和Thread间的关系  GPU中最重要的2种内存是全局......
  • uniapp 输入框文本域(uni-easyinput)内容长度限制
    问题描述提示:uni-ui组件库中uni-easyinput输入框组件相关使用问题在使用uni-easyinput组件时,你会发现,默认情况下你输入内容的长度最大是140原因是,uni-easyinput组件内封装的maxlength属性,在不设置的情况下,默认值为140。我们可以通过maxlength属性,为使用的输入框限制其......
  • Linux-grep或和与操作
    一、或(or)操作1、使用选项-Egrep-E'a1|a2’filename//找出文件(filename)中包含a1或者包含a2的行2、使用egrepegrep‘a1|a2’filename//用egrep同样可以实现3、使用选项-e使用grep-e选项,只能传递一个参数。在单条命令中使用多个-e选项grep-ea1-ea2filename//......
  • Go - Sorting Arrays or Slices
    Problem: Youwanttosortelementsinanarrayorslice.Solution: Forint,float64,andstringarraysorslicesyoucanusesort.Ints,sort.Float64s,andsort.Strings.Youcanalsouseacustomcomparatorbyusingsort.Slice.Forstructs,youcan......
  • 用pandas探索你的数据(五)-合并数据
    用pandas探索你的数据(五)-合并数据在数据处理和分析中,数据的合并是一项关键任务。Pandas提供了丰富的工具来处理不同来源的数据,并将它们合并成一个更大的数据集。在这篇文章中,我们将深入探讨Pandas中两个重要的数据合并函数:pd.concat()和pd.merge()。首先,我们将通过一系列的......
  • Go - Making Arrays and Slices Safe for Concurrent Use
    Problem: Youwanttomakearraysandslicessafeforconcurrentusebymultiplegoroutines.Solution: Useamutexfromthesynclibrarytosafeguardthearrayorslice.Lockthearrayorslicebeforemodifyingit,andunlockitaftermodificationsarema......
  • 如何提高redux开发效率?当然是redux-tookit啦!
    前言使用react-redux的朋友都经历过这种痛苦吧?定义一个store仓库,首先创建各种文件,比如reducer、action、store...,然后将redux和react连接使用。整个流程繁琐,写起来代码冗余。react-redux创建仓库,文件目录如下:好怀念使用vuex创建写仓库的日子.......直到有一天我发现了redu......
  • 2023-10-08
    一、针对WPF窗体程序卡顿优化问题:添加500个以上数据点,切换数据/地址类型时会出现卡顿现象。WPF程序打开窗体卡顿的原因可能有很多。以下是一些常见的原因及其解决方法:资源过于繁重:应用程序在启动时加载大量资源,如图片、视频等,从而导致窗口开启变慢。可以考虑将资源压缩或使......
  • FMC144 -八路 250MSPS 14bit AD FMC子卡
    一、板卡概述 FMC144是一款具有8通道模数转换器(ADC)的FMC卡,具有14bit分辨率,最大采样速率达250Msps。时钟配置芯片为AD9516-1,可由板载10MHz时钟提供参考,也可由外部时钟提供。FMC144采用HPC连接器,输入信号为差分对信号。FMC144基于ADS62P49,具有低功耗和高动态性能,适合于多载......