Python 如何在PyTorch中加载带有多个JSON注释的图像

Python 如何在PyTorch中加载带有多个JSON注释的图像,python,python-3.x,opencv,deep-learning,pytorch,Python,Python 3.x,Opencv,Deep Learning,Pytorch,我想知道如何使用PyTorch中的数据加载器来实现我的自定义文件结构。我已经阅读了PyTorch文档,但所有这些都是带有类的单独文件夹 我的文件夹结构由2个文件夹(称为培训和验证)组成,每个文件夹有2个子文件夹(称为图像和json注释)。“images”文件夹中的每个图像都有多个对象(如汽车、自行车、人等),每个图像都有注释,并有单独的JSON文件。遵循标准coco注释。我的目的是制作一个神经网络,可以对视频进行实时分类 编辑1: 我已经按照法比奥·佩雷斯的建议完成了编码 class lDa

我想知道如何使用PyTorch中的数据加载器来实现我的自定义文件结构。我已经阅读了PyTorch文档,但所有这些都是带有类的单独文件夹

我的文件夹结构由2个文件夹(称为培训和验证)组成,每个文件夹有2个子文件夹(称为图像和json注释)。“images”文件夹中的每个图像都有多个对象(如汽车、自行车、人等),每个图像都有注释,并有单独的JSON文件。遵循标准coco注释。我的目的是制作一个神经网络,可以对视频进行实时分类

编辑1: 我已经按照法比奥·佩雷斯的建议完成了编码

class lDataSet(data.Dataset):
    def __init__(self, path_to_imgs, path_to_json):
        self.path_to_imgs = path_to_imgs
        self.path_to_json = path_to_json
        self.img_ids = os.listdir(path_to_imgs)

    def __getitem__(self, idx):
        img_id = self.img_ids[idx]
        img_id = os.path.splitext(img_id)[0]
        img = cv2.imread(os.path.join(self.path_to_imgs, img_id + ".jpg"))
        load_json = json.load(open(os.path.join(self.path_to_json, img_id + ".json")))
        #n = len(load_json)
        #bboxes = load_json['annotation'][n]['segmentation']
        return img, load_json

    def __len__(self):
        return len(self.image_ids)
当我尝试这个的时候

l_data = lDataSet(path_to_imgs = '/home/training/images', path_to_json = '/home/training/json_annotations')
我用l_data[][0]获取l_数据,用json获取l_数据。现在我很困惑。我将如何将其与PyTorch中可用的微调示例一起使用?在该示例中,dataset和dataloader的操作如下所示。


您应该能够使用实现自己的数据集。您只需要实现
\uuu len\uuu
\uu getitem\uu
方法

在您的情况下,您可以迭代图像文件夹中的所有图像(然后您可以将图像ID存储在
数据集中的列表中)。然后,使用传递到
\uuuu getitem\uuu
的索引来获取相应的图像id。使用此图像id,您可以读取相应的JSON文件并返回所需的目标数据

大概是这样的:

class YourDataLoader(data.Dataset):
    def __init__(self, path_to_imgs, path_to_json):
        self.path_to_imags = path_to_imgs
        self.path_to_json = path_to_json
        self.image_ids = iterate_through_images(path_to_images)

    def __getitem__(self, idx):
        img_id = self.image_ids[idx]
        img = load_image(os.path.join(self.path_to_images, img_id)
        bboxes = load_bboxes(os.path.join(self.path_to_json, img_id)
        return img, bboxes

    def __len__(self):
        return len(self.image_ids)

遍历图像中
可以获得目录中图像的所有ID(例如文件名)。 在
load_bboxes
中,您可以阅读JSON并获得所需的信息


如果您想要引用,我有一个JSON加载器实现。

您应该能够使用实现自己的数据集。您只需要实现
\uuu len\uuu
\uu getitem\uu
方法

在您的情况下,您可以迭代图像文件夹中的所有图像(然后您可以将图像ID存储在
数据集中的列表中)。然后,使用传递到
\uuuu getitem\uuu
的索引来获取相应的图像id。使用此图像id,您可以读取相应的JSON文件并返回所需的目标数据

大概是这样的:

class YourDataLoader(data.Dataset):
    def __init__(self, path_to_imgs, path_to_json):
        self.path_to_imags = path_to_imgs
        self.path_to_json = path_to_json
        self.image_ids = iterate_through_images(path_to_images)

    def __getitem__(self, idx):
        img_id = self.image_ids[idx]
        img = load_image(os.path.join(self.path_to_images, img_id)
        bboxes = load_bboxes(os.path.join(self.path_to_json, img_id)
        return img, bboxes

    def __len__(self):
        return len(self.image_ids)

遍历图像中
可以获得目录中图像的所有ID(例如文件名)。 在
load_bboxes
中,您可以阅读JSON并获得所需的信息


如果您需要参考,我有一个JSON加载程序实现。

我已经阅读了您的代码,这是一个很大的帮助。我是一个初学者,我仍然很困惑。我把它们作为编辑1。请帮助您尝试使用分类网络来训练目标探测器。请参考一些物体探测器教程。我已经阅读了你的代码,这是一个很大的帮助。我是一个初学者,我仍然很困惑。我把它们作为编辑1。请帮助您尝试使用分类网络来训练目标探测器。请参考一些对象检测器教程。