YOLO车辆检测报错:AttributeError: 'list'对象无'dtype'属性
解决YOLO车辆检测中
AttributeError: 'list' object has no attribute 'dtype'的问题 看起来你遇到的核心问题是**yolo_model.output返回的是一个列表而非单个张量**,导致yolo_head函数在调用K.dtype(feats)时出错——因为函数预期接收的是TensorFlow张量,而不是Python列表。下面是具体的排查和解决方案:
一、快速修复:提取列表中的第一个张量
先验证这个猜测:在调用yolo_head前添加一行打印代码确认输出类型:
print(type(yolo_model.output)) # 大概率会输出 <class 'list'> print(len(yolo_model.output)) # 通常为1,因为YOLO最后一层是单个输出
如果确实是列表,直接修改调用代码,取出列表的第一个元素传入yolo_head:
# 替换原来的yolo_head调用语句 yolo_outputs = yolo_head(yolo_model.output[0], anchors, len(class_names))
这应该能直接解决报错问题,因为现在传入函数的是符合要求的单个张量。
二、更稳健的方案:重新构建模型而非直接加载
有时候直接用load_model加载旧Keras模型,在TF2兼容V1的模式下会出现输出格式异常。可以尝试通过yolo_body重新构建模型结构,再加载预训练权重:
# 替换原来的load_model代码段 input_shape = (608, 608, 3) # 和你预处理的图像尺寸保持一致 input_image = Input(shape=input_shape) # 用yolo_body重新定义模型结构 yolo_model = yolo_body(input_image, len(anchors), len(class_names)) # 加载预训练权重(注意这里用load_weights而非load_model) yolo_model.load_weights("model_data/yolo.h5") # 此时yolo_model.output是单个张量,可正常调用yolo_head yolo_outputs = yolo_head(yolo_model.output, anchors, len(class_names))
这种方法绕过了load_model可能带来的兼容性问题,完全按照模型定义重建结构,稳定性更高。
三、额外的版本兼容优化
你的导入混合了独立keras和tensorflow.compat.v1,这可能导致潜在的版本冲突。建议将所有Keras相关导入替换为TF集成的版本:
# 替换原来的Keras导入语句 # from keras import backend as K # from keras.layers import Input, Lambda, Conv2D # from keras.models import load_model, Model from tensorflow.keras import backend as K from tensorflow.keras.layers import Input, Lambda, Conv2D from tensorflow.keras.models import load_model, Model
这样能确保Keras和TensorFlow版本完全对齐,避免因独立Keras与TF版本不匹配导致的奇怪问题。
为什么Jupyter能运行但本地不行?
大概率是两个环境的依赖版本细节有差异:Jupyter环境中load_model返回的模型输出是单个张量,而本地环境因为TF2转V1的兼容逻辑,将模型输出包装成了列表。上述修复方案能统一两种环境的运行行为。
内容的提问来源于stack exchange,提问作者BluRaven
相关产品推荐
相关产品推荐

