目标检测:数据集划分 XML数据集转YOLO标签

文章目录

  • 1、前言:
  • 2、生成对应的类名
  • 3、xml转为yolo的label形式
  • 4、优化代码
  • 5、划分数据集
  • 6、画目录树
  • 7、目标检测系列文章

1、前言:

本文演示如何划分数据集,以及将VOC标注的xml数据转为YOLO标注的txt格式,且生成classes的txt文件。

# 本文演示的项目目录
E:
└──dataset├── images_package  # 存放图片文件夹│    ├── 000002.jpg│    ├── 000003.jpg│    ├── 000004.jpg│    ├── 000005.jpg│    ├── 000006.jpg│    ├── zebra_crossing_20180129-000545_362.jpg│    ├── zebra_crossing_20180129-000545_364.jpg│    ├── zebra_crossing_20180129-000545_366.jpg│    └── zebra_crossing_20180129-000645_368.jpg└── xml_outputs  # 存放图片对应的XML├── 000002.xml├── 000003.xml├── 000004.xml├── 000005.xml├── 000006.xml├── zebra_crossing_20180129-000545_362.xml├── zebra_crossing_20180129-000545_364.xml├── zebra_crossing_20180129-000545_366.xml└── zebra_crossing_20180129-000645_368.xml

2、生成对应的类名

创建create_classes_json.py自动生成对应的类名json文件,以及在控制台输出对应的类名集。

from doctest import REPORTING_FLAGS
from lib2to3.pgen2.token import RPAR
import os
from tqdm import tqdm
from lxml import etree
import json# 读取 xml 文件信息,并返回字典形式
def parse_xml_to_dict(xml):if len(xml) == 0:  # 遍历到底层,直接返回 tag对应的信息return {xml.tag: xml.text}result = {}for child in xml:child_result = parse_xml_to_dict(child)  # 递归遍历标签信息if child.tag != 'object':result[child.tag] = child_result[child.tag]else:if child.tag not in result:  # 因为object可能有多个,所以需要放入列表里result[child.tag] = []result[child.tag].append(child_result[child.tag])return {xml.tag: result}# 提取xml中name保留为json文件
def xml2json(data,json_path):xml_path = [os.path.join(data, i) for i in os.listdir(data)]classes = []      # 目标类别num_object = 0for xml_file in tqdm(xml_path, desc="loading..."):with open(xml_file,encoding='gb18030',errors='ignore') as fid:      # 防止出现非法字符报错xml_str = fid.read()xml = etree.fromstring(xml_str)data = parse_xml_to_dict(xml)["annotation"]  # 读取xml文件信息for j in data['object']:        # 获取单个xml文件的目标信息ob = j['name']num_object +=1if ob not in classes:classes.append(ob)print(num_object)# 生成json文件labels = {}for index,object in enumerate(classes):labels[index] = object# 打印类名classes_name=[labels[key] for key in labels]print(f'类名:{classes_name}')# 打印类型字典print(f'字典形式:{labels}')# json.dumps将python对象转为json对象(将dict转化成str)。 json.loads将json字符串解码成python对象(将str转化成dict)labels = json.dumps(labels,indent=4)json_path=os.path.join(json_path,'classes_indices.json')with open(json_path,'w') as f:f.write(labels)if __name__ == "__main__":# 数据集的 xml 目录xml_path = 'E:\\dataset\\xml_outputs' # 存放类名json路径json_path='E:\\dataset'        xml2json(xml_path,json_path)pass'''
输出效果如下:
loading...: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 9/9 [00:00<00:00, 143.24it/s]        
9
类名:['red', 'crosswalk']
字典形式:{0: 'red', 1: 'crosswalk'}
'''

classes_indices.json文件如下

在这里插入图片描述

3、xml转为yolo的label形式

创建xml_to_yolo_label_txt.py,在转换之前,我们需要获取数据集目标类别的列表,即运行上方create_classes_json.py,得到类名集,再替换CLASSES值。程序运行完后自动生成Annotations文件夹,里面就是yolo的label形式txt文件了。

import xml.etree.ElementTree as ET
import osdef convert(size,box):# 将bbox的左上角点,右下角点坐标的格式,转换为bbox中心点+bbox的W,H的格式,并进行归一化dw=1./size[0]dh=1./size[1]x=(box[0]+box[1])/2.0y=(box[2]+box[3])/2.0w=box[1]-box[0]h=box[3]-box[2]x=x*dww=w*dwy=y*dhh=h*dhreturn (x,y,w,h)def convert_annotation(xml_path,labels_path,CLASSES,image_id):# 把图像image_id的xml文件转换为目标检测的label文件(txt)# 其中包含物体的类别cls,bbox的中心点坐标,以及bbox的W,H# 并将四个物理量归一化in_file=open(xml_path+image_id)stats = os.stat(in_file.name)if stats.st_size!=0:image_id=image_id.split(".")[0]out_file=open(labels_path+"%s.txt"%(image_id),"w")tree=ET.parse(in_file)root=tree.getroot()size=root.find("size")w=int(size.find("width").text)h=int(size.find("height").text)for obj in root.iter("object"):#  difficult 代表是否难以识别,0表示易识别,1表示难识别。difficult=obj.find("difficult").textobj_cls=obj.find("name").textif obj_cls not in CLASSES:continuecls_id=CLASSES.index(obj_cls)xmlbox=obj.find("bndbox")points=(float(xmlbox.find("xmin").text),float(xmlbox.find("xmax").text),float(xmlbox.find("ymin").text),float(xmlbox.find("ymax").text))bb=convert((w,h),points)out_file.write(str(cls_id)+" "+" ".join([str(a) for a in bb])+"\n")def make_label_txt(xml_path,labels_path,CLASSES):# labels文件夹下创建image_id.txt# 对应每个image_id.xml提取出的bbox信息image_ids=os.listdir(xml_path)for file in image_ids:convert_annotation(xml_path,labels_path,CLASSES,file)if __name__=="__main__":# 类别,运行create_classes_json.py,得到类名集CLASSES=['red', 'crosswalk']# 数据整体文件路径common_path='E:\\dataset'# xml文件路径xml_path=os.path.join(common_path,'xml_outputs\\')# Annotations路径,即存放xml转为全部lables的路径labels_path=os.path.join(common_path,'Annotations\\')if not os.path.exists(labels_path):os.mkdir(labels_path)# 开始提取和转换make_label_txt(xml_path,labels_path,CLASSES)

4、优化代码

有人问,上方两个代码,需要运行两次,能否直接一次性运行就完呢?

答案:是可以的,上方代码关键就在获取类名集,于是将两者合并,创建final_xml2yolo.py代码

from doctest import REPORTING_FLAGS
from lib2to3.pgen2.token import RPAR
import os
from tqdm import tqdm
from lxml import etree
import json
import xml.etree.ElementTree as ET
import os# 读取 xml 文件信息,并返回字典形式
def parse_xml_to_dict(xml):if len(xml) == 0:  # 遍历到底层,直接返回 tag对应的信息return {xml.tag: xml.text}result = {}for child in xml:child_result = parse_xml_to_dict(child)  # 递归遍历标签信息if child.tag != 'object':result[child.tag] = child_result[child.tag]else:if child.tag not in result:  # 因为object可能有多个,所以需要放入列表里result[child.tag] = []result[child.tag].append(child_result[child.tag])return {xml.tag: result}# 提取xml中name保留为json文件
def xml2json(data,json_path):xml_path = [os.path.join(data, i) for i in os.listdir(data)]classes = []      # 目标类别num_object = 0for xml_file in tqdm(xml_path, desc="loading..."):with open(xml_file,encoding='gb18030',errors='ignore') as fid:      # 防止出现非法字符报错xml_str = fid.read()xml = etree.fromstring(xml_str)data = parse_xml_to_dict(xml)["annotation"]  # 读取xml文件信息for j in data['object']:        # 获取单个xml文件的目标信息ob = j['name']num_object +=1if ob not in classes:classes.append(ob)print(num_object)# 生成json文件labels = {}for index,object in enumerate(classes):labels[index] = object# 打印类名classes_name=[labels[key] for key in labels]print(f'类名:{classes_name}')# 打印类型字典print(f'字典形式:{labels}')# json.dumps将python对象转为json对象(将dict转化成str)。 json.loads将json字符串解码成python对象(将str转化成dict)labels = json.dumps(labels,indent=4)json_path=os.path.join(json_path,'classes_indices.json')with open(json_path,'w') as f:f.write(labels)# 返回类名 return classes_namedef convert(size,box):# 将bbox的左上角点,右下角点坐标的格式,转换为bbox中心点+bbox的W,H的格式,并进行归一化dw=1./size[0]dh=1./size[1]x=(box[0]+box[1])/2.0y=(box[2]+box[3])/2.0w=box[1]-box[0]h=box[3]-box[2]x=x*dww=w*dwy=y*dhh=h*dhreturn (x,y,w,h)def convert_annotation(xml_path,labels_path,CLASSES,image_id):# 把图像image_id的xml文件转换为目标检测的label文件(txt)# 其中包含物体的类别cls,bbox的中心点坐标,以及bbox的W,H# 并将四个物理量归一化in_file=open(xml_path+image_id)stats = os.stat(in_file.name)if stats.st_size!=0:image_id=image_id.split(".")[0]out_file=open(labels_path+"%s.txt"%(image_id),"w")tree=ET.parse(in_file)root=tree.getroot()size=root.find("size")w=int(size.find("width").text)h=int(size.find("height").text)for obj in root.iter("object"):#  difficult 代表是否难以识别,0表示易识别,1表示难识别。difficult=obj.find("difficult").textobj_cls=obj.find("name").textif obj_cls not in CLASSES:continuecls_id=CLASSES.index(obj_cls)xmlbox=obj.find("bndbox")points=(float(xmlbox.find("xmin").text),float(xmlbox.find("xmax").text),float(xmlbox.find("ymin").text),float(xmlbox.find("ymax").text))bb=convert((w,h),points)out_file.write(str(cls_id)+" "+" ".join([str(a) for a in bb])+"\n")def make_label_txt(xml_path,labels_path,CLASSES):# labels文件夹下创建image_id.txt# 对应每个image_id.xml提取出的bbox信息image_ids=os.listdir(xml_path)for file in image_ids:convert_annotation(xml_path,labels_path,CLASSES,file)if __name__ == "__main__":# 数据整体文件路径,同时也是存放类名json路径common_path=json_path='E:\\dataset'# xml文件路径xml_path=os.path.join(common_path,'xml_outputs\\')# 获取类别     CLASSES=xml2json(xml_path,json_path)# Annotations路径,即存放xml转为全部lables的路径labels_path=os.path.join(common_path,'Annotations\\')if not os.path.exists(labels_path):os.mkdir(labels_path)# 开始提取和转换make_label_txt(xml_path,labels_path,CLASSES)pass

5、划分数据集

创建split_train_val.py,根据具体情况分别修改cur_path,image_original_path,label_original_path 值,程序运行完后,分别生成images,labes和data_txt文件夹。

# 将图片和标注数据按比例切分为 训练集和测试集
import shutil
import random
import os# 原始路径
# 数据整体文件路径(注意这里需要修改)
cur_path='E:\\dataset'
# 图像文件夹路径,注意一定要有\\,(注意这里需要修改)
image_original_path = os.path.join(cur_path,"images_package\\")# 标注结果的路径即labels路径,该路径下不要有classes.txt,注意一定要有\\,(注意这里需要修改)
label_original_path = os.path.join(cur_path,"Annotations\\")		# cur_path = os.getcwd()# 训练集路径
train_image_path = os.path.join(cur_path, "images/train/")
train_label_path = os.path.join(cur_path, "labels/train/")# 验证集路径
val_image_path = os.path.join(cur_path, "images/val/")
val_label_path = os.path.join(cur_path, "labels/val/")# 测试集路径
test_image_path = os.path.join(cur_path, "images/test/")
test_label_path = os.path.join(cur_path, "labels/test/")# 训练集目录
data_txt_path=os.path.join(cur_path,'data_txt')
if not os.path.exists(data_txt_path):os.mkdir(data_txt_path)
list_train = os.path.join(data_txt_path, "train.txt")
list_val = os.path.join(data_txt_path, "val.txt")
list_test = os.path.join(data_txt_path, "test.txt")# 划分数据集比例
train_percent = 0.8
val_percent = 0.1
test_percent = 0.1def del_file(path):for i in os.listdir(path):file_data = path + "\\" + ios.remove(file_data)def mkdir():if not os.path.exists(train_image_path):os.makedirs(train_image_path)else:del_file(train_image_path)if not os.path.exists(train_label_path):os.makedirs(train_label_path)else:del_file(train_label_path)if not os.path.exists(val_image_path):os.makedirs(val_image_path)else:del_file(val_image_path)if not os.path.exists(val_label_path):os.makedirs(val_label_path)else:del_file(val_label_path)if not os.path.exists(test_image_path):os.makedirs(test_image_path)else:del_file(test_image_path)if not os.path.exists(test_label_path):os.makedirs(test_label_path)else:del_file(test_label_path)def clearfile():if os.path.exists(list_train):os.remove(list_train)if os.path.exists(list_val):os.remove(list_val)if os.path.exists(list_test):os.remove(list_test)def main():mkdir()clearfile()file_train = open(list_train, 'w')file_val = open(list_val, 'w')file_test = open(list_test, 'w')total_txt = os.listdir(label_original_path)num_txt = len(total_txt)list_all_txt = range(num_txt)num_train = int(num_txt * train_percent)num_val = int(num_txt * val_percent)num_test = num_txt - num_train - num_valtrain = random.sample(list_all_txt, num_train)# train从list_all_txt取出num_train个元素# 所以list_all_txt列表只剩下了这些元素val_test = [i for i in list_all_txt if not i in train]# 再从val_test取出num_val个元素,val_test剩下的元素就是testval = random.sample(val_test, num_val)print("训练集数目:{}, 验证集数目:{}, 测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))for i in list_all_txt:name = total_txt[i][:-4]srcImage = image_original_path + name + '.jpg'srcLabel = label_original_path + name + ".txt"if i in train:dst_train_Image = train_image_path + name + '.jpg'dst_train_Label = train_label_path + name + '.txt'shutil.copyfile(srcImage, dst_train_Image)shutil.copyfile(srcLabel, dst_train_Label)file_train.write(dst_train_Image + '\n')elif i in val:dst_val_Image = val_image_path + name + '.jpg'dst_val_Label = val_label_path + name + '.txt'shutil.copyfile(srcImage, dst_val_Image)shutil.copyfile(srcLabel, dst_val_Label)file_val.write(dst_val_Image + '\n')else:dst_test_Image = test_image_path + name + '.jpg'dst_test_Label = test_label_path + name + '.txt'shutil.copyfile(srcImage, dst_test_Image)shutil.copyfile(srcLabel, dst_test_Label)file_test.write(dst_test_Image + '\n')file_train.close()file_val.close()file_test.close()if __name__ == "__main__":main()

本文最终形成的目录形式

    E:└──dataset├── Annotations│    ├── 000002.txt│    ├── 000003.txt│    ├── 000004.txt│    ├── 000005.txt│    ├── 000006.txt│    ├── zebra_crossing_20180129-000545_362.txt│    ├── zebra_crossing_20180129-000545_364.txt│    ├── zebra_crossing_20180129-000545_366.txt│    └── zebra_crossing_20180129-000645_368.txt├── classes_indices.json├── data_txt│    ├── test.txt│    ├── train.txt│    └── val.txt├── images│    ├── test│    │    ├── 000005.jpg│    │    └── zebra_crossing_20180129-000545_362.jpg│    ├── train│    │    ├── 000002.jpg│    │    ├── 000003.jpg│    │    ├── 000004.jpg│    │    ├── 000006.jpg│    │    ├── zebra_crossing_20180129-000545_364.jpg│    │    ├── zebra_crossing_20180129-000545_366.jpg│    │    └── zebra_crossing_20180129-000645_368.jpg│    └── val├── images_package│    ├── 000002.jpg│    ├── 000003.jpg│    ├── 000004.jpg│    ├── 000005.jpg│    ├── 000006.jpg│    ├── zebra_crossing_20180129-000545_362.jpg│    ├── zebra_crossing_20180129-000545_364.jpg│    ├── zebra_crossing_20180129-000545_366.jpg│    └── zebra_crossing_20180129-000645_368.jpg├── labels│    ├── test│    │    ├── 000005.txt│    │    └── zebra_crossing_20180129-000545_362.txt│    ├── train│    │    ├── 000002.txt│    │    ├── 000003.txt│    │    ├── 000004.txt│    │    ├── 000006.txt│    │    ├── zebra_crossing_20180129-000545_364.txt│    │    ├── zebra_crossing_20180129-000545_366.txt│    │    └── zebra_crossing_20180129-000645_368.txt│    └── val└── xml_outputs├── 000002.xml├── 000003.xml├── 000004.xml├── 000005.xml├── 000006.xml├── zebra_crossing_20180129-000545_362.xml├── zebra_crossing_20180129-000545_364.xml├── zebra_crossing_20180129-000545_366.xml└── zebra_crossing_20180129-000645_368.xml

6、画目录树

创建draw_tree.py,如本文输入

请输入文件夹路径(不含名称): E

请输入文件夹名称:dataset

自动生成 tree.txt

import osdef get_num(path):dirlist = os.listdir(path)j=0for i in dirlist:j+=1return jdef print_tree(path,last):num=get_num(path)if num!=0:dirlist = os.listdir(path)j=0for i in dirlist:for k in last:if k=='0':print("  │",end=" ")else:print("   ", end=" ")j+=1if j<num:print("  ├── ", end="")print(i)dir=path+"\\"+iif os.path.isdir(dir):print_tree(dir,last+'0')else:print("  └── ", end="")print(i)dir = path + "\\" + iif os.path.isdir(dir):print_tree(dir,last+'1')def write_tree(path,last,f):num=get_num(path)if num!=0:dirlist = os.listdir(path)j=0for i in dirlist:for k in last:if k=='0':f.write("    │")else:f.write("    ")j+=1if j<num:f.write("    ├── ")f.write(i)f.write('\n')dir=path+"\\"+iif os.path.isdir(dir):write_tree(dir,last+'0',f)else:f.write("    └── ")f.write(i)f.write('\n')dir = path + "\\" + iif os.path.isdir(dir):write_tree(dir,last+'1',f)if __name__=='__main__':path = input("请输入文件夹路径(不含名称):")root = input("请输入文件夹名称:")if len(path)==1:path+=':'#print("  └─root")#print_tree('D:\\root',"1")f = open("tree.txt", "w", encoding="utf-8")f.write("    └──"+root+"\n")write_tree(path+"\\"+root, "1",f)f.close()

7、目标检测系列文章

  1. YOLOv5s网络模型讲解(一看就会)

  2. 生活垃圾数据集(YOLO版)

  3. YOLOv5如何训练自己的数据集

  4. 双向控制舵机(树莓派版)

  5. 树莓派部署YOLOv5目标检测(详细篇)

  6. YOLO_Tracking 实践 (环境搭建 & 案例测试)

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

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

相关文章

Nginx 日志输出配置json格式

nginx日志输出配置json格式 nginx服务器日志相关指令主要有两条&#xff1a; (1) 一条是log_format&#xff0c;用来设置日志格式 (2) 另外一条是access_log&#xff0c;用来指定日志文件的存放路径、格式和缓存大小。 log_format指令用来设置日志的记录格式&#xff0c;它的语…

iOS移动应用实时查看运行日志的最佳实践

目录 一、设备连接 二、使用克魔助手查看日志 三、过滤我们自己App的日志 &#x1f4dd; 摘要&#xff1a; 本文介绍了如何在iOS iPhone设备上实时查看输出在console控制台的日志。通过克魔助手工具&#xff0c;我们可以连接手机并方便地筛选我们自己App的日志。 &#x1f4…

目标检测——工业安全生产环境违规使用手机的识别

一、重要性及意义 首先&#xff0c;工业安全生产环境涉及到许多复杂的工艺和设备&#xff0c;这些设备和工艺往往需要高精度的操作和严格的监管。如果员工在生产过程中违规使用手机&#xff0c;不仅可能分散其注意力&#xff0c;降低工作效率&#xff0c;更可能因操作失误导致…

云原生技术赋能AI绘图:Stable Diffusion在腾讯云的部署与应用新篇章

摘要 随着信息技术的飞速发展和数字化转型的深入推进&#xff0c;云原生架构已成为企业数字化转型的重要基石。Docker容器、Serverless和微服务等技术作为云原生的核心组成部分&#xff0c;正在不断推动着企业应用架构的革新与升级。本文旨在总结近期在云原生实践、容器技术、…

混合现实(MR)开发工具

混合现实&#xff08;MR&#xff09;开发工具是一系列软件和框架&#xff0c;它们使得开发者能够创建和优化能够在虚拟与现实世界之间无缝交互的应用程序。以下是一些在MR领域内广泛使用的开发工具。 1.Microsoft Mixed Reality Toolkit (MRTK) MRTK是一个跨平台的工具包&…

【操作系统】FCFS、SJF、HRRN、RR、EDF、LLF调度算法及python实现代码

文章目录 一、先来先服务调度算法&#xff08;FCFS&#xff09; 二、短作业优先调度算法&#xff08;SJF&#xff09; 三、高响应比优先调度算法&#xff08;HRRN&#xff09; 四、轮转调度算法&#xff08;RR&#xff09; 五、最早截至时间优先算法&#xff08;EDF&#…

Mysql故障解析

目录 一、Mysql单实例故障排查 1.故障一 2.故障二 3.故障三 4.故障四 5.故障五 6.故障六 7.故障七 8.故障八 二、Mysql主从故障排查 1.故障一 2.故障二 3.故障三 三、Mysql优化 1.硬件方面 &#xff08;1&#xff09;关于CPU &#xff08;2&#xff09;关于内…

Autodesk 3DS MAX 2025 (3Dmax2025)激活版

3ds Max 2025 是一款功能强大的3D建模、动画和渲染软件&#xff0c;广泛应用于建筑、游戏开发、影视制作等多个领域。在材质设定和描影、3D彩现以及动画和效果方面&#xff0c;3ds Max 2025也提供了丰富的增强功能&#xff0c;以满足用户在不同制作需求中的要求。 3ds Max 2025…

Linux多进程通信(2)——POSIX信号量使用例程

1.POSIX信号量 1&#xff09;POSIX信号量和System V信号量区别 常用的是POSIX信号量&#xff0c;使用起来更加方便&#xff0c;而POSIX信号量分为有名信号量和无名信号量 POSIX信号量是多线程多进程安全的&#xff0c;而System V标准的信号量并不是&#xff0c;Posix通过sem_…

外包干了25天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

Mysql中的 IFNULL 函数的详解

Mysql中的 IFNULL 函数的详解 概念 在mysql中IFNULL() 函数用于判断第一个表达式是否为 NULL&#xff0c;如果第一个值不为NULL就执行第一个值。第一个值为 NULL 则返回第二个参数的值。 语法 IFNULL(a, b)Demo 举例说明 创建表 create table student_one( sno varchar(20)…

机器学习: 绪论(基础概念)

文章目录 一、机器学习做什么二、机器学习的基本术语2.1、数据相关2.1.1、数据集2.1.2、特征&#xff08;Feature&#xff09;2.1.3、样本空间&#xff08;Sample Space&#xff09; 2.2、任务相关2.2.1、分类2.2.2、回归2.2.3、聚类2.2.4、监督学习和无监督学习 三、机器学习思…

智乃想考一道鸽巢原理

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

VSCode 设置vue2模板

点击设置 > 用户代码片段 > 输入Vue &#xff08;打开vue.json&#xff09;> 将代码复制内 "Print to console": {"prefix": "<","body": ["<template>"," <div class$1></div>"…

苹果App上架指南

苹果上架要求是苹果公司对于提交应用程序到苹果商店上架的要求和规定。这些要求主要是为了保证用户体验、应用程序的质量和安全性。以下是苹果上架要求的详细介绍&#xff1a;1. 应用程序的内容和功能必须符合苹果公司的规 苹果上架要求是苹果公司对于提交应用程序到苹果商店上…

【随笔】Git -- 高级命令(中篇)(七)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

文本直接生成2分钟视频,即将开源模型StreamingT2V

Picsart人工智能研究所、德克萨斯大学和SHI实验室的研究人员联合推出了StreamingT2V视频模型。通过文本就能直接生成2分钟、1分钟等不同时间&#xff0c;动作一致、连贯、没有卡顿的高质量视频。 虽然StreamingT2V在视频质量、多元化等还无法与Sora媲美&#xff0c;但在高速运…

【项目技术介绍篇】若依项目代码文件结构介绍

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

深入剖析Xen与KVM虚拟化技术及其架构特点

引言 在现代数据中心与云计算领域中&#xff0c;虚拟化技术已经成为提升资源利用率、增强灵活性与可扩展性的重要基石。其中&#xff0c;Xen与KVM作为两种备受瞩目的开源虚拟化解决方案&#xff0c;分别以其独特的设计理念与技术创新引领着行业的进步与发展。Xen源自剑桥大学的…

基于深度学习的停车场车辆检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 上图测试结果如下图所示&#xff1a; 2.算法运行软件版本 matlab2022a 3.部分核心程序 image imread(image_test\test.jpg); image2 image;%图…