深度学习之图像打标签及json转化xml指南

本篇文章主要介绍如何对初始数据集的图像数据打标签,以及如何将打标签之后的json格式的数据转化为可以直接进行训练的xml格式。

一、如何打标签

1、获得一份jpg格式的图像数据集

2、在电脑开始栏输入cmd,打开命令窗口,输入pip install labelme,等待安装完成,输入labelme,打开界面

3、点击打开目录,找到存储图像数据集的文件夹,右侧的文件列表显示该文件夹当中所有的图片

4、按住CTRL+R键,选择你要打标记的区域,点击两下鼠标左键,形成一个矩形框,对该分类进行命名,点击ok。点击文件→自动保存,生成的 json文件会自动保存在当前图像数据集的文件夹当中,点击下一幅,右侧文件列表会打勾,显示图像数据集的标注进度。重复此步骤,直到所有图像都被打上标签为止。最后,文件夹内每幅图像对应一个json文件

注:

Ⅰ 如果图像有多个类别,那么针对不同类别应归为不同标签之内

Ⅱ 可在属性当中查看文件夹中图像个数

二、如何进行数据格式转化

1、目标

获得一份拥有Annocations、ImageSets、JPEGImages三个子文件夹的VOCdevkit文件夹

2、python代码
import os
import numpy as np
import codecs
import json
import glob
import cv2
import shutil
from sklearn.model_selection import train_test_split

# 1.标签路径
labelme_path = "E:\\JPEGImages"  # 原始labelme标注数据路径
saved_path = "E:\\VOCdevkit"  # 保存路径

# 2.创建要求文件夹
dst_annotation_dir = os.path.join(saved_path, 'Annotations')
if not os.path.exists(dst_annotation_dir):
    os.makedirs(dst_annotation_dir)
dst_image_dir = os.path.join(saved_path, "JPEGImages")
if not os.path.exists(dst_image_dir):
    os.makedirs(dst_image_dir)
dst_main_dir = os.path.join(saved_path, "ImageSets", "Main")
if not os.path.exists(dst_main_dir):
    os.makedirs(dst_main_dir)

# 3.获取待处理文件
org_json_files = sorted(glob.glob(os.path.join(labelme_path, '*.json')))
org_json_file_names = [i.split("\\")[-1].split(".json")[0] for i in org_json_files]
org_img_files = sorted(glob.glob(os.path.join(labelme_path, '*.jpeg')))
org_img_file_names = [i.split("\\")[-1].split(".jpeg")[0] for i in org_img_files]

# 4.labelme file to voc dataset
for i, json_file_ in enumerate(org_json_files):
    json_file = json.load(open(json_file_, "r", encoding="utf-8"))
    image_path = os.path.join(labelme_path, org_json_file_names[i]+'.jpeg')
    img = cv2.imread(image_path)
    height, width, channels = img.shape
    dst_image_path = os.path.join(dst_image_dir, "{:06d}.jpeg".format(i))
    cv2.imwrite(dst_image_path, img)
    dst_annotation_path = os.path.join(dst_annotation_dir, '{:06d}.xml'.format(i))
    with codecs.open(dst_annotation_path, "w", "utf-8") as xml:
        xml.write('<annotation>\n')
        xml.write('\t<folder>' + 'Pin_detection' + '</folder>\n')
        xml.write('\t<filename>' + "{:06d}.jpeg".format(i) + '</filename>\n')
        # xml.write('\t<source>\n')
        # xml.write('\t\t<database>The UAV autolanding</database>\n')
        # xml.write('\t\t<annotation>UAV AutoLanding</annotation>\n')
        # xml.write('\t\t<image>flickr</image>\n')
        # xml.write('\t\t<flickrid>NULL</flickrid>\n')
        # xml.write('\t</source>\n')
        # xml.write('\t<owner>\n')
        # xml.write('\t\t<flickrid>NULL</flickrid>\n')
        # xml.write('\t\t<name>ChaojieZhu</name>\n')
        # xml.write('\t</owner>\n')
        xml.write('\t<size>\n')
        xml.write('\t\t<width>' + str(width) + '</width>\n')
        xml.write('\t\t<height>' + str(height) + '</height>\n')
        xml.write('\t\t<depth>' + str(channels) + '</depth>\n')
        xml.write('\t</size>\n')
        xml.write('\t\t<segmented>0</segmented>\n')
        for multi in json_file["shapes"]:
            points = np.array(multi["points"])
            xmin = min(points[:, 0])
            xmax = max(points[:, 0])
            ymin = min(points[:, 1])
            ymax = max(points[:, 1])
            label = multi["label"]
            if xmax <= xmin:
                pass
            elif ymax <= ymin:
                pass
            else:
                xml.write('\t<object>\n')
                xml.write('\t\t<name>' + label + '</name>\n')
                xml.write('\t\t<pose>Unspecified</pose>\n')
                xml.write('\t\t<truncated>1</truncated>\n')
                xml.write('\t\t<difficult>0</difficult>\n')
                xml.write('\t\t<bndbox>\n')
                xml.write('\t\t\t<xmin>' + str(xmin) + '</xmin>\n')
                xml.write('\t\t\t<ymin>' + str(ymin) + '</ymin>\n')
                xml.write('\t\t\t<xmax>' + str(xmax) + '</xmax>\n')
                xml.write('\t\t\t<ymax>' + str(ymax) + '</ymax>\n')
                xml.write('\t\t</bndbox>\n')
                xml.write('\t</object>\n')
                print(json_file_, xmin, ymin, xmax, ymax, label)
        xml.write('</annotation>')

# 5.split files for txt
train_file = os.path.join(dst_main_dir, 'train.txt')
trainval_file = os.path.join(dst_main_dir, 'trainval.txt')
val_file = os.path.join(dst_main_dir, 'val.txt')
test_file = os.path.join(dst_main_dir, 'test.txt')

ftrain = open(train_file, 'w')
ftrainval = open(trainval_file, 'w')
fval = open(val_file, 'w')
ftest = open(test_file, 'w')

total_annotation_files = glob.glob(os.path.join(dst_annotation_dir, "*.xml"))
total_annotation_names = [i.split("\\")[-1].split(".xml")[0] for i in total_annotation_files]

# test_filepath = ""
for file in total_annotation_names:
    ftrainval.writelines(file + '\n')
# test
# for file in os.listdir(test_filepath):
#    ftest.write(file.split(".jpg")[0] + "\n")
# split
train_files, val_files = train_test_split(total_annotation_names, test_size=0.2)
# train
for file in train_files:
    ftrain.write(file + '\n')
# val
for file in val_files:
    fval.write(file + '\n')

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

注:

Ⅰ 该代码需要修改的地方如下,需要将其更改为自己的文件路径

labelme_path = "E:\\JPEGImages"  # 原始labelme标注数据路径
saved_path = "E:\\VOCdekit"  # 保存路径

Ⅱ 如果图像数据集为jpeg格式,需将代码中所有的"jpg"替换为"jpeg"

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 深度学习是一种机器学习的方法,它可以通过大量的数据和神经网络模型来进行模式识别和特征提取。而JSON是一种轻量级的数据交换格式,它在现代互联网应用中被广泛使用。 深度学习JSON之间的转化需要注意以下几点: 1. 数据准备:首先,需要将原始数据准备成适合深度学习模型的格式。在处理文本数据时,可以将文本内容转化为向量或矩阵表示,以便输入到深度学习模型中。可以使用词袋模型、词嵌入等技术进行文本向量化。对于图像数据,可以将图像转化为像素矩阵或使用卷积神经网络提取图像特征。 2. JSON数据加载:将JSON数据加载到程序中,可以使用现有的JSON库来进行解析和处理。常见的JSON库有jsoncpp、json-c、rapidjson等。这些库可以实现JSON数据的解析、读取和写入操作,提供了方便的API。 3. 数据转换:根据具体的深度学习任务,可以将JSON数据转化为适用于深度学习模型的输入格式。例如,可以将JSON中的标签信息转化为独热编码、数值特征等形式,以便输入到深度学习模型中进行训练。 4. 深度学习模型训练和预测:根据处理好的数据,可以利用深度学习框架(如TensorFlow、PyTorch)来构建、训练和评估模型。深度学习模型的训练过程一般包括前向传播、计算损失、反向传播等步骤。模型训练完成后,可以使用该模型对新的JSON数据进行预测和分类。 总之,深度学习JSON的结合可以帮助我们更好地进行数据处理和模型训练。合理地转化JSON数据,将其应用于深度学习模型中,可以提高模型的效果和应用的可行性。 ### 回答2: 深度学习是一种机器学习的方法,它通过构建具有多个隐藏层的神经网络来模拟人类大脑的工作方式。Json是一种常用的数据格式,用于存储和传输结构化的数据。将Json标签转化深度学习模型可以通过以下步骤实现: 首先,需要将Json数据转化为可以被深度学习模型处理的数据格式。可以使用Python中的json库来读取Json文件,并将其转化为可用于输入神经网络的数据结构,例如NumPy数组或Pandas DataFrame。 接下来,需要将Json标签进行编码。对于分类问题,可以使用独热编码或标签编码。独热编码将每个标签编码为一个二进制向量,其中只有一个元素为1,其余元素均为0。标签编码将每个标签编码为一个整数值。可以使用scikit-learn库中的LabelEncoder类来进行标签编码。 然后,需要将编码后的标签与相应的数据样本一起输入深度学习模型进行训练。可以使用各种深度学习框架,例如TensorFlow或PyTorch,来构建和训练深度学习模型。 在模型训练完成后,可以使用模型对新的Json标签进行预测。将新的Json数据转化为可用于输入模型的数据格式,并使用已经训练好的模型进行预测。预测结果可以是分类标签或概率值,取决于具体的深度学习模型和任务。 总而言之,深度学习可以通过将Json标签转化为可用于模型训练和预测的数据格式,来解决各种与Json数据相关的问题。这种转化过程可以通过适当的编码方法和深度学习框架来实现。 ### 回答3: 深度学习中,常常需要将数据以某种格式进行标签化,以便机器能够理解和处理。而JSON(JavaScript Object Notation)是一种常用的数据交换格式,它具有结构清晰、易于阅读和编写的特点,因此在深度学习中往往选择使用JSON进行数据标签转化。 在深度学习中,将数据转化JSON标签可以按照以下步骤进行: 1. 确定数据的标签结构:根据数据的特点和需求,确定数据应该包含哪些标签标签的层次结构。例如,对于图像数据,可以包含图像的类别、尺寸、通道等标签。 2. 使用编程语言解析数据:根据数据的格式,选择合适的编程语言和库来解析数据。常用的编程语言有Python和JavaScript,常用的库如jsonjsonlib等。 3. 将数据转化JSON格式:根据标签结构和编程语言的语法,将数据转化JSON格式。可以使用编程语言提供的函数和方法来实现这一步骤。一般来说,可以将数据转化JSON对象或JSON数组的形式。 4. 验证JSON格式的正确性:在转化完成后,需要验证生成的JSON格式是否正确。可以使用在线的JSON格式验证工具或编程语言提供的JSON验证函数来进行验证。 5. 存储和使用JSON数据:将生成的JSON数据存储到文件或数据库中,以便之后的使用。在深度学习中,可以将JSON数据用作训练数据、验证数据或测试数据。 总之,深度学习中的JSON标签转化是将数据转化JSON格式的一种方法,它可以方便地表示和传递复杂的数据结构,为机器学习算法提供输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值