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

【YOLO(txt)格式转VOC(xml)格式数据集】以及【制作VOC格式数据集 】

1.txt—>xml转化代码

如果我们手里只有YOLO标签的数据集,我们要进行VOC格式数据集的制作首先要进行标签的转化,以下是标签转化的脚本。
其中picPath为图片所在文件夹路径;
txtPath为你的YOLO标签对应的txt文件所在路径;
xmlPath为要生成的xml的路径;
同时将脚本中的类别信息换成你自己的。

from xml.dom.minidom import Document
import os
import cv2# def makexml(txtPath, xmlPath, picPath):  # txt所在文件夹路径,xml文件保存路径,图片所在文件夹路径
def makexml(picPath, txtPath, xmlPath):  # txt所在文件夹路径,xml文件保存路径,图片所在文件夹路径"""此函数用于将yolo格式txt标注文件转换为voc格式xml标注文件在自己的标注图片文件夹下建三个子文件夹,分别命名为picture、txt、xml"""# names: ['-1', 'bearing', 'bolt', 'flange', 'gear', 'nut', 'retaining_ring', 'spring', 'washer']dic = {'0': "Double hexagonal column",  # 创建字典用来对类型进行转换'1': "Flange nut",  # 此处的字典要与自己的classes.txt文件中的类对应,且顺序要一致'2': "Hexagon nut",'3': "Hexagon pillar",'4': "Hexagon screw",'5': "Hexagonal steel columnc",'6': "Hexagonal steel column",'7': "Keybar",'8': 'Plastic cushion pillar','9': 'Rectangular nut','10': 'Round head screw','11': 'Spring washer','12': 'T-shaped screw',}files = os.listdir(txtPath)for i, name in enumerate(files):print(f"�� [{i + 1}/{len(files)}] 正在处理:{name}")xmlBuilder = Document()annotation = xmlBuilder.createElement("annotation")  # 创建annotation标签xmlBuilder.appendChild(annotation)txtFile = open(txtPath + name)txtList = txtFile.readlines()# img = cv2.imread(picPath + name[0:-4] + ".jpg")# 自动尝试读取 .jpg, .png, .jpeg 图像img = Noneimg_extensions = [".jpg", ".png", ".jpeg"]for ext in img_extensions:img_path = os.path.join(picPath, name[0:-4] + ext)if os.path.exists(img_path):img = cv2.imread(img_path)if img is not None:break# 如果图片读取失败,则跳过该文件if img is None:print(f"❌ 无法读取图片:{name[0:-4]}(支持格式:.jpg/.png/.jpeg),跳过")continueelse:print(f"✅ 成功读取图片:{name[0:-4]}")Pheight, Pwidth, Pdepth = img.shapefolder = xmlBuilder.createElement("folder")  # folder标签foldercontent = xmlBuilder.createTextNode("driving_annotation_dataset")folder.appendChild(foldercontent)annotation.appendChild(folder)  # folder标签结束filename = xmlBuilder.createElement("filename")  # filename标签filenamecontent = xmlBuilder.createTextNode(name[0:-4] + ".jpg")filename.appendChild(filenamecontent)annotation.appendChild(filename)  # filename标签结束size = xmlBuilder.createElement("size")  # size标签width = xmlBuilder.createElement("width")  # size子标签widthwidthcontent = xmlBuilder.createTextNode(str(Pwidth))width.appendChild(widthcontent)size.appendChild(width)  # size子标签width结束height = xmlBuilder.createElement("height")  # size子标签heightheightcontent = xmlBuilder.createTextNode(str(Pheight))height.appendChild(heightcontent)size.appendChild(height)  # size子标签height结束depth = xmlBuilder.createElement("depth")  # size子标签depthdepthcontent = xmlBuilder.createTextNode(str(Pdepth))depth.appendChild(depthcontent)size.appendChild(depth)  # size子标签depth结束annotation.appendChild(size)  # size标签结束for j in txtList:oneline = j.strip().split(" ")object = xmlBuilder.createElement("object")  # object 标签picname = xmlBuilder.createElement("name")  # name标签namecontent = xmlBuilder.createTextNode(dic[oneline[0]])picname.appendChild(namecontent)object.appendChild(picname)  # name标签结束pose = xmlBuilder.createElement("pose")  # pose标签posecontent = xmlBuilder.createTextNode("Unspecified")pose.appendChild(posecontent)object.appendChild(pose)  # pose标签结束truncated = xmlBuilder.createElement("truncated")  # truncated标签truncatedContent = xmlBuilder.createTextNode("0")truncated.appendChild(truncatedContent)object.appendChild(truncated)  # truncated标签结束difficult = xmlBuilder.createElement("difficult")  # difficult标签difficultcontent = xmlBuilder.createTextNode("0")difficult.appendChild(difficultcontent)object.appendChild(difficult)  # difficult标签结束bndbox = xmlBuilder.createElement("bndbox")  # bndbox标签xmin = xmlBuilder.createElement("xmin")  # xmin标签mathData = int(((float(oneline[1])) * Pwidth + 1) - (float(oneline[3])) * 0.5 * Pwidth)xminContent = xmlBuilder.createTextNode(str(mathData))xmin.appendChild(xminContent)bndbox.appendChild(xmin)  # xmin标签结束ymin = xmlBuilder.createElement("ymin")  # ymin标签mathData = int(((float(oneline[2])) * Pheight + 1) - (float(oneline[4])) * 0.5 * Pheight)yminContent = xmlBuilder.createTextNode(str(mathData))ymin.appendChild(yminContent)bndbox.appendChild(ymin)  # ymin标签结束xmax = xmlBuilder.createElement("xmax")  # xmax标签mathData = int(((float(oneline[1])) * Pwidth + 1) + (float(oneline[3])) * 0.5 * Pwidth)xmaxContent = xmlBuilder.createTextNode(str(mathData))xmax.appendChild(xmaxContent)bndbox.appendChild(xmax)  # xmax标签结束ymax = xmlBuilder.createElement("ymax")  # ymax标签mathData = int(((float(oneline[2])) * Pheight + 1) + (float(oneline[4])) * 0.5 * Pheight)ymaxContent = xmlBuilder.createTextNode(str(mathData))ymax.appendChild(ymaxContent)bndbox.appendChild(ymax)  # ymax标签结束object.appendChild(bndbox)  # bndbox标签结束annotation.appendChild(object)  # object标签结束f = open(xmlPath + name[0:-4] + ".xml", 'w')xmlBuilder.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')f.close()print(f"✅ 已保存 XML 文件:{name[0:-4]}.xml\n")if __name__ == "__main__":picPath = "/home/yu/wz/duibi/retinanet-pytorch-master/VOCdeckit/VOC2007/JPEGImages/"  # 图片所在文件夹路径,后面的/一定要带上txtPath = "/home/yu/wz/duibi/retinanet-pytorch-master/VOCdeckit/VOC2007/YOLO/"  # txt所在文件夹路径,后面的/一定要带上xmlPath = "/home/yu/wz/duibi/retinanet-pytorch-master/VOCdeckit/VOC2007/Annotations/"  # xml文件保存路径,后面的/一定要带上makexml(picPath, txtPath, xmlPath)

2.VOC格式数据集处理

VOC格式数据集文件夹存放格式:
ImageSets里面等会是通过脚本生成的,前期只需要整理Annotation和JPEGImages
开始时候:在这里插入图片描述

import os
import random
import xml.etree.ElementTree as ETimport numpy as npfrom utils.utils import get_classes#--------------------------------------------------------------------------------------------------------------------------------#
#   annotation_mode用于指定该文件运行时计算的内容
#   annotation_mode为0代表整个标签处理过程,包括获得VOCdevkit/VOC2007/ImageSets里面的txt以及训练用的2007_train.txt、2007_val.txt
#   annotation_mode为1代表获得VOCdevkit/VOC2007/ImageSets里面的txt
#   annotation_mode为2代表获得训练用的2007_train.txt、2007_val.txt
#--------------------------------------------------------------------------------------------------------------------------------#
annotation_mode     = 0
#-------------------------------------------------------------------#
#   必须要修改,用于生成2007_train.txt、2007_val.txt的目标信息
#   与训练和预测所用的classes_path一致即可
#   如果生成的2007_train.txt里面没有目标信息
#   那么就是因为classes没有设定正确
#   仅在annotation_mode为0和2的时候有效
#-------------------------------------------------------------------#
classes_path        = 'model_data/voc_classes.txt'
#--------------------------------------------------------------------------------------------------------------------------------#
#   trainval_percent用于指定(训练集+验证集)与测试集的比例,默认情况下 (训练集+验证集):测试集 = 9:1
#   train_percent用于指定(训练集+验证集)中训练集与验证集的比例,默认情况下 训练集:验证集 = 9:1
#   仅在annotation_mode为0和1的时候有效
#--------------------------------------------------------------------------------------------------------------------------------#
trainval_percent    = 1.0
train_percent       = 0.8
#-------------------------------------------------------#
#   指向VOC数据集所在的文件夹
#   默认指向根目录下的VOC数据集
#-------------------------------------------------------#
VOCdevkit_path  = 'VOCdevkit'VOCdevkit_sets  = [('2007', 'train'), ('2007', 'val')]
classes, _      = get_classes(classes_path)#-------------------------------------------------------#
#   统计目标数量
#-------------------------------------------------------#
photo_nums  = np.zeros(len(VOCdevkit_sets))
nums        = np.zeros(len(classes))
def convert_annotation(year, image_id, list_file):in_file = open(os.path.join(VOCdevkit_path, 'VOC%s/Annotations/%s.xml'%(year, image_id)), encoding='utf-8')tree=ET.parse(in_file)root = tree.getroot()for obj in root.iter('object'):difficult = 0 if obj.find('difficult')!=None:difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult)==1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (int(float(xmlbox.find('xmin').text)), int(float(xmlbox.find('ymin').text)), int(float(xmlbox.find('xmax').text)), int(float(xmlbox.find('ymax').text)))list_file.write(" " + ",".join([str(a) for a in b]) + ',' + str(cls_id))nums[classes.index(cls)] = nums[classes.index(cls)] + 1if __name__ == "__main__":random.seed(0)if " " in os.path.abspath(VOCdevkit_path):raise ValueError("数据集存放的文件夹路径与图片名称中不可以存在空格,否则会影响正常的模型训练,请注意修改。")if annotation_mode == 0 or annotation_mode == 1:print("Generate txt in ImageSets.")xmlfilepath     = os.path.join(VOCdevkit_path, 'VOC2007/Annotations')saveBasePath    = os.path.join(VOCdevkit_path, 'VOC2007/ImageSets/Main')temp_xml        = os.listdir(xmlfilepath)total_xml       = []for xml in temp_xml:if xml.endswith(".xml"):total_xml.append(xml)num     = len(total_xml)  list    = range(num)  tv      = int(num*trainval_percent)  tr      = int(tv*train_percent)  trainval= random.sample(list,tv)  train   = random.sample(trainval,tr)  print("train and val size",tv)print("train size",tr)ftrainval   = open(os.path.join(saveBasePath,'trainval.txt'), 'w')  ftest       = open(os.path.join(saveBasePath,'test.txt'), 'w')  ftrain      = open(os.path.join(saveBasePath,'train.txt'), 'w')  fval        = open(os.path.join(saveBasePath,'val.txt'), 'w')  for i in list:  name=total_xml[i][:-4]+'\n'  if i in trainval:  ftrainval.write(name)  if i in train:  ftrain.write(name)  else:  fval.write(name)  else:  ftest.write(name)  ftrainval.close()  ftrain.close()  fval.close()  ftest.close()print("Generate txt in ImageSets done.")if annotation_mode == 0 or annotation_mode == 2:print("Generate 2007_train.txt and 2007_val.txt for train.")type_index = 0for year, image_set in VOCdevkit_sets:image_ids = open(os.path.join(VOCdevkit_path, 'VOC%s/ImageSets/Main/%s.txt'%(year, image_set)), encoding='utf-8').read().strip().split()list_file = open('%s_%s.txt'%(year, image_set), 'w', encoding='utf-8')for image_id in image_ids:list_file.write('%s/VOC%s/JPEGImages/%s.jpg'%(os.path.abspath(VOCdevkit_path), year, image_id))convert_annotation(year, image_id, list_file)list_file.write('\n')photo_nums[type_index] = len(image_ids)type_index += 1list_file.close()print("Generate 2007_train.txt and 2007_val.txt for train done.")def printTable(List1, List2):for i in range(len(List1[0])):print("|", end=' ')for j in range(len(List1)):print(List1[j][i].rjust(int(List2[j])), end=' ')print("|", end=' ')print()str_nums = [str(int(x)) for x in nums]tableData = [classes, str_nums]colWidths = [0]*len(tableData)len1 = 0for i in range(len(tableData)):for j in range(len(tableData[i])):if len(tableData[i][j]) > colWidths[i]:colWidths[i] = len(tableData[i][j])printTable(tableData, colWidths)if photo_nums[0] <= 500:print("训练集数量小于500,属于较小的数据量,请注意设置较大的训练世代(Epoch)以满足足够的梯度下降次数(Step)。")if np.sum(nums) == 0:print("在数据集中并未获得任何目标,请注意修改classes_path对应自己的数据集,并且保证标签名字正确,否则训练将会没有任何效果!")print("在数据集中并未获得任何目标,请注意修改classes_path对应自己的数据集,并且保证标签名字正确,否则训练将会没有任何效果!")print("在数据集中并未获得任何目标,请注意修改classes_path对应自己的数据集,并且保证标签名字正确,否则训练将会没有任何效果!")print("(重要的事情说三遍)。")

修改代码中的:
在这里插入图片描述
voc_classes.txt存放自己的标签:
在这里插入图片描述
运行脚本最后生成:
在这里插入图片描述
控制台输出每个类别的信息则运行成功,
在这里插入图片描述
同时项目的根目录下生成:

在这里插入图片描述
打开这两个文件夹看一下是否包含自己的数据集信息:
在这里插入图片描述
至此,我们的数据集就制作完毕!

相关文章:

【YOLO(txt)格式转VOC(xml)格式数据集】以及【制作VOC格式数据集 】

1.txt—>xml转化代码 如果我们手里只有YOLO标签的数据集&#xff0c;我们要进行VOC格式数据集的制作首先要进行标签的转化&#xff0c;以下是标签转化的脚本。 其中picPath为图片所在文件夹路径&#xff1b; txtPath为你的YOLO标签对应的txt文件所在路径&#xff1b; xmlPa…...

【信息系统项目管理师】第8章:项目整合管理 - 39个经典题目及详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...

“Cloud Native English“云原生时代下的微服务架构设计:从理论到实战全解析

前引 &#xff1a;技术演进与架构变革的必然性 在数字经济高速发展的今天&#xff0c;软件系统的复杂度呈指数级增长。传统单体架构已无法满足高并发、弹性扩展和快速迭代的需求。根据Gartner预测&#xff0c;到2026年全球75%的企业将完成微服务架构改造。本文将深入探讨云原生…...

自由学习记录(61)

使用了 #pragma multi_compile_fwdbase 这条编译指令启用了 Unity 内部用于主光源阴影支持的一组关键词变体&#xff0c;如&#xff1a; SHADOWS_SCREEN&#xff08;屏幕空间阴影贴图&#xff09; SHADOWS_DEPTH&#xff08;深度图阴影&#xff09; SHADOWS_SOFT&#xff08…...

深入了解linux系统—— 基础IO(下)

前言 在基础IO&#xff08;上&#xff09;中&#xff0c;我们了解了文件相关的系统调用&#xff1b;以及文件描述符是什么&#xff0c;和操作系统是如何将被打开的文件管理起来的。 本篇文章来继续学习文件相关的知识 重定向 在了解重定向之前&#xff0c;我们先来看这样的…...

Flink Table SQL

Apache Flink 提供了强大的 Table API 和 SQL 接口&#xff0c;用于统一处理批数据和流数据。它们为开发者提供了类 SQL 的编程方式&#xff0c;简化了复杂的数据处理逻辑&#xff0c;并支持与外部系统集成。 &#x1f9e9; 一、Flink Table & SQL 核心概念 概念描述Table…...

【Git】基本操作

【简介】 Git是一种“版本控制器”&#xff0c; 可以用于记录每次的修改以及版本的迭代 其可以控制电脑上所有格式的文件&#xff0c;方便地查看文件的每个小修改版本都修改了什么内容&#xff0c;但前提条件是被管理的文件需要放在对应的git仓库&#xff08;又名“版本库”&…...

【八股战神篇】MySQL高频面试题

目录 专栏简介 一 什么是索引 延伸 1 索引的底层使用的是什么数据结构&#xff1f; 2 MySQL 索引分类有哪些&#xff1f; 3 什么字段适合创建索引&#xff1f; 4 索引失效的场景 5 什么是最左匹配原则&#xff1f; 二 为什么 InnoDB 存储引擎选用 B 树而不是 B 树呢&a…...

服务器防文件上传手写waf

一、waf的目录结构&#xff0c;根据自己目录情况进行修改 二、创建文件夹以及文件 sudo mkdir -p /www/server/waf-monitor sudo mkdir -p /www/server/waf-monitor/quarantine #创建文件夹 chmod 755 /www/server/waf-monitor #赋权cd /www/server/waf-monitor/touch waf-m…...

ElasticSearch-集群

本篇文章依据ElasticSearch权威指南进行实操和记录 1&#xff0c;空集群 即不包含任何节点的集群 集群大多数分为两类&#xff0c;主节点和数据节点 主节点 职责&#xff1a;主节点负责管理集群的状态&#xff0c;例如分配分片、添加和删除节点、监控节点故障等。它们不直接…...

Android开发——原生渲染方案实现 PDF 预览功能

Android开发——原生渲染方案实现 PDF 预览功能 1. 引言2. 原生渲染方案核心设计:从数据到视图3. 混合文档容器:ViewPager2 与适配器设计1. 引言 在移动应用开发中,PDF 预览是文档处理场景的核心需求之一。Android 生态提供了多元化的技术方案,从系统级简版预览到原生渲染…...

Java求职者面试:从Spring Boot到微服务的技术点解析

Java求职者面试&#xff1a;从Spring Boot到微服务的技术点解析 场景&#xff1a;互联网医疗-预约挂号系统 面试官&#xff1a; “小明&#xff0c;我们今天的场景是一个互联网医疗的预约挂号系统。我们需要支持高并发的用户预约操作&#xff0c;同时保证数据一致性和系统的高…...

操作系统听课笔记之进程的概念

引入新的概念,为什么不能叫程序 内存中进程Image实例: stack: 局部变量(函数弹出来没有了) data: 全局变量(共享) 静态变量 heap: malloc分配的内存 从数据结构和算法角度解决问题: 设计相应的数据结构和设计算法 数据结构: 进程PCB 算法:创建进程和进程通信各种操作在线内…...

【基于Spring Boot 的图书购买系统】深度讲解 用户注册的前后端交互,Mapper操作MySQL数据库进行用户持久化

引言 在现代Web应用中&#xff0c;用户注册功能是用户与应用交互的入口。一个高效、安全且用户友好的注册系统不仅能吸引用户&#xff0c;还能为后续功能&#xff08;如个性化服务&#xff09;奠定基础。本博客将通过一个实际案例&#xff0c;展示如何使用HTML、JavaScript、j…...

Spark,连接MySQL数据库,添加数据,读取数据

以下是使用 Spark/SparkSQL 连接 MySQL 数据库、添加数据和读取数据的完整示例&#xff08;需提前准备 MySQL 驱动包&#xff09;&#xff1a; 一、环境准备 1. 下载 MySQL 驱动 - 下载 mysql-connector-java-8.0.33.jar &#xff08;或对应版本&#xff09;&#xff0c;放…...

ubuntu的虚拟机上的网络图标没有了

非正常的关机导致虚拟机连接xshell连接不上&#xff0c;ping也ping不通。网络的图标也没有了。 记录一下解决步骤 1、重启服务 sudo systemctl restart NetworkManager 2、图标显示 sudo nmcli network off sudo nmcli network on 3、sudo dhclient ens33 //(网卡) …...

Linux系统:ext2文件系统的核心概念和结构

本节重点 块、块组、分区的引入块组的构成inode与inode Table路径解析与路径缓存机制目录与文件名在文件系统中的存储分区的初始化与挂载 一、ext2文件系统 1.1 “块”的引入 在前言部分我们说扇区是磁盘硬件的最小读写单位&#xff0c;通常为512字节&#xff0c;但是在操作…...

Python 装饰器详解

装饰器是 Python 中一种强大的语法特性&#xff0c;它允许在不修改原函数代码的情况下动态地扩展函数的功能。装饰器本质上是一个高阶函数&#xff0c;它接受一个函数作为参数并返回一个新的函数。 基本装饰器 1. 简单装饰器示例 def my_decorator(func):def wrapper():prin…...

Docker配置容器开机自启或服务重启后自启

要将一个 Docker 容器设置为开机自启&#xff0c;你可以使用 docker update 命令或配置 Docker 服务来实现。以下是两种常见的方法&#xff1a; 方法 1&#xff1a;使用 docker update 设置容器自动重启 使用 docker update 设置容器为开机自启 你可以使用以下命令&#xff0c…...

20250518 黎曼在三维空间中总结的一维二维的规律,推广到高维度合适吗?有没有人提出反对意见

黎曼在三维空间中总结的一维二维的规律&#xff0c;推广到高维度合适吗&#xff1f;有没有人提出反对意见 黎曼几何在数学物理中的广泛应用&#xff0c;尤其是在广义相对论和高维空间理论中&#xff0c;确实是建立在黎曼在三维空间中的推广基础上的。不过&#xff0c;这种推广…...

使用AI 生成PPT 最佳实践方案对比

文章大纲 一、专业AI生成工具(推荐新手)**1. 推荐工具详解****2. 操作流程优化****3. 优势与局限**二、代码生成方案(开发者推荐)**1. Python-pptx进阶用法****2. GitHub推荐**三、混合工作流(平衡效率与定制)**1. 工具链升级****2. 示例Markdown结构**四、网页转换方案(…...

【Docker】Docker Compose方式搭建分布式协调服务(Zookeeper)集群

开发分布式应用时,往往需要高度可靠的分布式协调,Apache ZooKeeper 致力于开发和维护开源服务器&#xff0c;以实现高度可靠的分布式协调。具体内容见zookeeper官网。现代应用往往使用云原生技术进行搭建,如何用Docker搭建Zookeeper集群,这里介绍使用Docker Compose方式搭建分布…...

R for Data Science(3)

R for Data Science以下是关于网页内容的详细笔记&#xff1a; 1. 章节概览 章节主题&#xff1a;数据转换&#xff08;Data Transformation&#xff09;核心内容&#xff1a;介绍如何使用 R 中的 dplyr 包进行数据转换&#xff0c;包括对数据框的行、列和组的操作&#xff0…...

深入浅出Hadoop:大数据时代的“瑞士军刀”

深入浅出Hadoop&#xff1a;大数据时代的“瑞士军刀” 在当今这个数据爆炸的时代&#xff0c;每天产生的数据量已经远超人类的想象。从社交媒体的互动到电商平台的交易记录&#xff0c;从物联网设备的实时监控到科学研究的实验数据&#xff0c;大数据已经成为推动各行各业变革…...

《Python星球日记》 第94天:走近自动化训练平台

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、自动化训练平台简介1. Kubeflow Pipelines2. TensorFlow Extended (TFX) 二…...

MetaMask安装及使用-使用水龙头获取测试币的坑?

常见的异常有&#xff1a; 1.unable to request drip, please try again later. 2.You must hold at least 1 LINK on Ethereum Mainnet to request native tokens. 3.The address provided does not have sufficient historical activity or balance on the Ethereum Mainne…...

软件架构之--论微服务的开发方法1

论微服务的开发方法1 摘要 2023年 2月,本人所在集团公司承接了长三角地区某省渔船图纸电子化审查系统项目开发,该项目旨在为长三角地区渔船建造设计院、以及渔船图纸审查机构提供一个便捷的渔船图纸电子化审查服务平台。在此项目中,我作为项目组成员参与项目的建设工作,并…...

SOLID 面对象设计的五大基本原则

SOLID 原则的价值 原则核心价值解决的问题SRP职责分离&#xff0c;提高内聚性代码臃肿、牵一发而动全身OCP通过扩展而非修改实现变化频繁修改现有代码导致的风险LSP确保子类行为的一致性继承滥用导致的系统不稳定ISP定制化接口&#xff0c;避免依赖冗余接口过大导致的实现负担…...

游戏引擎学习第293天:移动Familiars

回顾并为今天的内容定下基调 我们正在做一款完整的游戏&#xff0c;今天的重点是“移动模式”的正式化处理。目前虽然移动机制大致能运作&#xff0c;但写法相对粗糙&#xff0c;不够严谨&#xff0c;我们希望将其清理得更规范&#xff0c;更可靠一点。 目前脑逻辑&#xff0…...

《沙尘暴》观影记:当家庭成为人性的修罗场

起初点开《沙尘暴》&#xff0c;不过是想在碎片时间里寻个消遣&#xff0c;毕竟短剧的篇幅显得轻松无负担。未曾想&#xff0c;这看似简短的故事却如一场裹挟着砂砾的风暴&#xff0c;在心底掀起层层涟漪&#xff0c;让我忍不住在家庭教育、人性幽微处反复踱步沉思。 一、风暴眼…...

牛客网NC21989:牛牛学取余

牛客网NC21989:牛牛学取余 &#x1f4dd; 题目描述 ⏱️ 限制条件 时间限制&#xff1a;C/C/Rust/Pascal 1秒&#xff0c;其他语言2秒空间限制&#xff1a;C/C/Rust/Pascal 32 M&#xff0c;其他语言64 M输入范围&#xff1a;两个整数&#xff0c;在int范围内 &#x1f4e5;…...

王者荣耀游戏测试场景题

如何测试一个新英雄&#xff1a;方法论与实践维度 测试一个新英雄不仅仅是“打打打”&#xff0c;而是一套完整的测试流程&#xff0c;包括设计文档验证、功能验证、数值验证、性能验证、交互验证等。可以从以下多个角度展开&#xff1a; &#x1f50d; 1. 方法论维度 ✅ 测试…...

Spring Boot 与 RabbitMQ 的深度集成实践(二)

集成步骤详解 配置 RabbitMQ 连接信息 在 Spring Boot 项目中&#xff0c;通常在application.properties或application.yml文件中配置 RabbitMQ 的连接信息。以application.yml为例&#xff0c;配置如下&#xff1a; spring: rabbitmq: host: localhost port: 5672 usern…...

医疗信息系统安全防护体系的深度构建与理论实践融合

一、医疗数据访问系统的安全挑战与理论基础 1.1 系统架构安全需求分析 在医疗信息系统中&#xff0c;基于身份标识的信息查询功能通常采用分层架构设计&#xff0c;包括表现层、应用层和数据层。根据ISO/IEC 27001信息安全管理体系要求&#xff0c;此类系统需满足数据保密性…...

多模态大语言模型arxiv论文略读(八十)

## MMWorld: Towards Multi-discipline Multi-faceted World Model Evaluation in Videos ➡️ 论文标题&#xff1a;MMWorld: Towards Multi-discipline Multi-faceted World Model Evaluation in Videos ➡️ 论文作者&#xff1a;Xuehai He, Weixi Feng, Kaizhi Zheng, Yuji…...

FFmpeg:多媒体处理的终极利器

FFmpeg详细介绍 1. 定义与基本概述 FFmpeg是一套开源的跨平台多媒体处理工具集,最初由法国程序员Fabrice Bellard于2000年开发,其名称源自“Fast Forward MPEG”,体现了其高效处理MPEG格式的能力。它不仅是命令行工具,还包含多个库和开发套件,支持视频转码、剪辑、合并、…...

【Leetcode】取余/2的幂次方

给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回这个结果。 示例 1: 输入: num 38 输出: 2 解释: 各位相加的过程为&#xff1a; 38 --> 3 8 --> 11 11 --> 1 1 --> 2 由于 2 是一位数&#xff0c;所以返回 2。 …...

程序代码篇---ESP32的数据采集

文章目录 前言 前言 本文简单介绍了ESP32可以怎样采集数据。...

系统架构设计(十三):虚拟机体系结构风格

概念 虚拟机&#xff08;Virtual Machine&#xff09;体系结构风格&#xff0c;是指将整个系统抽象为一台“虚拟机”&#xff0c;通过解释或模拟的方式运行应用程序。 它本质上提供了一种“平台中立”的运行环境&#xff0c;典型代表就是 Java 虚拟机&#xff08;JVM&#xf…...

lvs-dr部署

实验准备&#xff1a; 准备4台设备&#xff0c;1台作为客户机&#xff0c;3台作为服务器&#xff0c;服务器中1台作为调度器&#xff0c;2台作为后端真实访问服务器。并关闭所有防火墙与核心防护。 systemctl stop firewalld setenforce 0 实验开始 调度器配置 yum -y ins…...

数据库blog2_数据结构与效率

&#x1f33f;计算机中的数据————存储结构与逻辑结构 &#x1f342;存储结构&#xff08;物理结构&#xff09; 定义&#xff1a;存储结构是指数据在计算机存储器中的实际存储方式&#xff0c;由计算机硬件特性决定。它涉及到数据的物理位置和存储顺序。存储结构直接影响数…...

聊天室项目总结

已实现的功能点&#xff1a; 存在的问题&#xff1a; 1.没有实现有含金量的创新功能点 2.太过于依赖工具&#xff0c;不喜欢自己看文章总结对知其然而不知其所以然&#xff0c;自己的理解比较少&#xff0c;懒于去思考 3.太过于依赖他人&#xff0c;自己的想法有点少&#x…...

数据结构:二叉树一文详解

数据结构:二叉树一文详解 前言一、二叉树的基本概念与结构特性1.1 二叉树的定义1.2 二叉树的特殊类型1.3 二叉树的性质 二、二叉树的遍历方式2.1 前序遍历&#xff08;Pre-order Traversal&#xff09;2.2 中序遍历&#xff08;In-order Traversal&#xff09;2.3 后序遍历&…...

2025年- H28-Lc136- 24.两两交换链表中的节点(链表)---java版

1.题目描述 2.思路 cur指针要先放在虚拟头节点&#xff0c;才能去操作第一个数和第二个数 先判断偶数个节点&#xff0c;再判断奇数个节点&#xff0c;否则会犯空指针异常。 &#xff08;1&#xff09;如果节点是偶数个节点&#xff0c;只要满足curr.nextnull&#xff0c;就说…...

ubuntu18.04通过cuda_11.3_xxx.run安装失败,电脑黑屏解决办法

项目场景&#xff1a; ubuntu18.04跑DG-SLAM相关代码&#xff0c;安装lietorch包报错&#xff0c;需要用到GPU。 问题描述 跑代码需要cuda11.3&#xff0c;系统里面有另外一个版本&#xff0c;运行cuda_11.3_xxx.run&#xff0c;同时也选择了driver&#xff0c;安装成功后&am…...

Linux之基础IO

目录 一、理解 "文件" 1.1、狭义理解 1.2、广义理解 1.3、文件操作的归类认知 1.4、系统角度 二、回顾C语言接口 2.1、打开文件 2.2、写文件 2.3、读文件 2.4、stdin & stdout & stderr 2.6、打开文件的方式 三、系统文件I/O 3.1、一种传递标志…...

上位机知识篇---涂鸦智能云平台

文章目录 前言 前言 本文简单介绍了涂鸦智能云平台。...

InfluxDB 3 Core + Java 11 + Spring Boot:打造高效物联网数据平台

一、 引言&#xff1a;为什么选择InfluxDB 3&#xff1f; 项目背景&#xff1a; 在我们的隧道风机监控系统中&#xff0c;实时数据的采集、存储和高效查询是至关重要的核心需求。风机运行产生的振动、倾角、电流、温度等参数是典型的时序数据&#xff0c;具有高并发写入、数据…...

Kubernetes控制平面组件:Kubelet详解(七):容器网络接口 CNI

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

Pandas 构建并评价聚类模型② 第六章

构建并评价聚类模型 构建并评价聚类模型一、数据读取与准备&#xff08;代码6 - 6部分&#xff09;结果代码解析 二、Kmeans聚类&#xff08;代码6 - 6部分&#xff09;结果代码解析 三、数据降维可视化&#xff08;代码6 - 6部分&#xff09;结果代码解析 四、FMI评价&#xf…...