自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

YOLO-NAS:最高效的目標檢測算法之一

開發(fā) 機器學習
我們使用新發(fā)布的YOLO-NAS模型執(zhí)行了圖像和視頻上的初始目標檢測任務。你可以使用自定義數(shù)據(jù)集來對該模型進行微調,以提高其在某些對象上的性能。

YOLO-NAS目標檢測

介紹

YOLO(You Only Look Once)是一種目標檢測算法,它使用深度神經(jīng)網(wǎng)絡模型,特別是卷積神經(jīng)網(wǎng)絡,來實時檢測和分類對象。該算法首次在2016年的論文《You Only Look Once:統(tǒng)一的實時目標檢測》被提出。自發(fā)布以來,由于其高準確性和速度,YOLO已成為目標檢測和分類任務中最受歡迎的算法之一。它在各種目標檢測基準測試中實現(xiàn)了最先進的性能。

YOLO架構

就在2023年5月的第一周,YOLO-NAS模型被引入到機器學習領域,它擁有無與倫比的精度和速度,超越了其他模型如YOLOv7和YOLOv8。

YOLO-NAS與其他模型對比

YOLO-NAS模型是在COCO和Objects365等數(shù)據(jù)集上進行預訓練的,這使得它適用于現(xiàn)實世界的應用。它目前可以在Deci的SuperGradients上使用,這是一個基于PyTorch的庫,包含近40個預訓練模型,用于執(zhí)行不同的計算機視覺任務,如分類、檢測、分割等。

那么,讓我們開始安裝SuperGradients庫,以便開始使用YOLO-NAS吧!


# Installing supergradients lib
!pip install super-gradients==3.1.0

導入和加載YOLO-NAS

#importing models from supergradients' training module
from super_gradients.training import models

下一步是初始化模型。YOLO-NAS有不同的模型可供選擇,對于本文,我們將使用 yolo_nas_l,其中pretrained_weights = 'coco'

你可以在這個GitHub頁面上獲取有關不同模型的更多信息。

# Initializing model
yolo_nas = models.get("yolo_nas_l", pretrained_weights = "coco")

模型架構

在下面的代碼單元格中,我們使用torchinfo的summary來獲取YOLO-NAS的架構,這對于深入了解模型的運作方式非常有用。

# Yolo NAS architecture
!pip install torchinfo
from torchinfo import summary

summary(model = yolo_nas,
       input_size = (16,3,640,640),
       col_names = ['input_size',
                   'output_size',
                   'num_params',
                   'trainable'],
       col_width = 20,
       row_settings = ['var_names'])
=================================================================================================================================================
Layer (type (var_name))                                           Input Shape          Output Shape         Param #              Trainable
=================================================================================================================================================
YoloNAS_L (YoloNAS_L)                                             [16, 3, 640, 640]    [16, 8400, 4]        --                   True
├─NStageBackbone (backbone)                                       [16, 3, 640, 640]    [16, 96, 160, 160]   --                   True
│    └─YoloNASStem (stem)                                         [16, 3, 640, 640]    [16, 48, 320, 320]   --                   True
│    │    └─QARepVGGBlock (conv)                                  [16, 3, 640, 640]    [16, 48, 320, 320]   3,024                True
│    └─YoloNASStage (stage1)                                      [16, 48, 320, 320]   [16, 96, 160, 160]   --                   True
│    │    └─QARepVGGBlock (downsample)                            [16, 48, 320, 320]   [16, 96, 160, 160]   88,128               True
│    │    └─YoloNASCSPLayer (blocks)                              [16, 96, 160, 160]   [16, 96, 160, 160]   758,594              True
│    └─YoloNASStage (stage2)                                      [16, 96, 160, 160]   [16, 192, 80, 80]    --                   True
│    │    └─QARepVGGBlock (downsample)                            [16, 96, 160, 160]   [16, 192, 80, 80]    351,360              True
│    │    └─YoloNASCSPLayer (blocks)                              [16, 192, 80, 80]    [16, 192, 80, 80]    2,045,315            True
│    └─YoloNASStage (stage3)                                      [16, 192, 80, 80]    [16, 384, 40, 40]    --                   True
│    │    └─QARepVGGBlock (downsample)                            [16, 192, 80, 80]    [16, 384, 40, 40]    1,403,136            True
│    │    └─YoloNASCSPLayer (blocks)                              [16, 384, 40, 40]    [16, 384, 40, 40]    13,353,733           True
│    └─YoloNASStage (stage4)                                      [16, 384, 40, 40]    [16, 768, 20, 20]    --                   True
│    │    └─QARepVGGBlock (downsample)                            [16, 384, 40, 40]    [16, 768, 20, 20]    5,607,936            True
│    │    └─YoloNASCSPLayer (blocks)                              [16, 768, 20, 20]    [16, 768, 20, 20]    22,298,114           True
│    └─SPP (context_module)                                       [16, 768, 20, 20]    [16, 768, 20, 20]    --                   True
│    │    └─Conv (cv1)                                            [16, 768, 20, 20]    [16, 384, 20, 20]    295,680              True
│    │    └─ModuleList (m)                                        --                   --                   --                   --
│    │    └─Conv (cv2)                                            [16, 1536, 20, 20]   [16, 768, 20, 20]    1,181,184            True
├─YoloNASPANNeckWithC2 (neck)                                     [16, 96, 160, 160]   [16, 96, 80, 80]     --                   True
│    └─YoloNASUpStage (neck1)                                     [16, 768, 20, 20]    [16, 192, 20, 20]    --                   True
│    │    └─Conv (reduce_skip1)                                   [16, 384, 40, 40]    [16, 192, 40, 40]    74,112               True
│    │    └─Conv (reduce_skip2)                                   [16, 192, 80, 80]    [16, 192, 80, 80]    37,248               True
│    │    └─Conv (downsample)                                     [16, 192, 80, 80]    [16, 192, 40, 40]    332,160              True
│    │    └─Conv (conv)                                           [16, 768, 20, 20]    [16, 192, 20, 20]    147,840              True
│    │    └─ConvTranspose2d (upsample)                            [16, 192, 20, 20]    [16, 192, 40, 40]    147,648              True
│    │    └─Conv (reduce_after_concat)                            [16, 576, 40, 40]    [16, 192, 40, 40]    110,976              True
│    │    └─YoloNASCSPLayer (blocks)                              [16, 192, 40, 40]    [16, 192, 40, 40]    2,595,716            True
│    └─YoloNASUpStage (neck2)                                     [16, 192, 40, 40]    [16, 96, 40, 40]     --                   True
│    │    └─Conv (reduce_skip1)                                   [16, 192, 80, 80]    [16, 96, 80, 80]     18,624               True
│    │    └─Conv (reduce_skip2)                                   [16, 96, 160, 160]   [16, 96, 160, 160]   9,408                True
│    │    └─Conv (downsample)                                     [16, 96, 160, 160]   [16, 96, 80, 80]     83,136               True
│    │    └─Conv (conv)                                           [16, 192, 40, 40]    [16, 96, 40, 40]     18,624               True
│    │    └─ConvTranspose2d (upsample)                            [16, 96, 40, 40]     [16, 96, 80, 80]     36,960               True
│    │    └─Conv (reduce_after_concat)                            [16, 288, 80, 80]    [16, 96, 80, 80]     27,840               True
│    │    └─YoloNASCSPLayer (blocks)                              [16, 96, 80, 80]     [16, 96, 80, 80]     2,546,372            True
│    └─YoloNASDownStage (neck3)                                   [16, 96, 80, 80]     [16, 192, 40, 40]    --                   True
│    │    └─Conv (conv)                                           [16, 96, 80, 80]     [16, 96, 40, 40]     83,136               True
│    │    └─YoloNASCSPLayer (blocks)                              [16, 192, 40, 40]    [16, 192, 40, 40]    1,280,900            True
│    └─YoloNASDownStage (neck4)                                   [16, 192, 40, 40]    [16, 384, 20, 20]    --                   True
│    │    └─Conv (conv)                                           [16, 192, 40, 40]    [16, 192, 20, 20]    332,160              True
│    │    └─YoloNASCSPLayer (blocks)                              [16, 384, 20, 20]    [16, 384, 20, 20]    5,117,700            True
├─NDFLHeads (heads)                                               [16, 96, 80, 80]     [16, 8400, 4]        --                   True
│    └─YoloNASDFLHead (head1)                                     [16, 96, 80, 80]     [16, 68, 80, 80]     --                   True
│    │    └─ConvBNReLU (stem)                                     [16, 96, 80, 80]     [16, 128, 80, 80]    12,544               True
│    │    └─Sequential (cls_convs)                                [16, 128, 80, 80]    [16, 128, 80, 80]    147,712              True
│    │    └─Conv2d (cls_pred)                                     [16, 128, 80, 80]    [16, 80, 80, 80]     10,320               True
│    │    └─Sequential (reg_convs)                                [16, 128, 80, 80]    [16, 128, 80, 80]    147,712              True
│    │    └─Conv2d (reg_pred)                                     [16, 128, 80, 80]    [16, 68, 80, 80]     8,772                True
│    └─YoloNASDFLHead (head2)                                     [16, 192, 40, 40]    [16, 68, 40, 40]     --                   True
│    │    └─ConvBNReLU (stem)                                     [16, 192, 40, 40]    [16, 256, 40, 40]    49,664               True
│    │    └─Sequential (cls_convs)                                [16, 256, 40, 40]    [16, 256, 40, 40]    590,336              True
│    │    └─Conv2d (cls_pred)                                     [16, 256, 40, 40]    [16, 80, 40, 40]     20,560               True
│    │    └─Sequential (reg_convs)                                [16, 256, 40, 40]    [16, 256, 40, 40]    590,336              True
│    │    └─Conv2d (reg_pred)                                     [16, 256, 40, 40]    [16, 68, 40, 40]     17,476               True
│    └─YoloNASDFLHead (head3)                                     [16, 384, 20, 20]    [16, 68, 20, 20]     --                   True
│    │    └─ConvBNReLU (stem)                                     [16, 384, 20, 20]    [16, 512, 20, 20]    197,632              True
│    │    └─Sequential (cls_convs)                                [16, 512, 20, 20]    [16, 512, 20, 20]    2,360,320            True
│    │    └─Conv2d (cls_pred)                                     [16, 512, 20, 20]    [16, 80, 20, 20]     41,040               True
│    │    └─Sequential (reg_convs)                                [16, 512, 20, 20]    [16, 512, 20, 20]    2,360,320            True
│    │    └─Conv2d (reg_pred)                                     [16, 512, 20, 20]    [16, 68, 20, 20]     34,884               True
=================================================================================================================================================
Total params: 66,976,392
Trainable params: 66,976,392
Non-trainable params: 0
Total mult-adds (T): 1.04
=================================================================================================================================================
Input size (MB): 78.64
Forward/backward pass size (MB): 27238.60
Params size (MB): 178.12
Estimated Total Size (MB): 27495.37
=================================================================================================================================================

圖像上的目標檢測

現(xiàn)在我們可以測試模型在不同圖像上檢測對象的能力。

在下面的代碼中,我們初始化了一個名為image的變量,該變量接收包含圖像的URL。然后,我們可以使用predict和show方法來顯示帶有模型預測的圖像。

image = "https://i.pinimg.com/736x/b4/29/48/b42948ef9202399f13d6e6b3b8330b20.jpg"
yolo_nas.predict(image).show()

yolo_nas.predict(image).show()

在上面的圖像中,我們可以看到為每個對象做出的檢測以及模型對其自身預測的置信度分數(shù)。例如,我們可以看到模型對地板上的白色物體是一個杯子有97%的置信度。然而,這個圖像中有許多對象,我們可以看到模型將任天堂64游戲主機誤認為是一輛汽車。

我們可以通過使用conf參數(shù)來改善結果,該參數(shù)用作檢測的閾值。例如,我們可以將此值更改為conf = 0.50,以便模型僅顯示置信度高于50%的檢測。讓我們試一試。

image = "https://i.pinimg.com/736x/b4/29/48/b42948ef9202399f13d6e6b3b8330b20.jpg"
yolo_nas.predict(image, conf = 0.50).show()

YOLO-NAS: Object Detection on Image

現(xiàn)在,模型只顯示在其檢測中至少有50%置信度的對象,這些對象是杯子、電視和遙控器。

我們可以測試更多圖像。

YOLO-NAS: Object Detection on Image

在視頻上進行目標檢測

我們還可以使用YOLO-NAS模型在視頻上執(zhí)行實時目標檢測!

在下面的代碼中,我使用IPython庫中的YouTubeVideo模塊選擇并保存任何我喜歡的YouTube視頻。

from IPython.display import YouTubeVideo # Importing YouTubeVideo from IPython's display module
video_id = "VtK2ZMlcCQU" # Selecting video ID
video = YouTubeVideo(video_id) # Loading video
display(video) # Displaying video

現(xiàn)在我們已經(jīng)選擇了一個視頻,我們將使用youtube-dl庫以.mp4格式下載視頻。

完成后,我們將視頻保存到input_video_path變量,該變量將作為我們的模型執(zhí)行檢測的輸入。

# Downloading video
video_url = f'https://www.youtube.com/watch?v={video_id}'
!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"

print('Video downloaded')

# Selecting input and output paths
input_video_path = f"/kaggle/working/Golf Rehab 'Short Game' Commercial-VtK2ZMlcCQU.mp4"
output_video_path = "detections.mp4"

然后,我們導入PyTorch并啟用GPU。

import torch
device = 'cuda' if torch.cuda.is_available() else "cpu"

然后,我們使用to()方法在GPU上運行YOLO-NAS模型,并使用predict()方法在input_video_path變量中存儲的視頻上執(zhí)行預測。save()方法用于保存帶有檢測結果的視頻,保存路徑由output_video_path指定。

yolo_nas.to(device).predict(input_video_path).save(output_video_path) # Running predictions on video
Video downloaded
Predicting Video: 100%|██████████| 900/900 [33:15<00:00,  2.22s/it]

完成后,我們再次使用IPython來顯示一個包含以.gif格式下載的視頻的.gif文件,以便在此Kaggle筆記本中查看。

from IPython.display import Image
with open('/kaggle/input/detection-gif/detections.gif','rb') as f:
display(Image(data=f.read(), format='png'))

結論

我們使用新發(fā)布的YOLO-NAS模型執(zhí)行了圖像和視頻上的初始目標檢測任務。你可以使用自定義數(shù)據(jù)集來對該模型進行微調,以提高其在某些對象上的性能。

責任編輯:趙寧寧 來源: 小白玩轉Python
相關推薦

2025-02-11 08:30:00

2017-09-20 16:25:00

深度學習視覺領域計算機

2024-09-09 16:35:10

YOLO模型

2024-04-26 10:00:03

自動駕駛模型

2023-10-07 08:12:05

DAMO-YOLO算法

2023-04-26 08:24:46

DAMO-YOLO算法

2018-01-23 16:16:03

開源技術 Facebook

2024-10-09 17:02:34

2024-06-05 09:26:50

2025-01-14 08:30:00

YOLO目標檢測YOLOv8

2024-08-20 09:30:00

2025-01-22 11:10:34

2024-11-29 16:10:31

2025-02-18 08:00:00

C++YOLO目標檢測

2023-03-13 13:35:00

幾何算法矩形碰撞檢測

2024-04-28 11:42:39

Python模型數(shù)據(jù)

2024-06-21 10:40:00

計算機視覺

2017-07-03 11:24:14

2025-01-02 10:30:00

無人機目標檢測AI

2024-07-30 09:50:00

深度學習目標檢測
點贊
收藏

51CTO技術棧公眾號