深入解析yolov5,为什么算法都是基于yolov5做改进的?(一)

article/2025/8/15 1:25:49

在这里插入图片描述

YOLOv5简介

YOLOv5是一种单阶段目标检测算法,它在YOLOv4的基础上引入了多项改进,显著提升了检测的速度和精度。YOLOv5的设计哲学是简洁高效,它有四个版本:YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,分别对应不同的模型大小和性能。
YOLOv5的四个版本(s,m,l,x)——YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,它们之间的主要区别在于模型的深度和宽度,即模型的复杂度和性能。下面是各个版本的具体区别:
在这里插入图片描述可以看到每个模型对应的大小速度检测性能都有差距

YOLOv5s

  • 尺寸和速度:YOLOv5s是四个版本中尺寸最小、速度最快的模型。它适用于需要快速推理且对模型大小有限制的应用场景,如移动设备或嵌入式系统。
  • 特征图宽度和深度:相比于其他版本,YOLOv5s的输入特征图的宽度和网络的深度都较小。

YOLOv5m

  • 中等性能:YOLOv5m在模型大小和性能之间取得平衡,比YOLOv5s稍大且稍慢,但比YOLOv5l和YOLOv5x小和快。
  • 适用场景:适合于大多数常规目标检测任务,是一个比较通用的选择。

YOLOv5l

  • 更大尺寸和更强性能:YOLOv5l比YOLOv5s和YOLOv5m更大,拥有更多的参数,因此在目标检测任务上通常能提供更高的准确率。
  • 计算资源需求:由于模型更大,因此对计算资源的需求也更高,适合于服务器或云端应用,其中对延迟不太敏感。

YOLOv5x

  • 最大尺寸和最佳性能:YOLOv5x是四个版本中最庞大、最强大的模型,提供最高的准确率。
  • 应用场景:适用于对检测精度要求极高的场景,如一些研究项目或对性能有极致追求的商业应用。
  • 资源消耗:由于模型的复杂性,YOLOv5x对硬件的要求最高,通常只在具有强大计算能力的环境下使用。

共同特点

在这里插入图片描述

尽管这四个版本在尺寸和性能上有所不同,但它们都保持了YOLO系列的核心架构和特性,如单阶段检测流程、端到端的训练方式等。此外,它们都可以通过修改配置文件来适应不同的应用需求,具有很高的灵活性。

1.YOLOv5网络结构

YOLOv5的网络结构可以分为四个主要部分:输入端、Backbone、Neck和Head。
在这里插入图片描述

2.1 输入端

输入端是模型处理图像数据的第一步,YOLOv5在此阶段采用了几种关键技术来提升模型性能:

Mosaic数据增强

  • 目的:增强模型对不同尺度、不同角度目标的识别能力,提升模型泛化性。
  • 方法:随机选择四张图片,将它们缩放到不同尺度后,按照一定比例放置在一张大图中的四个角落,形成一张增强图像。
  • 效果:模拟了多尺度目标检测,增加了模型训练时的数据多样性。
    在这里插入图片描述

在这里插入图片描述

自适应锚框计算

  • 目的:为不同的数据集自动计算合适的锚框尺寸,提高检测框预测的准确性。
  • 方法:利用数据集中所有目标的宽和高的统计信息,通过k-means聚类算法计算出一组合适的锚框尺寸。
  • 优势:避免了手动调整锚框尺寸,使模型更适应具体应用的数据集。
    在这里插入图片描述

自适应图片缩放

  • 目的:在测试时减少不必要的计算,提高推理速度。
  • 方法:根据原始图像尺寸和网络输入尺寸计算缩放比例,对图像进行缩放,并在必要时填充边缘以保持网络输入尺寸的一致性。
  • 应用:在模型推理时使用,训练时仍然使用固定的输入尺寸。
    在这里插入图片描述

2.2 Backbone

Backbone是模型中用于特征提取的主要网络结构,YOLOv5的Backbone设计注重效率和性能:
在这里插入图片描述

Focus结构

这里详细讲一下Focus结构,Focus结构是YOLOv5中的一个创新点,它用于在模型的早期阶段有效地进行特征图的下采样,同时增加网络的通道数,以保留更多的图像信息。Focus结构的设计理念是在不增加计算量的前提下,通过特定的操作来提升特征的表达能力。

Focus结构的作用
  1. 减少计算量:通过特定的切片操作,Focus结构能够在不丢失关键信息的情况下,实现对输入图像的下采样。
  2. 增加通道数:在下采样的同时,Focus结构将输入图像的通道数增加,这样做可以在后续的网络结构中提供更丰富的特征表示。
    在这里插入图片描述
Focus结构的工作原理

Focus结构的工作原理可以分解为以下几个步骤:

  1. 切片操作:将输入图像按通道进行切片,每隔一个通道取一个通道的值。例如,对于一个具有3个通道的输入图像,如果按照顺序排列通道值为[C1, C2, C3],则切片后得到的通道值为[C1, 0, C3],其中0代表未使用的通道位置。

  2. 拼接操作:将切片后得到的图像按通道方向拼接起来。例如,如果原始图像是320x320x3,经过切片操作后,图像变为160x320x6,因为每个通道的像素点数减半,而通道数翻倍。

  3. 卷积操作:对拼接后的图像进行卷积操作,通常是一个1x1的卷积,用于混洗和整合特征,最终得到下采样的特征图,尺寸通常是输入图像的一半,但通道数保持不变或有所增加。

Focus结构的优势
  • 计算效率:相比于直接进行卷积操作,Focus结构通过切片和拼接的方式减少了计算量。
  • 信息保留:尽管进行了下采样,但由于切片操作的特性,图像的关键视觉信息得以保留。
  • 特征增强:增加的通道数为后续网络结构提供了更丰富的特征表示,有助于提升检测性能。
Focus结构的实现

在YOLOv5的早期版本中,Focus结构是作为一个独立的模块实现的。但在后续的版本中,为了提高计算效率,特别是考虑到某些硬件对大卷积核的支持更好,Focus结构被一个6x6的卷积层所替代。这个6x6的卷积层在计算上等同于Focus结构的切片和拼接操作,但可能更适合某些GPU硬件的优化。

Focus结构是YOLOv5中的一个创新点,它体现了设计者在保持模型性能的同时对计算效率的重视。通过这种方式,YOLOv5能够在资源受限的设备上实现高效的目标检测。
在这里插入图片描述

代码示例

在YOLOv5的早期版本中,Focus结构作为一个独立的模块被实现。以下是一个简化版的Focus结构的代码示例,它展示了如何通过切片和拼接操作来实现通道数的增加和特征图的下采样:

import torch
import torch.nn as nnclass Focus(nn.Module):def __init__(self, c1, c2):  # c1为输入的通道数,c2为输出的通道数super(Focus, self).__init__()self.conv = nn.Conv2d(c1 * 4, c2, 3, 2, 1)  # 卷积操作,输出通道为c2,步长为2实现下采样def forward(self, x):# 假设输入特征图的尺寸为 [N, C, H, W],其中 C = c1# 切片操作:将C个通道分为4组,每组有C//4个通道# 通过reshape改变维度,使用view操作重新排列通道x = x.view(x.size(0), x.size(1) // 2, 2, x.size(2), x.size(3))x = x.permute(0, 1, 3, 2, 4).contiguous()  # 调整维度顺序,然后进行拼接x = x.view(x.size(0), x.size(1) * 2, x.size(2), x.size(3))  # 拼接后的特征图# 通过卷积层实现特征融合,并进行下采样return self.conv(x)# 假设输入的特征图尺寸为 [N, 3, 320, 320]
focus = Focus(c1=3, c2=12)
input_tensor = torch.randn(1, 3, 320, 320)  # 随机生成一个输入特征图
output_tensor = focus(input_tensor)  # 通过Focus结构print("Output shape:", output_tensor.shape)  # 输出特征图的尺寸

在这个代码示例中,Focus 类首先将输入特征图的通道数减半,并将其分为两部分,然后通过viewpermute操作重新排列这些通道,实现切片和拼接的效果。最后,通过一个卷积层进一步融合特征并进行空间维度的下采样。

CSP结构

  • CSP1_X:在Backbone中使用,通过共享权重减少计算量。
  • CSP2_X:在Neck中使用,结合CSP结构和Focus结构的优点,进一步减少计算量并保持特征表达能力。
  • CSPNet(Cross Stage Partial Network)是一种用于计算机视觉任务,尤其是在目标检测领域中的网络结构优化技术。CSPNet的核心思想是在网络的多个阶段中共享权重,以此来减少计算量和参数数量,同时保持或提升模型的性能。
    在这里插入图片描述

CSPNet的主要特点:

  1. 权重共享:在网络的多个阶段(stage)中,CSPNet通过共享卷积层的权重来减少模型的参数量。

  2. 计算量减少:由于权重共享,模型在训练和推理时的计算量会显著减少,这使得模型可以更快地训练和执行。

  3. 性能保持:尽管参数和计算量减少了,CSPNet通过精心设计的网络结构,仍然能够保持较高的性能。

  4. 灵活性:CSPNet可以很容易地集成到现有的网络架构中,如YOLO系列,以提高效率。

CSPNet的工作流程:

在这里插入图片描述

  1. 输入特征图:网络接收输入特征图,该特征图是从之前的网络层传递而来。

  2. 卷积操作:对输入特征图进行卷积操作,得到初步的输出特征图。

  3. 权重共享:将初步的输出特征图复制一份,并将复制的副本与原始输出特征图一起输入到下一个卷积层。在这个阶段,两个输入共享相同的卷积权重。

  4. 特征融合:通过共享权重的卷积层后,得到的特征图在通道维度上进行合并,形成最终的输出特征图。

  5. 输出:最终的输出特征图将传递到网络的下一个阶段,用于进一步的处理或作为检测任务的输入。

代码示例:

下面是一个简化版的CSP结构的代码示例,展示了如何在PyTorch中实现CSPNet的概念:

import torch
import torch.nn as nnclass CSPBlock(nn.Module):def __init__(self, c1, c2):super(CSPBlock, self).__init__()self.conv1 = nn.Conv2d(c1, c2, 1, 1, 0, bias=False)self.conv2 = nn.Conv2d(c1, c2, 1, 1, 0, bias=False)def forward(self, x):x1 = self.conv1(x)x2 = self.conv2(x)# 假设这里有一个额外的卷积层或网络分支# 例如: x2 = some_other_conv(x2)return torch.cat([x1, x2], dim=1)  # 在通道维度上合并特征图# 假设输入的特征图尺寸为 [N, C, H, W]
csp_block = CSPBlock(c1=64, c2=32)
input_tensor = torch.randn(1, 64, 56, 56)  # 随机生成一个输入特征图
output_tensor = csp_block(input_tensor)print("Output shape:", output_tensor.shape)  # 输出特征图的尺寸

在这个示例中,CSPBlock 类通过两次卷积操作生成两个特征图,然后将它们在通道维度上合并。这种方式减少了参数数量和计算量,同时保留了特征信息。

CSPNet通过减少模型的计算负担,使得在资源受限的设备上部署高效的深度学习模型成为可能,特别是在需要实时处理的场合,如自动驾驶和视频监控系统中的目标检测。

2.3 Neck

Neck是连接Backbone和Head的中间部分,负责特征的进一步融合和传递:
在这里插入图片描述

FPN+PAN结构

  • FPN (特征金字塔网络):通过自顶向下的路径传递高层的语义信息。
  • PAN (路径聚合网络):通过自底向上的路径传递低层的细节信息。
  • 结合:FPN和PAN的结合使用,构建了一个多层次、多尺度的特征融合框架,增强了模型对不同尺寸目标的检测能力。

CSP2结构

  • 应用:在Neck中采用CSP2结构,加强了特征融合的能力,同时保持了计算效率。

2.4 Head

Head是模型的最后一部分,负责生成最终的检测结果:

CIOU_Loss

  • 目的:作为bounding box的损失函数,比传统的IoU Loss更能准确衡量预测框和真实框之间的相似度。
  • 优势:CIOU_Loss考虑了重叠区域、中心点距离和宽高比,有助于生成更准确的预测框。
  • CIOU_Loss(Complete Intersection over Union Loss)是一种用于目标检测任务中bounding box预测的损失函数。CIOU_Loss不仅考虑了重叠区域(IoU),还考虑了中心点距离和宽高比,从而更全面地衡量预测框和真实框之间的相似度。
CIOU_Loss的计算方法

CIOU_Loss的计算包括以下几个部分:

  1. IoU(Intersection over Union):计算预测框和真实框的交集与并集的比值。

  2. 距离惩罚(Distance Penalty):计算预测框中心点与真实框中心点的欧氏距离。

  3. 宽高比惩罚(Aspect Ratio Penalty):计算预测框与真实框的宽高比的差的惩罚项。

  4. 最终的CIOU_Loss:将上述三部分结合,得到一个综合的损失值。

在这里插入图片描述

CIOU_Loss的代码示例

以下是使用PyTorch实现的CIOU_Loss的一个简化示例:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass CIOULoss(nn.Module):def __init__(self):super(CIOULoss, self).__init__()def forward(self, pred_boxes, true_boxes):# 计算IoUinter_area = self.compute_intersection(pred_boxes, true_boxes)union_area = self.compute_union(pred_boxes, true_boxes)iou = inter_area / union_area# 计算中心点距离rho2 = self.compute_center_distance(pred_boxes, true_boxes)# 计算宽高比惩罚v = self.compute_ar_inconsistency(pred_boxes, true_boxes)# 计算CIOU_Lossalpha = self.calculate_alpha(pred_boxes, true_boxes, v)loss = 1 - iou + (rho2 / alpha) + (v / (alpha ** 2))return loss.mean()def compute_intersection(self, pred_boxes, true_boxes):# 计算预测框和真实框的交集面积# pred_boxes, true_boxes的形状为 [N, 4],4表示(x1, y1, x2, y2)inter_top_left = torch.max(pred_boxes[:, None, :2], true_boxes[:, :2])inter_bot_right = torch.min(pred_boxes[:, None, 2:], true_boxes[:, 2:])inter_wh = torch.clamp(inter_bot_right - inter_top_left, min=0)inter_area = inter_wh[:, :, 0] * inter_wh[:, :, 1]return inter_areadef compute_union(self, pred_boxes, true_boxes):# 计算预测框和真实框的并集面积pred_areas = (pred_boxes[:, 2] - pred_boxes[:, 0]) * (pred_boxes[:, 3] - pred_boxes[:, 1])true_areas = (true_boxes[:, 2] - true_boxes[:, 0]) * (true_boxes[:, 3] - true_boxes[:, 1])union_area = pred_areas[:, None] + true_areas - self.compute_intersection(pred_boxes, true_boxes)return union_areadef compute_center_distance(self, pred_boxes, true_boxes):# 计算中心点距离的平方delta_x = pred_boxes[:, None, 0] - true_boxes[:, 0]delta_y = pred_boxes[:, None, 1] - true_boxes[:, 1]rho2 = delta_x ** 2 + delta_y ** 2return rho2def compute_ar_inconsistency(self, pred_boxes, true_boxes):# 计算宽高比不一致性pred_w = pred_boxes[:, 2] - pred_boxes[:, 0]pred_h = pred_boxes[:, 3] - pred_boxes[:, 1]true_w = true_boxes[:, 2] - true_boxes[:, 0]true_h = true_boxes[:, 3] - true_boxes[:, 1]v = (pred_w / pred_h - true_w / true_h) ** 2 * (4 - torch.abs(pred_w * pred_h / (true_w * true_h)))return vdef calculate_alpha(self, pred_boxes, true_boxes, v):# 使用高斯曲率函数计算alphaeps = 1e-7alpha = v / (4 - v + eps) + epsreturn alpha# 假设我们有5个预测框和真实框
pred_boxes = torch.tensor([[100, 150, 200, 200], [120, 160, 220, 210], [100, 100, 150, 150], [80, 120, 120, 160], [90, 130, 130, 170]])
true_boxes = torch.tensor([[150, 200, 250, 250], [140, 190, 240, 240], [120, 110, 170, 160], [100, 140, 150, 180], [80, 130, 120, 170]])ciouloss = CIOULoss()
loss = ciouloss(pred_boxes, true_boxes)
print(loss)

DIOU_nms

  • DIOU (距离交并比):一种改进的IoU,考虑了预测框和真实框之间的中心点距离。
  • nms (非极大值抑制):用于筛选重叠的预测框,保留最佳的检测结果。
  • 结合:DIOU_nms在非极大值抑制过程中考虑了中心点距离,提高了小目标和密集目标的检测性能。

通过这些精心设计的结构和技术,YOLOv5在目标检测任务中实现了高效和高精度的检测性能。

DIOU_nms(Distance Intersection over Union Non-Maximum Suppression)是一种改进的非极大值抑制(NMS)算法,它在传统的IoU(Intersection over Union)NMS的基础上增加了对预测框与真实框中心点距离的考量。DIOU_nms的目的是更精确地筛选出最佳的检测框,尤其是在处理重叠目标和相近目标时。

DIOU_nms的计算方法

DIOU_nms的计算包括以下步骤:

  1. 计算IoU:首先计算预测框与真实框之间的IoU值。

  2. 计算中心点距离:计算预测框中心点与真实框中心点之间的欧氏距离。

  3. 计算DIOU值:结合IoU值和中心点距离,计算预测框的DIOU值。DIOU值越小,表示预测框与真实框的匹配度越高。

  4. 非极大值抑制:根据DIOU值对预测框进行排序,并逐个比较,抑制掉重叠度高且DIOU值较大的预测框。

  5. 选择最佳预测框:保留DIOU值最小的预测框作为最终的检测结果。

DIOU_nms的示例代码

以下是使用PyTorch实现的DIOU_nms的一个简化示例:

import torchdef diou_nms(boxes, scores, iou_threshold):"""非极大值抑制,使用DIOU距离进行筛选boxes: 预测框的坐标,形状为 [N, 4],4表示(x1, y1, x2, y2)scores: 每个预测框的得分,形状为 [N]iou_threshold: 交并比阈值,当IoU大于该阈值时,认为预测框与真实框重叠"""# 将boxes转换为中心点坐标和宽高boxes_c = torch.cat([(boxes[:, :2] + boxes[:, 2:]) / 2, boxes[:, 2:] - boxes[:, :2]], 1)order = scores.argsort(descending=True)  # 根据得分排序keep = []  # 存储保留的预测框的索引while order.size(0) > 0:i = order[0]  # 选择得分最高的预测框keep.append(i)  # 将其加入保留列表# 计算与其他预测框的IoU和DIOU距离ious = torch.zeros(order.size(0))dious = torch.zeros(order.size(0))for j, k in enumerate(order[1:]):# 计算IoUiou = bbox_iou(boxes_c[i], boxes_c[k+1])ious[j] = iou# 计算DIOUdiou = bbox_diou(boxes_c[i], boxes_c[k+1])dious[j] = diou# 保留IoU小于阈值的预测框idxs = torch.where(ious < iou_threshold)[0] + 1order = order[idxs]return torch.tensor(keep)def bbox_iou(box1, box2):# 计算IoUinter_top_left = torch.max(box1[:2], box2[:2])inter_bot_right = torch.min(box1[2:], box2[2:])inter_wh = torch.clamp(inter_bot_right - inter_top_left, min=0)inter_area = inter_wh[0] * inter_wh[1]area1 = (box1[2] - box1[0]) * (box1[3] - box1[1])area2 = (box2[2] - box2[0]) * (box2[3] - box2[1])return inter_area / (area1 + area2 - inter_area)def bbox_diou(box1, box2):# 计算DIOUiou = bbox_iou(box1, box2)c1 = (box1[:2] + box1[2:]) / 2c2 = (box2[:2] + box2[2:]) / 2rho2 = (c1 - c2).norm() ** 2return iou - rho2 / ((box1[2] - box1[0]) * (box1[3] - box1[1]) + 1e-6)# 假设我们有5个预测框和相应的得分
boxes = torch.tensor([[100, 150, 200, 200], [120, 160, 220, 210], [100, 100, 150, 150], [80, 120, 120, 160], [90, 130, 130, 170]])
scores = torch.tensor([0.9, 0.8, 0.7, 0.6, 0.5])
iou_threshold = 0.5keep_indices = diou_nms(boxes, scores, iou_threshold)
print("Indices of kept boxes:", keep_indices)

在这个示例中,我们首先定义了diou_nms函数,它接受预测框、得分和IoU阈值作为输入,然后根据DIOU值进行非极大值抑制。我们还定义了辅助函数bbox_ioubbox_diou来计算IoU和DIOU值。

请注意,这个示例是一个简化的版本,仅用于演示DIOU_nms的基本计算方法。在实际应用中,DIOU_nms的实现可能会更加复杂,包括对输入格式的处理、边界条件的处理等。此外,为了提高效率,实际的实现可能会采用不同的方法来计算交并比和中心点距离。
在这里插入图片描述

3. YOLOv5实现细节(以下章节下一篇文章…)

YOLOv5的实现涉及到多个基础组件和实现细节,包括CBL模块、Res unit、CSP1_X、CSP2_X、Focus、SPP等。

3.1 基础组件

  • CBL:由Conv+BN+Leaky_relu激活函数组成。
  • Res unit:借鉴ResNet的残差结构,构建深层网络。
  • CSP1_X & CSP2_X:借鉴CSPNet,通过CBL和Res unit构建。

3.2 实现细节

  • Focus结构:通过slice操作裁剪输入图片,实现通道数的增加。
  • CSP结构:在Backbone和Neck中分别应用CSP1_X和CSP2_X结构。

4. YOLOv5训练策略

YOLOv5的训练策略包括多尺度训练、warmup预热、cosine学习率下降、EMA权重更新和混合精度训练。

5. YOLOv5性能分析

YOLOv5在COCO数据集上展现了优异的性能,不同版本的YOLOv5根据模型大小和速度需求,可以在AP指标和推理速度之间做出权衡。
在这里插入图片描述

6. YOLOv5改进方向

YOLOv5作为一个开放的算法框架,社区已经提出了多种改进方案,包括添加注意力机制、替换主干网络、改进损失函数和NMS算法等。

感谢看官老爷们看到这里,某Boss直…hr已读不会,可以看看这里

祝大家学习顺利~
如有任何错误,恳请批评指正~~
以上是我通过各种方式得出的经验和方法,欢迎大家评论区留言讨论呀,如果文章对你们产生了帮助,也欢迎点赞收藏,我会继续努力分享更多干货~


🎈关注我的公众号AI Sun可以获取Chatgpt最新发展报告以及腾讯字节等众多大厂面经
😎也欢迎大家和我交流,相互学习,提升技术,风里雨里,我在等你~


http://www.hkcw.cn/article/YlNBcwfUNT.shtml

相关文章

【数据结构】手撕AVL树(万字详解)

目录 AVL树的概念为啥要有AVL树&#xff1f;概念 AVL树节点的定义AVL树的插入AVL树的旋转左单旋右单旋左右双旋右左双旋 AVL树的查找AVL树的验证end AVL树的概念 为啥要有AVL树&#xff1f; 在上一章节的二叉搜索树中&#xff0c;我们在插入节点的操作中。有可能一直往一边插…

2024年信息素养大赛 C++小学组初赛 算法创意实践挑战赛 真题详细解析

2024年信息素养大赛初赛C真题解析 选择题&#xff08;共15题&#xff0c;每题5分&#xff0c;共75分&#xff09; 1、运行下列程序段&#xff0c;输出的结果是( ) int n572765; cout <<n/10%10; A、5 B、6 C、4 D、1 答案&#xff1a;B 考点分析&#xff1a;考察…

GPIO子系统层次与数据结构详解

往期内容 本专栏往期内容&#xff1a; Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析&#xff1a;imx_pinctrl_soc_info结构体Pinctrl子系统中c…

深度解析算法之模拟

39.替换所有的问号 题目链接 给你一个仅包含小写英文字母和 ? 字符的字符串 s&#xff0c;请你将所有的 ? 转换为若干小写字母&#xff0c;使最终的字符串不包含任何 连续重复 的字符。 注意&#xff1a;你 不能 修改非 ? 字符。 题目测试用例保证 除 ? 字符 之外&#…

《数据结构初阶》【顺序栈 + 链式队列 + 循环队列】

《数据结构初阶》【顺序栈 链式队列 循环队列】 前言&#xff1a;什么是栈&#xff1f;栈有哪些实现方式&#xff1f;我们要选择哪种实现方式&#xff1f;--------------------------------什么是队列&#xff1f;队列有哪些实现方式&#xff1f;我们要选择哪种实现方式&…

进阶数据结构: 二叉搜索树

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

DOA估计算法从原理到仿真——CBF、Capon、MUSIC算法

本人第一篇CSDN博客~欢迎关注&#xff01; DOA是指Direction Of Arrival&#xff0c;是利用电磁波信号来获取目标或信源相对天线阵列的角度信息的方式&#xff0c;也称测向、空间谱估计。主要应用于雷达、通信、电子对抗和侦察等领域。 一、阵列信号模型 如上图所示&#xff0…

算法效率的钥匙:从大O看复杂度计算

目录 1.数据结构与算法 1.1数据结构介绍 1.2算法介绍 2.算法效率 2.1复杂度 2.1.1时间复杂度 2.1.1.1时间复杂度计算示例1 2.1.1.2时间复杂度计算示例2 2.1.1.3时间复杂度计算示例3 2.1.1.4时间复杂度计算示例4 2.1.1.5时间复杂度计算示例5 2.1.1.6时间复杂度计算示例6…

A*算法详解【附算法代码与运行结果】

算法背景 A*算法是一种在图形平面上&#xff0c;有多个路径中寻找一条从起始点到目标点的最短遍历路径的算法。它属于启发式搜索算法&#xff08;Heuristic Search Algorithm&#xff09;&#xff0c;因为它使用启发式方法来计算图中的节点&#xff0c;从而减少实际计算的节点…

【leetcode】逐层探索:BFS求解最短路的原理与实践

前言 &#x1f31f;&#x1f31f;本期讲解关于力扣的几篇题解的详细介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…

七大排序算法深度解析:从原理到代码实现

1.排序 排序算法是计算机科学中最基础的技能之一&#xff0c;无论你是编程新手还是经验丰富的开发者&#xff0c;理解这些算法都能显著提升代码效率。本文将用最简单的方式&#xff0c;带你快速掌握七大经典排序算法的核心原理与实现。 1.1排序概念及其运用 排序是指将一组数据…

Python的情感词典情感分析和情绪计算

一.大连理工中文情感词典 情感分析 (Sentiment Analysis)和情绪分类 (Emotion Classification&#xff09;都是非常重要的文本挖掘手段。情感分析的基本流程如下图所示&#xff0c;通常包括&#xff1a; 自定义爬虫抓取文本信息&#xff1b;使用Jieba工具进行中文分词、词性标…

C++之vector类(超详细)

这节我们来学习一下&#xff0c;C中一个重要的工具——STL&#xff0c;这是C中自带的一个标准库&#xff0c;我们可以直接调用这个库中的函数或者容器&#xff0c;可以使效率大大提升。这节我们介绍STL中的vector。 文章目录 前言 一、标准库类型vector 二、vector的使用 2.…

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

&#x1f4da; 本文主要总结了一些常见的C面试题&#xff0c;主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能&#xff0c;掌握这些内容&#xff0c;基本上就满足C的岗位技能&#xff08;红色标记为重点内容&#xff09;&#xff0c;欢迎大家前来学习指正&…

『C++成长记』string模拟实现

🔥博客主页:小王又困了 📚系列专栏:C++ 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ ​ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.2析构函数 📒2.3拷贝构造 📒2.4赋值重载 三、容量操作 📒3.1获取有效字符长度…

多态的使用和原理(c++详解)

一、多态的概念 多态顾名思义就是多种形态&#xff0c;它分为编译时的多态&#xff08;静态多态&#xff09;和运行时的多态&#xff08;动态多态&#xff09;&#xff0c;编译时多态&#xff08;静态多态&#xff09;就是函数重载&#xff0c;模板等&#xff0c;通过不同的参数…

C++ 底层实现细节隐藏全攻略:从简单到复杂的五种模式

目录标题 1 引言&#xff1a;为什么要“隐藏实现”1.1 头文件暴露带来的三大痛点1.2 ABI 稳定 vs API 兼容&#xff1a;先分清概念1.3 选型三问法——评估你到底要不要隐藏 2 模式一&#xff1a;直接按值成员 —— “裸奔”也能跑2.1 典型写法与最小示例2.2 何时按值最合适&…

使用国内镜像网站在线下载安装Qt(解决官网慢的问题)——Qt

国内镜像网站 中国科学技术大学&#xff1a;http://mirrors.ustc.edu.cn/qtproject/清华大学&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/qt/北京理工大学&#xff1a;http://mirror.bit.edu.cn/qtproject/ 南京大学&#xff1a;https://mirror.nju.edu.cn/qt腾讯镜像&…

超全超详细!JDK 安装及环境配置(Java SE 8 保姆级教程)

一、JDK 简介 JDK&#xff08;Java Development Kit&#xff09;是用于开发 Java 程序的工具包&#xff0c;包括编译器 javac、Java 运行环境&#xff08;JRE&#xff09;以及各种开发工具。安装和配置 JDK 是学习和使用 Java 编程的第一步&#xff0c;以下是 Java 和 JDK 的具…

Java 大视界 -- 基于 Java 的大数据分布式数据库在社交网络数据存储与查询中的架构设计与性能优化(225)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…