Python处理机器学习JSON结果报NoneType不可下标错误求助
问题原因
- 核心触发原因:你调用
find_xy(18,18)时传入的目标class_id为18,但提供的result.json中所有检测目标的class_id均为17,遍历过程中没有匹配到对应id的目标,obj1、obj2始终保持初始化的None值,对None执行下标取值操作就会触发该报错。 - 代码逻辑缺陷:
- 没有添加空值校验逻辑,哪怕未匹配到目标也会继续执行坐标取值、差值计算代码
- 内层循环的
break仅能跳出当前frame的objects遍历,若存在多帧数据,只会取第一个匹配到对应id的目标,若需求是取置信度最高的目标则逻辑不成立 - 代码中存在两段完全冗余的遍历所有目标取坐标的代码,无实际作用可以删除
解决办法
先添加空值判断,匹配到两个目标后再执行后续校验逻辑,也可以根据需求调整目标匹配规则(比如取同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
相关产品推荐
相关产品推荐

