1. 程式人生 > >Tensorflow之呼叫object_detection中的API識別視訊

Tensorflow之呼叫object_detection中的API識別視訊

上一篇博文主要介紹瞭如何使用object_detection進行圖片的識別。本文將在上一篇的基礎上介紹一下如何進行視訊的識別。

視訊識別主要是將視訊分為一幀一幀的圖片,然後對圖片進行識別。本文主要分為對攝像頭拍攝的內容直接識別和對一段視訊檔案的識別。

1.  採用VideoCapture對視訊進行處理的方法:

    首先需要依賴於opencv裡面包含的視訊處理方式。所以需要在python中安裝opencv。安裝連結為 opencv安裝地址。具體安裝方式為,採用pip指令:pip  install  opencv-contrib-python。安裝完成之後執行import cv2  。如果不報錯則安裝成功。

   使用VideoCapture函式開啟攝像頭或者檔案。然後呼叫read方法得到對應的每一幀圖片(frame)。最後將圖片進行識別。具體程式碼如下:(程式碼的模型載入過程和使用tensorflow進行圖片識別的部分相同)

#cap = cv2.VideoCapture("test3.MOV")
cap = cv2.VideoCapture(0)
with detection_graph.as_default():
     with tf.Session(graph=detection_graph) as sess:
           while (1):
              start = time.clock()
              # 按幀讀視
              ret, frame = cap.read()
              if cv2.waitKey(1) & 0xFF == ord('q'):
                 break
              image_np = frame
              image_np_expanded = np.expand_dims(image_np, axis=0)
              image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
              boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
              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})
              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)
              end = time.clock()
              #print('frame:', 1.0 / (end - start))
              cv2.imshow("capture", image_np)
              cv2.waitKey(1)

# 釋放捕捉的物件和記憶體
cap.release()
cv2.destroyAllWindows()

如果VideoCapture傳入的是0則開啟預設攝像頭,如果傳入的是檔案,則開啟視訊檔案。例如當傳入"test3.mov",結果是對視訊檔案進行識別:(下圖為視訊檔案中擷取的兩張圖片)

2: 基於moviepy中的VideoFileClip進行的識別。

     在採用該方式識別之前要確保已經安裝了對應的包:安裝方式為:pip  install  moviepy。安裝完之後可以採用VideoFileClip對視訊檔案進行提取。然後採用fl_image函式對提取出的檔案進行識別並最終儲存成視訊檔案。具體程式碼如下:

import detection_demo.object_detection_model as model
import matplotlib
import cv2
import time
matplotlib.use('Agg')

import imageio
imageio.plugins.ffmpeg.download()

from moviepy.editor import VideoFileClip
from IPython.display import HTML

white_output = 'video1_out3.mp4'
clip1 = VideoFileClip("test3.MOV").subclip(0, 10)
white_clip = clip1.fl_image(model.run_unterence_for_single_image)
white_clip.write_videofile(white_output, audio=False)

其中model.run_unterence_for_single_image為模型中的載入部分。可以參照上篇博文中官方demo的模型載入部分。

此時會產生一個mp4的視訊檔案,檔案的內容和上述圖片的內容相同。由於上傳視訊不方便就不在此上傳。