卷积与动态特征选择:重塑YOLOv8的多尺度目标检测能力

文章目录

    • 1. YOLOv8的网络结构概述
    • 2. 添加注意力机制
      • 2.1 为什么添加注意力机制?
      • 2.2 如何将注意力机制集成到YOLOv8中?
      • 2.3 效果分析
    • 3. C2f模块的集成
      • 3.1 C2f模块简介
      • 3.2 如何在YOLOv8中集成C2f模块?
      • 3.3 效果分析
    • 4. 卷积操作的优化
      • 4.1 卷积操作的挑战
      • 4.2 深度可分离卷积(Depthwise Separable Convolution)
      • 4.3 组卷积(Group Convolution)
      • 4.4 效果分析
    • 5. Neck和检测头的改进
      • 5.1 Neck部分的优化
      • 5.2 PANet的集成
      • 5.3 检测头的优化
      • 5.4 焦点损失(Focal Loss)示例
    • 6. 自适应卷积与动态特征选择
      • 6.1 自适应卷积(Adaptive Convolution)的引入
      • 6.2 动态特征选择
    • 7. 多尺度训练与自监督学习
      • 7.1 多尺度训练的重要性
      • 7.2 自监督学习
    • 8. 增强型损失函数与后处理优化
      • 8.1 增强型损失函数
      • 8.2 后处理优化
        • Soft-NMS
        • DIoU-NMS
    • 总结

YOLO(You Only Look Once)系列模型已经是目标检测领域的一个重要里程碑。YOLOv8作为YOLO系列的最新版本,在精度和速度上都有了显著的提升。然而,YOLOv8依然有优化的空间,尤其是在网络结构层次上。本文将探讨如何在YOLOv8的网络结构中添加几种创新机制,以进一步提高其检测精度和性能,包括:注意力机制、C2f模块、卷积操作、Neck设计和检测头。

1. YOLOv8的网络结构概述

YOLOv8继承了YOLO系列的设计理念,以其极快的推理速度和较高的检测精度成为了许多目标检测任务中的首选。YOLOv8的结构通常包含以下几个部分:

  • Backbone:负责从输入图像中提取特征。
  • Neck:进一步处理特征,提取更多上下文信息,增强模型的表达能力。
  • Detection Head:用于预测最终的类别、边界框和置信度。

2. 添加注意力机制

2.1 为什么添加注意力机制?

注意力机制已经在计算机视觉中取得了广泛的成功,尤其在图像分类和目标检测中。其主要思想是让网络“关注”输入图像中的重要区域,从而提升模型的准确性。通过加权不同特征区域,注意力机制能够帮助网络从复杂的背景中区分出目标物体。

2.2 如何将注意力机制集成到YOLOv8中?

YOLOv8的改进可以通过将注意力机制融入到特征提取部分(Backbone)和特征融合部分(Neck)来实现。常见的注意力机制包括SE(Squeeze-and-Excitation)模块、CBAM(Convolutional Block Attention Module)等。

以下是一个简单的SE模块集成示例:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass SEBlock(nn.Module):def __init__(self, channel, reduction=16):super(SEBlock, self).__init__()self.fc1 = nn.Linear(channel, channel // reduction, bias=False)self.fc2 = nn.Linear(channel // reduction, channel, bias=False)def forward(self, x):batch_size, C, _, _ = x.size()y = F.adaptive_avg_pool2d(x, 1).view(batch_size, C)y = F.relu(self.fc1(y))y = torch.sigmoid(self.fc2(y)).view(batch_size, C, 1, 1)return x * y.expand_as(x)class YOLOv8WithSE(nn.Module):def __init__(self, backbone):super(YOLOv8WithSE, self).__init__()self.backbone = backboneself.se_block = SEBlock(channel=256)  # 假设Backbone输出256通道的特征def forward(self, x):x = self.backbone(x)x = self.se_block(x)  # 集成注意力机制return x

2.3 效果分析

通过将注意力机制添加到YOLOv8中,模型可以显著提升对小物体和复杂场景中的目标的检测精度,尤其在目标物体与背景对比度较低的情况下。

3. C2f模块的集成

3.1 C2f模块简介

C2f(Cascaded Convolutional Fusion)模块是一种通过级联卷积操作增强特征表达能力的方式。在目标检测中,C2f能够帮助网络更好地融合不同尺度的特征,提升多尺度目标的检测精度。

3.2 如何在YOLOv8中集成C2f模块?

C2f模块的设计主要在于通过多次卷积操作将不同层的特征进行融合。下面是一个简化版的C2f模块集成示例:

class C2fBlock(nn.Module):def __init__(self, in_channels, out_channels):super(C2fBlock, self).__init__()self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1)self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1)def forward(self, x):x1 = F.relu(self.conv1(x))x2 = F.relu(self.conv2(x1))return x + x2  # 融合两层特征

3.3 效果分析

C2f模块的加入能够提升YOLOv8对不同尺度目标的适应性,尤其在面对小物体或密集场景时,能够显著提高检测精度。

好的,继续从第4部分开始重写:


4. 卷积操作的优化

4.1 卷积操作的挑战

在YOLOv8中,卷积操作是提取特征的核心。然而,随着网络深度的增加,传统的卷积操作可能带来巨大的计算负担,尤其是在高分辨率图像的情况下。为了提高速度和效率,许多现代网络架构采取了优化的卷积策略,比如深度可分离卷积(Depthwise Separable Convolution)和组卷积(Group Convolution)。

4.2 深度可分离卷积(Depthwise Separable Convolution)

深度可分离卷积将标准卷积分解为两个操作:首先是“深度卷积”操作,即每个输入通道分别卷积;其次是“逐点卷积”,通过1x1卷积整合各个输出通道。这样可以减少参数数量和计算量,从而加速网络推理过程。

我们可以将深度可分离卷积集成到YOLOv8中,以替代传统的卷积层,从而在不显著损失精度的情况下减少计算量。以下是如何将其实现的示例代码:

class DepthwiseSeparableConv(nn.Module):def __init__(self, in_channels, out_channels, stride=1):super(DepthwiseSeparableConv, self).__init__()self.depthwise = nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=stride, padding=1, groups=in_channels, bias=False)self.pointwise = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, padding=0, bias=False)def forward(self, x):x = self.depthwise(x)x = self.pointwise(x)return x

4.3 组卷积(Group Convolution)

组卷积(Group Convolution)是一种将输入通道划分为多个组并独立进行卷积操作的策略。每组仅处理一部分通道,这样减少了每次卷积的计算量。组卷积在AlexNet和ResNeXt中有过成功应用,也可用于YOLOv8以进一步优化卷积操作,提升网络的效率。

以下是组卷积的代码实现:

class GroupConv(nn.Module):def __init__(self, in_channels, out_channels, groups=2):super(GroupConv, self).__init__()self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1, groups=groups, bias=False)def forward(self, x):return self.conv(x)

4.4 效果分析

通过使用深度可分离卷积和组卷积,YOLOv8的卷积操作得以优化,减少了计算量和内存占用,同时保持了较高的检测精度。这对于部署在移动设备或计算资源受限的环境中具有显著优势。

5. Neck和检测头的改进

5.1 Neck部分的优化

Neck部分在YOLOv8中用于特征融合,目的是将来自不同尺度的特征图进行融合,使得网络能够更好地处理多尺度目标。YOLOv8采用的是特征金字塔网络(FPN)结构,它通过自上而下的特征融合帮助网络有效地捕捉不同尺寸的目标。

然而,FPN在某些复杂场景下可能无法充分挖掘低层次和高层次特征的关系。因此,我们可以考虑引入PANet(Path Aggregation Network)来替代传统的FPN结构。PANet通过引入自底向上的特征传播路径,增强了低层次特征与高层次特征的交互,从而提高了多尺度目标的检测效果。

5.2 PANet的集成

在YOLOv8中集成PANet后,我们可以通过增加自底向上的路径来改进Neck的结构,提升多尺度特征的融合能力。以下是PANet在YOLOv8中的集成示例:

class PANetNeck(nn.Module):def __init__(self, in_channels, out_channels):super(PANetNeck, self).__init__()self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1)self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1)self.upconv = nn.ConvTranspose2d(out_channels, out_channels, kernel_size=2, stride=2)def forward(self, x):x1 = F.relu(self.conv1(x))x2 = F.relu(self.conv2(x1))x3 = self.upconv(x2)return x1 + x3  # 路径聚合

5.3 检测头的优化

YOLOv8的检测头负责生成最终的检测结果,包括目标类别、边界框和置信度。为了提升检测头的性能,我们可以引入更加精细的锚框生成策略以及更复杂的损失函数。例如,焦点损失(Focal Loss)可以帮助模型更好地处理类别不平衡问题,特别是针对小物体和困难背景。

以下是基于焦点损失优化检测头的代码示例:

class YOLODetectionHead(nn.Module):def __init__(self, in_channels, num_classes, num_anchors=3):super(YOLODetectionHead, self).__init__()self.num_classes = num_classesself.num_anchors = num_anchorsself.conv = nn.Conv2d(in_channels, num_anchors * (num_classes + 4 + 1), kernel_size=1)def forward(self, x):output = self.conv(x)return outputdef compute_loss(self, predictions, targets):# 计算焦点损失return focal_loss(predictions, targets)

5.4 焦点损失(Focal Loss)示例

焦点损失通过调整易错样本的权重,增强模型对难样本的关注,减少对容易样本的过拟合。以下是焦点损失的实现:

import torch
import torch.nn.functional as Fdef focal_loss(pred, target, alpha=0.25, gamma=2):"""Focal Loss for binary classification."""pred_prob = torch.sigmoid(pred)target_prob = target.float()loss = -alpha * target_prob * (1 - pred_prob) ** gamma * torch.log(pred_prob) - \(1 - alpha) * (1 - target_prob) * pred_prob ** gamma * torch.log(1 - pred_prob)return loss.mean()

好的,继续从第6部分开始:


6. 自适应卷积与动态特征选择

6.1 自适应卷积(Adaptive Convolution)的引入

自适应卷积是一种能够根据输入特征动态调整卷积核大小和形状的技术。在YOLOv8中,可以通过引入自适应卷积来提升网络的特征提取能力,特别是在面对不同背景和目标尺度时。自适应卷积通过调整卷积核的权重,使得卷积操作能更好地适应不同区域的特征,从而改善模型的表达能力。

例如,我们可以通过学习一个特征地图的空间自适应卷积核来调整每个局部区域的卷积操作,从而增强网络的自适应能力。以下是一个简单的自适应卷积实现示例:

class AdaptiveConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size=3):super(AdaptiveConv2d, self).__init__()self.kernel_size = kernel_sizeself.in_channels = in_channelsself.out_channels = out_channelsself.conv_weight = nn.Parameter(torch.randn(out_channels, in_channels, kernel_size, kernel_size))self.bias = nn.Parameter(torch.zeros(out_channels))def forward(self, x):batch_size, _, height, width = x.size()adaptive_weight = self.conv_weight.view(self.out_channels, self.in_channels, -1)adaptive_weight = adaptive_weight.permute(0, 2, 1).view(self.out_channels, self.in_channels, self.kernel_size, self.kernel_size)x = F.conv2d(x, adaptive_weight, self.bias, stride=1, padding=1)return x

6.2 动态特征选择

动态特征选择是一种基于输入数据的内容自动选择和调整特征的机制。在YOLOv8中,特征选择主要体现在如何在多个特征图中选择合适的特征进行融合。传统的方式是使用简单的加权平均或拼接方法,而动态特征选择则允许网络根据输入图像的内容动态选择最相关的特征图进行融合。

动态特征选择方法可以结合注意力机制来实现。例如,通过自适应调整不同尺度的特征图权重,网络可以更好地专注于关键区域,减少不相关信息的干扰。以下是动态特征选择的简单实现:

class DynamicFeatureSelection(nn.Module):def __init__(self, in_channels, out_channels):super(DynamicFeatureSelection, self).__init__()self.attention_layer = nn.Conv2d(in_channels, out_channels, kernel_size=1)def forward(self, x1, x2, x3):# 通过注意力机制对输入特征图进行动态加权attention_map = torch.sigmoid(self.attention_layer(x1))selected_features = attention_map * (x1 + x2 + x3)return selected_features

通过动态特征选择,YOLOv8能够根据输入图像的具体内容更有效地融合多尺度信息,从而提高目标检测的精度和鲁棒性。

7. 多尺度训练与自监督学习

7.1 多尺度训练的重要性

多尺度训练是一种在不同分辨率下训练模型的方法,它可以使模型具备更好的尺度适应能力。目标检测任务中,物体的尺寸可能变化很大,因此,训练过程中使用不同尺度的图像可以让模型更好地应对不同尺寸目标的检测。

在YOLOv8中,可以通过动态调整输入图像的大小来实现多尺度训练。例如,输入图像的大小可以在一个范围内随机选择,这样模型就能在不同尺度下学习到物体的特征,提高对不同大小物体的检测能力。

以下是多尺度训练实现的一种方法:

import random
import torch
import torch.nn.functional as Fdef resize_input(image, target_size=(640, 640)):new_size = random.randint(320, 1280)  # 随机选择不同的输入尺寸image = F.interpolate(image, size=(new_size, new_size), mode='bilinear', align_corners=False)return image# 使用resize_input对训练图像进行多尺度调整
image = torch.randn(1, 3, 640, 640)  # 假设原始图像是640x640
image_resized = resize_input(image)

通过这种方式,YOLOv8能够适应各种尺度的目标,从而提升在多尺度场景中的检测效果。

7.2 自监督学习

自监督学习作为一种无监督学习的方式,在目标检测中也逐渐受到关注。自监督学习的核心思想是通过预测输入数据的一部分来训练模型,而无需大量标注数据。在YOLOv8的上下游结构中,可以加入自监督学习任务,以提高特征的表达能力和泛化能力。

例如,在目标检测中,YOLOv8可以通过自监督任务来学习图像的上下文信息,如预测图像区域的相对位置、重建图像内容等。通过这种方式,模型能够在标注数据不足的情况下,通过自监督任务增强其对目标的理解。

以下是一个基于自监督学习的重建任务示例:

class SelfSupervisedReconstruction(nn.Module):def __init__(self, in_channels):super(SelfSupervisedReconstruction, self).__init__()self.conv1 = nn.Conv2d(in_channels, 64, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(64, in_channels, kernel_size=3, padding=1)def forward(self, x):x = F.relu(self.conv1(x))reconstructed = self.conv2(x)return reconstructed# 自监督重建损失
def reconstruction_loss(pred, target):return F.mse_loss(pred, target)

在训练过程中,YOLOv8不仅需要预测目标的位置和类别,还需要通过自监督学习任务增强对背景和上下文信息的理解,从而提升整体检测性能。

8. 增强型损失函数与后处理优化

8.1 增强型损失函数

传统的YOLO损失函数主要由三部分组成:分类损失、定位损失和置信度损失。虽然这种损失函数已经能够适应大多数任务,但对于复杂场景中的小物体或者密集场景,可能需要进一步的优化。例如,引入IoU(Intersection over Union)损失、CIoU(Complete IoU)损失或GIoU(Generalized IoU)损失来改进边界框回归的精度,特别是在检测小物体时,增强型损失函数可以显著提高模型的准确性。

以下是CIoU损失的代码实现:

def ciou_loss(pred_boxes, target_boxes):# 计算CIoU损失pred_x1, pred_y1, pred_x2, pred_y2 = pred_boxestarget_x1, target_y1, target_x2, target_y2 = target_boxes# 计算IoU部分inter_area = torch.max(torch.min(pred_x2, target_x2) - torch.max(pred_x1, target_x1), torch.tensor(0.0))inter_height = torch.max(torch.min(pred_y2, target_y2) - torch.max(pred_y1, target_y1), torch.tensor(0.0))inter_area *= inter_heightunion_area = (pred_x2 - pred_x1) * (pred_y2 - pred_y1) + (target_x2 - target_x1) * (target_y2 - target_y1) - inter_areaiou = inter_area / union_area# 计算中心点距离部分pred_center_x = (pred_x1 + pred_x2) / 2pred_center_y = (pred_y1 + pred_y2) / 2target_center_x = (target_x1 + target_x2) / 2target_center_y = (target_y1 + target_y2) / 2center_distance = (pred_center_x - target_center_x) ** 2 + (pred_center_y - target_center_y) ** 2# 计算长宽比部分pred_aspect = (pred_x2 - pred_x1) / (pred_y2 - pred_y1)target_aspect = (target_x2 - target_x1) / (target_y2 - target_y1)aspect_ratio = (pred_aspect - target_aspect) ** 2# 综合IoU损失,中心点距离损失和长宽比损失loss = 1 - iou + center_distance + aspect_ratioreturn loss.mean()

好的,继续从第8.2部分开始:


8.2 后处理优化

YOLOv8的后处理通常使用非极大值抑制(NMS)来去除重复的检测框。然而,在密集目标检测或者小物体检测的场景中,传统的NMS方法可能会丢失一些有效的框,或者错误地抑制掉重要的目标。为了提升后处理阶段的精度,可以尝试优化NMS策略,例如使用Soft-NMSDIoU-NMS等更为先进的后处理方法。

Soft-NMS

传统的NMS在计算重叠区域(IoU)后,如果框之间的IoU超过阈值,便直接丢弃重叠框。而Soft-NMS通过降低重叠框的置信度而不是直接丢弃它们,能够在保持精度的同时减少误抑制。在目标密集或者小物体的检测中,Soft-NMS可以显著提高检测的精度。

下面是Soft-NMS的代码实现:

import torchdef soft_nms(boxes, scores, sigma=0.5, threshold=0.3, method=2):"""Soft-NMS 算法:param boxes: 检测框,大小为 (N, 4),每个框的格式为 [x1, y1, x2, y2]:param scores: 检测框的置信度,大小为 (N,):param sigma: 高斯函数的标准差,控制置信度衰减的速度:param threshold: 阈值,低于该置信度的框将被丢弃:param method: 采用的软NMS方法:1: 经典的软NMS(基于高斯衰减)2: 使用线性衰减:return: 经过软NMS后的框和得分"""N = boxes.size(0)for i in range(N):max_score_idx = torch.argmax(scores[i:])scores[i + max_score_idx] = 0max_score_box = boxes[i + max_score_idx]ious = compute_iou(max_score_box.unsqueeze(0), boxes)  # 计算与其他框的IoUif method == 1:scores = scores * torch.exp(-(ious ** 2) / sigma)  # 高斯衰减elif method == 2:scores = scores - ious * sigma  # 线性衰减boxes[scores < threshold] = 0  # 过滤低置信度框return boxes, scoresdef compute_iou(box1, box2):"""计算IoU"""x1, y1, x2, y2 = box1[0], box1[1], box1[2], box1[3]x1_, y1_, x2_, y2_ = box2[:, 0], box2[:, 1], box2[:, 2], box2[:, 3]inter_x1 = torch.max(x1, x1_)inter_y1 = torch.max(y1, y1_)inter_x2 = torch.min(x2, x2_)inter_y2 = torch.min(y2, y2_)inter_area = torch.max(inter_x2 - inter_x1, torch.tensor(0.0)) * torch.max(inter_y2 - inter_y1, torch.tensor(0.0))box1_area = (x2 - x1) * (y2 - y1)box2_area = (x2_ - x1_) * (y2_ - y1_)union_area = box1_area + box2_area - inter_areaiou = inter_area / union_areareturn iou

通过这种方法,Soft-NMS能够在重叠区域较大的情况下,保留一些高置信度的目标,避免传统NMS的过度抑制问题,特别是在目标密集或存在大量重叠的情况下。

DIoU-NMS

除了Soft-NMS,DIoU-NMS(Distance-IoU-NMS)也是一种有效的后处理优化方法。DIoU-NMS结合了边界框的距离信息,不仅考虑了IoU,还加入了中心点距离的因素,这样可以在重叠的目标检测中更加准确地选择框,避免误丢失重要信息。

以下是DIoU-NMS的实现方法:

def diou_nms(boxes, scores, iou_threshold=0.5):"""DIoU-NMS 算法:param boxes: 检测框,大小为 (N, 4),每个框的格式为 [x1, y1, x2, y2]:param scores: 检测框的置信度,大小为 (N,):param iou_threshold: IoU 阈值,超过该阈值的框将被丢弃:return: 经过DIoU-NMS后的框和得分"""# 根据得分对框进行排序sorted_idx = scores.argsort(descending=True)boxes = boxes[sorted_idx]scores = scores[sorted_idx]keep = []while boxes.size(0) > 0:current_box = boxes[0].unsqueeze(0)current_score = scores[0].unsqueeze(0)keep.append(0)# 计算与当前框的IoUious = compute_iou(current_box, boxes[1:])dious = compute_diou(current_box, boxes[1:])# 计算DIoUdious = dious * (1 - ious)  # 权重调整,结合IoU和中心距离# 保留满足IoU阈值的框valid_mask = dious < iou_thresholdboxes = boxes[1:][valid_mask]scores = scores[1:][valid_mask]return boxes[keep], scores[keep]def compute_diou(box1, box2):"""计算DIoU"""x1, y1, x2, y2 = box1[0], box1[1], box1[2], box1[3]x1_, y1_, x2_, y2_ = box2[:, 0], box2[:, 1], box2[:, 2], box2[:, 3]inter_x1 = torch.max(x1, x1_)inter_y1 = torch.max(y1, y1_)inter_x2 = torch.min(x2, x2_)inter_y2 = torch.min(y2, y2_)inter_area = torch.max(inter_x2 - inter_x1, torch.tensor(0.0)) * torch.max(inter_y2 - inter_y1, torch.tensor(0.0))box1_area = (x2 - x1) * (y2 - y1)box2_area = (x2_ - x1_) * (y2_ - y1_)union_area = box1_area + box2_area - inter_areaiou = inter_area / union_area# 计算中心点的欧氏距离center_x1 = (x1 + x2) / 2center_y1 = (y1 + y2) / 2center_x2 = (x1_ + x2_) / 2center_y2 = (y1_ + y2_) / 2center_distance = (center_x1 - center_x2) ** 2 + (center_y1 - center_y2) ** 2diagonal_distance = (x2 - x1) ** 2 + (y2 - y1) ** 2 + (x2_ - x1_) ** 2 + (y2_ - y1_) ** 2diou = iou - center_distance / diagonal_distancereturn diou

总结

在本篇文章中,我们深入探讨了YOLOv8的改进方案,主要集中在以下几个方面:

  1. 卷积操作的优化:通过引入深度可分离卷积和组卷积,减少了参数数量和计算复杂度,从而提高了模型的推理速度和效率,同时保持了较高的精度。

  2. Neck和检测头的改进:我们通过集成PANet(路径聚合网络)来优化YOLOv8的Neck结构,使得多尺度特征融合更加高效,提升了网络对不同尺度目标的检测能力。同时,针对检测头,改进了损失函数,使用焦点损失帮助模型更好地处理类别不平衡问题。

  3. 自适应卷积与动态特征选择:自适应卷积使网络能够根据输入特征动态调整卷积核,提升了特征提取的灵活性和表达能力。而动态特征选择通过结合注意力机制,使得网络能够根据不同场景灵活选择关键特征,提高了检测的准确性。

  4. 多尺度训练与自监督学习:通过引入多尺度训练,YOLOv8能够适应不同尺寸的目标,增强了网络的尺度适应能力。同时,自监督学习任务被引入模型,以增强特征的泛化能力和理解上下文信息的能力,进一步提升了目标检测精度。

  5. 增强型损失函数与后处理优化:使用改进的损失函数(如CIoU损失)优化了边界框回归,提升了小物体检测精度。而后处理部分通过引入Soft-NMS和DIoU-NMS优化了检测框的筛选,减少了误抑制和漏检问题,尤其在密集目标检测中表现尤为突出。

这些改进共同推动了YOLOv8在检测精度和速度方面的提升,特别是在复杂场景和多尺度目标的检测中,能够更好地应对现实世界中的挑战。通过不断优化网络结构、损失函数以及后处理方法,YOLOv8展现了强大的目标检测能力,适用于更广泛的应用场景,如自动驾驶、视频监控等领域。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙-验证码输入框的几种实现方式-上

文章目录 效果图、优缺点多TextInput多 TextCanvas 绘制 多个 TextInput 拼接放置四个输入框焦点移动输入时向后移动输入完成回调删除时向前移动 防止点击总结 最近在做应用鸿蒙化&#xff0c;说白了就是把原来Android、iOS的代码重新用ArkTS写一遍&#xff0c;我负责基础建设和…

谈谈对线程的认识

面对这样的一个多核CPU时代, 实现并发编程是刚需. 多进程实现并发编程, 效果是特别理想的. 但是, 多线程编程模型有一个明显的缺点, 就是进程太重了, 效率不高. 创建一个进程, 消耗时间比较多. 销毁一个进程, 消耗时间也比较多. 调度一个进程, 消耗时间也比较多. 这里的时…

MySQL的数据类型

4. 数据类型 4.1 数据类型分类4.2 数值类型4.2.1 tinyint类型4.2.2 bit类型4.2.3 小数类型4.2.3.1 float4.2.3.2 decimal 4.3 字符串类型4.3.1 char4.3.2 varchar4.3.3 char和varchar比较 4.4 日期和时间类型enum和set 4.1 数据类型分类 4.2 数值类型 4.2.1 tinyint类型 数值越…

回不去的乌托邦

回不去的乌托邦 坐在电脑面前愣神间已至深夜&#xff0c;依然睡意不起。 相比于带着疲惫入睡&#xff0c;伏案发呆更令人惬意。想起最近在自媒体上看到的一句话“最顶级的享受变成了回不去的乌托邦”。 “这是兄弟们最后一次逛校园了&#xff0c;我拍个照”。我的记忆力总是用在…

分布式与集群,二者区别是什么?

??分布式 分布式系统是由多个独立的计算机节点组成的系统&#xff0c;这些节点通过网络协作完成任务。每个节点都有自己的独立计算能力和存储能力&#xff0c;可以独立运行。分布式系统的目标是提高系统的可靠性、可扩展性和性能。 分布式服务包含的技术和理论 负载均衡&am…

<02.21>八股文

JAVA基础 次数少了用解释性 次数多了用编译性(JIT) 操作系统

logging-operator 部署fluentd-bit日志报kubernetes链接错误

一、背景&#xff1a; 某项目使用logging-operator部署fluentd-bit进行日志采集&#xff0c;发现启动的fluentd-bit有大量的的链接kubernetes报错。 二、排查过程 1、排查fluentd容器到kubernetes api server的联通性&#xff0c;进入容器中curl kubernetes.default.svc.local:…

Redis数据结构-String字符串

1.String字符串 字符串类型是Redis中最基础的数据结构&#xff0c;关于数据结构与要特别注意的是&#xff1a;首先Redis中所有的键的类型都是字符串类型&#xff0c;而且其他集中数据结构也都是在字符串类似基础上进行构建&#xff0c;例如列表和集合的元素类型是字符串类型&a…

基于Django的购物商城平台的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统购物管理采取了人工的管理方法&#xff0c;但这种管理方法存…

Unity结合Vuforia虚拟按键实现AR机械仿真动画效果

零、最终效果 待上传 一、资源准备 1、Vuforia Vuforia版本不能高于10.17.4&#xff08;往上的版本虚拟按键功能被删除&#xff09; 2、Unity Unity版本必须要高于2022.3.x&#xff0c;不然使用Vuforia插件时会出现bug 二、主要内容 1、添加虚拟按钮 2、为虚拟按钮设置…

MATLAB在投资组合优化中的应用:从基础理论到实践

引言 投资组合优化是现代金融理论中的核心问题之一&#xff0c;旨在通过合理配置资产&#xff0c;实现风险与收益的最佳平衡。MATLAB凭借其强大的数学计算能力和丰富的金融工具箱&#xff0c;成为投资组合优化的理想工具。本文将详细介绍如何使用MATLAB进行投资组合优化&#…

Day15-后端Web实战-登录认证——会话技术JWT令牌过滤器拦截器

目录 登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令牌技术 2.3 JWT令牌2.3.1 介绍2.3.2 生成和校…

【实战篇】【深度介绍 DeepSeek R1 本地/私有化部署大模型常见问题及解决方案】

引言 大家好&#xff01;今天我们来聊聊 DeepSeek R1 的本地/私有化部署大模型。如果你正在考虑或者已经开始了这个项目&#xff0c;那么这篇文章就是为你准备的。我们会详细探讨常见问题及其解决方案&#xff0c;帮助你更好地理解和解决在部署过程中可能遇到的挑战。准备好了…

大模型本地部署及本地知识库构建

1、引言 随着AI技术的快速发展和普及&#xff0c;越来越多的LLM开始开源&#xff0c;若想在本地尝试部署大模型和搭建知识库&#xff0c;可以使用ollamaLLMscherry Studio nomic-embed-text的框架来实现&#xff0c;以便于对AI简单应用流程的整体了解。本地部署和知识库的搭建…

在 Ansys Motion 中创建链式伸缩臂的分步指南

介绍 链传动在负载和/或运动要远距离传递的机器中非常多产&#xff0c;例如&#xff0c;在两个平行轴之间。链条驱动系统的设计需要了解载荷传递和运动学如何影响链条张力、轴轴承中的悬臂载荷、轴应力和运动质量等。使用 Ansys Motion&#xff0c;可以轻松回答上述所有问题以…

blender笔记2

一、物体贴地 物体->变换->对齐物体 ->对齐弹窗(对齐模式&#xff1a;反方&#xff0c;相对于&#xff1a;场景原点&#xff0c;对齐&#xff1a;z)。 之后可以设置原点->原点--3d游标 二、面上有阴影 在编辑模式下操作过后&#xff0c;物体面有阴影。 数据-&g…

SPRING10_SPRING的生命周期流程图

经过前面使用三大后置处理器BeanPostProcessor、BeanFactoryPostProcessor、InitializingBean对创建Bean流程中的干扰,梳理出SPRING的生命周期流程图如下

光子集成电路加速边缘AI推理:突破传统NPU的能效比极限

引言&#xff1a;边缘计算的能耗困局 某领先自动驾驶公司采用128核光子张量处理器后&#xff0c;激光雷达点云处理能效比达458TOPS/W&#xff0c;是传统车规级GPU方案的57倍。在16线束LiDAR实时语义分割任务中&#xff0c;光子矩阵乘法单元将特征提取延迟从8.3ms降至0.12ms&am…

【EndNote】WPS 导入EndNote 21

写在前面&#xff1a;有没有人有激活码&#xff0c;跪求&#xff01; EndNote&#xff0c;在文献管理和文献引用方面很好用。写文章的时候&#xff0c;使用EndNote引入需要的文献会很方便。我目前用的WPS&#xff0c;想把EndNote的CWYW&#xff08;Cite While You Write&#…