在云上jupylab(codelab)常用的shell命令

1、切换当前文件目录位置:

bash 复制代码
%cd  /project/train/

2、删除目标文件夹和文件夹下面的内容,注意这个r是不能少的:

bash 复制代码
!rm  -r /project/train/src_repo/dataset

3、创建数据集相关文件夹

bash 复制代码
!mkdir /project/train/src_repo/dataset

4、复制指定后缀名的文件到,指定的文件夹下面

bash 复制代码
!cp /home/data/2711/*.xml /project/train/src_repo/dataset/Annotations

5、执行.py文件,前面加上!python即可

bash 复制代码
!python /project/train/src_repo/dataset/voc_label.py

6、使用bash命令执行指定的.sh文件

bash 复制代码
!bash /project/train/src_repo/run.sh

7、对xml文件进行标签处理转变为coco数据标签格式常用的python代码如下:

先对数据集进行分类(训练集,测试集,验证集)

python 复制代码
import os  
import random  
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--xml_path', type=str, help='input xml label path')
parser.add_argument('--txt_path', type=str, help='output txt label path')
opt = parser.parse_args()

trainval_percent = 1.0
train_percent = 0.9  
xmlfilepath = opt.xml_path  
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)  
if not os.path.exists(txtsavepath):
  os.makedirs(txtsavepath)

num=len(total_xml)  
list=range(num)  

ftrainval = open(txtsavepath + '/trainval.txt', 'w')  
ftest = open(txtsavepath + '/test.txt', 'w')  
ftrain = open(txtsavepath + '/train.txt', 'w')  
fval = open(txtsavepath + '/val.txt', 'w')  

for i in list:
    name=total_xml[i][:-4]+'\n'  
    ftrainval.write(name)  
    if i%7 == 0:
        fval.write(name)
    else:
        ftrain.write(name)  

ftrainval.close()  
ftrain.close()  
fval.close()  
ftest.close()  

这段代码主要做的是将一些XML标签文件进行划分,分成训练集、验证集、测试集三部分。

首先,代码导入了三个模块:osrandomargparse

然后,使用argparse模块创建了一个命令行参数解析器,并添加了两个命令行参数:--xml_path--txt_path。这两个参数分别用于指定输入的XML标签路径和输出的TXT标签路径。

之后,代码定义了两个变量:trainval_percenttrain_percent,分别设置为1.0和0.9。这两个变量可能是用于设置训练集和总数据集的比例,但在这个代码段中并未使用。

然后,代码获取了用户通过命令行参数指定的XML文件路径和TXT文件保存路径,并列出了指定路径下的所有XML文件。

如果指定的TXT文件保存路径不存在,代码会创建这个路径。

接着,代码定义了四个文件对象:ftrainvalftestftrainfval,用于写入四个不同的TXT文件。

最后,代码遍历了所有的XML文件,将每个文件的名称(去掉后缀)写入到ftrainval文件中。每写入7个文件名,就将下一个文件名写入到fval文件中,其他的都写入到ftrain文件中。

在完成所有写入操作后,代码关闭了所有文件对象。

这样,就完成了将XML标签文件划分成训练集、验证集和测试集的操作。需要注意的是,这个代码段并没有使用随机打乱数据,也没有按照实际的比例划分数据集,可能还需要进一步的处理才能满足实际需求。

下面这个是读取xml文件的内容,并且写入到指定的txt文件下面

python 复制代码
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets=['train', 'val', 'test']
classes = ['head']

abs_path = os.getcwd()
def convert(size, box):
    dw = 1./(size[0])
    dh = 1./(size[1])
    x = (box[0] + box[1])/2.0 - 1
    y = (box[2] + box[3])/2.0 - 1
    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('/home/data/2718/%s.xml'%( image_id))  
    out_file = open('/project/train/src_repo/dataset/labels/%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 = obj.find('difficult').text
        cls = obj.find('name').text
        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')

for image_set in sets:
    if not os.path.exists('/project/train/src_repo/dataset/labels/'):
        os.makedirs('/project/train/src_repo/dataset/labels/')
    image_ids = open('/project/train/src_repo/dataset/ImageSets/Main/%s.txt'%(image_set)).read().strip().split()
    list_file = open('/project/train/src_repo/dataset/%s.txt'%(image_set), 'w')
    for image_id in image_ids:
        list_file.write('/project/train/src_repo/dataset/images/%s.jpg\n'%(image_id))
        convert_annotation(image_id)
    list_file.close()   

首先,导入了一些需要的模块,包括xml.etree.ElementTree用于解析XML文件,pickle用于序列化和反序列化Python对象,os用于操作系统相关的操作,getcwd获取当前工作目录,listdir列出一个目录中的文件名,join连接路径的元素。

然后,定义了一些变量,包括三个数据集名称sets和一个类别名称classes

接下来,定义了一个函数convert,它接收两个参数:sizebox。这个函数将一个矩形框(box)转换为标准化的形式。标准化的过程是将矩形框的左上角坐标(x,y)和宽度高度(w,h)进行变换,变换的公式是:x = (box[0] + box[1])/2.0 - 1 和 y = (box[2] + box[3])/2.0 - 1,并且 w = box[1] - box[0] 和 h = box[3] - box[2]。然后这个函数返回转换后的坐标和尺寸。

再下面,定义了一个函数convert_annotation,这个函数用于处理单个图片的XML标注文件。它首先打开图片的XML文件,解析XML树,获取到图片的大小以及所有的对象(在这里是目标)。然后对于每一个目标,如果它在类别列表中,就获取其边界框并使用上述的转换函数进行转换,然后将类别ID和转换后的边界框写入到一个新的文本文件中。

最后,对于每个数据集,首先检查输出文件夹是否存在,如果不存在就创建。然后读取该数据集的所有图片ID,对于每个图片ID,调用上述函数处理其对应的XML文件,然后将图片的路径写入到一个新的文本文件中。

需要注意的是,这段代码假设所有的图片和标注文件都在指定的路径下,如果不在这个路径下需要进行相应的修改。另外,这段代码处理的是VOC格式的XML标注文件,如果你使用的是其他格式的标注文件可能需要进行一些修改。

最后注意 CoCo数据集的格式是每一行作为一个label(包含分类序号,中心点的坐标,宽度,高度,都需要进行归一化)

相关推荐
liebe1*11 分钟前
第七章 防火墙地址转换
运维·服务器·网络
好好学操作系统7 分钟前
autodl 保存 数据 跨区
linux·运维·服务器
dbitc9 分钟前
WIN11把WSL2移动安装目录
linux·运维·ubuntu·wsl
KingRumn9 分钟前
Linux同步机制之信号量
linux·服务器·网络
嵌入式学习菌10 分钟前
SPIFFS文件系统
服务器·物联网
旺仔Sec10 分钟前
2026年度河北省职业院校技能竞赛“Web技术”(高职组)赛项竞赛任务
运维·服务器·前端
BullSmall31 分钟前
linux 根据端口查看进程
linux·运维·服务器
herinspace35 分钟前
管家婆软件年结存后快马商城操作注意事项
服务器·数据库·windows
_F_y41 分钟前
Linux:进程间通信
linux
嘻哈baby42 分钟前
Ansible自动化运维入门:从手工到批量部署
运维·自动化·ansible