eloisewkyqq 2024-09-20 22:10 采纳率: 50%
浏览 1

VOC转成JSON有问题,不知从何追溯的keyerror

求解答:跑detr模型出现了“keyerror:'r' ”的问题,出问题的代码段在哪里??而且还有一个问题是:运行了VOC转JSON之后,.json文件中的filename还发生了变化?
首先阐述第二个问题的具体情况:
在我运行了VOC转JSON的代码后,.json文件中的文件名filename与.xml不一致,具体的表现为:
.json:

img


.xml:

img


就是最后的_600变成了_256,我不知道为啥会减掉4
具体代码如下,检查了也没切片操作啊,为啥(?)

def get(root, name):
    vars = root.findall(name)
    return vars

def get_and_check(root, name, length):
    vars = root.findall(name)
    if len(vars) == 0:
        raise NotImplementedError('Can not find %s in %s.' % (name, root.tag))
    if length > 0 and len(vars) != length:
        raise NotImplementedError('The size of %s is supposed to be %d, but is %d.' % (name, length, len(vars)))
    if length == 1:
        vars = vars[0]
    return vars


def get_filename_as_int(filename):
    try:
        filename = os.path.splitext(filename)[0]
        return filename
    except:
        raise NotImplementedError('Filename %s is supposed to be an integer.' % (filename))


# xml_list为xml文件存放的txt文件名    xml_dir为真实xml的存放路径    json_file为存放的json路径
def convert(xml_list, xml_dir, json_file):
    list_fp = open(xml_list, 'r')
    json_dict = {"images": [], "type": "instances", "annotations": [],
                 "categories": []}
    categories = PRE_DEFINE_CATEGORIES
    bnd_id = START_BOUNDING_BOX_ID
    for line in list_fp:
        line = line.strip()
        line = line + ".xml"
        print("Processing %s" % (line))
        xml_f = os.path.join(xml_dir, line)
        tree = ET.parse(xml_f)
        root = tree.getroot()
        path = get(root, 'path')
        if len(path) == 1:
            filename = os.path.basename(path[0].text)
        elif len(path) == 0:
            filename = get_and_check(root, 'filename', 1).text
        else:
            raise NotImplementedError('%d paths found in %s' % (len(path), line))
        ## The filename must be a number
        image_id = get_filename_as_int(filename)
        size = get_and_check(root, 'size', 1)
        width = int(get_and_check(size, 'width', 1).text)
        height = int(get_and_check(size, 'height', 1).text)
        image = {'file_name': filename, 'height': height, 'width': width,
                 'id': image_id}
        json_dict['images'].append(image)

出现keyerror'r'的错误报告如下,这个错也不知道从何纠起

Traceback (most recent call last):
  File "C:\Githouse\detr-main\detr-main\main.py", line 247, in <module>
    main(args)
  File "C:\Githouse\detr-main\detr-main\main.py", line 195, in main
    train_stats = train_one_epoch(
  File "C:\Githouse\detr-main\detr-main\engine.py", line 28, in train_one_epoch
    for samples, targets in metric_logger.log_every(data_loader, print_freq, header):
  File "C:\Githouse\detr-main\detr-main\util\misc.py", line 223, in log_every
    for obj in iterable:
  File "C:\Users\15022\anaconda3\envs\detr\lib\site-packages\torch\utils\data\dataloader.py", line 630, in __next__
    data = self._next_data()
  File "C:\Users\15022\anaconda3\envs\detr\lib\site-packages\torch\utils\data\dataloader.py", line 1344, in _next_data
    return self._process_data(data)
  File "C:\Users\15022\anaconda3\envs\detr\lib\site-packages\torch\utils\data\dataloader.py", line 1370, in _process_data
    data.reraise()
  File "C:\Users\15022\anaconda3\envs\detr\lib\site-packages\torch\_utils.py", line 706, in reraise
    raise exception
KeyError: Caught KeyError in DataLoader worker process 0.
Original Traceback (most recent call last):
  File "C:\Users\15022\anaconda3\envs\detr\lib\site-packages\torch\utils\data\_utils\worker.py", line 309, in _worker_loop
    data = fetcher.fetch(index)  # type: ignore[possibly-undefined]
  File "C:\Users\15022\anaconda3\envs\detr\lib\site-packages\torch\utils\data\_utils\fetch.py", line 52, in fetch
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "C:\Users\15022\anaconda3\envs\detr\lib\site-packages\torch\utils\data\_utils\fetch.py", line 52, in <listcomp>
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "C:\Githouse\detr-main\detr-main\datasets\coco.py", line 27, in __getitem__
    img, target = super(CocoDetection, self).__getitem__(idx)
  File "C:\Users\15022\anaconda3\envs\detr\lib\site-packages\torchvision\datasets\coco.py", line 53, in __getitem__
    image = self._load_image(id)
  File "C:\Users\15022\anaconda3\envs\detr\lib\site-packages\torchvision\datasets\coco.py", line 41, in _load_image
    path = self.coco.loadImgs(id)[0]["file_name"]
  File "C:\Users\15022\anaconda3\envs\detr\lib\site-packages\pycocotools\coco.py", line 227, in loadImgs
    return [self.imgs[id] for id in ids]
  File "C:\Users\15022\anaconda3\envs\detr\lib\site-packages\pycocotools\coco.py", line 227, in <listcomp>
    return [self.imgs[id] for id in ids]
KeyError: 'r'

ai出来说是主要是这个 File "C:\Githouse\detr-main\detr-main\datasets\coco.py", line 27, in getitem
打印出来的idx确实有'r',可是不知道哪来的?究竟怎么溯源找到错误源头?

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-20 22:28
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    针对你的问题,我们可以从以下几个方面进行分析和解决:

    1. 关于VOC转JSON后文件名变化的问题

    从你提供的代码和描述来看,你在转换VOC到JSON的过程中对文件名进行了处理。但是,处理逻辑中有一处可能会引发问题,就是在处理pathfilename时。由于你的代码中处理了两种方式来获取filename,当path存在多个时可能会出现问题,引发错误或文件名变化。

    具体来说,这段代码:

    path = get(root, 'path')
    if len(path) == 1:
        filename = os.path.basename(path[0].text)
    elif len(path) == 0:
        filename = get_and_check(root, 'filename', 1).text
    else:
        raise NotImplementedError('%d paths found in %s' % (len(path), line))
    

    你需要确保path元素只有一个或者没有,否则会尝试从filename获取文件名。这部分代码可能需要更详细的错误处理和逻辑检查来确保文件名的准确性。此外,还需要检查XML文件的结构和内容是否正确。

    2. 关于KeyError的问题

    这个错误出现在处理COCO数据集时。从错误信息来看,问题在于尝试访问字典中的'r'键,但该键不存在。这个'r'键可能来源于你的数据集中某个图像的ID或者其他与数据相关的键。你可能需要检查以下几点来追溯错误源头:

    • 数据源: 检查你的COCO数据集是否有'r'这个键,以及它的来源是什么。可能是在数据预处理阶段或者数据加载阶段出现了问题。
    • 数据加载器: 检查你的数据加载器(如CocoDetection类)是否正确加载了图像和标注信息。特别是涉及图像ID的部分,确保它们与数据集中的键对应正确。
    • 自定义处理逻辑: 如果你对数据进行了任何自定义处理(例如调整ID等),请检查这部分逻辑是否引入了额外的键或修改了现有键的值。
    • 打印调试信息: 在涉及到数据的部分添加打印语句,输出具体的图像ID和其他相关信息,以帮助你定位问题。例如,在数据加载器的__getitem__方法中打印出加载的图像ID和对应的标注信息。这样可以帮助你找到引起错误的图像和数据条目。

    总的来说,这两个问题都与数据处理和加载有关。建议首先仔细检查你的数据处理逻辑和数据源,然后逐步跟踪代码以找到引发问题的具体位置。如果可能的话,提供更详细的代码和数据结构信息将有助于更准确地定位问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月20日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?