目标检测自动标注python脚本

2023-05-16

在需要大量标注数据时,可以先用少量样本训练一个模型,在模型大致可以正常输出类别和位置坐标的情况下进行自动标注,后续再进行少量的人工调整,可以节省很大的精力(自动标注的格式仿照labelimg标注的VOC格式):

import shutil
import os
from xml.etree import cElementTree as ET
from PIL import Image
import cv2


def write_xml(img_path, boxes):
    '''
    img_path :  图片的绝对路径
    boxes   :   图像的预测结果 [[cls,x1,y1,x2,y2],
                             [cls,x1,y1,x2,y2],
                             ................]
    '''

    img = cv2.imread(img_path)
    h, w, d = img.shape
    img_name = img_path.split("/")[-1:][0]
    file_dir = img_path.split("/")[-2]                       #图片存放文件夹的名称
    xml_dir = os.path.join(os.path.dirname(img_path),"xml_labels")

    if os.path.exists(xml_dir)==False:
        os.mkdir(xml_dir)
    xml_path = os.path.join(xml_dir, img_name.split(".")[0]+".xml" )       #需要写入的xml的绝对路径

    doc = ET.Element('annotation')                          # 树根
    folder = ET.SubElement(doc, "folder")                   # 文件夹
    folder.text = file_dir                                  # 文件夹--------填值
    filename = ET.SubElement(doc, "filename")               # 文件名
    filename.text = img_path.split("/")[-1:][0]             # 文件名--------填值

    path = ET.SubElement(doc, 'path')                       # 绝对路径
    path.text = img_path                                    # 绝对路径------填值
    source = ET.SubElement(doc, "source")                   # 来源
    database = ET.SubElement(source, "database")            # 数据库
    database.text = str('Unknown')                          # 数据库--------填值      --默认
    size = ET.SubElement(doc, 'size')                       # 图片大小
    width = ET.SubElement(size, 'width')                    # 图片的宽度
    width.text = str(w)                                     # 图片宽度-----填值
    height = ET.SubElement(size, 'height')                  # 图片高度
    height.text = str(h)                                    # 图片高度-----填值
    depth = ET.SubElement(size, 'depth')                    # 通道数
    depth.text = str(d)                                     # 通道数-------填值
    segmented = ET.SubElement(doc, "segmented")             # 分割
    segmented.text = str(0)                                 # 分割--------填值
    for i,box in enumerate(boxes):
        cls,x1,y1,x2,y2 = box
        object = ET.SubElement(doc, "object")               # 物体
        name = ET.SubElement(object, 'name')                # 物体名称
        name.text = cls                                     # 物体名称-----填值
        pose = ET.SubElement(object, "pose")                # 姿势
        pose.text = str("Unspecified")                      # 姿势---------填值      --默认
        truncated = ET.SubElement(object, "truncated")      # 截断
        truncated.text = str('0')                           # 截断---------填值      --默认
        difficult = ET.SubElement(object, "difficult")      # 困难样本
        difficult.text = str('0')                           # 困难样本------填值      --默认
        bndbox = ET.SubElement(object, 'bndbox')            # 矩形框
        xmin = ET.SubElement(bndbox, 'xmin')                # x1
        xmin.text = str(x1)                                 # x1-----------填值
        ymin = ET.SubElement(bndbox, 'ymin')                # y1
        ymin.text = str(y1)                                 # y1-----------填值
        xmax = ET.SubElement(bndbox, 'xmax')                # x2
        xmax.text = str(x2)                                 # x2-----------填值
        ymax = ET.SubElement(bndbox, 'ymax')                # y2
        ymax.text = str(y2)                                 # y2-----------填值

        tree = ET.ElementTree(doc)
        tree.write(xml_path, encoding='utf-8')
    print("[{}] -----------------------------finished !! !".format(xml_path))

if __name__ == '__main__':

    img_path = "1.jpg"          
    boxes = [['cls1', 23, 46, 90, 120], ['cls2', 60, 100, 300, 200]]
    write_xml(img_path,boxes)                   #传入预测结果和图片的绝对路径

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

目标检测自动标注python脚本 的相关文章

  • ubuntu14.04 samba服务器安装配置

    Data 2016 12 19 Author cjh Theme samba install andconfiguration 在介绍如何安装配置samba之前 xff0c 先简单介绍linux中两个命令的区别分别是update和upgra
  • 在数组中进行图形绘制

    include lt stdio h gt define k 2 43 1 define 2 define s 0 static unsigned short stop 61 s k k k k k k k s k k k k k k k
  • socket函数

    转自 xff1a http blog csdn net guoping16 article details 6584382 1 基本套接字函数 xff08 1 xff09 socket函数原型 socket 建立一个socket文件描述符
  • 进程与线程

    第一章 xff1a 计算机系统漫游 进程 xff1a 进程是操作系统对一个正在运行的程序的一种抽象 xff0c 一个系统可以同时运行多个进程 xff0c 看上去是CPU并发的执行多个程序 xff0c 实际上是通过进程切换来实现的 xff0c
  • GDI GDI+ 的区别

    转载自 xff1a http www cnblogs com lidabo p 3701252 html GDI 43 是GDI的下一个版本 xff0c 它进行了很好的改进 xff0c 并且易用性更好 GDI的一个好处就是你不必知道任何关于
  • GDI GDI+ 的区别

    转载自 xff1a http www cnblogs com lidabo p 3701252 html GDI 43 是GDI的下一个版本 xff0c 它进行了很好的改进 xff0c 并且易用性更好 GDI的一个好处就是你不必知道任何关于
  • 使用的DockPanel的心得

    使用这个控件的时候后一定要先Show this DockPlan1 才能使用DockTo this DockPlan1 DockStyle Bottom 固定位置 xff0c 否则会抛出异常
  • C#使用双缓冲解决绘图闪屏的问题

    最近在工作需要使用C 绘制图形 xff0c 看了一下绘制的函数觉得很简单就开始着手工作了 xff0c 但是在实际应用的时候发现鼠标进行绘制的时候会闪屏 xff0c 原因是图元重绘的时间不一致 xff0c 百度一下有很多更详细的 xff0c
  • 关于捕获键盘信息的processDialogkey方法

    转载自 xff1a http blog csdn net lucifinil s article details 6318189 在一些控件里的keydown方法 xff0c 没有办法捕获所有的按键消息 比如自己写一个窗体控件库 xff0c
  • C#泛型委托

    因为项目原因最近要使用C 进行编程 xff0c 于是每天现学现卖一点一点的进行开发 之前很长的时间一直使用C和C 43 43 进行编程 xff0c 于是转到C 一开始开始不是特别适应的 xff0c 特别是C 这门语言没有了指针 xff0c
  • 基于windows的Ubuntu双系统安装

    Data 2016 12 19 Author cjh Theme Ubuntu dual system installation 前期准备 1 Ubuntu相关版本镜像ios 2 UltraISO 用于制作U盘启动盘 3 EasyBCD 2
  • 汇编文件.S和.s的区别

    c C 原始程序 xff1b 预处理 编译 汇编 C C 43 43 原始程序 xff1b 预处理 编译 汇编 ccC 43 43 原始程序 xff1b 预处理 编译 汇编 cxx C 43 43 原始程序 xff1b 预处理 编译 汇编
  • 串口网口数据帧解析(支持连包、断传、错误数据过滤)

    本文转载自 xff1a https blog csdn net hwb 1988 article details 45872379 嵌入式系统中 xff0c 关于数据接受部分确实思考了很多 xff0c 下面总结下个人经验 关于串口传输 xf
  • Use of $Super$ $  and$Sub$ $to patch symbol definitions

    在无法修改现有符号的情况下 xff0c 可以使用特殊模式 现有符号无法修改 xff0c 例如 xff0c 如果它位于外部库或ROM代码中 在这种情况下 xff0c 您可以使用 Super 和 Sub 模式来修补现有符号 修补函数foo xf
  • RT-Thread内核移植

    记录代码移植过程 xff0c 成功一步记录一步 第一步 xff1a 建立裸机程序 使用STM32CubeMx建立一个裸机程序 生成MDK5工程 第二步 xff1a 参考0 bare metal完成board c board h文件 在Dri
  • C#委托和事件框架封装简写 delegate、event、Action、EventHandler

    曾经 Net大佬只有一个Delegete 委托 xff0c 别人想用委托的时候 xff0c 必须得用delegate关键字来定义一个委托 xff0c 就像这样 span class token comment 定义一个无返回值的 xff0c
  • CentOS 7 firewalld使用简介

    学习apache安装的时候需要打开80端口 xff0c 由于centos 7版本以后默认使用firewalld后 xff0c 网上关于iptables的设置方法已经不管用了 xff0c 想着反正iptable也不会用 xff0c 索性直接搬
  • 通过VNC访问docker容器的图形界面

    https hub docker com r dorowu ubuntu desktop lxde vnc https github com fcwu docker ubuntu vnc desktop docker ubuntu vnc
  • 阿里云产品图标

    2022年最新 最全的阿里云产品图标 xff0c 矢量图哦 xff0c 留下你的邮箱 xff0c 我发给你 2022年最新阿里云产品图标 有200多个图标 随时可以拿来用 为了可以审批通过 我在这里多写点字 我平时都是用这些图标 用来做设计
  • 论文引用:参考文献GB/T 7714、APA、MLA的自动生成

    一 谷歌学术 1 谷歌学术镜像 xff1a 谷歌学术镜像 Google学术搜索导航 64 思谋学术 xff0c 随意点进去一个链接 2 搜索需要的论文 xff0c 点击下方引用小标志 3 根据自己需要的引用标准 xff0c 选择复制 注 x

随机推荐