使用 Yolo-NAS 輕松進行對象檢測
學(xué)習(xí)如何使用 Python 和 yolo-NAS 進行對象檢測。YOLO(You Only Look Once,你只看一次)徹底改變了計算機視覺領(lǐng)域。YOLO 的第一個版本由 Joseph Redmon 等人在 2016 年發(fā)布,它在速度和準(zhǔn)確性方面都打破了基準(zhǔn)。在對象檢測方面,YOLO 一直是數(shù)據(jù)科學(xué)家和機器學(xué)習(xí)工程師的最愛,并且當(dāng)涉及到圖像中實體的分割時,它是首選的模型。自從它推出以來,YOLO 經(jīng)過多次新迭代,改進了以前版本的幾個缺點,即:
- 改進了底層深度學(xué)習(xí)模型的架構(gòu)。
- 實施了提高性能的替代方案,如數(shù)據(jù)增強技術(shù)。
- 將原始的 YOLO 代碼遷移到使用 pytorch 訓(xùn)練和部署框架。
- 改進了小對象的檢測機制。
需要意識到的一件重要事情是,每個計算機視覺和對象檢測模型都是根據(jù)兩個參數(shù)進行評估的:準(zhǔn)確性(由與計算機視覺分割相關(guān)的指標(biāo)定義)和速度(由推理中的延遲定義)。下面展示了如何評估 CV 算法的一個例子:
不同 YOLO 模型與 EfficientDet 的比較 — 圖片來源:https://blog.roboflow.com/yolov5-is-here/
在這個例子中,我將向您展示如何在圖像和視頻上運行自己的 YOLO 模型,以便您可以執(zhí)行對象檢測和分割。
加載模型
我們將從加載大型 YOLO 模型的預(yù)訓(xùn)練版本開始。在這種情況下,我們將使用帶有 NAS(神經(jīng)架構(gòu)搜索)的 YOLO 實現(xiàn)。神經(jīng)架構(gòu)搜索是神經(jīng)網(wǎng)絡(luò)優(yōu)化技術(shù)的常見實現(xiàn),以改善深度學(xué)習(xí)模型中參數(shù)的自動選擇。我們將使用的模型是在 COCO 數(shù)據(jù)集(上下文中的常見對象)上訓(xùn)練的。這些權(quán)重已經(jīng)包含了在圖像上檢測對象的非常好基線。
首先,讓我們向我們的環(huán)境添加一些我們將需要的庫,即:
- torchinfo,一個幫助可視化我們神經(jīng)網(wǎng)絡(luò)架構(gòu)的助手;
- super_gradients,我們將用來加載模型的庫。
!pip install torchinfo
!pip install super_gradients
接下來,我們將加載我們需要的函數(shù)和庫:
from super_gradients.training import models
from torchinfo import summary
import torch
注意:如果您使用的是 Google Colab,并且在安裝 super_gradients 后提示重新啟動內(nèi)核,請執(zhí)行。這是在該環(huán)境中使用 super_learners 的已知問題。然后,我們開始使用 super_gradients 將我們的 COCO 預(yù)訓(xùn)練模型加載到內(nèi)存中:
# Using Yolo NAS Large
yolo_nas_l = models.get("yolo_nas_l", pretrained_weights="coco")
我們已經(jīng)在 yolo_nas_l 中存儲了預(yù)訓(xùn)練模型。使用 models 來獲取這些預(yù)訓(xùn)練版本的 YOLO 是非常容易的。torchinfo 為我們提供了模型架構(gòu)的非??岬囊晥D:
summary(model=yolo_nas_l,
input_size=(16, 3, 640, 640),
col_names=["input_size", "output_size", "num_params", "trainable"],
col_width=20,
row_settings=["var_names"]
)
出于好奇,如果您想檢查 YOLO 架構(gòu)(來自原始論文),請查看下面的圖片:
圖片來源:https://www.researchgate.net/publication/329038564_Complexity_and_accuracy_analysis_of_common_artificial_neural_networks_on_pedestrian_detection
這是我們 YOLO NAS 模型架構(gòu)的預(yù)覽:
Yolo-NAS 模型架構(gòu)預(yù)覽
分割圖像
讓我們從一張以桌子為中心的簡單圖像開始,周圍有各種物體。在這張圖像中,我們可以看到:
- 兩把椅子
- 一張桌子
- 兩盞燈
- 一臺電腦
- 耳機
- 一盆植物
在我們的代碼中,我們只請求在模型置信度超過 55% 的地方繪制邊界框。只有這些項目的標(biāo)簽才會出現(xiàn)在分割后的圖像中。
url = "https://images.unsplash.com/photo-1476365518243-f738bf58443d?q=80&w=2787&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
yolo_nas_l.predict(url, cnotallow=0.55).show()
我們的模型能夠自信地檢測到椅子、筆記本電腦、桌子和植物(盡管它錯過了燈、耳機和那個高科技水壺)。讓我們看看如果我們降低我們的置信度閾值會發(fā)生什么:
url = "https://images.unsplash.com/photo-1476365518243-f738bf58443d?q=80&w=2787&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
yolo_nas_l.predict(url, cnotallow=0.40).show()
降低我們的閾值導(dǎo)致了我們第一次的誤分類。在這種情況下,耳機被錯誤地識別為計算機鼠標(biāo)。降低閾值將不可避免地導(dǎo)致更多的對象檢測和分割錯誤。讓我們嘗試一張更擁擠的場景的圖片:
我們的 YOLO 模型將分割哪些對象?由于這張圖片有更多的元素,我將降低推理的置信度:
url = "https://images.unsplash.com/photo-1496664444929-8c75efb9546f?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
yolo_nas_l.predict(url, cnotallow=0.3).show()
正如我們所看到的,YOLO 未能分割一些對象 — 特別是更小/更細的對象。盡管如此,對于如此擁擠的圖像來說,性能相當(dāng)不錯。為了提高一些性能,與您的用例相關(guān)的圖像的遷移學(xué)習(xí)非常重要。
在接下來的部分中,我們將學(xué)習(xí)如何使用 YOLO-NAS,但是在分割視頻的背景下。
對于這部分,我將使用 Youtube 上的一個交通短視頻:
交通視頻 — https://www.youtube.com/watch?v=CftLBPI1Ga4
我們將從下載這個視頻到我們的 Google Colab 環(huán)境開始。我們還可以使用 IPython 的便捷 YoutubeVideo 功能來顯示視頻:
from IPython.display import YouTubeVideo
video = YouTubeVideo('CftLBPI1Ga4')
display(video)
要下載我們的視頻,我將使用 youtube-dl:
video_url = f'https://www.youtube.com/watch?v=CftLBPI1Ga4'
!pip install -U "git+https://github.com/ytdl-org/youtube-dl.git"
!python -m youtube_dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' "$video_url"
我們只需要設(shè)置分割視頻的輸出路徑,就可以將視頻通過 YOLO 模型傳遞了!
input_video_path = f"/content/Cars, Busy Streets, City Traffic - No Copyright Royalty Free Stock Videos-CftLBPI1Ga4.mp4"
output = "traffic.mp4"
一切就緒!讓我們運行我們的分割模型:
device = 'cuda' if torch.cuda.is_available() else "cpu"
yolo_nas_l.to(device).predict(input_video_path).save(output)
注意:根據(jù)您本地系統(tǒng)的配置和 Google Colab 上 GPU 的可用性,此代碼可能需要一些時間來運行。
分割后的交通視頻截圖
YOLO 模型非常強大!您可以使用它們通過幾行代碼快速分割圖像或視頻。使用我在這里展示的代碼,您可以非常容易地使用自己的媒體進行實驗,并嘗試這個偉大的計算機視覺模型。正如您可能注意到的,特別是在復(fù)雜的圖像或視頻中,YOLO 基礎(chǔ)模型仍然有一些需要糾正的缺陷。