当前位置: 首页 > news >正文

【完整源码+数据集+部署教程】交通工具图像分割系统: yolov8-seg-C2f-RFCAConv

背景意义

研究背景与意义

随着城市化进程的加快,交通工具的种类和数量不断增加,交通管理和安全问题日益突出。传统的交通监控手段往往依赖于人工观察和简单的图像处理技术,难以满足现代交通管理对实时性和准确性的高要求。因此,基于计算机视觉的交通工具图像分割技术应运而生,成为解决这一问题的重要手段。YOLO(You Only Look Once)系列模型因其高效的实时检测能力和良好的精度,广泛应用于交通监控、智能驾驶等领域。YOLOv8作为该系列的最新版本,具备更强的特征提取能力和更高的处理速度,为交通工具的自动识别和分割提供了新的可能性。

本研究旨在基于改进的YOLOv8模型,构建一个高效的交通工具图像分割系统。该系统将能够准确识别和分割多种交通工具,包括自行车、公交车、轿车、摩托车等,共计14类不同的交通工具。这一系统的开发不仅能够提升交通监控的智能化水平,还将为城市交通管理提供数据支持,帮助决策者制定更为科学的交通政策。

在数据集方面,本研究采用了包含3300张图像的soban数据集,涵盖了多种交通工具的实例分割任务。该数据集的多样性和丰富性为模型的训练和测试提供了坚实的基础。通过对不同类别交通工具的图像进行标注和分割,研究者能够更好地理解各类交通工具在不同场景下的特征,从而提升模型的识别能力和准确性。此外,数据集中包含的多种交通工具类别,能够有效提升模型的泛化能力,使其在实际应用中表现出色。

研究的意义不仅体现在技术层面,更在于其对社会的广泛影响。随着智能交通系统的不断发展,交通工具图像分割技术将为自动驾驶、交通流量监测、事故分析等领域提供强有力的支持。通过准确识别和分割交通工具,相关部门能够实时监控交通状况,及时处理交通事故,提升道路安全性。同时,研究成果还将为交通管理系统的智能化升级提供技术保障,推动智慧城市的建设。

综上所述,基于改进YOLOv8的交通工具图像分割系统的研究,具有重要的理论价值和实际应用意义。通过深入探索该领域的前沿技术,研究者不仅能够推动计算机视觉技术的发展,还能为解决现实交通问题提供切实可行的方案。这一研究将为未来的交通管理和智能交通系统的构建奠定基础,具有广泛的社会效益和经济价值。

图片效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数据集信息

数据集信息展示

在本研究中,我们使用了名为“soban”的数据集,以支持对YOLOv8-seg模型在交通工具图像分割任务中的改进和优化。该数据集专门设计用于涵盖多种交通工具及相关对象,具有丰富的多样性和复杂性,能够有效地为模型提供训练和验证所需的样本。soban数据集包含14个类别,涵盖了从常见的交通工具到特定的交通标志,旨在提高模型在实际应用中的表现。

soban数据集的类别包括:自行车(bicycle)、公交车(bus)、小汽车(car)、牛(cow)、狗(dog)、大象(elephant)、摩托车(motorcycle)、物体(object)、人(person)、停车标志(stop sign)、三轮车(three wheeler)、拖拉机(tractor)、卡车(truck)和厢式货车(van)。这些类别的选择不仅反映了交通环境中的多样性,也考虑到了不同物体在图像分割任务中的重要性。例如,自行车和摩托车作为轻型交通工具,常常在城市交通中出现,而公交车和卡车则代表了公共交通和货物运输的主要形式。通过对这些类别的细致划分,soban数据集能够为YOLOv8-seg模型提供更为全面的训练数据,进而提升其在实际场景中的识别和分割能力。

在数据集的构建过程中,soban不仅注重图像的质量和多样性,还特别关注图像的标注精度。每个类别的图像都经过严格的标注,以确保模型在训练过程中能够学习到准确的特征。这种高质量的标注对于图像分割任务尤为重要,因为模型需要在复杂的背景中准确识别并分割出目标物体。通过使用soban数据集,YOLOv8-seg模型能够更好地理解不同类别之间的特征差异,从而提高其分割精度。

此外,soban数据集还考虑到了不同环境和光照条件下的图像采集。数据集中包含了在不同天气、时间和地点拍摄的图像,确保模型在面对多变的实际应用场景时,能够保持较高的鲁棒性。这种多样化的训练数据不仅增强了模型的泛化能力,也为其在复杂场景中的应用奠定了基础。

在本研究中,我们将利用soban数据集对YOLOv8-seg模型进行训练和测试,期望通过不断优化模型参数和结构,提升其在交通工具图像分割任务中的表现。通过对数据集的深入分析和利用,我们相信soban将为模型的改进提供强有力的支持,使其在未来的实际应用中能够更好地服务于智能交通系统的发展。总之,soban数据集的多样性、准确性和全面性,使其成为本研究中不可或缺的重要组成部分,为YOLOv8-seg模型的改进提供了坚实的基础。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

核心代码

以下是经过简化和详细注释的核心代码部分:

import torch
import torch.nn as nn

def select_candidates_in_gts(xy_centers, gt_bboxes, eps=1e-9):
“”"
选择在真实框(gt)中的正锚点中心。

参数:xy_centers (Tensor): 形状为(h*w, 2)的张量,表示锚点的中心坐标。gt_bboxes (Tensor): 形状为(b, n_boxes, 4)的张量,表示真实框的坐标。返回:(Tensor): 形状为(b, n_boxes, h*w)的张量,表示每个真实框中锚点的选择情况。
"""
n_anchors = xy_centers.shape[0]  # 锚点数量
bs, n_boxes, _ = gt_bboxes.shape  # 批次大小和真实框数量
lt, rb = gt_bboxes.view(-1, 1, 4).chunk(2, 2)  # 将真实框分为左上角和右下角
bbox_deltas = torch.cat((xy_centers[None] - lt, rb - xy_centers[None]), dim=2).view(bs, n_boxes, n_anchors, -1)
return bbox_deltas.amin(3).gt_(eps)  # 返回每个锚点是否在真实框内的布尔值

class TaskAlignedAssigner(nn.Module):
“”"
任务对齐分配器,用于目标检测。

属性:topk (int): 考虑的前k个候选框数量。num_classes (int): 目标类别数量。alpha (float): 分类组件的超参数。beta (float): 定位组件的超参数。eps (float): 防止除零的小值。
"""def __init__(self, topk=13, num_classes=80, alpha=1.0, beta=6.0, eps=1e-9):"""初始化任务对齐分配器对象,设置超参数。"""super().__init__()self.topk = topkself.num_classes = num_classesself.bg_idx = num_classes  # 背景索引self.alpha = alphaself.beta = betaself.eps = eps@torch.no_grad()
def forward(self, pd_scores, pd_bboxes, anc_points, gt_labels, gt_bboxes, mask_gt):"""计算任务对齐分配。参数:pd_scores (Tensor): 形状为(bs, num_total_anchors, num_classes)的张量,表示预测的分数。pd_bboxes (Tensor): 形状为(bs, num_total_anchors, 4)的张量,表示预测的边界框。anc_points (Tensor): 形状为(num_total_anchors, 2)的张量,表示锚点坐标。gt_labels (Tensor): 形状为(bs, n_max_boxes, 1)的张量,表示真实框的标签。gt_bboxes (Tensor): 形状为(bs, n_max_boxes, 4)的张量,表示真实框的坐标。mask_gt (Tensor): 形状为(bs, n_max_boxes, 1)的张量,表示真实框的掩码。返回:target_labels (Tensor): 形状为(bs, num_total_anchors)的张量,表示目标标签。target_bboxes (Tensor): 形状为(bs, num_total_anchors, 4)的张量,表示目标边界框。target_scores (Tensor): 形状为(bs, num_total_anchors, num_classes)的张量,表示目标分数。fg_mask (Tensor): 形状为(bs, num_total_anchors)的布尔张量,表示前景锚点。target_gt_idx (Tensor): 形状为(bs, num_total_anchors)的张量,表示目标真实框索引。"""self.bs = pd_scores.size(0)  # 批次大小self.n_max_boxes = gt_bboxes.size(1)  # 最大真实框数量if self.n_max_boxes == 0:  # 如果没有真实框device = gt_bboxes.devicereturn (torch.full_like(pd_scores[..., 0], self.bg_idx).to(device), torch.zeros_like(pd_bboxes).to(device),torch.zeros_like(pd_scores).to(device), torch.zeros_like(pd_scores[..., 0]).to(device),torch.zeros_like(pd_scores[..., 0]).to(device))# 获取正锚点掩码和对齐度量mask_pos, align_metric, overlaps = self.get_pos_mask(pd_scores, pd_bboxes, gt_labels, gt_bboxes, anc_points, mask_gt)# 选择重叠度最高的真实框target_gt_idx, fg_mask, mask_pos = select_highest_overlaps(mask_pos, overlaps, self.n_max_boxes)# 获取目标标签、边界框和分数target_labels, target_bboxes, target_scores = self.get_targets(gt_labels, gt_bboxes, target_gt_idx, fg_mask)# 归一化对齐度量align_metric *= mask_pospos_align_metrics = align_metric.amax(dim=-1, keepdim=True)  # 计算正样本的最大对齐度量pos_overlaps = (overlaps * mask_pos).amax(dim=-1, keepdim=True)  # 计算正样本的最大重叠度norm_align_metric = (align_metric * pos_overlaps / (pos_align_metrics + self.eps)).amax(-2).unsqueeze(-1)target_scores = target_scores * norm_align_metric  # 更新目标分数return target_labels, target_bboxes, target_scores, fg_mask.bool(), target_gt_idxdef get_pos_mask(self, pd_scores, pd_bboxes, gt_labels, gt_bboxes, anc_points, mask_gt):"""获取正锚点掩码。"""mask_in_gts = select_candidates_in_gts(anc_points, gt_bboxes)  # 获取在真实框内的锚点掩码align_metric, overlaps = self.get_box_metrics(pd_scores, pd_bboxes, gt_labels, gt_bboxes, mask_in_gts * mask_gt)  # 计算对齐度量和重叠度mask_topk = self.select_topk_candidates(align_metric, topk_mask=mask_gt.expand(-1, -1, self.topk).bool())  # 选择前k个候选mask_pos = mask_topk * mask_in_gts * mask_gt  # 合并掩码return mask_pos, align_metric, overlapsdef get_box_metrics(self, pd_scores, pd_bboxes, gt_labels, gt_bboxes, mask_gt):"""计算给定预测和真实边界框的对齐度量。"""na = pd_bboxes.shape[-2]  # 锚点数量mask_gt = mask_gt.bool()  # 转换为布尔类型overlaps = torch.zeros([self.bs, self.n_max_boxes, na], dtype=pd_bboxes.dtype, device=pd_bboxes.device)  # 初始化重叠度张量bbox_scores = torch.zeros([self.bs, self.n_max_boxes, na], dtype=pd_scores.dtype, device=pd_scores.device)  # 初始化边界框分数张量ind = torch.zeros([2, self.bs, self.n_max_boxes], dtype=torch.long)  # 创建索引张量ind[0] = torch.arange(end=self.bs).view(-1, 1).expand(-1, self.n_max_boxes)  # 批次索引ind[1] = gt_labels.squeeze(-1)  # 真实框标签索引bbox_scores[mask_gt] = pd_scores[ind[0], :, ind[1]][mask_gt]  # 获取每个锚点的分数# 计算重叠度pd_boxes = pd_bboxes.unsqueeze(1).expand(-1, self.n_max_boxes, -1, -1)[mask_gt]  # 扩展预测边界框gt_boxes = gt_bboxes.unsqueeze(2).expand(-1, -1, na, -1)[mask_gt]  # 扩展真实边界框overlaps[mask_gt] = bbox_iou(gt_boxes, pd_boxes, xywh=False, CIoU=True).squeeze(-1).clamp_(0)  # 计算IoUalign_metric = bbox_scores.pow(self.alpha) * overlaps.pow(self.beta)  # 计算对齐度量return align_metric, overlapsdef get_targets(self, gt_labels, gt_bboxes, target_gt_idx, fg_mask):"""计算正锚点的目标标签、目标边界框和目标分数。参数:gt_labels (Tensor): 真实框标签。gt_bboxes (Tensor): 真实框边界框。target_gt_idx (Tensor): 正锚点的真实框索引。fg_mask (Tensor): 前景掩码。返回:(Tuple[Tensor, Tensor, Tensor]): 包含目标标签、目标边界框和目标分数的元组。"""batch_ind = torch.arange(end=self.bs, dtype=torch.int64, device=gt_labels.device)[..., None]target_gt_idx = target_gt_idx + batch_ind * self.n_max_boxes  # 计算目标真实框索引target_labels = gt_labels.long().flatten()[target_gt_idx]  # 获取目标标签target_bboxes = gt_bboxes.view(-1, 4)[target_gt_idx]  # 获取目标边界框target_labels.clamp_(0)  # 限制标签范围# 计算目标分数target_scores = torch.zeros((target_labels.shape[0], target_labels.shape[1], self.num_classes),dtype=torch.int64,device=target_labels.device)  # 初始化目标分数张量target_scores.scatter_(2, target_labels.unsqueeze(-1), 1)  # 使用scatter填充目标分数fg_scores_mask = fg_mask[:, :, None].repeat(1, 1, self.num_classes)  # 扩展前景掩码target_scores = torch.where(fg_scores_mask > 0, target_scores, 0)  # 仅保留前景分数return target_labels, target_bboxes, target_scores

代码说明:
选择正锚点:select_candidates_in_gts 函数用于确定哪些锚点位于真实框内。
任务对齐分配器:TaskAlignedAssigner 类实现了目标检测中的锚点与真实框的分配逻辑。
前向传播:forward 方法执行分配过程,计算目标标签、边界框和分数。
对齐度量:通过 get_box_metrics 方法计算预测边界框与真实框之间的对齐度量。
目标生成:get_targets 方法生成最终的目标标签、边界框和分数。
这个程序文件 ultralytics/utils/tal.py 是用于目标检测的一个模块,主要实现了任务对齐分配器(TaskAlignedAssigner),该分配器用于将真实框(ground truth,gt)对象分配给锚框(anchors),以便进行目标检测模型的训练。以下是对文件中主要功能和结构的详细说明。

首先,文件导入了必要的库,包括 PyTorch 和一些自定义的模块。check_version 用于检查 PyTorch 的版本,bbox_iou 和 wasserstein_loss 是用于计算边界框的交并比和 Wasserstein 损失的函数。

接下来,定义了一个函数 select_candidates_in_gts,该函数用于选择在真实框内的正锚框中心。它接收锚框中心和真实框的坐标,并返回一个布尔张量,指示哪些锚框中心位于真实框内。

然后是 select_highest_overlaps 函数,该函数用于处理锚框与多个真实框的重叠情况。如果一个锚框被分配给多个真实框,它将选择与其重叠度最高的真实框。

TaskAlignedAssigner 类是这个模块的核心,继承自 nn.Module。它的构造函数接受一些超参数,如考虑的顶级候选框数量、类别数量、分类和定位的权重参数等。该类的 forward 方法实现了任务对齐的分配逻辑,输入包括预测的分数、边界框、锚点、真实标签和真实框等。它首先检查是否有真实框,如果没有,则返回背景索引和零张量。接着,它调用 get_pos_mask 方法来获取正锚框的掩码、对齐度量和重叠度量。

get_pos_mask 方法用于获取在真实框内的锚框掩码,并计算对齐度量和重叠度量。get_box_metrics 方法则用于计算给定预测和真实边界框的对齐度量。select_topk_candidates 方法用于根据度量选择前 K 个候选框。

最后,get_targets 方法计算正锚框的目标标签、目标边界框和目标分数。它通过索引和条件掩码来生成最终的目标输出。

此外,文件还定义了一些辅助函数,如 make_anchors 用于从特征生成锚框,dist2bbox 和 bbox2dist 用于在边界框和距离表示之间进行转换。

总体而言,这个模块实现了一个复杂的目标检测锚框分配机制,结合了分类和定位信息,以提高模型的训练效果。

12.系统整体结构(节选)
程序整体功能和架构概括
Ultralytics YOLO项目是一个用于目标检测的深度学习框架,主要实现了YOLO系列模型。该项目的整体架构分为多个模块,涵盖了模型定义、数据处理、训练和测试等功能。每个模块都有其特定的职责,协同工作以实现高效的目标检测。

模型模块(如ultralytics\nn)负责定义和实现YOLO模型的结构和功能。
数据处理模块(如ultralytics\data)用于图像的标注、预处理和数据增强。
工具模块(如ultralytics\utils)提供了各种辅助功能,如任务对齐分配器、损失计算等。
测试模块(如ultralytics\nn\extra_modules\ops_dcnv3\test.py)用于验证模型的功能和性能。
通过这些模块的协作,Ultralytics YOLO能够实现高效的目标检测,支持多种任务(如分类、检测和分割),并提供了灵活的接口供用户使用和扩展。

文件功能整理表
文件路径 功能描述
ultralytics\nn_init_.py 初始化YOLO模型包,导入核心模型类和函数,定义公共接口。
ultralytics\nn\extra_modules\ops_dcnv3\test.py 测试DCNv3(Deformable Convolutional Networks v3)的前向和反向传播,验证计算结果的一致性和性能。
ultralytics\data\annotator.py 自动标注图像,结合YOLO和SAM模型进行目标检测和分割,并将结果保存为文本文件。
ultralytics\models\utils_init_.py 初始化模型工具包,可能包含其他工具模块的导入(具体内容未提供)。
ultralytics\utils\tal.py 实现任务对齐分配器(TaskAlignedAssigner),用于将真实框分配给锚框,支持目标检测模型的训练。
这个表格概述了每个文件的主要功能,帮助理解Ultralytics YOLO项目的整体结构和各个模块的职责。

13.图片、视频、摄像头图像分割Demo(去除WebUI)代码
在这个博客小节中,我们将讨论如何在不使用WebUI的情况下,实现图像分割模型的使用。本项目代码已经优化整合,方便用户将分割功能嵌入自己的项目中。 核心功能包括图片、视频、摄像头图像的分割,ROI区域的轮廓提取、类别分类、周长计算、面积计算、圆度计算以及颜色提取等。 这些功能提供了良好的二次开发基础。

核心代码解读
以下是主要代码片段,我们会为每一块代码进行详细的批注解释:

import random
import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image
from hashlib import md5
from model import Web_Detector
from chinese_name_list import Label_list

根据名称生成颜色

def generate_color_based_on_name(name):

计算多边形面积

def calculate_polygon_area(points):
return cv2.contourArea(points.astype(np.float32))

绘制中文标签

def draw_with_chinese(image, text, position, font_size=20, color=(255, 0, 0)):
image_pil = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(image_pil)
font = ImageFont.truetype(“simsun.ttc”, font_size, encoding=“unic”)
draw.text(position, text, font=font, fill=color)
return cv2.cvtColor(np.array(image_pil), cv2.COLOR_RGB2BGR)

动态调整参数

def adjust_parameter(image_size, base_size=1000):
max_size = max(image_size)
return max_size / base_size

绘制检测结果

def draw_detections(image, info, alpha=0.2):
name, bbox, conf, cls_id, mask = info[‘class_name’], info[‘bbox’], info[‘score’], info[‘class_id’], info[‘mask’]
adjust_param = adjust_parameter(image.shape[:2])
spacing = int(20 * adjust_param)

if mask is None:x1, y1, x2, y2 = bboxaim_frame_area = (x2 - x1) * (y2 - y1)cv2.rectangle(image, (x1, y1), (x2, y2), color=(0, 0, 255), thickness=int(3 * adjust_param))image = draw_with_chinese(image, name, (x1, y1 - int(30 * adjust_param)), font_size=int(35 * adjust_param))y_offset = int(50 * adjust_param)  # 类别名称上方绘制,其下方留出空间
else:mask_points = np.concatenate(mask)aim_frame_area = calculate_polygon_area(mask_points)mask_color = generate_color_based_on_name(name)try:overlay = image.copy()cv2.fillPoly(overlay, [mask_points.astype(np.int32)], mask_color)image = cv2.addWeighted(overlay, 0.3, image, 0.7, 0)cv2.drawContours(image, [mask_points.astype(np.int32)], -1, (0, 0, 255), thickness=int(8 * adjust_param))# 计算面积、周长、圆度area = cv2.contourArea(mask_points.astype(np.int32))perimeter = cv2.arcLength(mask_points.astype(np.int32), True)......# 计算色彩mask = np.zeros(image.shape[:2], dtype=np.uint8)cv2.drawContours(mask, [mask_points.astype(np.int32)], -1, 255, -1)color_points = cv2.findNonZero(mask)......# 绘制类别名称x, y = np.min(mask_points, axis=0).astype(int)image = draw_with_chinese(image, name, (x, y - int(30 * adjust_param)), font_size=int(35 * adjust_param))y_offset = int(50 * adjust_param)# 绘制面积、周长、圆度和色彩值metrics = [("Area", area), ("Perimeter", perimeter), ("Circularity", circularity), ("Color", color_str)]for idx, (metric_name, metric_value) in enumerate(metrics):......return image, aim_frame_area

处理每帧图像

def process_frame(model, image):
pre_img = model.preprocess(image)
pred = model.predict(pre_img)
det = pred[0] if det is not None and len(det)
if det:
det_info = model.postprocess(pred)
for info in det_info:
image, _ = draw_detections(image, info)
return image

if name == “main”:
cls_name = Label_list
model = Web_Detector()
model.load_model(“./weights/yolov8s-seg.pt”)

# 摄像头实时处理
cap = cv2.VideoCapture(0)
while cap.isOpened():ret, frame = cap.read()if not ret:break......# 图片处理
image_path = './icon/OIP.jpg'
image = cv2.imread(image_path)
if image is not None:processed_image = process_frame(model, image)......# 视频处理
video_path = ''  # 输入视频的路径
cap = cv2.VideoCapture(video_path)
while cap.isOpened():ret, frame = cap.read()......

源码文件

在这里插入图片描述

源码获取

欢迎大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式


文章转载自:

http://rkFwzYLO.bzrwz.cn
http://wXnxTXtD.bzrwz.cn
http://Zv9OvWDZ.bzrwz.cn
http://YRqHKLUU.bzrwz.cn
http://BG7ajqCZ.bzrwz.cn
http://0T4RztIN.bzrwz.cn
http://Kx8WppFs.bzrwz.cn
http://c4CF7YUS.bzrwz.cn
http://MfTmuN6L.bzrwz.cn
http://uOQ5I5Pv.bzrwz.cn
http://rov6hSYP.bzrwz.cn
http://8ZKECoAR.bzrwz.cn
http://wF0QZyDc.bzrwz.cn
http://Tm8QAU4C.bzrwz.cn
http://UyAR5FWJ.bzrwz.cn
http://IbtMBPCb.bzrwz.cn
http://k97PcIuO.bzrwz.cn
http://R10rkO5F.bzrwz.cn
http://Ysaru7VA.bzrwz.cn
http://dpoQNl5W.bzrwz.cn
http://xl3YcnLT.bzrwz.cn
http://OyoxxuFx.bzrwz.cn
http://uJZtz6yz.bzrwz.cn
http://GbpM87AD.bzrwz.cn
http://17UGSBMR.bzrwz.cn
http://7SwCvwFx.bzrwz.cn
http://gqeng9CF.bzrwz.cn
http://3ncqfwSF.bzrwz.cn
http://8H6TOja7.bzrwz.cn
http://Sa0s6Kqt.bzrwz.cn
http://www.dtcms.com/a/381664.html

相关文章:

  • uniapp 混合mixins和继承extends详解
  • 【Lua】Windows 下编写 C 扩展模块:VS 编译与 Lua 调用全流程
  • 004 Rust控制台打印输出
  • idea自动编译,idea不重启项目,加载修改的内容
  • 阻塞 IO为什么叫BIO,非阻塞IO为什么叫NIO,异步IO为什么叫AIO
  • 少即是多:从 MPTCP 看优化干预的边界
  • 2025服贸会“海淀之夜”,点亮“科技”与“服务”底色
  • String留言板
  • js生成excel表格进阶版
  • Win 11 ARM 版搭建ESP-IDF环境问题记录
  • MyBatis主键返回:必须显式配置
  • MySQL——MVCC实现原理流程分析
  • Linux -- 基于TCP服务器实现一个简单的电商网站
  • 佳维视工业一体机 vs 普通电脑:工业场景选哪个?
  • 小迪安全v2023学习笔记(八十二讲)—— Java组件安全SolrShiroLog4jCVE复现
  • Spring AI(四)机构化输出
  • 单体到微服务拆分方案
  • 云端服务器使用指南:如何跨机传输较大文件(通过windows自带工具远程桌面连接 非常方便)
  • Linux 高性能 I/O 事件通知机制的核心系统调用—— `epoll_ctl`
  • 域格YM310 X09移芯CAT1模组HTTPS连接服务器
  • 连续随机变量无法用点概率描述出现了概率密度函数(Probability Density Function, PDF)
  • Go语言实战案例 — 工具开发篇:Go 实现条形码识别器
  • 洛谷-P1923 【深基9.例4】求第 k 小的数-普及-
  • DeerFlow实践:华为ITR流程的评审智能体设计
  • K均值聚类(K-Means)算法介绍及示例
  • 【企业架构】TOGAF-4A架构概览
  • 华为防火墙三层部署模式
  • Linux Kernel Core API:printk
  • 空间信息与数字技术专业主要学什么技能?
  • 遗传算法模型深度解析与实战应用