實戰:使用 PyTorch 和 OpenCV 實現實時目標檢測系統

2021-12-17 OpenCV與AI深度學習

點擊上方「OpenCV與AI深度學習」,選擇加"星標"或「置頂

重磅乾貨,第一時間送達

自動駕駛汽車可能仍然難以理解人類和垃圾桶之間的區別,但這並沒有使最先進的物體檢測模型在過去十年中取得的驚人進步相去甚遠。


將其與 OpenCV 等庫的圖像處理能力相結合,如今在數小時內構建實時對象檢測系統原型要容易得多。在本指南中,我們將嘗試向您展示如何開發用於簡單對象檢測應用程式的子系統,以及如何將所有這些組合在一起。



我知道你們中的一些人可能會想,為什麼我們要使用Python,在某種程度上,它對於實時應用程式來說不是太慢了嗎。


大多數計算重操作,如預測或圖像處理,都是通過PyTrand和OpenCV來執行的,它們都使用C++在場景後面實現這些操作,因此,如果我們在這裡使用C++或Python,則不會有太大的差別。




輸入的視頻源可以是任何內容,從網絡攝像頭讀取,或解析現有視頻,或從連接到網絡的外部攝像頭。在此示例中,我們將展示如何從 youtube 或網絡攝像頭讀取視頻流。


你們可能不想出去創建新視頻,而是使用許多在線可用的視頻。在這種情況下,你們可以從 youtube 讀取視頻流。

import cv2 import pafy URL = "https://www.youtube.com/watch?v=dQw4w9WgXcQ" play = pafy.new(self._URL).streams[-1] assert play is not None stream = cv2.VideoCapture(play.url) 



import cv2stream = cv2.VideoCapture(0) 


如果你們正在構建將部署在伺服器上的應用程式,攝像機擁有一個自己的 IP 地址,你可以從中訪問視頻流。

import cv2camera_ip = "rtsp://username:password@IP/port"stream = cv2.VideoCapture(camera_ip)



有許多不錯的對象檢測模型,每個模型都有其優點和缺點。為了簡單起見,我們將使用YoloV5,因為它為我們提供了對我們的實時應用程式至關重要的快速應用。你們還可以查看其他模型,例如 FasterRCNN。


我們可以直接從 PyTorch hub 加載模型,第一次運行代碼可能需要幾分鐘,因為它會從網際網路上下載模型,但下次它將直接從磁碟加載。

from torch import hub model = torch.hub.load( \                      'ultralytics/yolov5', \                      'yolov5s', \                      pretrained=True)



我們可以說「解析一個視頻流,從一幀開始」。那麼讓我們看看如何對單個幀進行評分和解析。我們用來執行應用的設備對我們的應用速度產生了巨大的影響,現代深度學習模型在使用 GPU 時效果最好,因此如果你們有一個帶有 CUDA 內核的 GPU,它將大大提高您的性能。根據經驗,即使是單個 GPU 的系統也可以達到每秒 45-60 幀,而 CPU 最多只能提供 25-30 幀。

"""The function below identifies the device which is availabe to make the prediction and uses it to load and infer the frame. Once it has results it will extract the labels and cordinates(Along with scores) for each object detected in the frame."""def score_frame(frame, model):    device = 'cuda' if torch.cuda.is_available() else 'cpu'    model.to(device)    frame = [torch.tensor(frame)]    results = self.model(frame)    labels = results.xyxyn[0][:, -1].numpy()    cord = results.xyxyn[0][:, :-1].numpy()    return labels, cord


一旦我們對幀進行了評分,在將幀寫入輸出流之前,我們需要在幀上繪製識別的對象及其框。為此,我們可以使用 OpenCV 的圖像處理工具包。

"""The function below takes the results and the frame as input and plots boxes over all the objects which have a score higer than our threshold."""def plot_boxes(self, results, frame):    labels, cord = results    n = len(labels)    x_shape, y_shape = frame.shape[1], frame.shape[0]    for i in range(n):        row = cord[i]                if row[4] < 0.2:             continue        x1 = int(row[0]*x_shape)        y1 = int(row[1]*y_shape)        x2 = int(row[2]*x_shape)        y2 = int(row[3]*y_shape)        bgr = (0, 255, 0)         classes = self.model.names         label_font = cv2.FONT_HERSHEY_SIMPLEX         cv2.rectangle(frame, \                      (x1, y1), (x2, y2), \                       bgr, 2)         cv2.putText(frame,\                    classes[labels[i]], \                    (x1, y1), \                    label_font, 0.9, bgr, 2)         return frame





現在我們將它們整合到一個調用函數中,在循環中執行整個操作,讓我們回顧一下我們的主要功能必須執行以成功運行應用程式的步驟。
"""The Function below oracestrates the entire operation and performs the real-time parsing for video stream."""def __call__(self):    player = self.get_video_stream()     assert player.isOpened()             x_shape = int(player.get(cv2.CAP_PROP_FRAME_WIDTH))    y_shape = int(player.get(cv2.CAP_PROP_FRAME_HEIGHT))    four_cc = cv2.VideoWriter_fourcc(*"MJPG")     out = cv2.VideoWriter(out_file, four_cc, 20, \                          (x_shape, y_shape))     ret, frame = player.read()     while rect:         start_time = time()         results = self.score_frame(frame)         frame = self.plot_boxes(results, frame)         end_time = time()        fps = 1/np.round(end_time - start_time, 3)         print(f"Frames Per Second : {fps}")        out.write(frame)         ret, frame = player.read() 

你們應該將所有這些組件打包到一個類中,該類可以與你們希望將輸出流寫入其中的 URL 和輸出文件一起調用。最終效果如下:



當然,生產級實時應用程式比這複雜得多,但本文並不打算教授這一點。它是為了展示 Python 的驚人力量,它使我們能夠在數小時內構建如此複雜的應用程式原型。


Github代碼連結:https://github.com/akash-agni


QQ學習交流群

覺得有用,麻煩給個贊和在看 

相關焦點

  • 教程 | 如何使用Docker、TensorFlow目標檢測API和OpenCV實現實時目標檢測和視頻處理
    Docker 容器中的 TensorFlow 目標檢測 API,通過網絡攝像頭執行實時目標檢測,同時進行視頻後處理。)開始探索實時目標檢測問題,這促使我研究 Python 多進程庫,使用這篇文章(https://www.pyimagesearch.com/2015/12/21/increasing-webcam-fps-with-python-and-opencv/)中介紹的方法提高每秒幀數(frames per second,FPS)。
  • 模板識別:使用OpenCV實現基於特徵的圖像對齊
    我們將使用的技術通常被稱為「基於特徵圖像對齊」,因為在該技術中,在一個圖像中檢測稀疏的特徵集並且在另一圖像中進行特徵匹配。然後基於這些匹配特徵將原圖像映射到另一個圖像,實現圖像對齊。在OpenCV中實現了幾個關鍵點檢測器(例如SIFT,SURF和ORB)。在本教程中,我們將使用ORB特徵檢測器,因為SIFT和SURF已獲得專利,如果您想在實際應用中使用它,則需要支付許可費。ORB快速,準確且無許可證!ORB關鍵點使用圓圈顯示在下圖中。
  • OpenCV實戰:人臉關鍵點檢測(FaceMark)
    本教程僅利用OpenCV,不依賴任何其它第三方庫來實現人臉關鍵點檢測,這一特性是之前沒有的。因為OpenCV自帶的samples中只有常見的人臉檢測、眼睛檢測和眼鏡檢測等(方法是harr+cascade或lbp+cascade)。
  • OpenCV使用CUDA處理圖像的教程與實戰
    在多張圖像上使用對多張圖像使用Dask進行並行延時處理我們需要創建GPU空間(GPU_frame)來保存圖像(就像相框保存圖片一樣),然後才能將圖像上傳到GPU。在「小白學視覺」公眾號後臺回覆:Python視覺實戰項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數、添加眼線、車牌識別、字符識別、情緒檢測
  • 實用教程詳解:模型部署,用DNN模塊部署YOLOv5目標檢測(附原始碼)
    三、DNN模塊部署Yolov5用opencv的dnn模塊做yolov5目標檢測的程序,包含兩個步驟:1)、把pytorch的訓練模型pth文件轉換到onnx文件;2)、opencv的dnn模塊讀取onnx文件做前向計算。
  • 模型部署翻車記:PyTorch轉onnx踩坑實錄
    接下來通過幾個實例程序,介紹pytorch轉換onnx的過程中遇到的坑。1.  opencv裡的深度學習模塊不支持3維池化層起初,我在微信公眾號裡看到一篇文章《使用Python和YOLO檢測車牌》。有了這4個角點之後,對車牌做透視變換,這時的車牌就是水平放置的,最後做車牌識別,這樣就做成了一個車牌識別系統,在這個系統裡包含車牌檢測,車牌矯正,車牌識別三個模塊。車牌檢測模塊使用retinaface,原始的retinaface是做人臉檢測的,它能輸出人臉檢測矩形框和人臉5個關鍵點。
  • [Pytorch]教程-使用 PyTorch 進行 Faster R-CNN 目標檢測
    Faster R-CNN目標檢測器的發展歷程3. 使用 PyTorch 加載Faster R-CNN模型進行目標檢測4. Faster R-CNN模型在CPU|GPU上推理時間比較1.在目標檢測中,我們不僅對輸入的圖像中存在的目標對象感興趣,而且也對目標在輸入圖像中的位置感興趣。故而,從某種意義上,目標檢測的範疇超越了圖像分類。如上圖所示,分別展示了圖像分類與目標檢測的區別。1.1. 圖像分類與目標檢測:選哪個?
  • 基於OpenCV實戰:3步實現圖像降噪
    我們必須安裝兩個庫才能使我們的程序正常運行:numpy和opencv-python。我們可以使用PIP庫管理器將它們安裝在一行中:pip install numpy opencv-python讓我們繼續創建一個新的Jupyter Notebook(但可以隨意使用所需的代碼編寫環境)。
  • 【模型訓練】目標檢測實現分享四:詳解 YOLOv4 算法實現
    本文是目標檢測類算法實現分享的第四篇,前面已經寫過三篇,感興趣的同學可以查閱:  (1) 《【模型訓練】目標檢測實現分享一:詳解 YOLOv1 算法實現》;  (2) 《【模型訓練】目標檢測實現分享二
  • 如何基於Flutter和Paddle Lite實現實時目標檢測
    這款引擎允許我們在很多硬體平臺上實現輕量化的高效預測,進行一次預測耗時較短,也不需要太多的計算資源。那麼如果我們想開發一款既能在本地進行預測又能在Android和iOS上面有一致體驗的App的話,Flutter無疑是一個好選擇。
  • 基於qt的opencv實時圖像處理框架FastCvLearn實戰
    static_cast<CaptureThread::MASK_TYPE>(i)綜合上述知識,下面這個函數可以理解為將uint8_t masks_flag與uint8_t bit進行位運算。其可作為多個算法的開關函數。
  • onnx實現對pytorch模型推理加速
    Pytorch 模型轉onnx當提到保存和加載模型時,有三個核心功能需要熟悉:1.torch.save:將序列化的對象保存到disk。這個函數使用Python的pickle實用程序進行序列化。使用這個函數可以保存各種對象的模型、張量和字典。
  • 使用YOLOv3訓練自己數據的目標檢測
    點擊我愛計算機視覺標星,更快獲取CVML新技術YOLOv3是當前計算機視覺中最為流行的實時目標檢測算法之一。
  • TensorFlow 上基於 Faster RCNN 的目標檢測
    對目標檢測感興趣的讀者可以通過 Pascal VOC【1】、ILSVRC【2】、COCO【3】 等國際比賽了解具體規則和數據等細節。Faster RCNN 【4】是對之前的 RCNN、SPPNet、Fast RCNN 等目標檢測框架的進一步優化,創造性地將 Region Proposal 過程也融合進入 CNN 模型,稱之為 RPN(Region Proposal Network),大幅降低了 test-time 計算量,可以實現近似實時目標檢測(使用 VGG-16 模型,每秒處理 5 張圖,在 Pascal VOC 2007
  • 基於HOG+SVM的目標檢測與識別
    國家也投入了大量的財力物力推進其發展,在各大高校、科研院所也有相應的機構進行專門的研發,在研究生學歷攻讀階段,也有相應的基礎和高級課程的設計。今天,我不是以一個科研人員的身份進行說話,而是站在一個普通的圖像算法應用工程師的角度總結下我的工作經驗,不足之處,多多海涵!     下面,我以一個人臉目標的檢測為例,使用OpenCV2.4.7做一個HOG+SVM的檢測實例。
  • OpenCV Python + Tesseract-OCR輕鬆實現中文識別
    安裝opencv-python開發包pip install opencv-python安裝Tesseract-OCR Python SDK支持下載Tesseract-OCR 5.0.0-alpha.20201127安裝包並安裝!
  • 基於OpenCV的顯著圖繪製
    顯著性是圖像的突出部分,我們的大腦會特別關注這個部分。上圖突出了我們在看到一個場景或圖像時會注意到的部分。例如,大家有沒有曾經在看廣告的時候被一些特別的內容吸引,為此我們還特意停下來多看了一會兒?這就是廣告的顯著性,即使讓我們可以一眼看到廣告,也會被他吸引。首先,您需要安裝OpenCV庫。如果已經安裝了pip,則可以通過運行以下命令來完成。
  • 【實戰】基於TensorRT 加速YOLO系列以及其他加速算法實戰與對比
    TensorRT 做YOLO的加速,先概述我這邊實現的速度和精度對比可以看到,精度上使用TensorRT 精度不掉Install OpenCV 安裝opencvsudo add-apt-repository ppa:timsc/opencv-3.3sudo apt-get updatesudo apt install libopencv-dev4.
  • OpenCV 3.0之後三年半,OpenCV 4.0出爐
    也就是說,它是一套包含從圖像預處理到預訓練模型調用等大量視覺 API 的庫,並可以處理圖像識別、目標檢測、圖像分割和行人再識別等主流視覺任務。OpenCV 最顯著的特點是它提供了整套流程的工具,因此我們根本不需要了解各個模型的原理就能一個個 API 構建視覺任務。OpenCV 使用 BSD 許可證,因此對研究和商業用途均免費。
  • 輕鬆學pytorch之使用onnx runtime實現pytorch模型部署
    /paddle等深度學習框架訓練的模型都可以轉換為ONNX格式,然後ONNX格式模型可以通過ONNX runtime組件實現模型的推理預測並加速,從而實現不基於原來框架的模型部署。默認情況下,上述安裝的onnxruntime只支持CPU推理,也就是說模型是運行的CPU版本,想要完成CUDA版本的推理,需要安裝onnxruntime-gpu版本,安裝的命令行如下:pip install onnxruntime-gpu使用