【发布时间】:2020-06-09 13:40:43
【问题描述】:
对不起,我是新手,但我无法在任何地方找到答案。 我正在尝试在我的计算机上实现 yolo 汽车检测,但我收到此错误并且不知道该怎么做。
这里是代码
sess = tf.keras.backend.get_session()
##detect 80 classes, usng 5 anchor boxes; 729x1280 images which are processed to 608x608 images
class_names = read_classes("model_data/coco_classes.txt")
anchors = read_anchors("model_data/yolo_anchors.txt")
image_shape = (720., 1280.)
#load the model
yolo_model = load_model("model_data/yolo.h5", compile = False)
#convert output of the model to usable bounding box tensors
yolo_outputs = yolo_head(yolo_model.output, anchors, len(class_names))```
这是错误
Traceback (most recent call last):
File "yolo.py", line 232, in <module>
yolo_outputs = yolo_head(yolo_model.output, anchors, len(class_names))
File "C:\Users\Desktop\PYTHON\tensor\cardetect\yad2k\models\keras_yolo.py", line 113, in yolo_head
conv_index = K.cast(conv_index, K.dtype(feats))
File "C:\Users\Desktop\PYTHON\tensor\lib\site-packages\keras\backend\tensorflow_backend.py", line 905, in dtype
return x.dtype.base_dtype.name
AttributeError: 'list' object has no attribute 'dtype'
这里是yolo_head的代码,不知道重要吗
def yolo_head(feats, anchors, num_classes):
"""Convert final layer features to bounding box parameters.
Parameters
----------
feats : tensor
Final convolutional layer features.
anchors : array-like
Anchor box widths and heights.
num_classes : int
Number of target classes.
Returns
-------
box_xy : tensor
x, y box predictions adjusted by spatial location in conv layer.
box_wh : tensor
w, h box predictions adjusted by anchors and conv spatial resolution.
box_conf : tensor
Probability estimate for whether each box contains any object.
box_class_pred : tensor
Probability distribution estimate for each box over class labels.
"""
num_anchors = len(anchors)
# Reshape to batch, height, width, num_anchors, box_params.
anchors_tensor = K.reshape(K.variable(anchors), [1, 1, 1, num_anchors, 2])
# Static implementation for fixed models.
# TODO: Remove or add option for static implementation.
# _, conv_height, conv_width, _ = K.int_shape(feats)
# conv_dims = K.variable([conv_width, conv_height])
# Dynamic implementation of conv dims for fully convolutional model.
conv_dims = K.shape(feats)[1:3] # assuming channels last
# In YOLO the height index is the inner most iteration.
conv_height_index = K.arange(0, stop=conv_dims[0])
conv_width_index = K.arange(0, stop=conv_dims[1])
conv_height_index = K.tile(conv_height_index, [conv_dims[1]])
# TODO: Repeat_elements and tf.split doesn't support dynamic splits.
# conv_width_index = K.repeat_elements(conv_width_index, conv_dims[1], axis=0)
conv_width_index = K.tile(K.expand_dims(conv_width_index, 0), [conv_dims[0], 1])
conv_width_index = K.flatten(K.transpose(conv_width_index))
conv_index = K.transpose(K.stack([conv_height_index, conv_width_index]))
conv_index = K.reshape(conv_index, [1, conv_dims[0], conv_dims[1], 1, 2])
conv_index = K.cast(conv_index, K.dtype(feats))
feats = K.reshape(feats, [-1, conv_dims[0], conv_dims[1], num_anchors, num_classes + 5])
conv_dims = K.cast(K.reshape(conv_dims, [1, 1, 1, 1, 2]), K.dtype(feats))
# Static generation of conv_index:
# conv_index = np.array([_ for _ in np.ndindex(conv_width, conv_height)])
# conv_index = conv_index[:, [1, 0]] # swap columns for YOLO ordering.
# conv_index = K.variable(
# conv_index.reshape(1, conv_height, conv_width, 1, 2))
# feats = Reshape(
# (conv_dims[0], conv_dims[1], num_anchors, num_classes + 5))(feats)
box_confidence = K.sigmoid(feats[..., 4:5])
box_xy = K.sigmoid(feats[..., :2])
box_wh = K.exp(feats[..., 2:4])
box_class_probs = K.softmax(feats[..., 5:])
# Adjust preditions to each spatial grid point and anchor size.
# Note: YOLO iterates over height index before width index.
box_xy = (box_xy + conv_index) / conv_dims
box_wh = box_wh * anchors_tensor / conv_dims
return box_confidence, box_xy, box_wh, box_class_probs
我不知道我是否遗漏了一些关键细节,但在任何地方都找不到答案,我尝试了一些方法,但无济于事。告诉我是否需要添加更多信息,我将不胜感激。
我可能还应该补充一点,这是导入部分:
import argparse
import os
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
import scipy.io
import scipy.misc
import numpy as np
import pandas as pd
import PIL
import tensorflow as tf
from keras import backend as K
from keras.layers import Input, Lambda, Conv2D
from keras.models import load_model, Model
from yolo_utils import read_classes, read_anchors, generate_colors, preprocess_image, draw_boxes, scale_boxes
from yad2k.models.keras_yolo import yolo_head, yolo_boxes_to_corners, preprocess_true_boxes, yolo_loss, yolo_body
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
如您所见,我禁用了 tensorflow 2 作为 V1 工作,因为这是一些旧代码。我怀疑我的 keras 和 tensorflow 版本是问题所在,但如果我可以避免降级,或者有人可以向我解释问题所在,那就太好了,这样我就可以以某种方式解决它。这段代码在 Jupyter 书中有效,所以我不知道为什么它现在让我失望了。
【问题讨论】:
标签: deep-learning attributeerror yolo dtype