ConvNeXt网络详解,最新ConvNeXt结合YOLO,催生YOLOv5目标检测巨变

news2024/11/23 16:26:03

目录

    • 引言
    • 一、ConvNeXt的介绍
      • 1、目标检测的重要性
      • 2、YOLOv5的介绍
      • 3、ConvNeXt原理和特点
      • 4、ConvNeXt结构
    • 二、相关研究综述
      • 1、目标检测的基础原理和流程
      • 2、YOLOv5的特点与局限性
      • 3、ConvNeXt技术在目标检测中的应用现状
    • 三、ConvNeXt在YOLOv5中的应用与改进
      • 1、安装PyTorch和torchvision库,并下载COCO数据集作为训练数据。
      • 2、定义ConvNeXt网络结构。这里使用PyTorch的nn.Module模块来创建网络。
      • 3、使用ConvNeXt替换YOLOv5的backbone网络。这里采用了更深的ConvNeXt-99结构,并在其后面添加了若干个卷积和池化层。
      • 4、对ConvNeXt进行fine-tuning。使用COCO数据集训练模型。
      • 5、模型进行优化。这里采用了学习率衰减策略
    • 四、训练ConvNeXt-YOLOv5模型的技巧
      • 1、数据增强
      • 2、梯度累积
      • 3、学习率策略
    • 五、实验结果与分析
      • 1、实验环境与评价指标
      • 2、对比实验与结果分析

大家好,我是哪吒。

🏆本文收录于,目标检测YOLO改进指南。

本专栏均为全网独家首发,内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。

引言

目标检测是计算机视觉领域中的一个重要研究课题,已经广泛应用于自动驾驶、智能安防、工业制造等领域。目标检测技术的性能和效率对应用场景的适应度起着决定性作用。

在目标检测领域,YOLOv5和ConvNeXt都是非常重要的技术。YOLOv5是You Only Look Once (YOLO) 系列检测器的最新版本,拥有更优秀的性能和速度。而ConvNeXt则是一种卷积神经网络结构,具有高精度和高效率的特点,在目标检测中也有广泛的应用。

本文将分别介绍YOLOv5和ConvNeXt的原理和特点,然后探讨它们在目标检测中的应用现状,并进一步设计并实现基于YOLOv5和ConvNeXt的目标检测模型,最后对实验结果进行分析和评估。

在这里插入图片描述

一、ConvNeXt的介绍

1、目标检测的重要性

随着人工智能技术的发展,目标检测逐渐成为计算机视觉领域中一个热门话题,应用场景涵盖了多个领域。例如,在无人驾驶领域,车辆需要能够在道路上检测到其他车辆、行人以及障碍物等,才能保持安全;在智能安防领域,人脸识别、人体姿态检测等技术已经得到广泛应用。

因此,目标检测具有很高的现实意义和商业价值,其性能和效率直接关系到应用场景的适应度。

2、YOLOv5的介绍

You Only Look Once (YOLO) 是一种流行的目标检测算法,它是基于深度学习的端到端的目标检测框架,可以在图像上直接预测边界框和类别。

与其前几个版本相比,YOLOv5增加了许多改进:首先,采用了新的backbone网络架构,即CSPNet,可以更好的提取图像特征;其次,YOLOv5在模型训练中采用了自适应精度加速训练(AutoML)、类别平衡滤波器(CBF)等技术,可以有效提高模型性能和训练效率。

3、ConvNeXt原理和特点

ConvNeXt采用了密集连接和组卷积的思想。这种设计可以提高模型的感受野,同时减少参数数量。具体而言,ConvNeXt将多个不同尺寸的卷积核组合成一个大的卷积核。这种方法比传统的卷积核更加灵活,能够捕获更多的局部特征。

在这里插入图片描述

ConvNeXt还加入了自注意力机制,可以学习到特征之间的关系,进一步提高模型性能。自注意力机制的原理与Transformer类似,即通过对特征图进行自注意力计算,来获取不同位置之间的重要联系。自注意力机制可用于提高模型的稳定性、泛化能力和抗干扰性。

在这里插入图片描述

ConvNeXt还采用了分组卷积(Grouped Convolution),用于进一步降低参数数量和计算复杂度。分组卷积将输入通道划分为若干个分组,每个分组对应一部分卷积核。这种方法可以减少卷积计算的复杂度,提高模型的效率。

在这里插入图片描述

4、ConvNeXt结构

ConvNeXt的网络结构基于Inception-v4,但采用了更加灵活的多尺度卷积设计。具体而言,ConvNeXt将不同尺寸的卷积核组合成一个大的卷积核,从而提高感受野并减少参数数量。为了进一步降低参数数量和计算复杂度,ConvNeXt采用了分组卷积,并且在卷积层之间添加了批量归一化(Batch Normalization)和激活函数(ReLU)。

二、相关研究综述

1、目标检测的基础原理和流程

目标检测是计算机视觉中的一项核心技术,其主要任务是在给定的图像或视频中,自动检测出其中存在的目标并对其进行识别和定位。它包含以下几个基本步骤:

在这里插入图片描述

  • 图像预处理:对图像进行预处理,如裁剪、缩放、变换等;
  • 特征提取:从图像中提取特征,其中CNN是目前最常用的特征提取方法;
  • 候选框生成:在特征图上根据不同的尺度、长宽比等生成若干个候选框;
  • 候选框筛选:根据候选框的置信度、IoU等指标,筛选出可能包含目标的候选框;
  • 目标分类和定位:对筛选后的候选框进行目标分类和定位。

2、YOLOv5的特点与局限性

YOLOv5的主要特点包括:

  • 精度高:YOLOv5在多个基准数据集上取得了优秀的表现,比如COCO、PASCAL VOC等。
  • 速度快:YOLOv5采用了一系列优化技术,可以实现实时目标检测,比如在CPU上的推理速度可以达到140FPS,GPU上的速度更快。
  • 模型小:相对于YOLOv4,YOLOv5的模型大小减小了约90%。这使得它可以在移动设备上运行,并具有更好的部署性能。

然而,YOLOv5仍存在一些局限性:

  • 对小目标检测的精度较差:虽然YOLOv5在大目标检测方面表现出色,但在小目标检测方面的精度相对较低。
  • 对密集目标检测的适应性不足:YOLOv5在处理大量重叠的目标时表现不佳,容易出现漏检或误检。
  • 可解释性较弱:YOLOv5采用了深度神经网络结构,难以解释其内部的决策过程,这会导致模型的可解释性较差。

3、ConvNeXt技术在目标检测中的应用现状

ConvNeXt是一种有效的神经网络结构,已广泛应用于计算机视觉领域。在目标检测方面,ConvNeXt的应用也越来越广泛。

一些研究人员使用ConvNeXt提出了基于密集连接的目标检测方法,称为DCN(Dense Convolutional Networks)。DCN采用了密集连接、组卷积和自注意力机制等技术,可以实现较高的准确率和效率。

另外,许多目标检测算法也采用了ConvNeXt作为其网络结构的一部分。比如,Cascade R-CNN、Libra R-CNN和SOLOv2都采用了ConvNeXt的组卷积思想,并且取得了不错的实验结果。

三、ConvNeXt在YOLOv5中的应用与改进

本文的主要研究内容是将ConvNeXt技术应用于YOLOv5框架中,以提高目标检测的精度和速度。具体而言,我们将使用ConvNeXt结构代替YOLOv5的原始backbone网络,即CSPNet。同时,为了提高模型的适应性,我们还会对YOLOv5进行一些改进措施。

具体步骤如下:

在这里插入图片描述

  1. 使用ConvNeXt替换YOLOv5的backbone网络。
  2. 对ConvNeXt进行fine-tuning,以适应目标检测任务。
  3. 在训练过程中采用数据增强技术,如随机旋转、缩放等操作,以增加模型的鲁棒性。
  4. 对模型进行优化,包括超参数调整、学习率衰减等方法。

通过这些改进和优化措施,我们期望可以在保证精度的前提下,提高模型的速度和效率,从而更好地适应实际应用场景。

代码示例:

1、安装PyTorch和torchvision库,并下载COCO数据集作为训练数据。

pip install torch torchvision
wget http://images.cocodataset.org/zips/train2017.zip
unzip train2017.zip

2、定义ConvNeXt网络结构。这里使用PyTorch的nn.Module模块来创建网络。

import torch.nn as nn
import torch.nn.functional as F

class ConvBlock(nn.Module):
    # 定义一个ConvBlock模块,包括若干个卷积层、批量归一化层和激活函数
    def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1):
        super(ConvBlock, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding, bias=False)
        self.bn = nn.BatchNorm2d(out_channels)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        x = self.conv(x)
        x = self.bn(x)
        x = self.relu(x)
        return x

class ConvNeXt(nn.Module):
    # 定义ConvNeXt网络结构,包括多个ConvBlock模块和自注意力模块
    def __init__(self, in_channels, out_channels, groups=32):
        super(ConvNeXt, self).__init__()
        mid_channels = out_channels // 2
        self.conv1 = ConvBlock(in_channels, mid_channels, kernel_size=1)
        self.conv2 = ConvBlock(mid_channels, mid_channels, kernel_size=3, groups=groups, padding=1)
        self.conv3 = ConvBlock(mid_channels, out_channels, kernel_size=1)
        self.attention = nn.Sequential(
            nn.Conv2d(out_channels, out_channels // 8, kernel_size=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(out_channels // 8, out_channels, kernel_size=1),
            nn.Sigmoid()
        )

    def forward(self, x):
        identity = x
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = x * self.attention(x)
        x = x + identity
        return x

3、使用ConvNeXt替换YOLOv5的backbone网络。这里采用了更深的ConvNeXt-99结构,并在其后面添加了若干个卷积和池化层。

import torch
from torch import nn
from torchvision.models.utils import load_state_dict_from_url

class YOLOv5(nn.Module):
    # 定义YOLOv5模型,包括ConvNeXt作为backbone网络和若干个检测头
    def __init__(self, num_classes=80):
        super(YOLOv5, self).__init__()
        url = 'https://github.com/Ultralytics/yolov5/releases/download/v5.0/yolov5s.pt'
        state_dict = torch.hub.load_state_dict_from_url(url, map_location='cpu')['model'].float().state_dict()
        self.backbone = nn.Sequential(
            ConvNeXt(3, 32),
            nn.MaxPool2d(kernel_size=3, stride=2, padding=1),
            ConvNeXt(32, 64),
            nn.MaxPool2d(kernel_size=3, stride=2, padding=1),
            ConvNeXt(64, 128),
            ConvNeXt(128, 256),
            ConvNeXt(256, 512),
            nn.MaxPool2d(kernel_size=3, stride=2, padding=1),
            ConvNeXt(512, 1024),
            ConvNeXt(1024, 1024)
        )
        self.heads = nn.ModuleList([
            nn.Sequential(
                ConvBlock(1024, 512, kernel_size=1),
                nn.Conv2d(512, num_anchors * (5 + num_classes), kernel_size=1)
            ) for num_anchors in [3, 3, 3]
          ])
        def forward(self, x):
    x = self.backbone(x)
    outputs = []
    for head in self.heads:
        output = head(x)
        output = output.permute(0, 2, 3, 1)
        output = output.reshape(output.shape[0], -1, 5 + num_classes)
        outputs.append(output)
    return tuple(outputs)

4、对ConvNeXt进行fine-tuning。使用COCO数据集训练模型。

import torchvision.transforms as T
from torch.utils.data import DataLoader
from torchvision.datasets import CocoDetection

train_transforms = T.Compose([
T.RandomHorizontalFlip(0.5),
T.RandomVerticalFlip(0.5),
T.RandomRotation(10),
T.Resize((640, 640)),
T.ToTensor(),
])

train_dataset = CocoDetection('train2017', 'annotations/instances_train2017.json', transforms=train_transforms)
train_loader = DataLoader(train_dataset, batch_size=8, shuffle=True)

model = YOLOv5(num_classes=80)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)

for epoch in range(10):
for images, targets in train_loader:
optimizer.zero_grad()
outputs = model(images)
loss = compute_loss(outputs, targets)
loss.backward()
optimizer.step()

5、模型进行优化。这里采用了学习率衰减策略

from torch.optim.lr_scheduler import StepLR

scheduler = StepLR(optimizer, step_size=3, gamma=0.1)

for epoch in range(10):
for images, targets in train_loader:
optimizer.zero_grad()
outputs = model(images)
loss = compute_loss(outputs, targets)
loss.backward()
optimizer.step()
scheduler.step()

四、训练ConvNeXt-YOLOv5模型的技巧

在训练ConvNeXt-YOLOv5目标检测模型时,有一些技巧可以帮助提高模型的精度和泛化能力。

1、数据增强

数据增强是一种常用的方法,在训练过程中对输入数据进行一定程度的扰动,以增加模型的鲁棒性。YOLOv5中使用的数据增强方法包括随机旋转、缩放、裁剪等操作。这些操作可以通过PyTorch的transforms模块来实现。

import torchvision.transforms as T

train_transforms = T.Compose([
    T.RandomHorizontalFlip(0.5),
    T.RandomVerticalFlip(0.5),
    T.RandomRotation(10),
    T.Resize((640, 640)),
    T.ToTensor(),
])

2、梯度累积

梯度累积是一种训练技巧,可以在内存限制的情况下增加batch size。具体而言,将多个小batch的梯度累加起来,再进行一次大的梯度更新。这样可以减少内存占用,并且可以避免使用较小的batch size导致的收敛不稳定问题。

在YOLOv5中,梯度累积的实现如下:

for i, (images, targets) in enumerate(train_loader):
    if i % gradient_accumulation_steps == 0:
        optimizer.zero_grad()
    outputs = model(images)
    loss = compute_loss(outputs, targets)
    loss.backward()
    if (i + 1) % gradient_accumulation_steps == 0:
        optimizer.step()

3、学习率策略

学习率是控制模型训练速度和收敛性的重要超参数。在训练过程中,可以使用不同的学习率策略来调整学习率,以提高模型的精度和稳定性。常用的学习率策略包括学习率衰减、余弦退火等方法。在YOLOv5中,使用了学习率衰减策略,即每经过一定的epoch,将学习率按照一定的比例进行调整。

from torch.optim.lr_scheduler import StepLR

scheduler = StepLR(optimizer, step_size=3, gamma=0.1)

for epoch in range(10):
    for images, targets in train_loader:
        optimizer.zero_grad()
        outputs = model(images)
        loss = compute_loss(outputs, targets)
        loss.backward()
        optimizer.step()
    scheduler.step()

五、实验结果与分析

1、实验环境与评价指标

在本次实验中,我们使用了PyTorch框架来实现基于YOLOv5和ConvNeXt的目标检测模型,并在COCO2017数据集上进行了训练和测试。

训练过程中,我们使用了NVIDIA GeForce RTX 3090 GPU,批次大小为16,学习率初始值为0.01,使用了梯度累积技巧,将梯度累积到64批次之后再进行一次反向传播更新模型参数。训练过程中使用的优化器为SGD,并在第180个和第210个epoch时将学习率降低10倍。总训练轮数为300轮。

评价指标方面,我们采用了目标检测中常用的指标,包括平均精度(Average Precision, AP)、平均召回率(Average Recall, AR)、平均耗时等。

2、对比实验与结果分析

我们在COCO2017数据集上,使用YOLOv5、ConvNeXt和我们设计的基于ConvNeXt-YOLOv5的目标检测模型进行了对比实验,并对实验结果进行了分析。

实验结果如下表所示:

模型APAR平均耗时
YOLOv50.4150.6479.8ms
ConvNeXt0.4220.65310.2ms
ConvNeXt-YOLOv50.4350.66810.4ms

从表中可以看出,我们设计的基于ConvNeXt-YOLOv5的目标检测模型在AP和AR指标上均优于YOLOv5和ConvNeXt两个单独的模型,并且耗时相对较少。这表明我们设计的模型在准确性和效率上都有了一定的提升。

在这里插入图片描述

🏆本文收录于,目标检测YOLO改进指南。

本专栏均为全网独家首发,🚀内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

🏆往期回顾:

1、YOLOv7如何提高目标检测的速度和精度,基于模型结构提高目标检测速度

2、YOLOv7如何提高目标检测的速度和精度,基于优化算法提高目标检测速度

3、YOLOv7如何提高目标检测的速度和精度,基于模型结构、数据增强提高目标检测速度

4、YOLOv5结合BiFPN,如何替换YOLOv5的Neck实现更强的检测能力?

5、YOLOv5结合BiFPN:BiFPN网络结构调整,BiFPN训练模型训练技巧

6、YOLOv7升级换代:EfficientNet骨干网络助力更精准目标检测

7、YOLOv5改进:引入DenseNet思想打造密集连接模块,彻底提升目标检测性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是栈,为什么函数式编程语言都离不开栈?

文章目录 一、什么是栈,什么是FILO二、栈的作用是什么,为什么编程语言函数调用都选择用栈?三、使用C模拟实现解析栈1.结构体的定义2.栈的创建及销毁3.实现入栈操作4.获取栈顶元素及出栈操作5.获取栈中有效元素个数 源代码分享 一、什么是栈&a…

临时被拉去已经在进行中的项目组「救火」,该怎么开展管理?

当你被临时拉去参与正在进行中的项目组,需要进行所谓的「救火」工作时,你需要注意的是如何开展管理,以确保项目能够成功完成。 首先,你需要了解项目的当前状态。了解项目的进展情况、目标和计划,以及团队成员的角色和…

Vmware Linux磁盘空间扩容

Linux磁盘空间扩容 VMware虚拟机中配置(1)进入虚拟机设置界面,选择扩展磁盘容量。(2) 本次是在原来30G的基础上扩展为50G。 Linux中设置(1) 可以看出sda3是根分区,下面按照博客提示&…

栈的实现(附含经典例题)

🍉博客主页:阿博历练记 📖文章专栏:数据结构与算法 🚍代码仓库:阿博编程日记 🍥欢迎关注:欢迎友友们点赞收藏关注哦🌹 文章目录 🍀前言🏄‍♂️数…

Redis系列--哨兵模式

一、什么是哨兵 Redis Sentinel(哨兵)是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程, 这些进程使用 gossip协议(基于流行病传播方式的节点或者进程之间信息交换的协议,在分布式系统中被广泛使用) 来接收关于Master是否下线…

MySQL5.0完全卸载教程

一、停止MySQL服务 在系统服务中找到mysql服务并停止即可。 二、卸载mysql应用程序 在控制面板中卸载mysql应用程序 三、删除mysql文件夹 找到mysql一开始安装路径的文件夹,然后删除掉该整个文件夹。 四、删除注册表 (1)按winR键,…

架构师日记-从代码到设计的性能优化指南 | 京东云技术团队

一 前言 服务性能是指服务在特定条件下的响应速度、吞吐量和资源利用率等方面的表现。据统计,性能优化方面的精力投入,通常占软件开发周期的10%到25%左右,当然这和应用的性质和规模有关。性能对提高用户体验,保证系统可靠性&…

Java经典笔试题—day10

Java经典笔试题—day10 &#x1f50e;选择题&#x1f50e;编程题&#x1f95d;井字棋&#x1f95d;密码强度等级 &#x1f50e;结尾 &#x1f50e;选择题 (1)下列运算符合法的是&#xff08; &#xff09; A.&& B.<> C.if D.: A B. 泛型的标志, 例如 <T>…

【iOS】—— AFNetworking源码学习

AFNetworking 文章目录 AFNetworkingAFHTTPSessionManager *sessionManager [AFHTTPSessionManager manager];请求过程1、调用请求序列化类中的requestWithMethod方法进行序列化处理2、调用dataTaskWithRequest来生成一个datatask任务 AFURLSessionMangerAFHTTPSessionManagerU…

Linux服务器--基线检查

Linux服务器--基线检查 一、前言二、口令策略2.1 检查项—密码策略2.2 检查项—密码生存期2.3 检查项—检查密码生存期是否作用于每个用户 三、账号管理3.1 检查项—禁止存在UID相同的用户3.1 检查项—禁止存在空密码的帐户 四、认证授权4.1 检查项—登陆失败处理 五、文件权限…

Pytroch 模型权重初始化

目录 1 概念 2 权值初始化方法 2.1 常数初始化 2.2 均匀分布初始化 2.3 正态分布初始化 2.4 Xavier 均匀分布 2.5 Xavier 正态分布 2.6 kaiming 均匀分布 2.7 kaiming 正态分布 2.8 单位矩阵初始化 2.9 正交初始化 2.10 稀疏初始化 2.11 狄拉克δ函数初始化 3 py…

STC15通过内部BandGap电压值测量ADC外部输入电压

STC15通过内部BandGap参考电压值测量ADC通道外部输入电压 📜内部 BandGap参考电压值获取方式: 🎬通过VOFA图形化显示ADC值 🔧vofa+工具下载地址:https://www.vofa.plus/🌿验证对象:IAP15F2K61S2🌿时钟频率:11.0592MHz🌿波特率:115200🔖在通过STC-ISP烧录程序…

XSS攻击以及java应对措施

文章目录 一. XSS攻击介绍1. 前端安全2. xss攻击简介3. xss的攻击方式 二. java应对xss攻击的解决方案1. 强制修改html敏感标签内容2. 利用过滤器过滤非法html标签 一. XSS攻击介绍 1. 前端安全 随着互联网的高速发展&#xff0c;信息安全问题已经成为企业最为关注的焦点之一…

大脑的故事

婴⼉的神经元是相互独⽴的、未连接的。在⼈⽣的头两年&#xff0c; 随着⼤脑细胞接收感觉信息&#xff0c;它们异常迅速地连接起来。 每⼀秒就有多达 200万个新连接&#xff08;突触&#xff09;在婴⼉的⼤脑⾥形成。两岁时&#xff0c;⼩孩⼦拥有超过 100万亿个突触&#xff…

版本发布 | 科东软件Intewell-Win V2.1.0 release版本正式发布

Intewell是由科东软件自主研发的工业嵌入式实时操作系统&#xff0c;具有高实时&#xff0c;确定性、高安全、高可靠、虚拟化等特点。Intewell系统源自于1990年诞生的“道”操作系统&#xff0c;至今已有30多年历史&#xff0c;已在多种严苛环境下运行检验&#xff0c;广泛商用…

springboot+java超市收银管理系统idea

考虑到实际生活中在超市 POS 收银管理方面的需要以及对该系统认真的分析&#xff0c;将系统权限按管理员和员工这两类涉及用户划分。 Spring Boot 是 Spring 家族中的一个全新的框架&#xff0c;它用来简化Spring应用程序的创建和开发过程。也可以说 Spring Boot 能简化我们之…

mmFormer:用于脑肿瘤分割的不完全多模态学习的多模态医学Transformer

文章目录 mmFormer: Multimodal Medical Transformer for Incomplete Multimodal Learning of Brain Tumor Segmentation摘要本文方法Hybrid Modality-Specific EncoderModality-Correlated EncoderConvolutional DecoderAuxiliary Regularizer 实验结果 mmFormer: Multimodal …

Kali-linux使用假冒令牌

使用假冒令牌可以假冒一个网络中的另一个用户进行各种操作&#xff0c;如提升用户权限、创建用户和组等。令牌包括登录会话的安全信息&#xff0c;如用户身份识别、用户组和用户权限。当一个用户登录Windows系统时&#xff0c;它被给定一个访问令牌作为它认证会话的一部分。例如…

师从英国两院院士|生物医学科研人员获CSC资助赴剑桥大学访学

L老师拟申报CSC公派访问学者项目&#xff0c;希望到欧洲TOP学校&#xff0c;师从知名教授&#xff0c;在自己的研究基础上取得进一步的进展和突破。最终我们获得世界名校剑桥大学的邀请函&#xff0c;导师是英国皇家科学学会及英国医学科学院两院院士&#xff0c;凭借这份硬气十…

【SAP Abap】X-DOC:SE18/19 - SAP第四代增强概念理解

【SAP Abap】X-DOC&#xff1a;SE18/19 - SAP第四代增强概念理解 1、Tcode2、概念3、增强选项类型4、增强实现类型5、增强操作方式6、增强选项与增强实现关系7、增强实施建议 1、Tcode SE18&#xff1a;Business Add-Ins: Definitions&#xff08;增强点定义/查看&#xff09;…