热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

voc生成xml代码

目录lxmlwindows安装读取示例可视化生成示例上面是代码,下面有调用示例api调用代码,其实只有几行:这个生成代码也很简

目录

lxml windows安装

读取示例

可视化

生成示例

上面是代码,下面有调用示例

api调用代码,其实只有几行:




这个生成代码也很简洁:

python生成voc xml文件_jacke121的专栏-CSDN博客


lxml windows安装

pip install lxml可能失败,

一种可行方法,在这里下载对应版本whl,然后安装,亲测OK。

lxml · PyPI


读取示例

import os
import cv2
import numpy as np
import xml.etree.ElementTree as ET
CLASSES = ('m',)
_class_to_ind=dict(list(zip(CLASSES, list(range(len(CLASSES))))))
def get_label(label_path,shape, flip&#61;False):h, w, c &#61; shapeannotations &#61; np.zeros((0, 5),dtype&#61;np.float32)if os.path.exists(label_path):tree &#61; ET.parse(label_path)objs &#61; tree.findall(&#39;object&#39;)for ix, obj in enumerate(objs):if obj.find(&#39;name&#39;).text.lower().strip() not in _class_to_ind:# logging.info("label not select: {}".format(obj.find(&#39;name&#39;).text.lower().strip()))continuebbox &#61; obj.find(&#39;bndbox&#39;)x1 &#61; max(float(bbox.find(&#39;xmin&#39;).text), 1) # - 1y1 &#61; max(float(bbox.find(&#39;ymin&#39;).text), 1) # - 1x2 &#61; min(float(bbox.find(&#39;xmax&#39;).text), 10000) # - 1y2 &#61; min(float(bbox.find(&#39;ymax&#39;).text), 10000) # - 1if obj.find("difficult") is not None and obj.find("difficult").text &#61;&#61; &#39;1&#39;:if (x2-x1) * (y2-y1)<10*10:continue

可视化


import os
import cv2
import reimport xml.etree.ElementTree as ETCLASSES &#61; (&#39;car&#39;,)
_class_to_ind&#61;dict(list(zip(CLASSES, list(range(len(CLASSES))))))if __name__ &#61;&#61; &#39;__main__&#39;:image_dir &#61; r&#39;G:\img&#39;xml_dir &#61; r&#39;G:\xml&#39;image_list &#61; os.listdir(image_dir)cnt &#61; 0for i in image_list:image_path &#61; os.path.join(image_dir ,i)xml_path &#61; os.path.join(xml_dir ,os.path.splitext(i)[0 ] &#43;&#39;.xml&#39;)tree &#61; ET.parse(xml_path)objs &#61; tree.findall(&#39;object&#39;)image &#61; cv2.imread(image_path)for ix, obj in enumerate(objs):if obj.find(&#39;name&#39;).text.lower().strip() not in _class_to_ind:# logging.info("label not select: {}".format(obj.find(&#39;name&#39;).text.lower().strip()))continuebbox &#61; obj.find(&#39;bndbox&#39;)x1 &#61; max(float(bbox.find(&#39;xmin&#39;).text), 1) # - 1y1 &#61; max(float(bbox.find(&#39;ymin&#39;).text), 1) # - 1x2 &#61; min(float(bbox.find(&#39;xmax&#39;).text), 10000) # - 1y2 &#61; min(float(bbox.find(&#39;ymax&#39;).text), 10000) # - 1cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), thickness&#61;2)# cv2.putText(image, info[0], (info[1], info[2]), cv2.FONT_HERSHEY_PLAIN, 0.5, (0, 0, 255), 1)cv2.imshow("image",image)cv2.waitKey()


生成示例


上面是代码&#xff0c;下面有调用示例


api调用代码&#xff0c;其实只有几行&#xff1a;

anno &#61; GEN_Annotations(pic_path)anno.set_size(new_width, new_height, 3)for (x, y, w, h,name) in bbox_list:anno.add_pic_attr(name, x, y, w, h)save_xml_path&#61;xml_path.replace(base_path,save_pic_path)os.makedirs(os.path.dirname(save_xml_path), exist_ok&#61;True)anno.savefile(save_xml_path)

# -*- coding: utf-8 -*-import osfrom lxml import etreeclass GEN_Annotations:def __init__(self, filename):self.root &#61; etree.Element("annotation")child1 &#61; etree.SubElement(self.root, "folder")child1.text &#61; "VOC2007"child2 &#61; etree.SubElement(self.root, "filename")child2.text &#61; filenamechild3 &#61; etree.SubElement(self.root, "source")# child2.set("database", "The VOC2007 Database")child4 &#61; etree.SubElement(child3, "annotation")child4.text &#61; "PASCAL VOC2007"child5 &#61; etree.SubElement(child3, "database")child6 &#61; etree.SubElement(child3, "image")child6.text &#61; "flickr"child7 &#61; etree.SubElement(child3, "flickrid")child7.text &#61; "35435"# root.append( etree.Element("child1") )# root.append( etree.Element("child1", interesting&#61;"totally"))# child2 &#61; etree.SubElement(root, "child2")# child3 &#61; etree.SubElement(root, "child3")# root.insert(0, etree.Element("child0"))def set_size(self,witdh,height,channel):size &#61; etree.SubElement(self.root, "size")widthn &#61; etree.SubElement(size, "width")widthn.text &#61; str(witdh)heightn &#61; etree.SubElement(size, "height")heightn.text &#61; str(height)channeln &#61; etree.SubElement(size, "channel")channeln.text &#61; str(channel)def savefile(self,filename):tree &#61; etree.ElementTree(self.root)tree.write(filename, pretty_print&#61;True, xml_declaration&#61;False, encoding&#61;&#39;utf-8&#39;)def add_pic_attr(self,label,x,y,w,h,diffi_&#61;0):object &#61; etree.SubElement(self.root, "object")namen &#61; etree.SubElement(object, "name")namen.text &#61; labeldiffi &#61; etree.SubElement(object, "difficult")diffi.text &#61; str(diffi_)truncated_ &#61; etree.SubElement(object, "truncated")truncated_.text &#61; str(0)bndbox &#61; etree.SubElement(object, "bndbox")xminn &#61; etree.SubElement(bndbox, "xmin")xminn.text &#61; str(x)yminn &#61; etree.SubElement(bndbox, "ymin")yminn.text &#61; str(y)xmaxn &#61; etree.SubElement(bndbox, "xmax")xmaxn.text &#61; str(x&#43;w)ymaxn &#61; etree.SubElement(bndbox, "ymax")ymaxn.text &#61; str(y&#43;h)

调用&#xff1a;

import cv2
import xml.etree.ElementTree as ETdef change_size(pic_path, xml_path,base_path,save_pic_path):img &#61; cv2.imread(pic_path)if img is None:print(&#39;img is null&#39;, pic_path)returnif img.shape[1] <1 or img.shape[0] <1:print(&#39;img is null&#39;, pic_path)returnheight,width&#61;img.shape[:2]new_width &#61; widthnew_height &#61; heightif height>700 and width>1200:new_width &#61; int(width * 0.8)new_height &#61; int(height * 0.8)img&#61;cv2.resize(img,(new_width,new_height))if new_height!&#61;576 or new_width!&#61;1024:print(new_height,new_width,pic_path)pic_path &#61; pic_path.replace(base_path, save_pic_path)os.makedirs(os.path.dirname(pic_path), exist_ok&#61;True)cv2.imwrite(pic_path, img)if os.path.exists(xml_path):tree &#61; ET.parse(xml_path)# file_objs &#61; tree.findall(&#39;filename&#39;)objs &#61; tree.findall(&#39;object&#39;)objs_diffi &#61; tree.findall(&#39;object/difficult&#39;)if len(objs_diffi)&#61;&#61;0:print(xml_path, objs_diffi, len(objs_diffi))bbox_list &#61; []for ix, obj in enumerate(objs):name &#61; obj.find(&#39;name&#39;).textbbox &#61; obj.find(&#39;bndbox&#39;)x1 &#61; int(int(bbox.find(&#39;xmin&#39;).text)*0.8)y1 &#61; int(int(bbox.find(&#39;ymin&#39;).text)*0.8)x2 &#61; int(int(bbox.find(&#39;xmax&#39;).text)*0.8)y2 &#61; int(int(bbox.find(&#39;ymax&#39;).text)*0.8)bbox_list.append((x1,y1,(x2-x1),(y2-y1),name))anno &#61; GEN_Annotations(pic_path)anno.set_size(new_width, new_height, 3)for (x, y, w, h,name) in bbox_list:anno.add_pic_attr(name, x, y, w, h)save_xml_path&#61;xml_path.replace(base_path,save_pic_path)os.makedirs(os.path.dirname(save_xml_path), exist_ok&#61;True)anno.savefile(save_xml_path)if __name__ &#61;&#61; &#39;__main__&#39;:# save file pathsource_base_path &#61; r&#39;D:\Team-CV\dataset\chumao_train/&#39;save_base_path &#61; r&#39;D:\Team-CV\dataset\chumao_train_1024/&#39;os.makedirs(save_base_path, exist_ok&#61;True)# file pathg &#61; os.walk(source_base_path)pic_files &#61; [&#39;%s\\%s&#39; % (i[0], j) for i in g if i[0].endswith(&#39;JPEGImages&#39;) for j in i[-1] if j.endswith(&#39;jpg&#39;)]for i,pic_file in enumerate(pic_files):if &#39;JPEGImages&#39; in pic_file:xml_file &#61; pic_file.replace(&#39;JPEGImages&#39;,&#39;Annotations&#39;).replace(&#39;.jpg&#39;,&#39;.xml&#39;)change_size(pic_file, xml_file,source_base_path,save_base_path)print(i,pic_file)


推荐阅读
  • 【Python爬虫实操】 不创作小说,专精网站内容迁移,超高效!(含源代码)
    本文详细介绍了如何利用Python爬虫技术实现高效网站内容迁移,涵盖前端、后端及Android相关知识点。通过具体实例和源代码,展示了如何精准抓取并迁移网站内容,适合对Python爬虫实战感兴趣的开发者参考。 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • 深入解析Spring Boot自动配置机制及其核心原理
    Spring Boot 的自动配置机制是其核心特性之一,旨在简化开发过程并提高效率。本文将深入探讨这一机制的工作原理,解释其如何通过智能化的类路径扫描和条件注解实现自动装配。通过对 Spring Boot 自动配置的详细解析,读者将能够更好地理解和应用这一强大功能,从而在实际项目中更加高效地利用 Spring Boot。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • Django框架下的对象关系映射(ORM)详解
    在Django框架中,对象关系映射(ORM)技术是解决面向对象编程与关系型数据库之间不兼容问题的关键工具。通过将数据库表结构映射到Python类,ORM使得开发者能够以面向对象的方式操作数据库,从而简化了数据访问和管理的复杂性。这种技术不仅提高了代码的可读性和可维护性,还增强了应用程序的灵活性和扩展性。 ... [详细]
  • 为了优化直播应用底部聊天框的弹出机制,确保在不同设备上的布局稳定性和兼容性,特别是在配备虚拟按键的设备上,我们对用户交互流程进行了调整。首次打开应用时,需先点击首个输入框以准确获取键盘高度,避免直接点击第二个输入框导致的整体布局挤压问题。此优化通过调整 `activity_main.xml` 布局文件实现,确保了更好的用户体验和界面适配。 ... [详细]
  • 本文深入探讨了 Python Watchdog 库的使用方法和应用场景。通过详细的代码示例,展示了如何利用 Watchdog 监控文件系统的变化,包括文件的创建、修改和删除等操作。文章不仅介绍了 Watchdog 的基本功能,还探讨了其在实际项目中的高级应用,如日志监控和自动化任务触发。读者将能够全面了解 Watchdog 的工作原理及其在不同场景下的应用技巧。 ... [详细]
  • Go语言中的高效排序与搜索算法解析
    在探讨Go语言中高效的排序与搜索算法时,本文深入分析了Go语言提供的内置排序功能及其优化策略。通过实例代码,详细讲解了如何利用Go语言的标准库实现快速、高效的排序和搜索操作,为开发者提供了实用的编程指导。 ... [详细]
  • 深入解析 Spring MVC 的核心原理与应用实践
    本文将详细探讨Spring MVC的核心原理及其实际应用,首先从配置web.xml文件入手,解析其在初始化过程中的关键作用,接着深入分析请求处理流程,包括控制器、视图解析器等组件的工作机制,并结合具体案例,展示如何高效利用Spring MVC进行开发,为读者提供全面的技术指导。 ... [详细]
  • PyQt5 QTextEdit:深入解析Python中多功能GUI库的应用与实现
    本文详细探讨了 PyQt5 中 QTextEdit 组件在 Python 多功能 GUI 库中的应用与实现。PyQt5 是 Qt 框架的 Python 绑定,提供了超过 620 个类和 6000 个函数及方法,广泛应用于跨平台应用程序开发。QTextEdit 作为其中的重要组件,支持丰富的文本编辑功能,如富文本格式、文本高亮和自定义样式等。PyQt5 的流行性不仅在于其强大的功能,还在于其易用性和灵活性,使其成为开发复杂用户界面的理想选择。 ... [详细]
  • 本课程详细解析了Spring AOP的核心概念及其增强机制,涵盖前置增强、后置增强和环绕增强等类型。通过具体示例,深入探讨了如何在实际开发中有效运用这些增强技术,以提升代码的模块化和可维护性。此外,还介绍了Spring AOP在异常处理和性能监控等场景中的应用,帮助开发者更好地理解和掌握这一强大工具。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • Python正则表达式详解:掌握数量词用法轻松上手
    Python正则表达式详解:掌握数量词用法轻松上手 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • 在一系列的学习与实践后,Jsoup学习笔记系列即将进入尾声。本文详细介绍了如何使用Jsoup实现从Saz文件到Csv格式的数据解析功能。未来,计划将此功能进一步封装,开发成具有用户界面的独立应用程序,以增强其实用性和便捷性。对于希望深入掌握Jsoup技术的开发者,本文提供了宝贵的参考和实践案例。 ... [详细]
author-avatar
海角处回忆_417
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有