使用 Yolo-NAS 輕松進(jìn)行對(duì)象檢測(cè)
學(xué)習(xí)如何使用 Python 和 yolo-NAS 進(jìn)行對(duì)象檢測(cè)。YOLO(You Only Look Once,你只看一次)徹底改變了計(jì)算機(jī)視覺(jué)領(lǐng)域。YOLO 的第一個(gè)版本由 Joseph Redmon 等人在 2016 年發(fā)布,它在速度和準(zhǔn)確性方面都打破了基準(zhǔn)。在對(duì)象檢測(cè)方面,YOLO 一直是數(shù)據(jù)科學(xué)家和機(jī)器學(xué)習(xí)工程師的最?lèi)?ài),并且當(dāng)涉及到圖像中實(shí)體的分割時(shí),它是首選的模型。自從它推出以來(lái),YOLO 經(jīng)過(guò)多次新迭代,改進(jìn)了以前版本的幾個(gè)缺點(diǎn),即:
- 改進(jìn)了底層深度學(xué)習(xí)模型的架構(gòu)。
- 實(shí)施了提高性能的替代方案,如數(shù)據(jù)增強(qiáng)技術(shù)。
- 將原始的 YOLO 代碼遷移到使用 pytorch 訓(xùn)練和部署框架。
- 改進(jìn)了小對(duì)象的檢測(cè)機(jī)制。
需要意識(shí)到的一件重要事情是,每個(gè)計(jì)算機(jī)視覺(jué)和對(duì)象檢測(cè)模型都是根據(jù)兩個(gè)參數(shù)進(jìn)行評(píng)估的:準(zhǔn)確性(由與計(jì)算機(jī)視覺(jué)分割相關(guān)的指標(biāo)定義)和速度(由推理中的延遲定義)。下面展示了如何評(píng)估 CV 算法的一個(gè)例子:
不同 YOLO 模型與 EfficientDet 的比較 — 圖片來(lái)源:https://blog.roboflow.com/yolov5-is-here/
在這個(gè)例子中,我將向您展示如何在圖像和視頻上運(yùn)行自己的 YOLO 模型,以便您可以執(zhí)行對(duì)象檢測(cè)和分割。
加載模型
我們將從加載大型 YOLO 模型的預(yù)訓(xùn)練版本開(kāi)始。在這種情況下,我們將使用帶有 NAS(神經(jīng)架構(gòu)搜索)的 YOLO 實(shí)現(xiàn)。神經(jīng)架構(gòu)搜索是神經(jīng)網(wǎng)絡(luò)優(yōu)化技術(shù)的常見(jiàn)實(shí)現(xiàn),以改善深度學(xué)習(xí)模型中參數(shù)的自動(dòng)選擇。我們將使用的模型是在 COCO 數(shù)據(jù)集(上下文中的常見(jiàn)對(duì)象)上訓(xùn)練的。這些權(quán)重已經(jīng)包含了在圖像上檢測(cè)對(duì)象的非常好基線(xiàn)。
首先,讓我們向我們的環(huán)境添加一些我們將需要的庫(kù),即:
- torchinfo,一個(gè)幫助可視化我們神經(jīng)網(wǎng)絡(luò)架構(gòu)的助手;
- super_gradients,我們將用來(lái)加載模型的庫(kù)。
!pip install torchinfo
!pip install super_gradients
接下來(lái),我們將加載我們需要的函數(shù)和庫(kù):
from super_gradients.training import models
from torchinfo import summary
import torch
注意:如果您使用的是 Google Colab,并且在安裝 super_gradients 后提示重新啟動(dòng)內(nèi)核,請(qǐng)執(zhí)行。這是在該環(huán)境中使用 super_learners 的已知問(wèn)題。然后,我們開(kāi)始使用 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 中存儲(chǔ)了預(yù)訓(xùn)練模型。使用 models 來(lái)獲取這些預(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)(來(lái)自原始論文),請(qǐng)查看下面的圖片:
圖片來(lái)源: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ù)覽
分割圖像
讓我們從一張以桌子為中心的簡(jiǎn)單圖像開(kāi)始,周?chē)懈鞣N物體。在這張圖像中,我們可以看到:
- 兩把椅子
- 一張桌子
- 兩盞燈
- 一臺(tái)電腦
- 耳機(jī)
- 一盆植物
在我們的代碼中,我們只請(qǐng)求在模型置信度超過(guò) 55% 的地方繪制邊界框。只有這些項(xiàng)目的標(biāo)簽才會(huì)出現(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()
我們的模型能夠自信地檢測(cè)到椅子、筆記本電腦、桌子和植物(盡管它錯(cuò)過(guò)了燈、耳機(jī)和那個(gè)高科技水壺)。讓我們看看如果我們降低我們的置信度閾值會(huì)發(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)致了我們第一次的誤分類(lèi)。在這種情況下,耳機(jī)被錯(cuò)誤地識(shí)別為計(jì)算機(jī)鼠標(biāo)。降低閾值將不可避免地導(dǎo)致更多的對(duì)象檢測(cè)和分割錯(cuò)誤。讓我們嘗試一張更擁擠的場(chǎng)景的圖片:
我們的 YOLO 模型將分割哪些對(duì)象?由于這張圖片有更多的元素,我將降低推理的置信度:
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 未能分割一些對(duì)象 — 特別是更小/更細(xì)的對(duì)象。盡管如此,對(duì)于如此擁擠的圖像來(lái)說(shuō),性能相當(dāng)不錯(cuò)。為了提高一些性能,與您的用例相關(guān)的圖像的遷移學(xué)習(xí)非常重要。
在接下來(lái)的部分中,我們將學(xué)習(xí)如何使用 YOLO-NAS,但是在分割視頻的背景下。
對(duì)于這部分,我將使用 Youtube 上的一個(gè)交通短視頻:
交通視頻 — https://www.youtube.com/watch?v=CftLBPI1Ga4
我們將從下載這個(gè)視頻到我們的 Google Colab 環(huán)境開(kāi)始。我們還可以使用 IPython 的便捷 YoutubeVideo 功能來(lái)顯示視頻:
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è)置分割視頻的輸出路徑,就可以將視頻通過(guò) YOLO 模型傳遞了!
input_video_path = f"/content/Cars, Busy Streets, City Traffic - No Copyright Royalty Free Stock Videos-CftLBPI1Ga4.mp4"
output = "traffic.mp4"
一切就緒!讓我們運(yùn)行我們的分割模型:
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 的可用性,此代碼可能需要一些時(shí)間來(lái)運(yùn)行。
分割后的交通視頻截圖
YOLO 模型非常強(qiáng)大!您可以使用它們通過(guò)幾行代碼快速分割圖像或視頻。使用我在這里展示的代碼,您可以非常容易地使用自己的媒體進(jìn)行實(shí)驗(yàn),并嘗試這個(gè)偉大的計(jì)算機(jī)視覺(jué)模型。正如您可能注意到的,特別是在復(fù)雜的圖像或視頻中,YOLO 基礎(chǔ)模型仍然有一些需要糾正的缺陷。