提取objects365中的部分图像类别并转换为yolo输入格式

import os
import argparse



import json
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
import cv2
import shutil
import os
import subprocess
import argparse
import glob
from tqdm import tqdm
import time


# cellphone:79 key:266 handbag:13 laptop:77
# classes_names = {79: "cellphone", 266: "key", 13: "handbag", 77: "laptop"}

def save_annotations( anno_file_path, imgs_file_path,output_dir,objects_2_my_classes):
    '''
    :param classes_names: #如果该种类比如1 3被选取那么{1:person,3:chair}
    :param anno_file_path:  # D:\jsonProcess\input\val.json
    :param imgs_file_path:  # #D:\jsonProcess\input\image
    :param output_dir:  /output
    :return:
    '''
    # open json file(val.json or train.json)
    with open(anno_file_path, 'r') as f:
        data = json.load(f)
        # 900w+
        print("anno count:", len(data["annotations"]))
        print("image count:", len(data["images"]))
        img_map = {}    #编号到宽,高,名的映射354609->{}
        img_2_anno = {} #编号到类别,bbox等的映射354609->[{},{}]
        name_2_id={}    #名称到编号映射obj365_val_000000354609.jpg->354609
        images_in_dir = set(os.listdir(imgs_file_path)) #查找时间复杂度O(1)
        for i in data["images"]:
            if i["file_name"] in images_in_dir:
                img_map[i["id"]] = i    # {354609:{'id': 354609, 'height': 512, 'file_name': 'obj365_val_000000354609.jpg', 'width': 683},567733:{'image_id': 567733, 'area': 238074.4957648346, 'category_id': 1, 'id': 4, 'iscrowd': 0, 'bbox': [71.744506816, 60.36883545599999, 568.121826176, 419.055358896]}}
                img_2_anno[i["id"]] = []    #{354609:[],567733:[]}一口气弄完了
                name_2_id[i["file_name"]]=i["id"]
        for anno in data["annotations"]:#一口气弄完了
            if anno["image_id"] in img_map.keys() and anno["category_id"] in objects_2_my_classes.keys(): #如果文件夹里有该照片且该照片有需要的类
                anno["category_id"]=objects_2_my_classes[anno["category_id"]]   #换到我自己的类
                img_2_anno[anno["image_id"]].append(anno)   #{354609:[{'image_id': 354609, 'area': 13467.531777104436, 'category_id': 3, 'id': 1, 'iscrowd': 0, 'bbox': [289.74798586220004, 215.75781248, 127.72149654100002, 105.44451906559996]},{'image_id': 354609, 'area': 54688.424399724776, 'category_id': 3, 'id': 2, 'iscrowd': 0, 'bbox': [339.4999999909, 279.6185912832, 258.41333009830004, 211.6315918336]}]}
        # del data
        for _, id in enumerate(img_2_anno):#开始一张张处理图片
            annos = img_2_anno[id]  #354609对应的[{'image_id': 354609, 'area': 13467.531777104436, 'category_id': 3, 'id': 1, 'iscrowd': 0, 'bbox': [289.74798586220004, 215.75781248, 127.72149654100002, 105.44451906559996]},{'image_id': 354609, 'area': 54688.424399724776, 'category_id': 3, 'id': 2, 'iscrowd': 0, 'bbox': [339.4999999909, 279.6185912832, 258.41333009830004, 211.6315918336]}]
            if len(annos) > 0:  #有所要识别的对象
                img = img_map[id]
                img_width = img["width"]
                img_height = img["height"]
                objs = []
                for anno in annos:
                    bbox = anno["bbox"]
                    x = min(max(bbox[0]+bbox[2]/2,0)/img_width,1)   #大于0小于1(有标记有误差的的)
                    y = min(max(bbox[1]+bbox[3]/2,0)/img_height,1)
                    w =min(max(bbox[2]/img_width,0),1)
                    h=min(max(bbox[3]/img_height,0),1)
                    my_class_id = anno["category_id"]
                    obj = [my_class_id, x, y, w, h]
                    objs.append(obj)
                shutil.copy(os.path.join(imgs_file_path,img_map[id]['file_name']),os.path.join(output_dir,"images",'train'))    #复制图片到文件夹
                write_txt(output_dir,img_map[id]['file_name'],objs)
    print(" conver is done ")


def write_txt(output_dir, img_name,objs):
    img_name = img_name[:-4]
    list_name = os.path.join(output_dir,"labels",'train',img_name)+".txt"
    with open(list_name, 'w', encoding='utf-8') as list_fs:
        for line in objs:        # list_f.write(lines)
            line = str(int(line[0]))+" "+str(line[1])[:6]+" "+str(line[2])[:6]+" "+str(line[3])[:6]+" "+str(line[4])[:6]+"\n"
            list_fs.write(line)
        list_fs.close()

def main_object365(classes, input_dir, output_dir):
    # use ids match classes
    '''
    :param classes: [1,2,3]
    :param input_dir: objects365
    :param output_dir: 输出
    :return:
    '''
    classes_names = {}
    object_2_my_classes={}      #由objects365对应类别序号到我的序号1,4,8->0,1,2
    for i in range(len(classes)):
        object_2_my_classes[classes[i]]=i
    anno_file_path ="/public/home/huanggroup6/train.json" # D:\jsonProcess\input\val.json
    imgs_file_path = "/public/home/huanggroup6/train_part1/train"
    save_annotations(anno_file_path, imgs_file_path,output_dir,object_2_my_classes)

def main():
    input_dir = "input"
    classes = [9,14,33,35,59,103,145]  # object365_dict.txt里面的类
    output_dir = "output"
    main_object365(classes, input_dir, output_dir)


if __name__ == '__main__':
    main()
### 回答1: EMNIST数据集是一个大型的手写数字和字母识别数据集,在将其转换YOLO可识别的数据格式之前,需要对数据进行一些处理步骤。 首先,数据集图像需要进行预处理,以确保它们的大小和分辨率符合YOLO的要求。然后,对于每个图像,需要标注其的数字或字母的位置以及相关的类别信息。 接下来,可以使用一个标注工具,如 LabelImg,将这些标注转换YOLO需要的标注格式。一般来说,YOLO需要每个图像的路径和一个包含目标框位置和类别信息的文本文件。 最后,可以将处理并标注的数据集分为训练数据集和测试数据集,然后将其输入YOLO进行训练。 总的来说,将EMNIST数据集转换YOLO可识别的数据格式需要一些数据预处理和标注步骤,但是它们对于提高模型准确性是非常有益的。 ### 回答2: EMNIST数据集是一个包含手写数字和字母的数据集,可以用于模式识别和机器学习任务。要将EMNIST数据集转换YOLO可识别的数据格式,需要进行以下步骤: 首先,加载EMNIST数据集并进行预处理。EMNIST数据集图像分辨率较低,通常为28x28像素。我们可以将图像进行缩放,将其调整为YOLO模型所需的固定大小(例如416x416像素)。这可以通过图像处理库(如OpenCV)来完成。 其次,我们需要将原始标签格式转换YOLO可识别的标签格式。EMNIST数据集的标签是整数值,表示图像的字符或数字。YOLO模型需要的是每个边界框的类别标签和包围框的位置信息。因此,我们需要将每个字符的标签转换成对应的类别标签,并计算每个边界框的位置信息(心坐标、宽度和高度)。 接下来,根据转换后的标签信息,我们需要将数据格式转换YOLO可识别的数据格式YOLO模型需要的格式是每行表示一个图像的信息,每行包括图像路径和对应的边界框信息。边界框信息包括类别标签、边界框的心坐标、宽度和高度。可以将每个图像的标签和边界框信息保存在一个文本文件。 最后,训练YOLO模型。使用经过转换的数据格式和相应的标签数据,可以进行模型的训练。可以使用YOLO的相关库和工具来进行训练,并根据训练效果进行模型的优化和调整。 通过以上步骤,可以将EMNIST数据集转换YOLO可识别的数据格式,并使用该格式进行模型训练图像识别。 ### 回答3: EMNIST数据集是一个手写字母和数字的图像数据集,通常用来进行机器学习和图像识别任务。要将它转换YOLO可识别的数据格式,我们需要按照以下步骤处理数据集: 1. 下载和导入数据集:首先,我们需要从适当的来源下载EMNIST数据集,并确保将数据集文件导入到我们的工作环境。 2. 数据预处理:接下来,我们需要对数据集进行预处理,以便将其转换YOLO可识别的格式。这包括一些步骤: - 将每个样本的图像调整为固定大小,以便与YOLO模型的输入大小匹配。 - 将图像转换为RGB格式,因为YOLO模型通常使用RGB图像进行训练。 - 对每个样本进行标签处理,以便将类别索引转换为适当的YOLO格式。例如,将每个字母或数字的标签编码为独热编码。 - 将图像和标签的处理后的数据保存在一个新的文件,以供后续的训练和测试使用。 3. 划分数据集:为了进行训练和测试,我们需要将数据集划分为训练集和测试集。通常,我们使用大部分数据作为训练集,剩下的部分作为测试集。可以根据需求进行划分,并将划分好的数据集保存下来。 4. 创建YOLO标签文件:YOLO模型需要一个标签文件,其包含了每个样本的位置和类别信息。我们可以使用训练集数据来制作这个标签文件。在标签文件,每一行对应一个样本,格式为:类别索引 + 心坐标(x, y) + 宽度 + 高度。这些信息可以通过对图像进行处理和分析得到。 5. 进行训练和测试:将数据集和标签文件加载到YOLO模型,进行训练和测试。根据需要,可以调整模型的超参数和训练策略,以获得更好的性能和准确度。 以上步骤是将EMNIST数据集处理成YOLO可识别的数据格式的基本思路。根据具体的要求和实际情况,可能需要根据需要进行一些额外的处理和调整。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值