You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python处理机器学习JSON结果报NoneType不可下标错误求助

问题原因
  • 核心触发原因:你调用find_xy(18,18)时传入的目标class_id为18,但提供的result.json中所有检测目标的class_id均为17,遍历过程中没有匹配到对应id的目标,obj1、obj2始终保持初始化的None值,对None执行下标取值操作就会触发该报错。
  • 代码逻辑缺陷:
    1. 没有添加空值校验逻辑,哪怕未匹配到目标也会继续执行坐标取值、差值计算代码
    2. 内层循环的break仅能跳出当前frame的objects遍历,若存在多帧数据,只会取第一个匹配到对应id的目标,若需求是取置信度最高的目标则逻辑不成立
    3. 代码中存在两段完全冗余的遍历所有目标取坐标的代码,无实际作用可以删除
解决办法

先添加空值判断,匹配到两个目标后再执行后续校验逻辑,也可以根据需求调整目标匹配规则(比如取同id下置信度最高的目标),修改后的参考代码如下:

import json

results_path = r'result.json'

with open(results_path, 'r') as opened_results: 
    results = json.load(opened_results)

# 冗余的覆写文件逻辑如果没有格式化需求可以删掉
# with open(results_path, "w") as opened_results:
#     json.dump(results, opened_results, indent=4)

def find_xy(id1, id2):
    # 匹配id1的目标,这里示例取第一个匹配到的,要取置信度最高的可以自行调整逻辑
    obj1 = None
    for frame in results:
        for obj in frame["objects"]:
            if obj["class_id"] == id1:
                obj1 = obj
                break
        if obj1:
            break
    
    # 匹配id2的目标
    obj2 = None
    for frame in results:
        for obj in frame["objects"]:
            if obj["class_id"] == id2:
                obj2 = obj
                break
        if obj2:
            break

    # 空值校验,未匹配到目标直接返回提示
    if not obj1 or not obj2:
        print(f"未找到匹配的目标:id1={id1} {'已找到' if obj1 else '未找到'}, id2={id2} {'已找到' if obj2 else '未找到'}")
        return None, None

    # 计算坐标差
    x_dif = obj1["relative_coordinates"]["center_x"] - obj2["relative_coordinates"]["center_x"]
    x_absolute_dif = abs(x_dif)
    print(f"X Absolute Dif Is: {x_absolute_dif}")
    x_within_range = x_absolute_dif <= 0.1
    print("X-Cords Within Range" if x_within_range else "X-Cords Not Within Range")

    y_dif = obj1["relative_coordinates"]["center_y"] - obj2["relative_coordinates"]["center_y"]
    y_absolute_dif = abs(y_dif)
    print(f"Y Absolute Difference Is: {y_absolute_dif}")
    y_within_range = y_absolute_dif <= 0.1
    print("Y-Cords Within Range" if y_within_range else "Y-Cords Not Within Range")

    return x_within_range, y_within_range

如果需要测试代码生效,可以把调用参数改为find_xy(17,17),即可正常输出两个class_id为17的目标的坐标差校验结果。

内容的提问来源于stack exchange,提问作者Agarb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 14:06:02