使用Ultralytics训练的RT-DETR模型推理时出现KeyError:263求助
单类别RT-DETR模型推理KeyError: 263解决方法
问题背景
基于Ultralytics训练了单类别目标检测的RT-DETR模型,使用以下代码加载权重进行推理:
from ultralytics import YOLO import cv2 # Load your trained model model = YOLO(r"/content/drive/MyDrive/LN/best.pt") # Load an image for inference image_path = r"/content/drive/MyDrive/LN/114_jpg.rf.6b9c3febc395a3968078eec417f1c9ed.jpg" image = cv2.imread(image_path) # Perform object detection on the image results = model(image)
错误信息
运行时抛出KeyError: 263,完整错误栈如下:
KeyError Traceback (most recent call last) <ipython-input-3-d814bef29ddf> in <cell line: 12>() 10 11 # Perform object detection on the image ---> 12 results = model(image) 6 frames /usr/local/lib/python3.10/dist-packages/ultralytics/engine/results.py in verbose(self) 661 for c in boxes.cls.unique(): 662 n = (boxes.cls == c).sum() # detections per class ---> 663 log_string += f"{n} {self.names[int(c)]}{'s' * (n > 1)}, " 664 return log_string 665 KeyError: 263
排查动作
由于仅训练了一个类别,怀疑错误与类名映射相关,尝试用以下代码查看模型的类别数量及名称:
from ultralytics import YOLO # Load the trained model model = YOLO(r"D:\Research\Bhargav-Kaushik\best.pt") # Print the class names print("Class Names:", model.names)
解决方法
方法1:手动修正模型类别映射
加载模型后,直接覆盖model.names为单类别字典,确保类别ID(通常为0)对应你的目标类别名称:
model = YOLO(r"/content/drive/MyDrive/LN/best.pt") # 替换为你的实际类别名称 model.names = {0: "your_target_class"}
修正后再执行推理即可避免KeyError。
方法2:检查训练配置文件
训练时若未正确指定单类别配置,会导致模型继承默认的多类别映射(如COCO数据集的类别),进而引发ID不匹配。检查训练使用的data.yaml文件,确保:
nc: 1(类别数设置为1)names: ["your_class_name"](单类别名称列表)
如果配置错误,可重新训练,或按方法1手动修正已训练模型的类别映射。
方法3:临时关闭verbose输出
若只需临时规避错误,可在推理时添加verbose=False参数,跳过类别名称的自动打印:
results = model(image, verbose=False)
后续可自行处理检测结果,由于是单类别,所有检测框的cls值均为0。
内容的提问来源于stack exchange,提问作者Hitesh Tekchandani
相关产品推荐
相关产品推荐

