Traceback (most recent call last): File "/home/shijue1/500g/wy/yolov9/yolov9-main/val.py", line 389, in <module> main(opt) File "/home/shijue1/500g/wy/yolov9/yolov9-main/val.py", line 362, in main run(**vars(opt)) File "/home/shijue1/.conda/envs/torch117_cp38/lib/python3.8/site-packages/torch/autograd/grad_mode.py", line 27, in decorate_context return func(*args, **kwargs) File "/home/shijue1/500g/wy/yolov9/yolov9-main/val.py", line 201, in run preds = non_max_suppression(preds, File "/home/shijue1/500g/wy/yolov9/yolov9-main/utils/general.py", line 905, in non_max_suppression device = prediction.device AttributeError: 'list' object has no attribute 'device' Exception in thread Thread-2: Traceback (most recent call last): File "/home/shijue1/.conda/envs/torch117_cp38/lib/python3.8/threading.py", line 932, in _bootstrap_inner self.run() File "/home/shijue1/.conda/envs/torch117_cp38/lib/python3.8/threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "/home/shijue1/.conda/envs/torch117_cp38/lib/python3.8/site-packages/torch/utils/data/_utils/pin_memory.py", line 49, in _pin_memory_loop do_one_step() File "/home/shijue1/.conda/envs/torch117_cp38/lib/python3.8/site-packages/torch/utils/data/_utils/pin_memory.py", line 26, in do_one_step r = in_queue.get(timeout=MP_STATUS_CHECK_INTERVAL) File "/home/shijue1/.conda/envs/torch117_cp38/lib/python3.8/multiprocessing/queues.py", line 116, in get return _ForkingPickler.loads(res) File "/home/shijue1/.conda/envs/torch117_cp38/lib/python3.8/site-packages/torch/multiprocessing/reductions.py", line 305, in rebuild_storage_fd fd = df.detach() File "/home/shijue1/.conda/envs/torch117_cp38/lib/python3.8/multiprocessing/resource_sharer.py", line 57, in detach with _resource_sharer.get_connection(self._id) as conn: File "/home/shijue1/.conda/envs/torch117_cp38/lib/python3.8/multiprocessing/resource_sharer.py", line 87, in get_connection
时间: 2025-07-15 07:35:45 浏览: 5
<think>好的,我现在需要解决用户在使用YOLOv9进行非最大抑制(NMS)时遇到的AttributeError: 'list' object has no attribute 'device'的问题。首先,我应该回顾用户提供的错误信息和引用的资料,找出可能的原因和解决方案。
用户提到在运行detect.py时出现了这个错误,而引用[2]中提到了类似的错误,解决方案涉及调整代码中的NMS部分。根据引用[2]的内容,正确的做法是确保传递给non_max_suppression函数的pred变量是一个张量(tensor),而不是列表(list)。因为列表没有device属性,而张量有,所以在处理pred之前需要检查其类型。
接下来,我需要分析YOLOv9的输出结构。通常,目标检测模型如YOLO可能会返回包含多个元素的列表,比如不同尺度的特征图。如果代码中直接取pred[0],可能仍然得到一个列表,而不是张量。这时候需要使用条件判断来确保获取的是张量。例如,使用isinstance检查pred的元素是否为列表,如果是,则选择正确的元素,如pred[0][1]。
另外,用户提供的错误信息中的代码调整建议是:将pred = pred[0]改为pred = pred[0][1]如果pred[0]是列表的话。这可能是因为模型输出结构发生了变化,需要根据具体情况调整索引。
还需要检查non_max_suppression函数的输入是否符合要求。PyTorch的NMS函数通常需要输入是张量,并且位于正确的设备上(CPU或GPU)。如果pred是列表中的张量,需要先提取出来,并确保其device属性存在。
可能的解决步骤包括:
1. 检查pred变量的结构,确认其是否为列表或嵌套列表。
2. 使用条件判断处理不同情况,确保最终得到的是张量。
3. 调整索引方式,正确获取所需的张量。
4. 确保在调用non_max_suppression之前,pred已经是张量,并且有device属性。
此外,用户提到的引用[3]和[5]可能涉及其他类型错误或模块导入问题,但当前问题集中在列表与张量的转换上。因此,重点应放在处理pred变量的结构上。
最后,验证修改后的代码是否解决了错误,并确保其他部分如设备设置(CPU/GPU)正确无误。如果问题依旧,可能需要进一步检查模型输出或查阅官方文档和社区讨论,如引用[2]中提到的官方issues中的解决方案。</think>针对YOLOv9非最大抑制阶段出现的`AttributeError: 'list' object has no attribute 'device'`错误,以下是分步解决方案:
---
### 错误原因分析
该错误表明代码尝试访问列表(`list`)对象的`device`属性,但列表本身无此属性。通常发生在以下场景:
1. **模型输出格式不匹配**:YOLO模型输出可能包含多层嵌套结构(如多检测头的输出)
2. **张量提取不完整**:未正确提取预测张量,导致后续操作仍作用于列表对象
3. **NMS输入类型错误**:PyTorch的`non_max_suppression()`函数需要输入为张量而非列表
---
### 解决方案步骤
#### 1. 检查预测输出结构
在调用NMS前添加调试语句,验证`pred`的类型和结构:
```python
print(type(pred)) # 查看是否为列表
print([type(x) for x in pred]) # 查看列表元素类型
```
#### 2. 规范张量提取(关键步骤)
修改NMS前的代码段,强制转换为张量:
```python
# 原错误代码可能类似:
# pred = model(img)
# 修改为(根据模型实际输出结构调整索引):
if isinstance(pred, list):
# YOLOv9可能返回多个检测头结果,通常取第一个元素
pred = pred[0]
if isinstance(pred, list): # 处理嵌套列表
pred = pred[0][1] if isinstance(pred[0], list) else pred[0]
pred = pred if isinstance(pred, torch.Tensor) else torch.cat(pred, 1)
```
#### 3. 调整NMS调用方式
确保输入符合函数要求:
```python
pred = non_max_suppression(
prediction=pred, # 必须为张量
conf_thres=conf_thres,
iou_thres=iou_thres,
classes=classes,
agnostic=agnostic_nms,
max_det=max_det
)
```
#### 4. 完整代码示例
```python
# 检测阶段代码修改
with torch.no_grad():
pred = model(img) # 原始输出
# 添加格式规范化
if isinstance(pred, (list, tuple)):
pred = pred[0] # 提取主预测层
if isinstance(pred, list): # 处理嵌套结构
pred = pred[0][1] if isinstance(pred[0], list) else pred[0]
pred = pred if isinstance(pred, torch.Tensor) else torch.cat(pred, 1)
# 执行NMS
pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det)
```
---
### 验证要点
1. **设备一致性**:确认所有张量位于同一设备(CPU/GPU)
2. **版本兼容性**:检查PyTorch与YOLOv9代码库的版本匹配性
3. **官方更新**:参考YOLO官方GitHub的[解决方案](https://github.com/WongKinYiu/yolov9/issues) [^2]
---
阅读全文
相关推荐



















