无法获取JSON坐标数据,如何提取并标注图片用于CNN关键点训练?
解决JSON坐标提取问题,为CNN生成关键点标注
先看你的问题:你想从标注JSON里提取x/y坐标,用来生成适合CNN训练的关键点标注,但现有代码只打印x、y的键名,拿不到数值。咱们一步步来理清楚问题出在哪,以及怎么修正。
你的代码错误原因
你原来的循环代码:
for item in data: for label in item['Label']['radiuksen inklinaatio']: for cordinates in label['geometry']: print(cordinates)
问题有两个核心点:
- 第三层循环
for cordinates in label['geometry']:——label['geometry']是一个字典(比如{"x": 193, "y": 222}),直接遍历字典的话,Python默认会遍历字典的键名,所以你会看到输出x、y,而不是对应的数值。 - 拼写不匹配:你的JSON里标注类型的键是
"radius inclination angle",但代码里写的是'radiuksen inklinaatio',这会直接触发KeyError,得先和JSON里的键名严格匹配。
修正后的代码实现
我们需要遍历每个标注类型,提取每个geometry里的x和y,然后按照你想要的格式整理输出。这里提供完整的实现代码:
基础版:提取所有坐标合并到label字段
# 假设data是你加载后的JSON数据(如果是多个标注的列表,外层加循环即可) result = [] # 获取当前标注对应的图片URL image_url = data["Labeled Data"] # 收集所有关键点的坐标字符串 coords_str_list = [] # 遍历Label下的所有标注类型(比如radius inclination angle、radioulnar等) for label_type, points in data["Label"].items(): # 遍历当前类型下的每个关键点 for point in points: x = point["geometry"]["x"] y = point["geometry"]["y"] coords_str_list.append(f'"x":{x}, "y":{y}') # 拼接成你需要的label格式 label_str = ", ".join(coords_str_list) # 添加到结果列表 result.append({ "label": label_str, "image": image_url }) # 打印或保存结果 print(result)
可选:按标注类型分组坐标
如果你想保留每个标注类型的分组信息,可以调整label字符串的格式:
coords_str_list = [] for label_type, points in data["Label"].items(): # 生成当前类型下的坐标字符串 type_coords = [f'"x":{p["geometry"]["x"]}, "y":{p["geometry"]["y"]}' for p in points] coords_str_list.append(f'"{label_type}": [{", ".join(type_coords)}]') label_str = ", ".join(coords_str_list)
关键知识点总结
- 遍历字典时,直接
for k in dict得到的是键名,要获取值的话可以用dict[k],或者for k, v in dict.items()同时拿到键和值。 - 必须严格匹配JSON里的键名,大小写、空格、拼写都不能错,否则会触发KeyError。
- 字符串拼接优先用
f-string或join(),比逐个字符串相加更高效、可读性更强。
运行修正后的代码后,就能得到你期望的输出格式:
[ {'label': '"x":193, "y":222, "x":242, "y":228, "x":244, "y":227, "x":250, "y":225, "x":224, "y":217, "x":219, "y":217', 'image': 'url_from_json'}, ... ]
内容的提问来源于stack exchange,提问作者Ode




