〖open-mmlab: MMDetection〗解析文件:mmdet/models/losses/cross_entropy_loss.py
目录
- 深入解析MMDetection中的CrossEntropyLoss及其应用
- 1. 概述
- 2. 核心函数
- 2.1 cross_entropy
- 2.1.1 函数定义和参数说明
- 2.1.2 函数体
- 2.1.3 总结
- 2.2 binary_cross_entropy
- 2.2.1 `_expand_onehot_labels`函数
- 2.2.2 `binary_cross_entropy`函数
- 2.2.3 总结
- 2.3 mask_cross_entropy
- 2.3.1函数定义和参数说明
- 2.3.2函数体
- 2.3.3总结
- 3. CrossEntropyLoss类
- 3.1 CrossEntropyLoss 类详解
- 3.1.1 类定义
- 3.1.2 初始化方法
- 3.1.3 属性设置
- 3.1.4 `extra_repr` 方法
- 3.1.5 前向传播方法
- 3.1.6 内部逻辑
- 3.2 示例
- 4. 应用示例
- 5. 总结
- 参考文献
深入解析MMDetection中的CrossEntropyLoss及其应用
在目标检测和分类任务中,交叉熵损失(CrossEntropyLoss)是评估模型预测与真实标签差异的关键指标。MMDetection框架提供了灵活的损失函数实现,以支持不同的训练需求。本文将详细解析CrossEntropyLoss
及其在MMDetection中的应用,并探讨其在模型训练中的作用。
1. 概述
CrossEntropyLoss
是MMDetection中用于计算交叉熵损失的模块。它支持多种配置选项,包括对数损失的权重、忽略的标签索引等,以适应不同的训练场景。
2. 核心函数
2.1 cross_entropy
cross_entropy
函数是计算交叉熵损失的核心函数。它接收模型预测、真实标签和其他可选参数,并返回计算得到的损失值。
cross_entropy
函数是用于计算交叉熵损失的函数,通常用于多分类问题。在深度学习中,交叉熵损失是衡量模型预测概率分布与真实标签概率分布差异的常用方法。以下是对这个函数的详细逐行解析。
2.1.1 函数定义和参数说明
def cross_entropy(pred, label, weight=None, reduction='mean', avg_factor=None, class_weight=None, ignore_index=-100, avg_non_ignore=False):
pred
: 预测值,形状为(N, C)
的张量,其中N
是批次大小,C
是类别数量。label
: 真实标签,形状为(N,)
的张量,每个元素是对应样本的类别索引。weight
: 每个样本的损失权重,形状为(N,)
的张量。reduction
: 指定损失计算后的缩减方式,可以是 “none”、“mean” 或 “sum”。avg_factor
: 用于平均损失的因子,通常用于在损失中考虑无效(如填充)的样本。class_weight
: 每个类别的权重,用于加权损失计算。ignore_index
: 忽略的标签索引,对于这个索引的样本不计入损失计算。avg_non_ignore
: 是否仅在非忽略目标上平均损失。
2.1.2 函数体
ignore_index = -100 if ignore_index is None else ignore_index
- 这行代码设置
ignore_index
的默认值为 -100,如果用户没有指定ignore_index
,则使用默认值。
loss = F.cross_entropy(pred,label,weight=class_weight,reduction='none',ignore_index=ignore_index)
- 使用 PyTorch 的
F.cross_entropy
函数计算每个样本的交叉熵损失。这里设置reduction='none'
以获取每个样本的损失,而不是直接求平均或求和。
if (avg_factor is None) and avg_non_ignore and reduction == 'mean':avg_factor = label.numel() - (label == ignore_index).sum().item()
- 如果
avg_factor
未指定,且avg_non_ignore
为 True,且reduction
为 “mean”,则计算平均因子。这里,avg_factor
是用来计算损失的平均值时考虑的有效样本数量。
if weight is not None:weight = weight.float()
- 如果指定了每个样本的损失权重,则将其转换为浮点数。
loss = weight_reduce_loss(loss, weight=weight, reduction=reduction, avg_factor=avg_factor)
- 使用
weight_reduce_loss
函数应用样本权重,并根据reduction
参数指定的方法缩减损失。avg_factor
用于在平均损失时考虑有效样本数量。
return loss
- 返回计算得到的损失。
2.1.3 总结
cross_entropy
函数是计算多分类问题交叉熵损失的关键函数。它支持对损失进行加权、忽略特定标签的样本,并根据指定的方法缩减损失。这些特性使得该函数在处理不平衡数据集或需要特殊处理某些样本时非常有用。
2.2 binary_cross_entropy
binary_cross_entropy
函数用于计算二元交叉熵损失,特别适用于目标检测中正负样本的分类。
这两个函数是MMDetection中用于处理标签和计算二元交叉熵损失的关键工具。下面将逐行解析这两个函数。
2.2.1 _expand_onehot_labels
函数
def _expand_onehot_labels(labels, label_weights, label_channels, ignore_index):"""Expand onehot labels to match the size of prediction."""
- 这个函数用于将标签扩展为与预测尺寸相匹配的一位有效编码(one-hot encoding)形式。
bin_labels = labels.new_full((labels.size(0), label_channels), 0)
- 创建一个形状为
(labels.size(0), label_channels)
的全零张量,用于存储一位有效编码的标签。
valid_mask = (labels >= 0) & (labels != ignore_index)
- 创建一个有效掩码,其中标签值大于或等于0且不等于
ignore_index
的位置为True。
inds = torch.nonzero(valid_mask & (labels < label_channels), as_tuple=False)
- 找到所有有效且小于
label_channels
的标签索引。
if inds.numel() > 0:bin_labels[inds, labels[inds]] = 1
- 如果存在有效的索引,则在
bin_labels
张量中将这些索引对应的位置设置为1。
valid_mask = valid_mask.view(-1, 1).expand(labels.size(0),label_channels).float()
- 将
valid_mask
重塑并扩展到与bin_labels
相同的形状,并转换为浮点数。
if label_weights is None:bin_label_weights = valid_maskelse:bin_label_weights = label_weights.view(-1, 1).repeat(1, label_channels)bin_label_weights *= valid_mask
- 如果没有给定
label_weights
,则使用valid_mask
作为权重;否则,将label_weights
扩展并与valid_mask
相乘。
return bin_labels, bin_label_weights, valid_mask
- 返回扩展后的一位有效编码标签、标签权重和有效掩码。
2.2.2 binary_cross_entropy
函数
def binary_cross_entropy(pred, label, weight=None, reduction='mean', avg_factor=None, class_weight=None, ignore_index=-100, avg_non_ignore=False):
- 这个函数用于计算二元交叉熵损失。
ignore_index = -100 if ignore_index is None else ignore_index
- 设置
ignore_index
的默认值为-100。
if pred.dim() != label.dim():label, weight, valid_mask = _expand_onehot_labels(label, weight, pred.size(-1), ignore_index)else:valid_mask = ((label >= 0) & (label != ignore_index)).float()if weight is not None:weight = weight * valid_maskelse:weight = valid_mask
- 如果
pred
和label
的维度不同,则调用_expand_onehot_labels
函数扩展标签和权重;否则,创建有效掩码并根据需要调整weight
。
if (avg_factor is None) and avg_non_ignore and reduction == 'mean':avg_factor = valid_mask.sum().item()
- 如果需要在非忽略元素上平均损失,则计算平均因子。
weight = weight.float()loss = F.binary_cross_entropy_with_logits(pred, label.float(), pos_weight=class_weight, reduction='none')
- 将权重转换为浮点数,然后使用
torch.nn.functional.binary_cross_entropy_with_logits
计算未缩减的元素级损失。
loss = weight_reduce_loss(loss, weight, reduction=reduction, avg_factor=avg_factor)
- 使用
weight_reduce_loss
函数根据reduction
参数指定的方法对损失进行缩减。
return loss
- 返回计算得到的损失。
2.2.3 总结
这两个函数是处理标签和计算损失的关键步骤,特别是在处理不平衡数据集或需要忽略某些标签时非常有用。_expand_onehot_labels
函数负责将标签转换为适合损失计算的形式,而binary_cross_entropy
函数则负责实际的损失计算。通过这些函数,MMDetection能够灵活地处理各种复杂的训练场景。
2.3 mask_cross_entropy
mask_cross_entropy
函数用于计算掩码的交叉熵损失,常用于实例分割任务中。
在目标检测和实例分割任务中,mask_cross_entropy
函数用于计算预测掩码与真实掩码之间的交叉熵损失。这个函数特别适用于处理每个目标的二进制掩码。下面是对这个函数的逐行解析。
2.3.1函数定义和参数说明
def mask_cross_entropy(pred, target, label, reduction='mean', avg_factor=None, class_weight=None, ignore_index=None, **kwargs):
pred
: 预测的掩码,形状为(N, C, *)
,其中N
是样本数量,C
是类别数,*
表示任意维度的形状。target
: 真实掩码标签,形状为(N, *)
,与pred
的非类别维度相同。label
: 每个目标的类别标签,用于从pred
中选择对应类别的掩码。reduction
: 指定损失计算后的缩减方式,可以是 “none”、“mean” 或 “sum”。avg_factor
: 用于平均损失的因子,通常用于在损失中考虑无效(如填充)的样本。class_weight
: 每个类别的权重,用于加权损失计算。ignore_index
: 忽略的标签索引,在此函数中不支持。
2.3.2函数体
assert ignore_index is None, 'BCE loss does not support ignore_index'
- 这行代码确保
ignore_index
参数为None
,因为二元交叉熵损失(BCE loss)不支持忽略特定索引。
assert reduction == 'mean' and avg_factor is None
- 这行代码确保
reduction
参数为 “mean” 且avg_factor
为None
。这是为了简化实现,避免处理复杂的缩减逻辑。
num_rois = pred.size()[0]
- 获取预测掩码的数量(即样本数量)。
inds = torch.arange(0, num_rois, dtype=torch.long, device=pred.device)
- 创建一个从0到
num_rois
的整数序列,用于索引pred
。
pred_slice = pred[inds, label].squeeze(1)
- 从
pred
中选择每个样本对应类别的预测掩码。label
包含了每个样本的类别索引,squeeze(1)
用于去除长度为1的维度,使pred_slice
的形状为(N, *)
。
return F.binary_cross_entropy_with_logits(pred_slice, target, weight=class_weight, reduction='mean')[None]
- 使用
torch.nn.functional.binary_cross_entropy_with_logits
计算二元交叉熵损失。这里pred_slice
是预测值,target
是真实值,weight
是类别权重(如果有的话)。 reduction='mean'
指定损失的平均方式。[None]
用于将输出转换为形状(1,)
的张量,以符合 MMDetection 中损失函数的输出格式。
2.3.3总结
mask_cross_entropy
函数是一个专门用于计算预测掩码与真实掩码之间交叉熵损失的函数。它通过选择每个样本对应类别的预测掩码,并计算与真实掩码的二元交叉熵损失。这个函数在实例分割任务中非常有用,尤其是在需要对每个目标的掩码进行分类的场景中。
3. CrossEntropyLoss类
CrossEntropyLoss
类封装了交叉熵损失的计算逻辑,使其可以作为模型的一个组件被轻松集成。
@MODELS.register_module()
class CrossEntropyLoss(nn.Module):def __init__(self, use_sigmoid=False, use_mask=False, reduction='mean', class_weight=None, ignore_index=None, loss_weight=1.0, avg_non_ignore=False):...
3.1 CrossEntropyLoss 类详解
CrossEntropyLoss
类是用于计算交叉熵损失的一个自定义PyTorch模块。它可以适应多种场景下的分类任务,包括多分类、二分类以及掩码损失。下面我们将通过具体的例子来详细解析该类的实现及其工作原理。
3.1.1 类定义
@MODELS.register_module()
class CrossEntropyLoss(nn.Module):
这里 @MODELS.register_module()
是一个装饰器,通常用于注册自定义模块,使得该模块可以在配置文件中被方便地引用和实例化。
3.1.2 初始化方法
def __init__(self,use_sigmoid=False,use_mask=False,reduction='mean',class_weight=None,ignore_index=None,loss_weight=1.0,avg_non_ignore=False):
use_sigmoid
: 布尔值,指示输出是否使用sigmoid激活函数,默认为False,意味着使用softmax。use_mask
: 布尔值,指示是否使用掩码交叉熵损失,默认为False。reduction
: 字符串,指定损失函数的缩减方式,默认为’mean’,即计算平均损失。可选值还有’none’(不缩减)和’sum’(求和)。class_weight
: 列表或数组,每个类别的权重,默认为None,即所有类别权重相同。ignore_index
: 整数或None,需要忽略的标签索引,默认为None。loss_weight
: 浮点数,损失函数的整体权重,默认为1.0。avg_non_ignore
: 布尔值,决定是否只在非忽略的目标上平均损失,默认为False。
3.1.3 属性设置
在初始化方法中,设置了多个类属性,并根据传入的参数选择不同的交叉熵损失计算方法:
cls_criterion
: 根据use_sigmoid
和use_mask
的值来选择具体的损失计算函数。可能的函数有binary_cross_entropy
、mask_cross_entropy
或cross_entropy
。
3.1.4 extra_repr
方法
def extra_repr(self):s = f'avg_non_ignore={self.avg_non_ignore}'return s
该方法返回一个额外的表示字符串,通常用于打印类的额外信息。在这个例子中,返回的是 avg_non_ignore
的状态。
3.1.5 前向传播方法
def forward(self,cls_score,label,weight=None,avg_factor=None,reduction_override=None,ignore_index=None,**kwargs):
cls_score
: 模型的预测输出。label
: 真实标签。weight
: 样本权重,默认为None。avg_factor
: 平均因子,默认为None。reduction_override
: 指定的缩减方式,默认为None,表示使用初始化时指定的方式。ignore_index
: 需要忽略的标签索引,默认为None,表示使用初始化时指定的值。**kwargs
: 其他关键字参数。
3.1.6 内部逻辑
-
参数验证
assert reduction_override in (None, 'none', 'mean', 'sum')
确保
reduction_override
参数的有效性。 -
确定缩减方式
reduction = (reduction_override if reduction_override else self.reduction)
根据
reduction_override
参数或初始化时设置的reduction
属性确定实际使用的缩减方式。 -
确定忽略索引
if ignore_index is None:ignore_index = self.ignore_index
如果
ignore_index
未被显式指定,则使用初始化时设置的值。 -
处理类别权重
if self.class_weight is not None:class_weight = cls_score.new_tensor(self.class_weight, device=cls_score.device) else:class_weight = None
如果提供了类别权重,将其转换为与
cls_score
相同设备上的张量。 -
计算损失
loss_cls = self.loss_weight * self.cls_criterion(cls_score,label,weight,class_weight=class_weight,reduction=reduction,avg_factor=avg_factor,ignore_index=ignore_index,avg_non_ignore=self.avg_non_ignore,**kwargs)
根据选择的交叉熵损失计算函数
cls_criterion
计算损失,并应用损失权重。 -
返回损失
return loss_cls
返回计算得到的损失值。
3.2 示例
假设我们有一个简单的二分类问题,其中 cls_score
是模型的输出,label
是真实的标签,我们想要计算交叉熵损失。
import torch
import torch.nn.functional as F# 假设的模型输出
cls_score = torch.tensor([[1.0, 2.0], [3.0, 4.0]], requires_grad=True)
# 假设的真实标签
label = torch.tensor([0, 1])# 实例化 CrossEntropyLoss
loss_func = CrossEntropyLoss(use_sigmoid=True)# 计算损失
loss = loss_func(cls_score, label)
print("Loss:", loss.item())
在这个例子中,我们使用了sigmoid激活函数,并假设 cls_score
是两个样本的二分类概率预测。label
表示这两个样本的真实类别分别为0和1。loss_func
实例化了一个使用sigmoid的交叉熵损失函数,最后我们计算并打印了损失值。
通过以上分析,我们可以看到 CrossEntropyLoss
类是如何灵活地适应不同场景下的交叉熵损失计算需求的。
4. 应用示例
以下是如何在实际模型训练中使用CrossEntropyLoss
的示例。
# 初始化损失函数
criterion = CrossEntropyLoss(use_sigmoid=True, reduction='mean')# 假设有预测和标签
pred = torch.randn(10, 2) # 10个样本,2个类别
label = torch.empty(10, dtype=torch.long).random_(2)# 计算损失
loss = criterion(pred, label)
5. 总结
CrossEntropyLoss
是MMDetection中实现交叉熵损失的关键组件,它支持多种配置选项,以适应不同的训练需求。通过合理配置,可以有效地优化模型在目标检测和分类任务中的表现。
参考文献
- PyTorch官方文档
本文详细介绍了CrossEntropyLoss
的实现及其在MMDetection中的应用,希望对目标检测和分类任务的研究者和开发者有所帮助。
相关文章:

〖open-mmlab: MMDetection〗解析文件:mmdet/models/losses/cross_entropy_loss.py
目录 深入解析MMDetection中的CrossEntropyLoss及其应用1. 概述2. 核心函数2.1 cross_entropy2.1.1 函数定义和参数说明2.1.2 函数体2.1.3 总结 2.2 binary_cross_entropy2.2.1 _expand_onehot_labels函数2.2.2 binary_cross_entropy函数2.2.3 总结 2.3 mask_cross_entropy2.3.…...

【PyTorch单点知识】torch.nn.Embedding模块介绍:理解词向量与实现
文章目录 0. 前言1. 基础介绍1.1 基本参数1.2 可选参数1.3 属性1.4 PyTorch源码注释 2. 实例演示3. embedding_dim的合理设定4. 结论 0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但…...

Jedis 操作 Redis 数据结构全攻略
Jedis 操作 Redis 数据结构全攻略 一 . 认识 RESP二 . 前置操作2.1 创建项目2.2 关于开放 Redis 端口的问题2.2.1 端口转发?2.2.2 端口配置 2.3 连接到 Redis 服务器 三 . 通用命令3.1 set 和 get3.2 exists 和 del3.3 keys3.4 expire、ttl、type 三 . string 相关命令3.1 mse…...

ctf.show靶场ssrf攻略
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 web351 解析:post传入url参数他就会访问。 解法: hackbar传入url参数写入https://127.0.0.1/flag.php web352 解析:post传入url参数,不能是127.0.0.1和localhost 解法:缩写127.1传入 web353 解析…...

在 PyTorch 中,如何使用 `pack_padded_sequence` 来提高模型训练的效率?
在PyTorch中,pack_padded_sequence 是一个非常有用的函数,它可以用来提高模型训练的效率,特别是在处理变长序列数据时。这个函数的主要作用是将填充后的序列数据打包,以便循环神经网络(RNN)可以更高效地处理…...

Gossip协议
主要用在Redis Cluster 节点间通信 Gossip协议,也称为流行病协议(Epidemic Protocol),是一种在分布式系统中用于信息传播和故障探测的算法。 一、工作原理 随机选择传播对象 每个节点会定期随机选择一些其他节点作为传播对象。这…...

数据结构————双向链表
内存泄漏: 内存泄漏(Memory Leak)是指程序中已动态分配的内存由于某种原因程序未释放或无法释放,导致系统内存的浪费,严重时会导致程序运行缓慢甚至崩溃。这种情况在长时间运行的程序或大型系统中尤为常见,…...

55 - I. 二叉树的深度
comments: true difficulty: 简单 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9855%20-%20I.%20%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%B7%B1%E5%BA%A6/README.md 面试题 55 - I. 二叉树的深度 题目描述 输入一棵二叉树的根节点…...

Redis——初识Redis
初识Redis Redis认识Redis 分布式系统单机架构为什么要引入分布式理解负载均衡数据库的读写分离引入主从数据库 引入缓存数据库分库分表业务拆分——微服务常见概念了解 Redis背景介绍特性应用场景Redis不能做的事情Redis客户端redis客户端的多种形态 Redis 认识Redis 存储数…...

Xshell or Xftp提示“要继续使用此程序,您必须应用最新的更新或使用新版本”
Xshell提示“要继续使用此程序,您必须应用最新的更新或使用新版本”,笔者版本是xshell 6 方法一:更改系统时间 对于Windows 10用户,首先找到系统日期,右键点击并选择“调整时间/日期”。将日期设定为上一年。完成调整后&#x…...

table用position: sticky固定多层表头,滑动滚动条border边框透明解决方法
问题:我发现,这个上下滑动有内容经过就会出现如图的情况。 解决的方法:用outline(轮廓)替代border,以达到我们想要的样式。 outline主要是在元素边框的外围设置轮廓,outline不占据空间,绘制于…...

基于飞桨paddle2.6.1+cuda11.7+paddleRS开发版的目标提取-道路数据集训练和预测代码
基于飞桨paddle2.6.1cuda11.7paddleRS开发版的目标提取-道路数据集训练和预测代码 预测结果: 预测影像: (一)准备道路数据集 下载数据集地址: https://aistudio.baidu.com/datasetdetail/56961 mass_road.zip …...

数学建模笔记—— 整数规划和0-1规划
数学建模笔记—— 整数规划和0-1规划 整数规划和0-1规划1. 模型原理1.1 基本概念1.2 线性整数规划求解1.3 线性0-1规划的求解 2. 典型例题2.1 背包问题2.2 指派问题 3. matlab代码实现3.1 背包问题3.2 指派问题 整数规划和0-1规划 1. 模型原理 1.1 基本概念 在规划问题中&am…...

[001-03-007].第26节:分布式锁迭代3->优化基于setnx命令实现的分布式锁-防锁的误删
我的博客大纲 我的后端学习大纲 1、问题分析: 1.1.问题: 1.锁的超时释放,可能会释放其他服务器的锁 1.2.场景: 1.如果业务逻辑的执行时间是7s。执行流程如下 1.index1业务逻辑没执行完,3秒后锁被自动释放。2.index…...

【Unity踩坑】为什么有Rigidbody的物体运行时位置会变化
先上图,不知你有没有注意过这个现象呢? 一个物体加上了Rigidbody组件,当勾选上Use Gravity时,运行后,这个物体的位置的值会有变化。这是为什么呢? 刚体由物理系统处理,因此它会对重力、碰撞等做…...

NGINX开启HTTP3,给web应用提个速
环境说明 linuxdockernginx版本:1.27 HTTP3/QUIC介绍 HTTP3是由IETF于2022年发布的一个标准,文档地址为:https://datatracker.ietf.org/doc/html/rfc9114 如rfc9114所述,http3主要基于QUIC协议实现,在具备高性能的同时又兼备了…...

秋招季!别浮躁!
好久没写了,今天兴致来了,众所周知我一旦想说话,就来这里疯狂写。 最近,我去了一家国企的研究院,听着是不是贼高大上,呵——这玩意儿把我分配到三级机构,我一个学计算机的,它不把我…...

Java的时间复杂度和空间复杂度和常见排序
目录 一丶时间复杂度 二丶空间复杂度 三丶Java常见排序 1. 冒泡排序(Bubble Sort) 2.插入排序(Insertion Sort) 3.希尔排序(Shell Sort) 4.选择排序(Selection Sort) 5.堆排序&am…...

Qt 学习第十天:标准对话框 页面布局
系统标准对话框 错误对话框 //错误对话框connect(createPro, &QAction::triggered, this, []{//参数1 父亲 参数2 标题 参数3 对话框内显示文本内容 。。。QMessageBox::critical(this, "报错!", "没加头文件!");}); 【运行结果】 信息对话框 co…...

体育数据API纳米足球数据API:足球数据接口文档API示例⑩
纳米体育数据的数据接口通过JSON拉流方式获取200多个国家的体育赛事实时数据或历史数据的编程接口,无请求次数限制,可按需购买,接口稳定高效; 覆盖项目包括足球、篮球、网球、电子竞技、奥运等专题、数据内容。纳米数据API2.0版本…...

[数据集][目标检测]高铁受电弓检测数据集VOC+YOLO格式1245张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1245 标注数量(xml文件个数):1245 标注数量(txt文件个数):1245 标注…...

Vuex:深入理解所涉及的几个问题
你好,我是沐爸,欢迎点赞、收藏、评论和关注。 一、Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 二、Vu…...

vue原理分析(六)研究new Vue()
今天我们来分析使用new Vue() 之前研究时,只是说是在创建一个实例。并没有深入进行研究 在vue的源码中找下Vue的构造函数 function Vue(options) {if (!(this instanceof Vue)) {warn$2(Vue is a constructor and should be called with the new keyword);}this.…...

滑动窗口+动态规划
前言:分析这个题目的时候,就知道要这两个线段要分开,但是要保证得到最优解,那么我们在选取第二根线段的时候,要保证我们第一根线段是左边最优解 并且我们选的两根线段的右端点一定是我们的数组的点(贪心思…...

vscode配置django环境并创建django项目
1、创建文件夹 创建文件夹 并在vscode打开 终端输入命令 “ python -m venv env ” 查看目录结构 2、创建项目 在终端输入 django-admin startproject 文件名(这里以myshop为例) 3、创建应用 在myshop打开终端 在终端输入 django-admin startapp 应用名 这里以app1为例…...

WebGL系列教程四(绘制彩色三角形)
目录 1 前言2 varying变量介绍3 开始绘制3.1 声明顶点着色器3.2 声明片元着色器3.3 创建顶点和颜色的缓冲区3.4 指定变量从缓冲区获取值3.5 效果3.6 varying的内涵3.7 完整代码 4 总结 1 前言 上一篇中我们介绍了如何使用缓冲区来绘制三角形,这一篇我们来讲讲如何给…...

通过mxGraph在ARMxy边缘计算网关上实现工业物联网
在当今的工业4.0时代,工业物联网(IIoT)已经成为制造业转型升级的关键技术之一。ARMxy边缘计算网关作为工业自动化和物联网的重要组成部分,能够为工厂车间提供实时的数据处理能力和智能化服务。而mxGraph作为一种流行的JavaScript库…...

GEE案例:利用sentinel-1数据进行洪水监测分析(直方图统计)
目录 简介 数据 函数 ee.Filter.calendarRange(start, end, field) Arguments: Returns: Filter updateMask(mask) Arguments: Returns: Image 代码 结果 简介 利用sentinel-1数据进行洪水监测分析 数据 COPERNICUS/S1_GRD数据是由欧洲空间局(ESA)的Copernicus项…...

QT 联合opencv 易错点
https://blog.csdn.net/qq_51699436/article/details/135777911 网上已经有大量优秀切详尽的文章来讲述QT联合opencv了,我把容易出错的点列出来备忘 1、在进行opencv进行编译时,要确认好是32位还是64位,因为在创建QT项目的时候QT和opencv要匹…...

例如/举例的使用方法 ,e.g., 以及etc的使用方法
e.g. 例如 for example for the sake of example such as 1 e.g. 是拉丁语 exempli gratia 的缩写意思是“举个例子,比如”,等同于for example、 for the sake of example、such as,使用 e.g. 的目的是用几个例子来说明前面的观点。 2 例…...