2017-07-31 38 views
0

我已經重新訓練了我的模型與tensorflow爲詩人啓動模型。預測需要0.4秒,分類需要2秒。由於需要很長時間,因此該框架具有滯後性,並且在預測時被擾亂。儘管預測需要時間,但我是否能通過任何手段使框架平滑? 以下是我的代碼...Opencv流是太遲緩

camera = cv2.VideoCapture(0) 

# Loads label file, strips off carriage return 
label_lines = [line.rstrip() for line 
       in tf.gfile.GFile('retrained_labels.txt')] 

def grabVideoFeed(): 
    grabbed, frame = camera.read() 
    return frame if grabbed else None 

def initialSetup(): 
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 
    start_time = timeit.default_timer() 

    # This takes 2-5 seconds to run 
    # Unpersists graph from file 
    with tf.gfile.FastGFile('retrained_graph.pb', 'rb') as f: 
     graph_def = tf.GraphDef() 
     graph_def.ParseFromString(f.read()) 
     tf.import_graph_def(graph_def, name='') 

    print 'Took {} seconds to unpersist the graph'.format(timeit.default_timer() - start_time) 

initialSetup() 

with tf.Session() as sess: 
    start_time = timeit.default_timer() 

    # Feed the image_data as input to the graph and get first prediction 
    softmax_tensor = sess.graph.get_tensor_by_name('final_result:0') 

    print 'Took {} seconds to feed data to graph'.format(timeit.default_timer() - start_time) 

    while True: 
     frame = grabVideoFeed() 

     if frame is None: 
      raise SystemError('Issue grabbing the frame') 

     frame = cv2.resize(frame, (299, 299), interpolation=cv2.INTER_CUBIC) 

     cv2.imshow('Main', frame) 

     # adhere to TS graph input structure 
     numpy_frame = np.asarray(frame) 
     numpy_frame = cv2.normalize(numpy_frame.astype('float'), None, -0.5, .5, cv2.NORM_MINMAX) 
     numpy_final = np.expand_dims(numpy_frame, axis=0) 

     start_time = timeit.default_timer() 

     # This takes 2-5 seconds as well 
     predictions = sess.run(softmax_tensor, {'Mul:0': numpy_final}) 

     print 'Took {} seconds to perform prediction'.format(timeit.default_timer() - start_time) 

     start_time = timeit.default_timer() 

     # Sort to show labels of first prediction in order of confidence 
     top_k = predictions[0].argsort()[-len(predictions[0]):][::-1] 

     print 'Took {} seconds to sort the predictions'.format(timeit.default_timer() - start_time) 

     for node_id in top_k: 
      human_string = label_lines[node_id] 
      score = predictions[0][node_id] 
      print('%s (score = %.5f)' % (human_string, score)) 

     print '********* Session Ended *********' 

     if cv2.waitKey(1) & 0xFF == ord('q'): 
      sess.close() 
      break 

camera.release() 
cv2.destroyAllWindows() 

回答

2

@ dat-tran是正確的,雖然fater rcnn很快,但它也會稍微滯後。對於沒有滯後,你可以使用yolo,ssd模型,我已經使用yolo它是好的。

對於隊列和多處理,您可以使用以下代碼。

from utils import FPS, WebcamVideoStream 
from multiprocessing import Process, Queue, Pool 

def worker(input_q, output_q): 
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 
    start_time = timeit.default_timer() 
    # This takes 2-5 seconds to run 
    # Unpersists graph from file 

    graph_def = tf.Graph() 
    with graph_def.as_default(): 
     graph_def_ = tf.GraphDef() 
     with tf.gfile.FastGFile('retrained_graph.pb', 'rb') as f: 
      graph_def_.ParseFromString(f.read()) 
      tf.import_graph_def(graph_def_, name='') 

     sess = tf.Session(graph=graph_def) 

    fps = FPS().start() 
    while True: 
     fps.update() 
     frame = input_q.get() 
     numpy_frame = np.asarray(frame) 
     numpy_frame = cv2.normalize(numpy_frame.astype('float'), None, -0.5, .5, cv2.NORM_MINMAX) 
     numpy_final = np.expand_dims(numpy_frame, axis=0) 

     start_time = timeit.default_timer() 

     # This takes 2-5 seconds as well 
     predictions = sess.run(softmax_tensor, {'Mul:0': numpy_final}) 

     print 'Took {} seconds to perform prediction'.format(timeit.default_timer() - start_time) 

     start_time = timeit.default_timer() 

     # Sort to show labels of first prediction in order of confidence 
     top_k = predictions[0].argsort()[-len(predictions[0]):][::-1] 

     print 'Took {} seconds to sort the predictions'.format(timeit.default_timer() - start_time) 

     for node_id in top_k: 
      human_string = label_lines[node_id] 
      score = predictions[0][node_id] 
      print('%s (score = %.5f)' % (human_string, score)) 

     output_q.put(frame) 

    fps.stop() 
    sess.close() 

if __name__ == '__main__': 
    input_q = Queue(maxsize=10) 
    output_q = Queue(maxsize=10) 

    process = Process(target=worker, args=((input_q, output_q))) 
    process.daemon = True 
    pool = Pool(1, worker, (input_q, output_q)) 

    video_capture = WebcamVideoStream(src=0, 
             width=args.width, 
             height=args.height).start() 

    fps = FPS().start() 

    while (video_capture.isOpened()): 
     _,frame = video_capture.read() 
     input_q.put(frame) 
     cv2.namedWindow('Image', cv2.WINDOW_NORMAL) 
     cv2.resizeWindow('Image', 600, 600) 
     cv2.imshow('Image', output_q.get()) 
     fps.update() 
     if cv2.waitKey(1) & 0xFF == ord('q'): 
      break 

    fps.stop() 
+0

謝謝...讓我試試這個... –

+0

即時通訊錯誤' input_q = Queue(maxsize = args.queue_size) NameError:名稱'args'未定義 ' –

+0

將args.value更改爲harcode值,如30或40 –

1

的問題,因爲這太laggy是由於您使用的模型。這些模型不適合低延遲。讓你的框架更流暢的一種方法是讓你的模型比如Mobilenets或F-RCNN更快,但精度更低。如果您有興趣我blogged about this on Medium

如果你仍然想使用你的模型的另一個選擇是使用隊列和多處理。您可以設置一個加載圖像的隊列和一個只在加載其他隊列之前進行預測的隊列。最後,這兩個隊列需要同步在一起。

+0

請問您可以提供關於如何使用隊列和多處理的要點嗎? –

+0

示例示例將有所幫助 –

+0

在博客文章中,我還提供了代碼。你能看看這個嗎?我也在使用隊列。 –