使用OpenCV和Python構建自己的車輛檢測模型

2020-08-28 人工智慧遇見磐創

介紹

我喜歡智慧城市的理念。自動智能能源系統、電網、一鍵接入埠的想法等等。這是一個令人著迷的概念!老實說,這是一個數據科學家的夢想,我很高興世界上很多城市都在朝著更智能的方向發展。

智能城市的核心組成部分之一是自動交通管理。這不禁讓我思考——我能用我的數據科學知識來建立一個車輛檢測模型,在智能交通管理中發揮作用嗎?

想想看,如果你能在紅綠燈攝像頭中集成車輛檢測系統,你可以輕鬆地同時跟蹤許多有用的東西:

  • 白天交通路口有多少輛車?
  • 什麼時候交通堵塞?
  • 什麼樣的車輛(重型車輛、汽車等)正在通過交叉路口?
  • 有沒有辦法優化交通,並通過不同的街道進行分配?

還有很多例子就不一一列舉。應用程式是無止境的!

我們人類可以很容易地在一瞬間從複雜的場景中檢測和識別出物體。然而,將這種思維過程轉化為機器的思維,需要我們學習使用計算機視覺算法進行目標檢測。

因此在本文中,我們將建立一個自動車輛檢測器和計數器模型。以下視頻是你可以期待的體驗:

https://youtu.be/C_iZ2yivskE

注意:還不懂深度學習和計算機視覺的新概念?以下是兩門熱門課程,可開啟你的深度學習之旅:

  • 深度學習基礎(https://courses.analyticsvidhya.com/courses/fundamentals-of-deep-learning?utm_source=blog&utm_medium=vehicle-detection-opencv-python)
  • 利用深度學習的計算機視覺(https://courses.analyticsvidhya.com/courses/computer-vision-using-deep-learning-version2?utm_source=blog&utm_medium=vehicle-detection-opencv-python)

目錄

  1. 視頻中運動目標檢測的思想
  2. 視頻中目標檢測的真實世界用例
  3. 視頻目標檢測的基本概念 幀差分 圖像閾值 檢測輪廓 圖像膨脹
  4. 利用OpenCV構建車輛檢測系統

視頻中運動目標檢測的思想

目標檢測是計算機視覺中一個引人入勝的領域。當我們處理視頻數據時,它達到了一個全新的水平,複雜性上升了一個等級,但也有回報!

我們可以使用目標檢測算法來執行超級有用的高價值任務,如監視、交通管理、打擊犯罪等。下面的GIF圖演示了這個想法:

在目標檢測中,我們可以執行許多子任務,例如計算目標數量、查找目標的相對大小或查找目標之間的相對距離。這些子任務都很重要,因為它們有助於解決一些最棘手的現實問題。

如果你希望從頭開始學習目標檢測,我建議你使用以下教程:

  • 逐步介紹基本的目標檢測算法(https://www.analyticsvidhya.com/blog/2018/10/a-step-by-step-introduction-to-the-basic-object-detection-algorithms-part-1/?utm_source=blog&utm_medium=vehicle-detection-opencv-python)
  • 利用SlimYOLOv3進行實時目標檢測(https://www.analyticsvidhya.com/blog/2019/08/introduction-slimyolov3-real-time-object-detection/?utm_source=blog&utm_medium=vehicle-detection-opencv-python)
  • 其他目標檢測物品和資源(https://www.analyticsvidhya.com/blog/tag/object-detection/?utm_source=blog&utm_medium=vehicle-detection-opencv-python)

讓我們看看一些令人興奮的現實世界中的目標檢測用例。

視頻中目標檢測的真實世界用例

如今,視頻目標檢測正被廣泛應用於各個行業。使用案例從視頻監控到體育廣播,再到機器人導航。

好消息是,在未來的視頻目標檢測和跟蹤用例中,可能性是無窮的。這裡我列出了一些有趣的應用程式:

  • 人群計數(https://www.analyticsvidhya.com/blog/2019/02/building-crowd-counting-model-python/)
  • 車牌檢測與識別
  • 運動中的球跟蹤(https://www.analyticsvidhya.com/blog/2020/03/ball-tracking-cricket-computer-vision/)
  • 機器人學
  • 交通管理(我們將在本文中看到這個想法)

視頻目標檢測的基本概念

在開始構建視頻檢測系統之前,你應該知道一些關鍵概念。一旦你熟悉了這些基本概念,就可以為你選擇的任何用例構建自己的檢測系統。

那麼,你希望如何檢測視頻中的移動目標?

我們的目標是捕捉運動物體的坐標並在視頻中突出顯示該物體。請考慮下面視頻中的這一幀:

我們希望我們的模型能夠檢測視頻中的運動目標,如上圖所示。檢測到移動的汽車,並在汽車周圍創建一個邊界框。

解決這個問題有多種方法。你可以為目標檢測訓練一個深度學習模型,也可以選擇一個預先訓練好的模型並根據你的數據對其進行微調。然而,這些方法都是有監督的學習方法,需要標記數據來訓練目標檢測模型。

在本文中,我們將重點討論視頻中無監督的目標檢測方法,即不使用任何標記數據的目標檢測。我們將使用幀差分技術。讓我們了解它是如何工作的!

幀差分

視頻是一組按正確順序堆疊在一起的幀。所以,當我們看到一個物體在視頻中移動時,這意味著這個物體在每一個連續的幀上都處於不同的位置。

如果我們假設除了該目標之外,在一對連續的幀中沒有其他物體移動,那麼第一幀與第二幀的像素差將突出顯示移動目標的像素。現在,我們得到了移動物體的像素和坐標。這就是幀差分法的工作原理。

舉個例子。考慮視頻中的以下兩個幀:

你能看出這兩幀的區別嗎?

握筆的手的位置從第1幀變為第2幀。其餘的物體根本沒有移動。所以,正如我前面提到的,為了定位移動目標,我們將執行幀差分。結果如下:

你可以看到高亮或白色區域,這是手最初出現的地方。除此之外,記事本的邊緣也會突出顯示一點。這可能是由於手的移動改變了光照。建議不要對靜止物體進行不必要的檢測。因此,我們需要對幀執行某些圖像預處理步驟。

圖像閾值

在這種方法中,灰度圖像的像素值根據閾值被指定為表示黑白顏色的兩個值之一。因此,如果一個像素的值大於一個閾值,它被賦予一個值,否則它被賦予另一個值。

在本例中,我們將對上一步驟中幀差分的輸出圖像應用圖像閾值:

你可以看到,不需要的高亮區域的大部分已經消失了。高亮顯示的「記事本」邊緣不再可見。合成的圖像也可以稱為二值圖像,因為其中只有兩種顏色。在下一個步驟中,我們將看到如何捕獲這些高亮區域。

檢測輪廓

輪廓用於識別圖像中具有相同顏色或強度的區域的形狀。輪廓就是目標區域周圍的邊界。因此,如果我們在閾值步驟後對圖像應用輪廓檢測,我們將得到以下結果:

白色區域被淺灰色的邊界所包圍,這些邊界就是輪廓。我們很容易得到這些輪廓的坐標。這意味著我們可以得到高亮區域的位置。

請注意,有多個高亮顯示區域,每個區域由輪廓包圍。在我們的例子中,具有最大面積的輪廓是我們期望的區域。因此,輪廓最好儘可能少。

在上圖中,仍然有一些不必要的白色區域碎片。還有改進的餘地。我們的想法是合併附近的白色區域以獲得更少的輪廓,為此,我們可以使用另一種稱為圖像膨脹的技術。

圖像膨脹

這是對圖像的卷積操作,其中核心(矩陣)傳遞到整個圖像上。為了給你直覺,右邊的圖像是左邊圖像的放大版本:

所以,讓我們對我們的圖像進行圖像膨脹,然後我們將再次找到輪廓:

事實證明,許多支離破碎的區域已經相互融合。現在我們可以再次在這張圖片中找到輪廓:

在這裡,我們只有四個候選輪廓,從中我們可以選擇一個有最大面積的輪廓。也可以在原始幀上繪製這些輪廓,以查看輪廓圍繞移動目標的情況:

用OpenCV和Python構建車輛檢測系統

我們準備建立我們的車輛檢測系統!在這個實現中,我們將大量使用計算機視覺庫OpenCV(4.0.0版)(https://www.analyticsvidhya.com/blog/2019/03/opencv-functions-computer-vision-python/?utm_source=blog&utm_medium=vehicle-detection-opencv-python) 。我們先導入所需的庫和模塊。

導入庫

import osimport reimport cv2 get file names of the framescol_frames = os.listdir(&39;)39;\D&39;& empty list to store the framescol_images=[]for i in col_frames: 39;frames/& append the frames to the list col_images.append(img)

數據探索

讓我們顯示兩個連續的幀:

34;frame: & convert the frames to grayscalegrayA = cv2.cvtColor(col_images[i], cv2.COLOR_BGR2GRAY)grayB = cv2.cvtColor(col_images[i+1], cv2.COLOR_BGR2GRAY)39;gray& perform image thresholdingret, thresh = cv2.threshold(diff_image, 30, 255, cv2.THRESH_BINARY)39;gray& apply image dilationkernel = np.ones((3,3),np.uint8)dilated = cv2.dilate(thresh,kernel,iterations = 1)39;gray& plot vehicle detection zoneplt.imshow(dilated)cv2.line(dilated, (0, 80),(256,80),(100, 0, 0))plt.show()

水平線y = 80以下的區域是我們的車輛檢測區域。我們將只檢測在這個區域發生的任何移動。你還可以創建自己的檢測區。

現在讓我們在上述幀的檢測區域中找到輪廓:

34;contours& count of discovered contours len(valid_cntrs)

接下來,讓我們繪製輪廓和原始幀:

dmy = col_images[13].copy()cv2.drawContours(dmy, valid_cntrs, -1, (127,200,0), 2)cv2.line(dmy, (0, 80),(256,80),(100, 255, 255))plt.imshow(dmy)plt.show()

太酷了!只有位於檢測區域內的車輛輪廓可見。這就是我們在整個畫面中檢測車輛的方法

視頻中的車輛檢測

現在是時候對所有幀應用相同的圖像變換和預處理操作,並找到所需的輪廓。重申一下,我們將遵循以下步驟:

  1. 對每對連續幀應用幀差分
  2. 對上一步的輸出圖像應用圖像閾值
  3. 對上一步的輸出圖像進行圖像放大
  4. 在上一步的輸出圖像中查找輪廓
  5. 檢測區域出現的候選輪廓
  6. 保存幀與最終輪廓

font stylefont = cv2.FONT_HERSHEY_SIMPLEX34;contour_frames_3/& frame differencing grayA = cv2.cvtColor(col_images[i], cv2.COLOR_BGR2GRAY) grayB = cv2.cvtColor(col_images[i+1], cv2.COLOR_BGR2GRAY) diff_image = cv2.absdiff(grayB, grayA) image dilation dilated = cv2.dilate(thresh,kernel,iterations = 1) shortlist contours appearing in the detection zone valid_cntrs = [] for cntr in contours: x,y,w,h = cv2.boundingRect(cntr) if (x <= 200) & (y >= 80) & (cv2.contourArea(cntr) >= 25): if (y >= 90) & (cv2.contourArea(cntr) < 40): break valid_cntrs.append(cntr) 34;vehicles detected: &39;.png& specify video namepathOut = &39;39;\D&39;&read frames img = cv2.imread(filename) height, width, layers = img.shape size = (width,height) 39;DIVX& writing to a image array out.write(frame_array[i])out.release()

恭喜你學會了車輛目標檢測!

尾注

在本教程中,我們學習了如何使用幀差分技術在視頻中執行移動目標檢測。我們還討論了目標檢測和圖像處理的一些概念。然後用OpenCV建立了自己的運動目標檢測系統。

相關焦點

  • 使用OpenCV和Python構建自己的車輛檢測模型
    然而,將這種思維過程轉化為機器的思維,需要我們學習使用計算機視覺算法進行目標檢測。因此在本文中,我們將建立一個自動車輛檢測器和計數器模型。以下視頻是你可以期待的體驗:https://youtu.be/C_iZ2yivskE注意:還不懂深度學習和計算機視覺的新概念?
  • 使用樹莓派和Python實現目標檢測
    這項研究的目的是確定在一個便宜的行動裝置上的對象檢測模型是否可以用於現實世界的任務。作為一個移動平臺,我們使用的是樹莓派3B。樹莓派是一款售價35美元的單板機,這意味著微處理器、內存、無線收音機和埠都在一塊電路板上。它是一臺Linux計算機,所以從技術上講,它可以做Linux計算機能做的一切事情,比如運行電子郵件和網絡伺服器,充當網絡存儲,或者用於對象檢測。
  • 使用Python為初學者構建AI汽車和行人跟蹤
    顏色增加了模型的複雜性,或者我們可以說灰色圖像是用來簡化數學的。例如,我們可以談論亮度、對比度、邊緣、形狀、輪廓、紋理、透視、陰影等,而不必討論顏色。如果某個物體與上述特徵相匹配,模型會將其檢測為行人。讓我們開始編寫檢測器步驟1:我們首先需要安裝OpenCV庫。
  • 使用OpenCv和Dlib進行打哈欠檢測
    打哈欠檢測與應用打哈欠檢測就是使用OpenCV和Dlib來檢測打哈欠(由於疲勞或無聊而張大嘴巴深吸氣)。可廣泛應用於自駕車、駕駛員疲勞檢測、駕駛員睡意檢測、駕駛員意識檢測等領域。安裝OpenCv和Dlib庫OpenCv的安裝如下:pip install opencv-pythonDlib的安裝如下:pip install cmakepip install dlib導入Opencv,Dlib和Numpy庫設置dat文件我們將.dat文件放置到工作目錄中,它是一個可以識別面部特徵並提供信息的模型
  • 使用Python和OpenCV檢測和標記湖面輪廓
    OpenCV是一個跨平臺的計算機視覺庫,廣泛的被應用於物體識別,機器視覺和圖像處理等領域。這篇文章裡我們將使用OpenCV探測地圖中湖面的輪廓,並標記面積最大的湖面。下面示例中圖片來至於goolge地圖截圖。
  • OpenCV無神經網絡對象檢測模型,如何進行目標的檢測與追蹤
    前面的文章,小編分享了很多關於目標檢測與目標追蹤的文章,且使用python方面的目標檢測算法打造了自己的目標追蹤專欄文章,小夥伴們可以參考由於目標檢測算法太大,需要大量的計算機的計算能力,在小型的應用場景中,使用YOLO系列,或者SSD對象檢測(雖然SSD算法簡單,模型較小),Fast-RCNN 等等對象檢測算法,需要配備高計算能力的計算機,有沒有簡單的適合小型應用場景的目標檢測與追蹤算法
  • opencv調用深度學習模型
    總有不少人喜歡深度學習,所以,這裡寫一個用opencv調用python深度學習的例子。python的訓練以後再說,這裡就不說了,畢竟網上有太多現成的代碼。例子如下,這個例子展示的是在opencv裡面調用tensorflow的訓練模型文件,實現視覺分類功能。
  • 使用Python+OpenCV實現圖像數據採集
    通常,數據科學家會建立一個圖像識別模型,觀察其準確性,如果足夠高,就表示工作完成了。然而,自從我13歲開始學習機器學習,我就一直不明白這一點,為什麼要花費所有的時間來建立最好的模型——只是為了滿足於一個數字?在本文中,將提供代碼並指導你如何通過構建與模型交互的拍照接口來真正完成項目。
  • python3.7和opencv4.1來實現人臉識別和人臉特徵比對以及模型訓練
    OpenCV4.1已經發布將近一年了,其人臉識別速度和性能有了一定的提高,這裡我們使用opencv來做一個實時活體面部識別的demo 首先安裝一些依賴的庫pip install opencv-pythonpip install opencv-contrib-pythonpip install numpypip install pillow
  • Python調用Dlib實現人臉關鍵點檢測
    今天,夏老師跟大家分享這些應用場景背後的技術——Python調用Dlib實現人臉關鍵點檢測。這次我們會用到兩個工具,分別是opencv和dlib。>opencv可以使用以下命令直接安裝pip install opencv-pythondlib可能會比較麻煩,我的電腦直接使用pip安裝會一片紅,在網上找了很多資料,然後我先從https
  • 基於TensorFlow 、OpenCV 和 Docker 的實時視頻目標檢測
    翻譯 | 於志鵬  徐普     校對 | 陶玉龍     整理 | 孔令雙在本文中,我將介紹如何在 Docker 容器中使用 Tensorflow Object-detection API 來執行實時(網絡攝像頭)和視頻的目標檢測。
  • 目標檢測必須要OpenCV?10行Python代碼也能實現,親測好用!
    大數據文摘出品編譯:朱一輝、雪清、小魚短短10行代碼就可以實現目標檢測?!本文作者和他的團隊構建了一個名為ImageAI 的Python庫,集成了現今流行的深度學習框架和計算機視覺庫。本文將手把手教你構建自己的第一個目標檢測應用,而且文摘菌已經幫你踩過坑了,親測有效!
  • 終極指南:構建用於檢測汽車損壞的Mask R-CNN模型(附Python演練)
    Mask R-CNN的工作原理如何構建用於汽車損壞檢測的Mask R-CNN收集數據注釋數據 訓練模型驗證模型運行圖像模型並進行預測什麼是MaskR-CNN?Mask R-CNN是一個實例分割模型,它允許我們識別目標類別的像素位置。「實例分割」意味著對場景內的各個目標進行分段,無論它們是否屬於同一類型- 即識別單個車輛,人員等。
  • 藉助Streamlit框架,可僅使用Python代碼來構建基於瀏覽器的UI
    Python項目變得前所未有的簡單,你可以僅僅使用Python代碼來構建基於瀏覽器的UI。本次演示將為迷宮求解器程序構建UI。StreamlitStreamlit是一種Web框架,旨在供數據科學家使用Python輕鬆部署模型和可視化。它運行速度既快又簡約,代碼既漂亮又對用戶友好。
  • 在瀏覽器中使用TensorFlow.js和Python構建機器學習模型
    這就是為什麼構建不僅能夠訓練機器學習模型而且能夠在瀏覽器本身中「學習」或「遷移學習」的應用程式是有意義的。在本文中,我們將首先了解使用TensorFlow.js的重要性及其它的不同組件。然後,我們將深入討論使用TensorFlow.js在瀏覽器中構建我們自己的機器學習模型。然後我們將構建一個應用程式,來使用計算機的網絡攝像頭檢測你的身體姿勢!
  • Opencv-Python簡介
    剛開始接觸Opencv的時候,使用的是C++版本的,一邊學C++,一邊跟著opencv教材實現裡面的圖像處理操作,將一張曝光不足,黑暗的圖像經過直方圖均衡化變得清晰,感覺很神奇,opencv,嘗試了一下,哇!
  • TensorFlow對象檢測:訓練,導出,優化,推斷
    在訓練模型上運行推理將訓練後的模型轉換為量化格式,以便部署在諸如Jetson Nano的板上構建引擎和部署引擎之間的tensorRT版本和cuda計算能力不匹配這個清單永無止境……為克服上述一些問題,我們在Monk Object Detection Toolkit中的Tensorflow 對象檢測 API的兩個版本上添加了一個低代碼的
  • 使用OpenCV和Python構建運動熱圖視頻
    OpenCV是一個強大的圖像和視頻處理庫,在這篇文章中,我將創建一個運動熱圖,用於檢測運動、一些物體或人的流動方向,以及在投影公共區域時對建築師的幫助。簡介:OpenCV,或(開源計算機視覺)是英特爾於1999年開發的一個庫,主要是計算機視覺和實時視頻操作
  • YOLOV4視頻對象檢測,python+opencv輕鬆實現
    上期文章,我們介紹了YOLOV4對象檢測算法的模型以及基本知識,哪裡還進行了圖片的對象檢測,如何使用YOLOV4進行視頻檢測與實時視頻檢測呢?COCO數據集上的對象label,然後定義了隨機的顏色,這裡主要是為了後期檢測到不同的對象時,採用不同的顏色邊框進行標註cv2.dnn.readNetFromDarknet(configPath, weightsPath)來加載YOLOV4的預訓練模型,這裡需要注意:opencv的版本需要時4.4版本
  • 保護女神林志玲,給臉打馬賽克python+opencv實現
    1 說明:=====1.1 python+opencv實現人臉定位、馬賽克採用2種方法:dlib法和cv2自帶xml法。1.2 cv2自帶xml法:加載人臉模型haarcascade_frontalface_default.xml1.3 圖片來源:來自今日頭條正版免費圖庫,向女神致敬,僅供學習。