news 2026/6/21 8:17:02

python --yolo混合文件xml和img整理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python --yolo混合文件xml和img整理
importosimportrandomimporttimefrompathlibimportPathimportshutilimporttkinterastkfromtkinterimportfiledialogfromloguruimportloggerimportxml.etree.ElementTreeasETclassAnalysisXML(object):'''清洗xml'''def__init__(self):root=tk.Tk()root.withdraw()root.attributes('-topmost',1)self.directory=filedialog.askdirectory()# 打开目录选择器root.destroy()logger.warning(f'路径选择:【{self.directory}】')defxml_img_split(self):'''分割图片和xml'''logger.info(f'---------------------------分割图片和xml------------------------')self.images_path=Path(self.directory).parent.joinpath('images')self.xml_labels_path=Path(self.directory).parent.joinpath('xml_labels')self.images_path.mkdir(parents=True,exist_ok=True)self.xml_labels_path.mkdir(parents=True,exist_ok=True)foriinPath(self.directory).iterdir():ifi.suffix=='.xml':new_path=self.xml_labels_path.joinpath(i.name)logger.debug(f'移动:【{i}】 -> 【{new_path}】')shutil.copy(str(i),str(new_path))ifi.suffixin('.jpg','.png'):new_path=self.images_path.joinpath(i.name)logger.debug(f'移动:【{i}】 -> 【{new_path}】')shutil.copy(str(i),str(new_path))defxml_to_txt(self):'''xml转txt'''logger.info(f'----------------------------正在将xml转为txt-----------------------')self.txt_labels=self.xml_labels_path.joinpath('labels')# 替换为实际的输出TXT文件夹路径os.makedirs(self.txt_labels,exist_ok=True)names_set=set()forfilenameinos.listdir(self.xml_labels_path):iffilename.endswith('.xml'):tree=ET.parse(os.path.join(self.xml_labels_path,filename))root=tree.getroot()forobjinroot.findall('object'):name=obj.find('name').text names_set.add(name)# 输出所有的namecategories=[]fornameinnames_set:categories.append(name)logger.success(f'标注的内容names:【{categories}】')category_to_index={category:indexforindex,categoryinenumerate(categories)}# 遍历输入文件夹中的所有XML文件forfilenameinos.listdir(self.xml_labels_path):iffilename.endswith('.xml'):xml_path=os.path.join(self.xml_labels_path,filename)logger.warning(f'正在处理:【{xml_path}】')# 解析XML文件tree=ET.parse(xml_path)root=tree.getroot()# 提取图像的尺寸size=root.find('size')width=int(size.find('width').text)height=int(size.find('height').text)# 存储name和对应的归一化坐标objects=[]# 遍历XML中的object标签forobjinroot.findall('object'):name=obj.find('name').textifnameincategory_to_index:category_index=category_to_index[name]else:continue# 如果name不在指定类别中,跳过该objectbndbox=obj.find('bndbox')xmin=int(bndbox.find('xmin').text)ymin=int(bndbox.find('ymin').text)xmax=int(bndbox.find('xmax').text)ymax=int(bndbox.find('ymax').text)# 转换为中心点坐标和宽高x_center=(xmin+xmax)/2.0y_center=(ymin+ymax)/2.0w=xmax-xmin h=ymax-ymin# 归一化x=x_center/width y=y_center/height w=w/width h=h/height objects.append(f"{category_index}{x:.6f}{y:.6f}{w:.6f}{h:.6f}")# 输出结果到对应的TXT文件txt_filename=os.path.splitext(filename)[0]+'.txt'txt_path=os.path.join(self.txt_labels,txt_filename)withopen(txt_path,'w')asf:forobjinobjects:f.write(obj+'\n')defto_dataset(self,test_ratio):'''整理为dataset'''output_folder=os.path.join(os.path.dirname(self.directory),'datasets')input_image_folder=self.images_path input_label_folder=self.txt_labels train_images_folder=os.path.join(output_folder,'train','images')train_labels_folder=os.path.join(output_folder,'train','labels')val_images_folder=os.path.join(output_folder,'val','images')val_labels_folder=os.path.join(output_folder,'val','labels')os.makedirs(train_images_folder,exist_ok=True)os.makedirs(train_labels_folder,exist_ok=True)os.makedirs(val_images_folder,exist_ok=True)os.makedirs(val_labels_folder,exist_ok=True)# 获取所有图像文件列表images=[fforfinos.listdir(input_image_folder)iff.endswith('.jpg')orf.endswith('.png')]# 随机打乱图像文件列表random.shuffle(images)# 计算验证集的数量val_size=int(len(images)*test_ratio)# 划分验证集和训练集val_images=images[:val_size]train_images=images[val_size:]# 复制验证集图像和标签forimageinval_images:label=os.path.splitext(image)[0]+'.txt'ifos.path.exists(os.path.join(input_label_folder,label)):shutil.copy(os.path.join(input_image_folder,image),os.path.join(val_images_folder,image))shutil.copy(os.path.join(input_label_folder,label),os.path.join(val_labels_folder,label))logger.debug(f'【{os.path.join(input_image_folder,image)}】 --> 【{os.path.join(val_images_folder,image)}】')logger.success(f'【{os.path.join(input_label_folder,label)}】 --> 【{os.path.join(val_labels_folder,label)}】')else:logger.error(f"Warning: Label file{label}not found for image{image}")# 复制训练集图像和标签forimageintrain_images:label=os.path.splitext(image)[0]+'.txt'ifos.path.exists(os.path.join(input_label_folder,label)):shutil.copy(os.path.join(input_image_folder,image),os.path.join(train_images_folder,image))shutil.copy(os.path.join(input_label_folder,label),os.path.join(train_labels_folder,label))logger.debug(f'【{os.path.join(input_image_folder,image)}】 --> 【{os.path.join(train_images_folder,image)}】')logger.success(f'【{os.path.join(input_label_folder,label)}】 --> 【{os.path.join(train_labels_folder,label)}】')else:logger.error(f"Warning: Label file{label}not found for image{image}")defstart(self):'''启动'''time.sleep(1)self.xml_img_split()time.sleep(1)self.xml_to_txt()time.sleep(1)self.to_dataset(0.2)if__name__=='__main__':base_dir=os.path.dirname(__file__)log_path=os.path.join(base_dir,'log.log')ifos.path.exists(log_path):os.unlink(log_path)logger.add(log_path)print('...第一层文件夹')print(' -->第二层文件夹↓')print(' -->[xml和img混合文件夹]')print('\n')status=input('请确认xml和图片在同一个文件夹(99:确认)(任意值:取消):')ifstatusin(99,'99'):a=AnalysisXML()a.start()logger.success('系统完成')foriin(3,2,1):time.sleep(1)logger.success(f'{i}/秒')else:logger.error('系统退出!')foriin(3,2,1):time.sleep(1)logger.error(f'{i}/秒')
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 13:47:09

Vue-springboot兔喜快递柜子超市库存管理系统已转

目录Vue-SpringBoot 兔喜快递柜超市库存管理系统摘要开发技术核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!Vu…

作者头像 李华
网站建设 2026/6/19 1:49:34

5分钟搭建MICROSOFT VISUAL C++原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 快速创建一个MICROSOFT VISUAL C概念验证原型,展示核心功能和用户体验。点击项目生成按钮,等待项目生成完整后预览效果 最近在尝试用MICROSOFT VISUAL C开发…

作者头像 李华
网站建设 2026/6/13 19:27:07

5个实际项目中JS Switch的高级应用场景

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个交互式案例展示平台,包含5个实际应用场景:1. 游戏状态机控制 2. API路由分发 3. 国际化多语言切换 4. 表单验证规则选择 5. 动态组件渲染。每个案例…

作者头像 李华
网站建设 2026/6/12 23:08:55

SQLSugar vs 原生ADO.NET:开发效率对比实验

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个对比测试项目,分别使用SQLSugar和原生ADO.NET实现相同的数据库操作:1) 单表CRUD;2) 多表关联查询;3) 批量插入1000条数据&a…

作者头像 李华
网站建设 2026/6/19 9:22:28

救命神器!专科生必看8个AI论文网站深度测评

救命神器!专科生必看8个AI论文网站深度测评 2026年专科生论文写作工具测评:为何需要这份深度榜单 随着AI技术在教育领域的不断渗透,越来越多的专科生开始依赖智能写作工具提升论文效率。然而,面对市场上琳琅满目的AI论文网站&…

作者头像 李华
网站建设 2026/6/14 1:29:35

HBase在大数据领域的物联网数据存储与处理

HBase在大数据领域的物联网数据存储与处理 关键词:HBase、物联网、大数据存储、实时处理、分布式数据库、列式存储、时间序列数据 摘要:本文深入探讨HBase在物联网数据存储与处理中的核心技术与应用实践。首先解析HBase的分布式架构与列式存储模型&#…

作者头像 李华