2017-07-27 20 views
1

我真的試圖運行模式,我在TensorFlow目標檢測API做了我自己的數據集,但運行腳本的時候,我得到這樣的錯誤:FailedPreconditionError運行時,TF目標檢測API和自己的模型

python object_detection/detect_test.py 

Traceback (most recent call last): 
    File "object_detection/detect_test.py", line 81, in <module> 
    feed_dict={image_tensor: image_np_expanded}) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 789, in run 
    run_metadata_ptr) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 997, in _run 
    feed_dict_string, options, run_metadata) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 1132, in _do_run 
    target_list, options, run_metadata) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 1152, in _do_call 
    raise type(e)(node_def, op, message) 
tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value SecondStageBoxPredictor/ClassPredictor/biases 
     [[Node: SecondStageBoxPredictor/ClassPredictor/biases/read = Identity[T=DT_FLOAT, _class=["loc:@SecondStageBoxPredictor/ClassPredictor/biases"], _device="/job:localhost/replica:0/task:0/cpu:0"](SecondStageBoxPredictor/ClassPredictor/biases)]] 

Caused by op u'SecondStageBoxPredictor/ClassPredictor/biases/read', defined at: 
    File "object_detection/detect_test.py", line 40, in <module> 
    tf.import_graph_def(od_graph_def, name='') 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/importer.py", line 311, in import_graph_def 
    op_def=op_def) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2506, in create_op 
    original_op=self._default_original_op, op_def=op_def) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1269, in __init__ 
    self._traceback = _extract_stack() 

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value SecondStageBoxPredictor/ClassPredictor/biases 
     [[Node: SecondStageBoxPredictor/ClassPredictor/biases/read = Identity[T=DT_FLOAT, _class=["loc:@SecondStageBoxPredictor/ClassPredictor/biases"], _device="/job:localhost/replica:0/task:0/cpu:0"](SecondStageBoxPredictor/ClassPredictor/biases)]] 

這有點奇怪,因爲我遵循their tutorial的模型用法,錯誤可能是說某些變量沒有初始化。

這裏是我的代碼:

detect_test.py

import numpy as np 
import os 
import six.moves.urllib as urllib 
import sys 
import tarfile 
import tensorflow as tf 
import zipfile 

from collections import defaultdict 
from io import StringIO 
from matplotlib import pyplot as plt 
from PIL import Image 

from utils import label_map_util 
from utils import visualization_utils as vis_util 

# Path to frozen detection graph. This is the actual model that is used for the object detection. 
PATH_TO_CKPT = '/home/jun/PycharmProjects/tf_workspace/models/output_inference_graph_151.pb' 

# List of the strings that is used to add correct label for each box. 
PATH_TO_LABELS = '/home/jun/PycharmProjects/tf_workspace/models/object_detection/data/pascal_label_map_new.pbtxt' 

NUM_CLASSES = 3 

detection_graph = tf.Graph() 
with detection_graph.as_default(): 
    od_graph_def = tf.GraphDef() 
    with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid: 
    serialized_graph = fid.read() 
    od_graph_def.ParseFromString(serialized_graph) 
    tf.import_graph_def(od_graph_def, name='') 

label_map = label_map_util.load_labelmap(PATH_TO_LABELS) 
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True) 
category_index = label_map_util.create_category_index(categories) 

def load_image_into_numpy_array(image): 
    (im_width, im_height) = image.size 
    return np.array(image.getdata()).reshape(
     (im_height, im_width, 3)).astype(np.uint8) 

# For the sake of simplicity we will use only 2 images: 
# image1.jpg 
# image2.jpg 
# If you want to test the code with your images, just add path to the images to the TEST_IMAGE_PATHS. 
PATH_TO_TEST_IMAGES_DIR = 'object_detection/test_images' 
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(1, 3) ] 

# Size, in inches, of the output images. 
IMAGE_SIZE = (12, 8) 

with detection_graph.as_default(): 
    with tf.Session(graph=detection_graph) as sess: 
    for image_path in TEST_IMAGE_PATHS: 
     image = Image.open(image_path) 
     # the array based representation of the image will be used later in order to prepare the 
     # result image with boxes and labels on it. 
     image_np = load_image_into_numpy_array(image) 
     # Expand dimensions since the model expects images to have shape: [1, None, None, 3] 
     image_np_expanded = np.expand_dims(image_np, axis=0) 
     image_tensor = detection_graph.get_tensor_by_name('image_tensor:0') 
     # Each box represents a part of the image where a particular object was detected. 
     boxes = detection_graph.get_tensor_by_name('detection_boxes:0') 
     # Each score represent how level of confidence for each of the objects. 
     # Score is shown on the result image, together with the class label. 
     scores = detection_graph.get_tensor_by_name('detection_scores:0') 
     classes = detection_graph.get_tensor_by_name('detection_classes:0') 
     num_detections = detection_graph.get_tensor_by_name('num_detections:0') 
     # Actual detection. 
     (boxes, scores, classes, num_detections) = sess.run(
      [boxes, scores, classes, num_detections], 
      feed_dict={image_tensor: image_np_expanded}) 
     # Visualization of the results of a detection. 
     vis_util.visualize_boxes_and_labels_on_image_array(
      image_np, 
      np.squeeze(boxes), 
      np.squeeze(classes).astype(np.int32), 
      np.squeeze(scores), 
      category_index, 
      use_normalized_coordinates=True, 
      line_thickness=8) 
     plt.figure(figsize=IMAGE_SIZE) 
     plt.imshow(image_np) 

我會在這種情況下,任何幫助,所以感激!提前致謝!

回答

0

最後,我已經改變了行,其中matplotlib顯示圖像後評估,以簡單地保存結果圖像。他們在他們的例子中一直使用jupyter筆記本,因此可能會有一些功能。

最終代碼:

import numpy as np 
import os 
import six.moves.urllib as urllib 
import sys 
import tarfile 
import tensorflow as tf 
import zipfile 

from collections import defaultdict 
from io import StringIO 
from matplotlib import pyplot as plt 
from PIL import Image 

from object_detection.utils import label_map_util 
from object_detection.utils import visualization_utils as vis_util 

NUM_CLASSES = 3 

detection_graph = tf.Graph() 
with detection_graph.as_default(): 
    od_graph_def = tf.GraphDef() 
    with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid: 
    serialized_graph = fid.read() 
    od_graph_def.ParseFromString(serialized_graph) 
    tf.import_graph_def(od_graph_def, name='') 

label_map = label_map_util.load_labelmap(PATH_TO_LABELS) 
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True) 
category_index = label_map_util.create_category_index(categories) 

def load_image_into_numpy_array(image): 
    (im_width, im_height) = image.size 
    return np.array(image.getdata()).reshape(
     (im_height, im_width, 3)).astype(np.uint8) 

# For the sake of simplicity we will use only 2 images: 
# image1.jpg 
# image2.jpg 
# If you want to test the code with your images, just add path to the images to the TEST_IMAGE_PATHS. 
PATH_TO_TEST_IMAGES_DIR = 'object_detection/test_images/' 
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(1, 6) ] 

# Size, in inches, of the output images. 
IMAGE_SIZE = (12, 8) 

with detection_graph.as_default(): 
    with tf.Session(graph=detection_graph) as sess: 
    sess.run(tf.global_variables_initializer()) 
    img = 1 
    for image_path in TEST_IMAGE_PATHS: 
     image = Image.open(image_path) 
     # the array based representation of the image will be used later in order to prepare the 
     # result image with boxes and labels on it. 
     image_np = load_image_into_numpy_array(image) 
     # Expand dimensions since the model expects images to have shape: [1, None, None, 3] 
     image_np_expanded = np.expand_dims(image_np, axis=0) 
     image_tensor = detection_graph.get_tensor_by_name('image_tensor:0') 
     # Each box represents a part of the image where a particular object was detected. 
     boxes = detection_graph.get_tensor_by_name('detection_boxes:0') 
     # Each score represent how level of confidence for each of the objects. 
     # Score is shown on the result image, together with the class label. 
     scores = detection_graph.get_tensor_by_name('detection_scores:0') 
     classes = detection_graph.get_tensor_by_name('detection_classes:0') 
     num_detections = detection_graph.get_tensor_by_name('num_detections:0') 
     # Actual detection. 
     (boxes, scores, classes, num_detections) = sess.run(
      [boxes, scores, classes, num_detections], 
      feed_dict={image_tensor: image_np_expanded}) 
     # Visualization of the results of a detection. 
     vis_util.visualize_boxes_and_labels_on_image_array(
      image_np, 
      np.squeeze(boxes), 
      np.squeeze(classes).astype(np.int32), 
      np.squeeze(scores), 
      category_index, 
      use_normalized_coordinates=True, 
      line_thickness=8) 
     plt.figure(figsize=IMAGE_SIZE) 
     plt.imsave(str(img) + '.jpg', image_np) 
     img += 1 
1

with tf.Session(graph=detection_graph) as sess:之後插入sess.run(tf.global_variable_initializers())

+0

謝謝回答身體,我心底測試它,並且你的答案corect是否可行 – Michael

+0

我確實做到了如u說,但得到同樣的錯誤,不幸的是 – Michael

+0

@邁克爾你有沒有得到這個工作,有一個類似的錯誤,但只在雲上https://stackoverflow.com/questions/46800018/tensorflow-object-detection-api-fails-when-running-on-cloud-machine-learning-eng – bw4sz