鱼C论坛

 找回密码
 立即注册
查看: 86|回复: 4

有批量改名称的代码,解释下什么意思?

[复制链接]
发表于 2024-6-12 23:01:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
main.py
import os
import cv2


if __name__ == '__main__':
    imgs = os.listdir('./Images')
    xml = os.listdir('./Annotations')

    i = 0
    for img in imgs:
        i = i + 1
        os.rename('./Images/'+img, './Images/data'+str(i)+img[-4:])
        os.rename('./Annotations/'+img[0:-4]+'.xml', './Annotations/data'+str(i)+'.xml')
        print(img)
1.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import copy
from lxml.etree import Element, SubElement, tostring, ElementTree

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

classes = ['XXX','XXX']  # 类别

CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))


def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)


def convert_annotation(image_id):
    in_file = open('./Annotations\%s.xml' % (image_id), encoding='UTF-8')

    out_file = open('./labels/%s.txt' % (image_id), 'w')  # 生成txt格式文件
    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'):
        cls = obj.find('name').text
        # print(cls)
        if cls not in classes:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


xml_path = os.path.join(CURRENT_DIR, 'Annotations/')

# xml list
img_xmls = os.listdir(xml_path)
for img_xml in img_xmls:
    label_name = img_xml.split('.')[0]
    print(label_name)
    convert_annotation(label_name)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-12 23:01:45 | 显示全部楼层
这个脚本是用来将图像数据集中的图片和对应的标注文件的文件名进行批量修改的。首先,它会遍历指定目录下的图片和标注文件,然后给它们重新命名,添加了"data"前缀,并在文件名中加上一个递增的数字,以便更好地对应。

但是有个小问题,你看到了吗?在第一个代码中的文件名修改部分,标注文件的后缀 `.xml` 会被 `.img.xml`替代,而在第二个代码中读取标注文件时,使用的是原本的后缀 `.xml`。这个问题需要修复。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-12 23:02:50 | 显示全部楼层
FishC 发表于 2024-6-12 23:01
这个脚本是用来将图像数据集中的图片和对应的标注文件的文件名进行批量修改的。首先,它会遍历指定目录下的 ...

详细的每一句什么意思呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-12 23:04:11 | 显示全部楼层
chen` 发表于 2024-06-12 23:02
详细的每一句什么意思呢?


这个脚本主要用于批量修改图像数据集中的图片和对应的标注文件的文件名。让我逐行解释:
import os
import cv2
这里导入了两个Python模块,一个是用于处理操作系统相关功能的`os`模块,另一个是用于图像处理的`cv2`模块(OpenCV)。
if __name__ == '__main__':
这个条件语句检查当前脚本是否作为主程序运行。
imgs = os.listdir('./Images')
    xml = os.listdir('./Annotations')
`os.listdir()`函数用于列出指定目录中的文件名。这里分别列出了存储图片的目录和存储标注文件的目录下的所有文件名,并分别存储在`imgs`和`xml`变量中。
i = 0
    for img in imgs:
        i = i + 1
        os.rename('./Images/'+img, './Images/data'+str(i)+img)
        os.rename('./Annotations/'+img+'.xml', './Annotations/data'+str(i)+'.xml')
        print(img)
这个循环遍历图片目录下的所有图片文件。对于每个图片文件,使用`os.rename()`函数给它重新命名,添加了"data"前缀,并在文件名中加上一个递增的数字。同时,使用相同的方式修改对应的标注文件名。最后,打印出每个图片文件名。

在第二个代码中,主要是读取标注文件并将其转换成特定格式的文本文件。
def convert_annotation(image_id):
这个函数用于将标注文件转换为特定格式的文本文件。`image_id`是图片文件名,也是标注文件名的一部分。
in_file = open('./Annotations\%s.xml' % (image_id), encoding='UTF-8')
打开标注文件,`%s`会被替换成`image_id`指定的文件名。
out_file = open('./labels/%s.txt' % (image_id), 'w')
创建一个文本文件用于存储转换后的标注信息,文件名与图片文件名对应,但是后缀改为`.txt`。
for obj in root.iter('object'):
遍历标注文件中的所有对象。
xmlbox = obj.find('bndbox')
找到对象的边界框信息。
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
获取边界框的坐标信息。
bb = convert((w, h), b)
调用`convert()`函数将坐标信息转换成特定格式。
out_file.write(str(cls_id) + " " + " ".join() + '\n')
将转换后的信息写入文本文件中。

在最后的部分,脚本列出了存储标注文件的目录下的所有文件名,并对每个文件调用`convert_annotation()`函数进行处理。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-13 22:33:38 | 显示全部楼层
类别名改的是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-25 13:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表