Transformer系列-4丨DETR模型和代码解析

news2024/11/30 20:43:15

1 前言

往期的文章中,笔者从网络结构和代码实现角度较为深入地和大家解析了Transformer模型Vision Transformer模型(ViT)以及BERT模型,其具体的链接如下:

  • 基础Transformer解析

  • ViT模型与代码解析

  • BERT模型与代码解析

本期内容,笔者想和大家聊一聊2020年非常火热的一个目标检测模型,叫做DEtection TRansformer,缩写为DETR

之所以火热的原因,并非这个模型的性能有多好,或者运行速度有多快。相反,DETR 的性能仅能与2015年提出的Faster R-CNN媲美,如下表1所示。

图1

那么为什么这个模型能火起来呢?

通常来说,性能速度是衡量检测模型的重要指标,为什么DETR性能一般,并且训练很困难(训练所需epoch非常长),也能受到如此大的关注?

这里直接抛出答案,该模型火的具体原因可以归纳为:

  • (1)真正做到了End-to-End检测。在我们熟知的基于CNN的检测模型中,不论是单阶段(如YOLO),双阶段(Faster R-CNN),亦或者是无锚框设计(Anchor-free)的CenterNet,其在进行训练或者测试时,都需要人为设置一些前处理或者后处理操作,比如设置锚框来提供参考,或者利用非极大值(NMS)抑制来筛除多余的框。然而,DETR抛弃了几乎所有的前处理和后处理操作,使模型做到了真正的End-to-End

  • (2)第一个将Transformer拓展到目标检测领域中,基本没有对Transformer做什么结构上的改动,且性能仍有上升空间。这个性质对研究者来说就是一个福音,没有对模型改动且性能有上升空间,意味着后续的研究者可以紧跟这个方向,通过对网络模型结构或者训练目标的优化来展开自己的研究,进而产出自己的成果。

基于上述提到的原因,DETR一跃成为目标检测领域的热点范式。在提出工作的近一年内,涌现大量相关工作,比如Deformable DETRSwin Transformer等。在后续的文章中,我们也会一一进行解析,欢迎大家关注。

这里我们推荐几个不错的视频课程和解析类的文章,笔者也是通过阅读原文+观看相应的文章/视频,加深了对DETR的理解:

【B站】李沐老师团队:DETR 论文精读【论文精读】,网址:https://www.bilibili.com/video/BV1GB4y1X72R/?spm_id_from=333.788&vd_source=beab624366b929b20152279cfa775ff6

【知乎】用Transformer做object detection:DETR, 网址:https://zhuanlan.zhihu.com/p/267156624

建议大家在看本文前,可以自行复习一下Transformer的相关知识。本文的代码如下:

https://github.com/facebookresearch/detr

2 DETR解析

2.1 简介

DETR的简要结构图如下图2所示。其大致可以归纳为以下几部分:

  • (1)将输入图像利用卷积神经网络(CNN)映射为特征图;

  • (2)将特征图输入到Transformer模型中,输出个包含物体的区域集合(一个固定数量的集合);

  • (3)对输出的区域集合真实的标签,计算两者间的集合相似度(二分图匹配损失);

  • (4)利用计算的损失,反向更新卷积神经网络(CNN)和Transformer模型的参数。

图2

这里,有两块内容最值得关注,分别为:

  • (1)DETR模型的结构以及一些其实现细节(如解码器的输入,即object queries)

  • (2)这个集合相似度如何计算

接下来我们就这两个点进行详细说明。

2.2 DETR模型

图3

上面提到, DETR模型主要分为两块,即卷积神经网络Transformer模型,其中Transformer模型由分为编码器解码器预测头

那么具体的DETR模型的结构如图3所示。其具体的运算流程可以归纳为:

  • (1)将图像(维度为)输入至卷积神经网络(比如说ResNet50),经过五次尺寸上的缩减(每次降为原来1/2)后,输出维度为的特征图;

  • (2)利用1x1卷积层将CNN输出的特征图的维度降低至256,记做输入特征图,其维度为;

  • (3)生成一个大小为的位置编码,将其与输入特征图按位相加,其相加后维度依旧是(仍记做输入特征图);

  • (4)将输入特征图reshape成 大小喂给Transformer编码器,输出同大小的特征图(记做编码器输出特征),其维度依旧是;

  • (5)构建N个(N=100),维度为256的object queries,其为可学习的embeddings,这里的100是希望模型产生至多100个物体区域。通过学习后,object queries和起到和anchor相似的作用,大致就是告诉解码器哪些区域可能会有物体;

  • (6)将object queries编码器输出特征图喂给Transformer解码器,产生大小的特征输出。其中,object queries为第一层多头自注意力(MSA)的输入,而MSA的输出以及编码器输出的特征将作为解码器中编码-解码多头自注意力的输入,如下图4所示;

  • (7)利用两个并行、不共享权重的全连接层,将Transformer解码器的输出(维度为)映射成两个输出,一个用以分类(维度为),一个用于位置回归(维度为)。其中,回归的目标就是检测框归一化的中心坐标和宽高

图4

说到这儿,基本上DETR的模型结构就解析的差不多啦。

这里我们对两块内容展开来说,其一是这个位置编码,其二是object queries,以加深大家的理解。

(1)位置编码

大家在学习Transformer的时候应该了解过Transformer对各个输入的位置是不敏感的

一般来说,为了让Transformer了解各输入间的位置关系,在输入Transformer之前需要为每个特征嵌入相应的位置信息

这种位置信息嵌入方式主要有两种,其一是为每个输入手动计算相应的位置编码,其二是设置可学习的位置编码

在DETR的代码实现中,作者提供了两种选择。下面我们先展示手动计算的位置编码的代码实现:

class PositionEmbeddingSine(nn.Module):
    """
    This is a more standard version of the position embedding, very similar to the one
    used by the Attention is all you need paper, generalized to work on images.
    """
    def __init__(self, num_pos_feats=64, temperature=10000, normalize=False, scale=None):
        super().__init__()
        self.num_pos_feats = num_pos_feats
        self.temperature = temperature
        self.normalize = normalize
        if scale is not None and normalize is False:
            raise ValueError("normalize should be True if scale is passed")
        if scale is None:
            scale = 2 * math.pi
        self.scale = scale

    def forward(self, tensor_list: NestedTensor):
        x = tensor_list.tensors
        mask = tensor_list.mask
        assert mask is not None
        not_mask = ~mask
        y_embed = not_mask.cumsum(1, dtype=torch.float32)
        x_embed = not_mask.cumsum(2, dtype=torch.float32)
        if self.normalize:
            eps = 1e-6
            y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale
            x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale

        dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device)
        dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats)

        pos_x = x_embed[:, :, :, None] / dim_t
        pos_y = y_embed[:, :, :, None] / dim_t
        pos_x = torch.stack((pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4).flatten(3)
        pos_y = torch.stack((pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4).flatten(3)
        pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2)
        return pos  

事实上,这种设置方法和《Attention is all your need》那篇的设置方式完全一致,感兴趣的小伙伴们可以看我之前的文章。

另外,作者还设置了一种自动学习的位置编码方式,其代码实现如下所示:

class PositionEmbeddingLearned(nn.Module):
    """
    Absolute pos embedding, learned.
    """
    def __init__(self, num_pos_feats=256):
        super().__init__()
        self.row_embed = nn.Embedding(50, num_pos_feats)
        self.col_embed = nn.Embedding(50, num_pos_feats)
        self.reset_parameters()

    def reset_parameters(self):
        nn.init.uniform_(self.row_embed.weight)
        nn.init.uniform_(self.col_embed.weight)

    def forward(self, tensor_list: NestedTensor):
        x = tensor_list.tensors
        h, w = x.shape[-2:]
        i = torch.arange(w, device=x.device)
        j = torch.arange(h, device=x.device)
        x_emb = self.col_embed(i)
        y_emb = self.row_embed(j)
        pos = torch.cat([
            x_emb.unsqueeze(0).repeat(h, 1, 1),
            y_emb.unsqueeze(1).repeat(1, w, 1),
        ], dim=-1).permute(2, 0, 1).unsqueeze(0).repeat(x.shape[0], 1, 1, 1)
        return pos

笔者感觉这里的位置编码方式好像与ViT中设置的位置编码方式有些差异

在ViT那篇文章中,作者设置的可学习的位置编码仅一行代码实现,如下:

self.pos_embedding = nn.Parameter(torch.randn(1, num_patches + 1, dim)) # 可学习的参数,长度为图像块数量+1,这里的1是class token

(2)object queries

这个不得不再提一下这个object queries,因为在DETR这篇文章中,笔者认为其和**集合相似度计算(二分图匹配损失)**都是DETR的核心所在。

前面提到,这个object queries的维度为,其为可学习的embeddings,训练刚开始的时候可以是随机初始化的。

这里的100是希望模型产生至多100个物体区域,在大多数检测任务中,图像中的目标数量远远小于这个值。通过学习后,object queries和起到和anchor相似的作用,大致就是告诉解码器哪些区域可能会有物体。

如下图5所示,作者在100个object queries中选了20个object queries,展示了这20个object queries在COCO(val)数据集上的可视化,也就是将这个数据集上所有的框在其对应的object query 的方块中分别进行了可视化。图中每个点表示一个框,其中点的位置为框的中心点颜色表示大小(绿色为小块,红色为大的水平框,蓝色为大的竖直框)。

从图中可以看出,每个object query负责检测的框的位置和大小都有一些区别,确实有点anchor的味道,只不过anchor是预先设置好的,而object queries是学习出来的

图5

另外一点需要注意的是,这里的100个物体区域Transformer解码器同时输出的,而非像应用于机器翻译的Transformer那样自回归地、逐个输出,这样也极大提高了输出的效率。

2.3 集合相似度计算(二分图匹配损失)

在对DETR的模型结构讨论完毕后,大家可能会有两个疑惑。

  • DETR最后输出个物体区域,但是一般图像中哪有这么多物体呢?

  • 还有就是,网络输出为固定数量的检测框,而其对应的标签里面的物体数量是变化(假设数量为m<<N)的,这个损失如何进行计算呢?

本文中,作者人为构造一个新的物体类别 ϕ (即非物体的背景类),将其补充到图像的标签中去,使得。这就构建了两个等容量的集合了,一个记做为预测集,一个为标签集

有了预测集标签集后,如何计算两者之间的相似度,进而求解两者之间的损失呢?

这里,作者在计算相似度之前执行了最优二分图匹配,来找到预测集标签集间各要素的最佳匹配。让我们能够耳熟能详的最优二分图匹配就是匈牙利算法啦。

匈牙利算法的计算和实现其实很简单,就是先计算两个集合间(二分图)的代价矩阵(cost matrix)。然后调用from scipy.optimize import linear_sum_assignment就可以找到最佳的二分图匹配。

总言之,要实现最终用于DETR训练的损失计算,需要的步骤就是1. 求解代价矩阵—>2. 匈牙利算法求最优匹配—>3. 根据匹配计算损失

(1)求解代价矩阵

匹配的核心就在于如何去计算两个集合间各要素的代价(cost)。具体地,本文作者利用以下公式计算预测集标签集中各要素间的代价(cost),具体如下:

cost计算

这里的第一项类别上的匹配代价,也就是类别相同,代价越小,反之越大;第二项位置上的匹配代价,如果两个框越重合,该代价就越小。

(2)匈牙利算法求最优匹配

这个最简单,利用from scipy.optimize import linear_sum_assignment就可以找到最佳的二分图匹配。其代码实现如下所示:

class HungarianMatcher(nn.Module):
    """This class computes an assignment between the targets and the predictions of the network

    For efficiency reasons, the targets don't include the no_object. Because of this, in general,
    there are more predictions than targets. In this case, we do a 1-to-1 matching of the best predictions,
    while the others are un-matched (and thus treated as non-objects).
    """

    def __init__(self, cost_class: float = 1, cost_bbox: float = 1, cost_giou: float = 1):
        """Creates the matcher

        Params:
            cost_class: This is the relative weight of the classification error in the matching cost
            cost_bbox: This is the relative weight of the L1 error of the bounding box coordinates in the matching cost
            cost_giou: This is the relative weight of the giou loss of the bounding box in the matching cost
        """
        super().__init__()
        self.cost_class = cost_class
        self.cost_bbox = cost_bbox
        self.cost_giou = cost_giou
        assert cost_class != 0 or cost_bbox != 0 or cost_giou != 0, "all costs cant be 0"

    @torch.no_grad()
    def forward(self, outputs, targets):
        """ Performs the matching

        Params:
            outputs: This is a dict that contains at least these entries:
                 "pred_logits": Tensor of dim [batch_size, num_queries, num_classes] with the classification logits
                 "pred_boxes": Tensor of dim [batch_size, num_queries, 4] with the predicted box coordinates

            targets: This is a list of targets (len(targets) = batch_size), where each target is a dict containing:
                 "labels": Tensor of dim [num_target_boxes] (where num_target_boxes is the number of ground-truth
                           objects in the target) containing the class labels
                 "boxes": Tensor of dim [num_target_boxes, 4] containing the target box coordinates

        Returns:
            A list of size batch_size, containing tuples of (index_i, index_j) where:
                - index_i is the indices of the selected predictions (in order)
                - index_j is the indices of the corresponding selected targets (in order)
            For each batch element, it holds:
                len(index_i) = len(index_j) = min(num_queries, num_target_boxes)
        """
        bs, num_queries = outputs["pred_logits"].shape[:2]

        # We flatten to compute the cost matrices in a batch
        out_prob = outputs["pred_logits"].flatten(0, 1).softmax(-1)  # [batch_size * num_queries, num_classes]
        out_bbox = outputs["pred_boxes"].flatten(0, 1)  # [batch_size * num_queries, 4]

        # Also concat the target labels and boxes
        tgt_ids = torch.cat([v["labels"] for v in targets])
        tgt_bbox = torch.cat([v["boxes"] for v in targets])

        # Compute the classification cost. Contrary to the loss, we don't use the NLL,
        # but approximate it in 1 - proba[target class].
        # The 1 is a constant that doesn't change the matching, it can be ommitted.
        cost_class = -out_prob[:, tgt_ids]

        # Compute the L1 cost between boxes
        cost_bbox = torch.cdist(out_bbox, tgt_bbox, p=1)

        # Compute the giou cost betwen boxes
        cost_giou = -generalized_box_iou(box_cxcywh_to_xyxy(out_bbox), box_cxcywh_to_xyxy(tgt_bbox))

        # Final cost matrix
        C = self.cost_bbox * cost_bbox + self.cost_class * cost_class + self.cost_giou * cost_giou
        C = C.view(bs, num_queries, -1).cpu()

        sizes = [len(v["boxes"]) for v in targets]
        indices = [linear_sum_assignment(c[i]) for i, c in enumerate(C.split(sizes, -1))]
        return [(torch.as_tensor(i, dtype=torch.int64), torch.as_tensor(j, dtype=torch.int64)) for i, j in indices]

(3)根据匹配计算损失

上面实现了最优匹配后,那么这里就需要根据匹配的结果计算损失了。具体的计算如下公式所示:

二分图匹配损失

上面这个公式怎么和代价矩阵的代价计算公式差不多呢?因为两者都是从类别位置上计算框间的相似度。

但是也有不同,较计算cost时,这里在计算类别损失时,作者在前面放了个log,也就是经典的交叉熵损失。而在计算cost的时候是没有这个log的。

这个再提一嘴,这里的的定义如下:

检测框损失

可见该损失函数由两块内容构成,其一是G-IOU损失,其二是常见的L1损失了。至于为什么多引入一个G-IOU损失,其原因是因为G-IOU损失的计算与检测框的大小是无关的,而L1损失对大目标和小目标的敏感程度存在显著差异的。

3 总结

写到这里,关于DETR的基本流程和网络结构都讲解完毕了。如果大家熟悉Transformer和VIT的话,应该会觉得DETR其实比较容易理解。当然,如果大家觉得看起来比较吃力的话,这里非常建议大家可以自学/温习一下Transformer和VIT后再来看一遍!

如何学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

学习路线

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

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

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

相关文章

嵌入式AI快速入门课程-K510篇 (第七篇 系统BSP开发)

第七篇 系统BSP开发 文章目录 第七篇 系统BSP开发1. 嵌入式Linux系统介绍嵌入式Linux系统组成产品形态嵌入式芯片启动流程Linux系统Linux系统框架嵌入式编译环境 2.嵌入式Linux开发准备手册文档开发工具配套硬件工程源码 3.嵌入式Linux开发组成概述编译工具链什么是工具链什么是…

[Linux#43][线程] 死锁 | 同步 | 基于 BlockingQueue 的生产者消费者模型

目录 1. 死锁 解决死锁问题 2. 同步 2.1 条件变量函数 cond 2.2 条件变量的使用&#xff1a; 3.CP 问题--理论 4. 基于 BlockingQueue 的生产者消费者模型 1. 基本概念 2.BlockQueue.hpp 基本设置&#xff1a; 生产关系控制&#xff1a; 消费关系的控制 ⭕思考点 …

公开整理-全国各省AI算力数据集(2000-2024年)

数据来源&#xff1a;本数据来源于&#xff0c;根据显卡HS编码筛选统计后获得时间跨度&#xff1a;2000-2024年数据范围&#xff1a;省级层面数据指标&#xff1a; 由于未发布2015至2016年的数据&#xff0c;因此该年份数据存在缺失。下表仅展示了部分指标及数据 年份 省份…

Mac apache 配置

命令 sudo apachectl -v //查看apache 版本 sudo apachectl -k start //启动apache sudo apachectl -k stop //停止apache sudo apachectl -k restart //重启apache配置 apache 的配置在 /etc/apache2/httpd.conf 默认情况下httpd.conf 为锁定状态&#xff0c;无法编辑 使用…

SAP B1 三大基本表单标准功能介绍-业务伙伴主数据(三)

背景 在 SAP B1 中&#xff0c;科目表、业务伙伴主数据、物料主数据被称为三大基本表单&#xff0c;其中的标准功能是实施项目的基础。本系列文章将逐一介绍三大基本表单各个字段的含义、须填内容、功能等内容。 附上 SAP B1 10.0 的帮助文档&#xff1a;SAP Business One 10…

单片机外部中断+定时器实现红外遥控NEC协议解码

单片机外部中断定时器实现红外遥控NEC协议解码 概述解码过程参考代码 概述 红外(Infrared&#xff0c;IR)遥控&#xff0c;是一种通过调制红外光实现的无线遥控器&#xff0c;常用于家电设备&#xff1a;电视机、机顶盒等等。NEC协议采用PPM(Pulse Position Modulation&#x…

敏感词替换为星号

编写一个函数&#xff0c;接收一个字符串参数&#xff0c;将其中 的敏感词替换为星号&#xff0c;并返回替换后的结果。 def getReplace(s):wordList["阿里巴巴","苹果","亚马逊","京东","字节","脸书"]for word …

月圆之夜梦儿时 贡秋竹唱响游子心声

自今年年初贡秋竹的首支单曲《逐梦》发布以来&#xff0c;其人气和传唱度便一直屡创新高&#xff0c;口碑上佳表现良好&#xff0c;网友们纷纷隔空喊话贡秋竹再发新作。时至今日&#xff0c;久经打磨的贡秋竹全新力作《低头思故乡》在千呼万唤中终于震撼首发&#xff01; 贡秋竹…

500以内开放式耳机哪款好?五款高性价比开放式耳机推荐

现在很多人会利用休闲时间进行锻炼&#xff0c;增强体质&#xff0c;在锻炼之前很多人会先入手一些运动设备&#xff0c;像慢跑鞋&#xff0c;还有臂环&#xff0c;运动手表等~当然运动耳机肯定也不能少&#xff0c;边运动边听音乐真的是一大享受&#xff01;但是哪种耳机比较适…

从零到一,全面掌握Apache DolphinScheduler发版流程,实战派经验分享!

引言 Apache DolphinScheduler的发版流程对于确保软件质量和社区协作至关重要&#xff0c;社区Committer王兴杰为我们详细介绍了Apache DolphinScheduler的发版流程&#xff0c;包括环境准备、流程文档、基础工具准备、依赖包确认等关键步骤&#xff0c;并指出了发版流程中可能…

一机两用的“多面手”既防勒索病毒又能做到数据防泄密!

随着数字化转型的加速&#xff0c;企业对互联网的依赖日益加深&#xff0c;网络安全风险也随之增加。勒索病毒作为网络安全领域的一大威胁&#xff0c;不仅加密重要文件&#xff0c;还可能泄露敏感信息&#xff0c;给企业带来巨大损失。SPN沙盒产品&#xff0c;以其独特的隔离技…

【python报错解决】ImportError: DLL load failed while importing win32gui: 找不到指定的程序

在 Python 中安装 pywin32 库 pip install pywin32安装完成后找到自己的 Python 根目录&#xff0c;在该目录下打开命令行。 在命令行中输入&#xff1a; python.exe Scripts/pywin32_postinstall.py -install执行后显示以下信息&#xff0c;即问题解决。 Parsed argumen…

KP8530X系列KP85302SGA 650V耐压 集成自举二极管的半桥栅极驱动器 专用于驱动功率MOSFET或IGBT

KP8530X系列KP85302SGA是一款 650V 耐压&#xff0c;集成自举二极管的半桥栅极驱动器&#xff0c;具有 0.3A 拉电流和 0.6A 灌电流能力&#xff0c;专用于驱动功率 MOSFETs 或 IGBTs。采用高压器件工艺技术&#xff0c;具有良好的电流输出及出色的抗瞬态干扰能力。在输入逻辑引…

React+Vis.js(05):vis.js的节点的点击事件

文章目录 需求实现思路抽屉实现完整代码需求 双击节点,弹出右侧的“抽屉”,显示节点的详细信息 实现思路 vis.network提供了一个doubleClick事件,代码如下: network.on(doubleClick, function (properties) {// console.log(nodes);let id = properties

el-date-picker根据某个时间动态规定可选的的时间范围

el-date-picker组件根据某一个时间段来动态规定当前时间选择的日期时间范围 例如&#xff1a;开始时间为2024-8-19&#xff0c;规定可循范围为30天的话&#xff0c;可选范围是2024-8-19至2024-9-19号之间 html <el-date-picker class"date" type"date"…

【GIS开发学员故事】地信本科前后跨过六个行业,勇气是人生的第七件装备

“出过外业、送过外卖、搞过环境设计......” 今天&#xff0c;我们就来看看X同学的就业故事&#xff1a; 自我介绍 我毕业于21年&#xff0c;大学是地理信息科学专业&#xff0c;考过一次研&#xff0c;但是没有考上。去年来的新中地学习GIS开发&#xff0c;目前是在广东的…

人机环境系统智能中有三种神经网络相互作用

在人机环境生态系统智能中&#xff0c;人、机器和环境之间的相互作用确实涉及到三种神经网络的协作&#xff0c;分别是人的神经网络、机器的神经网络和环境的神经网络。 1. 人的神经网络 人的神经网络指的是人类大脑及其神经系统的复杂结构&#xff0c;通过神经元之间的连接来处…

SpringBoot MySQL BinLog 监听数据变化(多库多表)

开始 1&#xff1a;引入mysql-binlog-connector-java.jar <!-- binlog --><dependency><groupId>com.zendesk</groupId><artifactId>mysql-binlog-connector-java</artifactId><version>0.27.1</version></dependency>…

亦菲喊你来学习之机器学习(6)--逻辑回归算法

逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛使用的统计方法&#xff0c;用于解决分类问题&#xff0c;尤其是二分类问题。尽管名字中有“回归”二字&#xff0c;但它实际上是一种分类算法&#xff0c;因为它试图通过线性回归的方式去预测一个事件…

【计算机组成原理】二、数据的表示和运算:3.算术逻辑单元ALU(逻辑运算、加法器)

4.运算器ALU 文章目录 4.运算器ALU4.1逻辑运算非&#xff08;NOT&#xff09;与&#xff08;AND&#xff09;或&#xff08;OR&#xff09;异或&#xff08;XOR&#xff09;同或&#xff08;XNOR&#xff09; 4.2加法器4.2.1一位全加器4.2.2串行加法器4.2.3并行加法器 4.3ALU功…