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

在PC和樹莓派上部署 YOLOv10 做檢測

人工智能 機器學習
在本文中,我測試了最新的(在撰寫本文時)YOLO v10模型,該模型于2024年5月發(fā)布,結(jié)果很有趣。

計算機視覺可以是不同規(guī)模的機器學習應用的重要組成部分,從價值20,000美元的特斯拉機器人或自動駕駛汽車到智能門鈴和吸塵器。這也是一個具有挑戰(zhàn)性的任務,因為與云基礎(chǔ)設(shè)施相比,在“真實”的邊緣設(shè)備上,硬件規(guī)格通常更加受限。

YOLO(You Only Look Once,你只需看一次)是一個流行的目標檢測庫;它的第一版是在2015年制作的。YOLO對于嵌入式設(shè)備特別有趣,因為它幾乎可以在任何地方運行;不僅有Python版本,還有C++(ONNX和OpenVINO)和Rust版本可用。一年前,我在樹莓派4上測試了YOLO v8?,F(xiàn)在,許多事情都發(fā)生了變化——新的樹莓派5已經(jīng)可用,而且更新的YOLO v10也已經(jīng)發(fā)布。因此,我期望在新硬件上的新模型能夠更快、更精確地工作。

本文中介紹的代碼是跨平臺的,所以沒有樹莓派的讀者也可以在Windows、Linux或OS X電腦上運行它。

樹莓派

對于可能從未聽說過樹莓派的人來說,讓我們做一個簡短的介紹。樹莓派是一個小型信用卡大小的單板計算機,擁有4-8GB的RAM,并且能夠運行完整的Linux版本:

樹莓派小巧、安靜且相對便宜,價格約為100美元。它還有很多端口(USB、GPIO、SPI/I2C、HDMI等)與不同的硬件通信。樹莓派不僅被業(yè)余愛好者廣泛使用,而且在工業(yè)中也有應用(樹莓派計算模塊專門為嵌入式應用設(shè)計)。這就是為什么看到我們可以使用最新的YOLO模型在最新的樹莓派上獲得什么樣的性能是很有趣的。

安裝

要在樹莓派上運行YOLO,我將使用Ubuntu 64位。這是最簡單的方式,因為Ubuntu不僅是最受歡迎的Linux發(fā)行版,而且也是官方認證適用于樹莓派的。64位的Raspbian操作系統(tǒng)也應該可以工作,但在上面安裝最新的庫和框架可能具有挑戰(zhàn)性。上次我嘗試時,很多庫和組件都過時了,而且apt倉庫中沒有最新版本。32位操作系統(tǒng)根本不支持Python YOLO版本,因為PyTorch(依賴項之一)不再支持32位架構(gòu)。

在編寫代碼之前,讓我們準備樹莓派上的虛擬環(huán)境(這里,我使用“pi”作為樹莓派用戶的默認名稱):

mkdir /home/pi/Documents/YOLO
cd /home/pi/Documents/YOLO
python3 -m venv yolo
source yolo/bin/activate

現(xiàn)在,我們準備安裝所需的庫:

sudo apt install libgl1
pip3 install opencv-python ultralytics supervision

不同的YOLO模型可用,我們可以從GitHub下載它們。我將使用YOLO v10 Large (x)、Medium (m)和Nano (n)模型:

wget https://github.com/THU-MIG/yolov10/releases/download/v1.0/yolov10n.pt
wget https://github.com/THU-MIG/yolov10/releases/download/v1.0/yolov10m.pt
wget https://github.com/THU-MIG/yolov10/releases/download/v1.0/yolov10x.pt

基本使用

當模型加載后,我們可以使用Python。要獲得結(jié)果,我們只需要幾行代碼:


from ultralytics import YOLO


model = YOLO("yolov10m.pt")
results = model.predict("image.jpg",
                        save=False, save_txt=False,
                        verbose=False, conf=0.75)
results[0].show()

在這里,我指定了75%的置信度閾值。庫為我們做了所有必要的工作,在屏幕上顯示了注釋后的圖像。輸出看起來像這樣:

我們還可以得到文本形式的數(shù)據(jù),這對于沒有屏幕的“無頭”系統(tǒng)可能有用:

model = YOLO("yolov10m.pt")
results = model.predict("image.jpg",
                        save=False, save_txt=False,
                        verbose=False, conf=0.75)

boxes = results[0].boxes
confidence, class_ids = boxes.conf, boxes.cls.int()
rects = boxes.xyxy.int()
for ind in range(boxes.shape[0]):
    print(model.names[class_ids[ind].item()],
          confidence[ind].item(),
          rects[ind].tolist())

在那種情況下,輸出看起來像這樣:

car 0.9247599244117737 [561, 311, 719, 420]
car 0.9067108035087585 [464, 303, 554, 380]
car 0.9027121663093567 [402, 300, 481, 367]
car 0.8614686727523804 [524, 310, 592, 396]
bicycle 0.8476000428199768 [181, 321, 241, 400]
person 0.8029575347900391 [71, 271, 126, 421]
person 0.7965097427368164 [186, 278, 237, 381]
bicycle 0.7882957458496094 [111, 330, 156, 414]

自定義注釋

正如我們從前面的示例中看到的,results[0].show()方法正在做添加框架和標簽到輸出圖像所需的工作。在Supervision庫的幫助下,我們可以使用更復雜的自定義注釋:

import supervision as sv


img = cv2.imread('image.jpg')
results = model.predict(img, ...)

detections = sv.Detections.from_ultralytics(results[0])
# Add Boxes
sv.BoxCornerAnnotator(thickness=2).annotate(
    scene=img,
    detections=detections
)
# Add Labels
labels = []
for ind, class_id in enumerate(detections.class_id):
    labels.append(f"{model.model.names[class_id]}: {detections.confidence[ind]:.2f}")

sv.LabelAnnotator().annotate(
    scene=img,
    detections=detections,
    labels=labels
)

# Show
cv2.imshow("Image", img_out)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里,我首先創(chuàng)建了一個標簽列表,然后使用了LabelAnnotator和BoxCornerAnnotator類在圖像上繪制結(jié)果。輸出看起來像這樣:

攝像頭流

在前面的示例中,我使用了一個靜態(tài)的JPEG圖像。這對于測試很好,但在實際應用中,來自USB攝像頭的實時流可能更有用。

我們可以使用OpenCV輕松獲取攝像頭流,并使用與之前相同的代碼:

def predict_and_annotate(model: YOLO, img: Any):
    """ Predict the labels and return the annotated image """
    results = model.predict(source=img,
                            save=False, save_txt=False, verbose=False,
                            conf=0.75)
    detections = sv.Detections.from_ultralytics(results[0])

    ...

    img = img.copy()    
    sv.LabelAnnotator().annotate(
        scene=img,
        detections=detections,
        labels=labels
    )
    return img


# Run the camera stream
model = YOLO("yolov10m.pt")

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
while True:
    ret, frame = cap.read()
    frame = predict_and_annotate(model, frame)

    cv2.imshow("WebCam", frame)

    if cv2.waitKey(30) == 27: # Stop with Escape key
        break

cap.release()
cv2.destroyAllWindows()

顯然,除了cv2.imshow調(diào)用之外,還可以使用其他數(shù)據(jù)處理。

結(jié)果

最后,我們擁有了所有需要的代碼,是時候看看結(jié)果了!正如文章開頭所寫的,在過去的一年中,有兩件事發(fā)生了變化:發(fā)布了新的YOLO v10模型,并且新的樹莓派5也變得可用。因此,分別檢查這些因素是有意義的。

準確性

為了比較準確性,我使用相同的圖像運行了YOLO v8和v10 Medium模型:

正如我們所看到的,結(jié)果幾乎相同。然而,YOLO v10模型錯過了一個被v8檢測到的人。顯然,一張圖片不足以作為“基準”,讀者歡迎使用自己的數(shù)據(jù)進行更多測試。

性能

首先,比較YOLO v10與v8的性能很有趣。正如YOLOv10論文中所寫,“我們從效率和準確性的角度全面優(yōu)化了YOLO的各種組件”,所以我期望新模型更快。樹莓派沒有GPU,所以我在桌面上進行了這個測試:

確實,YOLO v10稍微(5-15%)更快,這是一個不錯的改進。其次,看看YOLO v10模型(Nano、Medium和X-Large)在不同版本的樹莓派上的表現(xiàn)也很有趣:

結(jié)果很有趣。確實,樹莓派5比樹莓派4快了2倍以上。在樹莓派5上,使用最小的Nano模型,單張圖像處理大約需要0.6秒。然而,這臺微型計算機與全尺寸桌面PC相比,計算能力仍然要小得多。

結(jié)論

在本文中,我測試了最新的(在撰寫本文時)YOLO v10模型,該模型于2024年5月發(fā)布,結(jié)果很有趣。

首先,與一年前可用的新YOLO v10模型相比,速度略快,這是一個不錯的改進。其次,樹莓派5也比前一個模型更快,我們可以使用最小的“Nano”模型從攝像頭流中實現(xiàn)大約0.6秒每張圖像的性能。一般來說,0.6秒的處理時間還不錯。樹莓派是一臺小型且低成本的計算機;它不足以用于實時應用,如街道導航,但可以足夠好,例如,用于檢測停車場上的汽車或通過每分鐘拍照來估計商店中的人數(shù)。如果我們想要更快的速度,可以使用像NVIDIA Jetson這樣的板子;它們更強大,但也更昂貴。

責任編輯:趙寧寧 來源: 小白玩轉(zhuǎn)Python
相關(guān)推薦

2021-12-21 21:00:23

Ansible樹莓派語音助手

2024-10-07 10:12:50

2023-05-09 10:16:42

人工智能python版本

2024-05-29 09:25:38

2019-05-06 13:52:00

樹莓派Ubuntu MATEUbuntu

2024-12-03 15:25:27

2024-05-27 09:27:02

2024-07-03 09:39:52

2024-10-14 17:43:05

2020-06-01 20:00:28

樹莓派TT-RSSLinux

2024-06-17 13:39:45

2024-09-09 16:35:10

YOLO模型

2021-03-19 13:00:39

樹莓派Linux

2009-07-31 09:08:16

Intel部署Wind

2018-11-08 09:00:31

樹莓派WordPressLinux

2024-05-28 14:46:00

2009-06-01 11:23:08

Glassfish部署Glassfish

2019-07-31 09:32:06

2020-03-31 12:50:34

樹莓派K3sKubernetes集

2017-04-24 17:00:26

Linux樹莓派Fedora 25
點贊
收藏

51CTO技術(shù)棧公眾號