1. 程式人生 > >呼叫objection detection API 實現目標檢測

呼叫objection detection API 實現目標檢測

之前我其實已經介紹過呼叫這個objection實現目標檢測的方法,安裝上次的那個教程我們可以呼叫攝像頭實現目標的實時檢測,這篇文章則是向大家介紹如何對離線下載好的視訊進行檢測。

一、環境配置

環境配置部分和上次基本相同,這裡我不再贅述,如果對此有疑問可以參考上一次的教程:

手把手教你如何用objection detection API實現實時目標檢測(一)
手把手教你如何用objection detection API實現實時目標檢測(二)
手把手教你如何用objection detection API實現實時目標檢測(三)

二、檔案下載

我們可以從GitHub地址中下載我們這個專案所需要的所有檔案如下:
在這裡插入圖片描述

同時我們需要從地址中下載protoc檔案,用於對相關程式進行編譯來執行檔案。
在這裡插入圖片描述

我們選擇下載的是protoc-3.6.1-win32.zip檔案。

將其解壓後把檔案中的protoc.exe檔案複製到我們的c:、Windows\system32目錄中,相當於把這個檔案配置到環境變數裡。

三、匯入視訊

我們把需要檢測的視訊命名為video1.mp4儲存在objection detection中。

四、執行原始碼

1、我們首先需要匯入這個模型所需要的各種庫:

import numpy as np                    #numpy是python的數值計算擴充套件,可用於儲存和處理大型矩陣
import os #os模組提供了大量的方法來處理檔案和目錄 import six.moves.urllib as urllib #six是一個專門用來相容 Python 2 和 Python 3 的庫。網站都是基於HTTP協議的,我們使用urllib可以處理URL,從而用來訪問網站。 import sys #python在 sys.path 變數中所列目錄中尋找 sys 模組檔案。然後執行這個模組的主塊中的語句進行初始化,然後就可以使用模組了 。 import tarfile #tarfile模組可以方便讀取tar歸檔檔案,用於處理rar壓縮
import tensorflow as tf #匯入TensorFlow import zipfile #處理zip壓縮 from collections import defaultdict #從collection中匯入模組 from io import StringIO #StringIO可用來作字串的快取 from matplotlib import pyplot as plt #匯入plt模組 from PIL import Image #匯入PIL,而Image是PIL中最重要的一個模組

在這過程中如果我們發現有哪個包沒有安裝,則直接pip install 即可。

2、接下來,我們需要對執行的環境進行配置

通過sys.path.append("..") 回到上一個資料夾中。

# This is needed since the notebook is stored in the object_detection folder.
sys.path.append("..")                 #返回上一級資料夾(objection_detection)尋找相應的包
from object_detection.utils import ops as utils_ops     

3、檢查TensorFlow版本

這裡要求TensorFlow的版本需要1.4.0以上(如果是按照我的操作流程,我安裝的是TensorFlow 1.8.0的gpu版本)。如果版本低於1.4.0,則會進行報錯,需要我們更新TensorFlow到更高的版本。

#此處用於檢測TensorFlow的版本,如果版本低於1.4.0,則提示需要更新TensorFlow
if tf.__version__ < '1.4.0':
    raise ImportError('Please upgrade your tensorflow installation to v1.4.* or later!')

4、匯入objection detection的對應模組

# 匯入objection detection所需要的模組
from object_detection.utils import label_map_util
from object_detection.utils import visualization_utils as vis_util

5、設定資訊提示等級

我們在這裡表示只顯示 warning 和 Error

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

6、設定模型下載的檔名稱和下載地址

這裡我們呼叫了已經訓練好的模型ssd_mobilenet_v2_coco來進行檢測,如果使用我們自己訓練的模型也是可以的,詳細的流程可以參考一下手把手教你如何用objection detection API實現實時目標檢測(三)這篇文章。

但是自己訓練模型的成本比較大,訓練的效果應該會不會太好,我之前自己訓練了一個只能檢驗手機的一個模型(熟悉一下流程還是不錯的)

# 這裡設定了模型下載到的檔名稱和下載地址
MODEL_NAME = 'ssd_mobilenet_v2_coco_2018_03_29'
MODEL_FILE = MODEL_NAME + '.tar.gz'
DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/'

當然了,我們也可以從Tensorflow detection model zoo下載其他的模型:
在這裡插入圖片描述

只需要修改下載地址和檔名即可:

MODEL_NAME = 'ssd_mobilenet_v2_coco_2018_03_29'
MODEL_FILE = MODEL_NAME + '.tar.gz'
DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/'

7、匯入訓練好的模型和標籤

我們把實際使用的模型和標籤匯入,並設定標籤的數目為90

# 匯入訓練好的模型(這裡我們需要提示的是,我們在這裡匯入的可以是自己訓練的模型,也可以是別人已經訓練好的,本文用的是別人已經訓練好的,我自己訓練的資料集太小)
PATH_TO_CKPT = MODEL_NAME + '/frozen_inference_graph.pb'

# 匯入每個box已經訓練好的label
PATH_TO_LABELS = os.path.join('test', 'mscoco_label_map.pbtxt')

NUM_CLASSES = 90  #能識別出的物體類別數目是90

8、解壓檔案並將模型和標籤載入

tar_file = tarfile.open(MODEL_FILE)      #這裡對我們剛才下載的ssd_mobilenet_v2_coco_2018_03_29.tar.gz檔案進行解壓
for file in tar_file.getmembers():       #對解壓後文件的子資料夾進行檢查,
  file_name = os.path.basename(file.name)
  if 'frozen_inference_graph.pb' in file_name:
    tar_file.extract(file, os.getcwd())
    
## 我們把已經下載好的模型傳入記憶體之中
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載入
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)

9、import 所需要的視訊匯入模組

如果在import過程中發生錯誤,則根據提示將相應模組進行pip install即可

import imageio                                   #這裡我們匯入imageio模組,用來進行視訊的讀取
imageio.plugins.ffmpeg.download()                #這裡會下載一個ffmpeg程式,用於對視訊進行剪輯,也可提前下載好

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

10、生成box和相應的標籤置信度

def detect_objects(image_np, sess, detection_graph):
    # 擴充套件維度,應為模型期待: [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')

    # 每個框代表一個物體被偵測到
    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')

    # 執行偵測任務.  
    (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)
    return image_np

11、輸出視訊並儲存為gif檔案

我們對視訊的第16-65秒進行檢測,並把檢測後的視訊命名為:video1_out.mp4儲存,並轉化為gif格式也儲存一份。

def process_image(image):
    # NOTE: The output you return should be a color image (3 channel) for processing video below
    # you should return the final output (image with lines are drawn on lanes)
    with detection_graph.as_default():
        with tf.Session(graph=detection_graph) as sess:
            image_process = detect_objects(image, sess, detection_graph)
            return image_process
        
white_output = 'video1_out.mp4'
clip1 = VideoFileClip("video1.mp4").subclip(15,65)
white_clip = clip1.fl_image(process_image) #NOTE: this function expects color images!!s
white_clip.write_videofile(white_output, audio=False)

from moviepy.editor import *
clip1 = VideoFileClip("video1_out.mp4") #將檢測完成之後的視屏以video1_out.mp4的名字輸出
clip1.write_gif("final.gif")            #將視訊轉化為gif的格式進行儲存

五、效果檢測

這裡我匯入一段長為10分鐘左右的視訊(為了減少檢測時間,我只選擇了15-65秒的視訊),檢測的效果如下:

視訊和gif都太大了,我上傳了到了優酷中,大家可以看看:優酷地址

截圖如下:
在這裡插入圖片描述