Zephyrnet-logotyp

Detektering av levande objekt och bildsegmentering med YOLOv8

Datum:

Beskrivning

Inom datorseende finns olika tekniker för detektering av levande objekt, inklusive Faster R-CNN, SSDoch YOLO. Varje teknik har sina begränsningar och fördelar. Faster R-CNN kan utmärka sig i noggrannhet, men det kanske inte fungerar lika bra i realtidsscenarier, vilket leder till en förändring mot YOLO algoritm.

Objektdetektering är grundläggande i datorseende, vilket gör det möjligt för maskiner att identifiera och lokalisera objekt inom en ram eller skärm. Under årens lopp har olika objektdetekteringsalgoritmer utvecklats, där YOLO framstår som en av de mest framgångsrika. Nyligen har YOLOv8 introducerats, vilket ytterligare förbättrar algoritmens möjligheter.

I den här omfattande guiden utforskar vi tre framträdande objektdetekteringsalgoritmer: Faster R-CNN, SSD (Single Shot MultiBox Detector) och YOLOv8. Vi diskuterar de praktiska aspekterna av att implementera dessa algoritmer, inklusive att sätta upp en virtuell miljö och utveckla en Streamlit-applikation.

Lärande mål

  • Förstå Faster R-CNN, SSD och YOLO och analysera skillnaderna mellan dem.
  • Få praktisk erfarenhet av att implementera live-objektdetektionssystem med OpenCV, Supervision och YOLOv8.
  • Förstå bildsegmenteringsmodellen med hjälp av Roboflow-kommentaren.
  • Skapa en Streamlit-applikation för ett enkelt användargränssnitt.

Låt oss utforska hur man gör bildsegmentering med YOLOv8!

Innehållsförteckning

Denna artikel publicerades som en del av Data Science Blogathon.

Snabbare R-CNN

Faster R-CNN (Faster Region-based Convolutional Neural Network) är en djupinlärningsbaserad objektdetekteringsalgoritm. Det utvärderas med R-CNN och Fast R-CNN ramverk och kan betraktas som en förlängning av Fast R-CNN.

Denna algoritm introducerar Region Proposal Network (RPN) för att generera regionförslag, och ersätter den selektiva sökningen som används i R-CNN. RPN delar faltningslager med detektionsnätverket, vilket möjliggör effektiv träning från början till slut.

De genererade regionförslagen matas sedan in i ett Fast R-CNN-nätverk för begränsningsboxförfining och objektklassificering.

RCNN | bildsegmentering med YOLOv8
Snabbare RCNN | bildsegmentering med YOLOv8

Diagrammet ovan illustrerar Faster R-CNN-familjen på ett heltäckande sätt och är lätt att förstå för att utvärdera varje algoritm.

Single Shot MultiBox Detector (SSD)

Smakämnen Single Shot MultiBox-detektor (SSD) är populär inom objektdetektering och används främst i datorseende uppgifter. I den tidigare metoden, Faster R-CNN, följde vi två steg: det första steget involverade detektionsdelen och det andra involverade regression. Men med SSD utför vi bara ett enda detekteringssteg. SSD introducerades 2016 för att möta behovet av en snabb och exakt objektdetekteringsmodell.

"

SSD har flera fördelar jämfört med tidigare objektdetekteringsmetoder som Faster R-CNN:

  • Effektivitet: SSD är en enstegsdetektor, vilket innebär att den direkt förutsäger begränsningsrutor och klasspoäng utan att behöva ett separat steg för att generera förslag. Detta gör den snabbare jämfört med tvåstegsdetektorer som Faster R-CNN.
  • End-to-end-träning: SSD kan tränas från början till slut, vilket optimerar både basnätverket och detektionshuvudet tillsammans, vilket förenklar träningsprocessen.
  • Multi-scale Feature Fusion: SSD fungerar på funktionskartor i flera skalor, vilket gör att den kan upptäcka objekt av varierande storlek mer effektivt.

SSD har en bra balans mellan hastighet och noggrannhet, vilket gör den lämplig för realtidsapplikationer där både prestanda och effektivitet är avgörande.

Du tittar bara en gång (YOLOv8)

2015 introducerades You Only Look Once (YOLO) som en objektdetekteringsalgoritm i en forskningsartikel av Joseph Redmon, Santosh Divvala, Ross Girshick och Ali Farhadi. YOLO är en single-shot-algoritm som direkt klassificerar ett objekt i ett enda pass genom att endast ett neuralt nätverk förutsäger begränsningsrutor och klasssannolikheter med hjälp av en hel bild som indata. 

Låt oss nu förstå YOLOv8 som toppmoderna framsteg inom objektdetektering i realtid med förbättrad noggrannhet och hastighet. YOLOv8 låter dig utnyttja förtränade modeller, som redan är tränade på ett stort dataset som COCO (Common Objects in Context). Bildsegmentering ger information på pixelnivå om varje objekt, vilket möjliggör mer detaljerad analys och förståelse av bildinnehållet.

Även om bildsegmentering kan vara beräkningsmässigt dyrt, integrerar YOLOv8 denna metod i sin neurala nätverksarkitektur, vilket möjliggör effektiv och exakt objektsegmentering.

Arbetsprincipen för YOLOv8

YOLOv8 fungerar genom att först dela in inmatningsbilden i rutnätsceller. Med hjälp av dessa rutnätsceller förutsäger YOLOv8 begränsningsrutorna (bbox) med sannolikheter för klass.

Efteråt använder YOLOv8 NMS-algoritmen för att minska överlappning. Till exempel, om det finns flera bilar närvarande i bilden vilket resulterar i överlappande begränsningsrutor, hjälper NMS-algoritmen till att minska denna överlappning.

Skillnad mellan varianter av Yolo V8: YOLOv8 finns i tre varianter: YOLOv8, YOLOv8-L och YOLOv8-X. Den största skillnaden mellan varianterna är storleken på stamnätet. YOLOv8 har det minsta stamnätet, medan YOLOv8-X har det största stamnätet.

Skillnaden mellan Faster R-CNN, SSD och YOLO

Aspect Snabbare R-CNN SSD YOLO
arkitektur Tvåstegsdetektor med RPN och Fast R-CNN Enstegsdetektor Enstegsdetektor
Regionförslag Ja Nej Nej
Detektionshastighet Långsammare jämfört med SSD och YOLO Snabbare jämfört med Faster R-CNN, långsammare än YOLO Mycket snabb
Noggrannhet Generellt högre noggrannhet Balanserad noggrannhet och hastighet Anständig noggrannhet, särskilt för realtidsapplikationer
Flexibilitet Flexibel, kan hantera olika objektstorlekar och bildförhållanden Kan hantera flera skalor av objekt Kan kämpa med exakt lokalisering av små föremål
Unified Detection Nej Nej Ja
Avvägning mellan hastighet och noggrannhet Offrar i allmänhet hastighet för noggrannhet Balanserar hastighet och precision Prioriterar hastigheten med bibehållen anständig noggrannhet

Vad är segmentering?

Som vi vet innebär segmentering att vi delar upp den stora bilden i mindre grupper baserat på vissa egenskaper. Låt oss förstå bildsegmentering som är datorseendetekniken som används för att dela upp en bild i olika flera segment eller regioner. Eftersom bilderna är gjorda av pixlar och In Image-segmentering, grupperas pixlar efter likheten i färg, intensitet, struktur eller andra visuella egenskaper.

Till exempel, om en bild innehåller träd, bilar eller människor kommer bildsegmenteringen att dela upp bilden i olika klasser som representerar meningsfulla objekt eller delar av bilden. Bildsegmentering används ofta inom olika områden som medicinsk bildbehandling, satellitbildsanalys, objektigenkänning i datorseende och mer.

"

I segmenteringsdelen skapar vi initialt den första YOLOv8-segmenteringsmodellen med hjälp av Robflow. Sedan importerar vi segmenteringsmodellen för att utföra segmenteringsuppgiften. Frågan uppstår: varför skapar vi segmenteringsmodellen när uppgiften kunde slutföras med enbart en detektionsalgoritm?

Segmentering gör att vi kan få hela kroppsbilden av en klass. Medan detekteringsalgoritmer fokuserar på att upptäcka närvaron av objekt, ger segmentering en mer exakt förståelse genom att avgränsa objektens exakta gränser. Detta leder till mer exakt lokalisering och förståelse av objekten som finns i bilden.

Segmentering innebär dock vanligtvis högre tidskomplexitet jämfört med detekteringsalgoritmer eftersom det kräver ytterligare steg som att separera annoteringar och skapa modellen. Trots denna nackdel kan den ökade precisionen som erbjuds av segmentering uppväga beräkningskostnaden i uppgifter där exakt objektavgränsning är avgörande.

Steg-för-steg livedetektering och bildsegmentering med YOLOv8

I det här konceptet utforskar vi stegen för att skapa en virtuell miljö med hjälp av conda, aktivera venv och installera kravpaketen med pip. först skapar vi det normala python-skriptet och sedan skapar vi den strömbelysta applikationen.

Steg 1: Skapa en virtuell miljö med Conda

conda create -p ./venv python=3.8 -y

Steg 2: Aktivera den virtuella miljön

conda activate ./venv

Steg 3: Skapa requirements.txt 

Öppna terminalen och klistra in nedanstående skript:

touch requirements.txt

Steg 4: Använd Nano-kommandot och redigera requirements.txt

Efter att ha skapat requirements.txt, skriv följande kommando för att redigera requirements.txt

nano requirements.txt

Efter att ha kört ovanstående skript kan du se detta användargränssnitt.

Använd Nano-kommandot och redigera requirements.txt

Skriv hennes nödvändiga paket.

ultralytics==8.0.32
supervision==0.2.1
streamlit

Tryck sedan på "ctrl+o"(det här kommandot sparar redigeringsdelen) och tryck sedan på "Stiga på"

Använd Nano-kommandot och redigera requirements.txt

Efter att ha tryckt på "Ctrl+x”. du kan avsluta filen. och går till huvudvägen.

Steg 5: Installera requirements.txt

pip install -r requirements.txt

Steg 6: Skapa Python-skriptet

Skriv följande skript i terminalen eller så kan vi säga kommando.

touch main.py

Efter att ha skapat main.py, öppna vs-koden du använder kommandot write in terminal,

code 

Steg 7: Skriva Python-skriptet

import cv2
from ultralytics import YOLO
import supervision as sv

# Define the frame width and height for video capture
frame_width = 1280
frame_height = 720

def main():
    # Initialize video capture from default camera
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)

    # Load YOLOv8 model
    model = YOLO("yolov8l.pt")

    # Initialize box annotator for visualization
    box_annotator = sv.BoxAnnotator(
        thickness=2,
        text_thickness=2,
        text_scale=1
    )

    # Main loop for video processing
    while True:
        # Read frame from video capture
        ret, frame = cap.read()

        # Perform object detection using YOLOv8
        result = model(frame, agnostic_nms=True)[0]
        detections = sv.Detections.from_yolov8(result)

        # Prepare labels for detected objects
        labels = [
            f"{model.model.names[class_id]} {confidence:0.2f}"
            for _, confidence, class_id, _
            in detections
        ]

        # Annotate frame with bounding boxes and labels
        frame = box_annotator.annotate(
            scene=frame,
            detections=detections,
            labels=labels
        )

        # Display annotated frame
        cv2.imshow("yolov8", frame)

        # Check for quit key
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # Release video capture
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

Efter att ha kört det här kommandot kan du se att din kamera är öppen och känner av en del av dig. som kön och bakgrundsdelar.

Steg 7: Skapa strömbelyst app

import cv2
import streamlit as st
from ultralytics import YOLO
import supervision as sv

# Define the frame width and height for video capture
frame_width = 1280
frame_height = 720

def main():
    # Set page title and header
    st.title("Live Object Detection with YOLOv8")

    # Button to start the camera
    start_camera = st.button("Start Camera")

    if start_camera:
        # Initialize video capture from default camera
        cap = cv2.VideoCapture(0)
        cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
        cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)

        # Load YOLOv8 model
        model = YOLO("yolov8l.pt")

        # Initialize box annotator for visualization
        box_annotator = sv.BoxAnnotator(
            thickness=2,
            text_thickness=2,
            text_scale=1
        )

        # Main loop for video processing
        while True:
            # Read frame from video capture
            ret, frame = cap.read()

            # Perform object detection using YOLOv8
            result = model(frame, agnostic_nms=True)[0]
            detections = sv.Detections.from_yolov8(result)

            # Prepare labels for detected objects
            labels = [
                f"{model.model.names[class_id]} {confidence:0.2f}"
                for _, confidence, class_id, _
                in detections
            ]

            # Annotate frame with bounding boxes and labels
            frame = box_annotator.annotate(
                scene=frame,
                detections=detections,
                labels=labels
            )

            # Display annotated frame
            st.image(frame, channels="BGR", use_column_width=True)

            # Check for quit key
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        # Release video capture
        cap.release()

if __name__ == "__main__":
    main()

I det här skriptet skapar vi den strömbelysta applikationen och skapar knappen så att din enhetskamera är öppen efter att ha tryckt på knappen och upptäcker delen i ramen.

Kör det här skriptet med det här kommandot.

streamlit run app.py
# first create the app.py then paste the above code and run this script.

Efter att ha kört kommandot ovan antar du att du fick nå-out-felet som,

Ereor| Bildsegmentering med Yolov8

tryck sedan på detta kommando,

sudo sysctl fs.inotify.max_user_watches=524288

Efter att ha tryckt på kommandot vill du skriva ditt lösenord med eftersom vi använder sudo-kommandot sudo is god:)

Kör skriptet igen. och du kan se den strömbelysta applikationen.

Detektering av levande objekt | Bildsegmentering med YOLOv8

Här kan vi skapa en framgångsrik livedetektionsapplikation i nästa del kommer vi att se segmenteringsdelen.

Steg för anteckning

Steg 1: Roboflow-inställning

Efter att ha signerat "Skapa projekt”. här kan du skapa projektet och anteckningsgruppen.

Roboflow-inställning | Bildsegmentering med Yolov8

Steg 2: Nedladdning av datauppsättningar

Här överväger vi det enkla exemplet men du vill använda det på din problemformulering så jag använder här duck dataset.

Gå den här länk och ladda ner ankadatasetet.

Dataset laddar ner| Bildsegmentering med YOLOv8

Extrahera mappen där kan du se de tre mapparna: tåg, test och val.

Steg 3: Ladda upp datamängden på roboflow

Efter att ha skapat projektet i roboflow kan du se det här användargränssnittet här kan du ladda upp din datauppsättning så laddar du bara upp bilder på tågdelar välj "Välj mapp" alternativ.

Laddar upp datamängden på roboflow

Klicka sedan på “spara och fortsätt" alternativ som jag markerar i en röd rektangelruta

Ladda upp datamängden på roboflow | Bildsegmentering med Yolov8

Steg 4: Lägg till klassnamnet

Gå sedan till klassdel på vänster sida av kryssa i den röda rutan. och skriv klassnamnet som Anka, efter att ha klickat på den gröna rutan.

Lägg till klassnamnet

Nu är vår installation klar och nästa del som anteckningsdelen är också enkel.

Steg 5: Starta anteckningsdelen

Gå till anteckningsalternativ Jag markerade i den röda rutan och klickade sedan på start annotaion-delen som jag markerade i den gröna rutan.

Klicka på den första bilden så kan du se detta användargränssnitt. När du har sett detta klickar du på alternativet för manuell anteckning.

Lägg till klassnamnet

Lägg sedan till ditt e-post-ID eller din lagkamrats namn så att du kan tilldela uppgiften.

Klicka på den första bilden så kan du se detta användargränssnitt. klicka här på den röda rutan så att du kan välja multipolynommodellen.

Objektdetektion med yolov8

Efter att ha klickat på den röda rutan, välj standardmodellen och klicka på ankaobjektet. Detta segmenterar bilden automatiskt. Klicka sedan på nästa del och spara den. Du kommer då att se vänster sida markerad i en röd ruta, där du kan se klassnamnet.

Objektdetektion med yolov8

Klicka på spara&skriv in alternativ. kommentera alla bilder.

Lägg till bilderna för formatet YOLOv8. På höger sida ser du alternativet att lägga till bilder i kommentarsektionen. Här skapas två delar: en för kommenterade bilder och en för omärkta bilder.

  • Klicka först på vänster sida "kommentera" alternativ då lägga till bilderna till datasetet.
  • Klicka sedan på nästa "Lägg till bilder".
Objektdetektion med yolov8

Nu sist, vi skapar datasetet så klicka på alternativet "Generera" på vänster sida, markera sedan alternativet och tryck på alternativet fortsätt.

Objektdetektion med yolov8

Sedan får du användargränssnittet för datauppdelningsalternativet här kan du kontrollera tåg-, test- och valmapparna som deras bilder delas automatiskt. och klicka på den röda rutan ovan Alternativet Exportera datauppsättning och ladda ner zip-filen. zip-filens mappstruktur är som...

root_file.zip
│
├── test
│   ├── Images
│   └── labels
│
├── train
│   ├── Images
│   └── labels
│
├── val
│   ├── Images
│   └── labels
│
├── data.yaml
└── Readme.roboflow.txt

Steg 6: Skriv skriptet för att träna bildsegmenteringsmodellen

I den här delen skapar du först Google Collab-filen med Drive och laddar sedan upp din datauppsättning. och flytta Google Drive med Google Collab.

1. Använd detta kommando för Montera Google Drive

from google.colab import drive

drive.mount('/content/gdrive')

2. Definiera datakatalog Använd variabeln konstant.

DATA_DIR = '/content/drive/MyDrive/YoloV8/Data/'

3. Installera det nödvändiga paketet, Installera ultralytics

!pip install ultralytics

4. Importera biblioteken

import os

from ultralytics import YOLO

5. Ladda förtränad YOLOv8 modell (här har vi olika modeller, kolla även den officiella dokumentationen där kan du se olika modeller)

model = YOLO('yolov8n-seg.pt') 
 # load a pretrained model (recommended for training)

6. Träna modellen

model.train(data='/content/drive/MyDrive/YoloV8/Data/data.yaml', epochs=2, imgsz=640)

# Update the path & and join this line together 

Nej kontrollera din enhet. Mappen modellnamn skapas och modellen sparas för den förutsägelse vi vill ha denna modell.

7. Förutsäg modellen

#Update the path
model_path = '/content/drive/MyDrive/YoloV8/Model/train2/weights/last.pt'
#Update the path
image_path = '/content/drive/MyDrive/YoloV8/Data/val/1be566eccffe9561.png'

img = cv2.imread(image_path)
H, W, _ = img.shape

model = YOLO(model_path)

results = model(img)

for result in results:
    for j, mask in enumerate(result.masks.data):

        mask = mask.numpy() * 255

        mask = cv2.resize(mask, (W, H))

        cv2.imwrite('./output.png', mask)

Här kan du se att segmenteringsbilden är sparad.

Objektdetektion med yolov8

Nu äntligen kan vi bygga modeller för både livedetektering och bildsegmentering.

Slutsats

I den här bloggen utforskar vi levande objektdetektering och bildsegmentering med YOLOv8. För livedetektering importerar vi en förtränad YOLOv8-modell och använder datorseendebiblioteket, OpenCV, för att öppna kameran och upptäcka objekt. Dessutom skapar vi en Streamlit-applikation för ett attraktivt användargränssnitt.

Därefter fördjupar vi oss i bildsegmentering med YOLOv8. Vi importerar en förtränad modell och utför överföringsinlärning på en anpassad datauppsättning. Dessförinnan utforskade vi Roboflow för datauppsättningsannotering, vilket gav ett lättanvänt alternativ till verktyg som LabelImg.

Slutligen förutspår vi en bild som innehåller en anka. Även om objektet i bilden verkar vara en fågel, anger vi klassnamnet som "anka” i demonstrationssyfte.

Key Takeaways

  • Lär dig om objektdetekteringsmodeller som Faster R-CNN, SSD och den senaste YOLOv8.
  • Förstå anteckningsverktyget Roboflow och dess roll i att skapa datauppsättningar för YOLOv8 segmenteringsmodeller.
  • Utforska levande objektdetektering med OpenCV (cv2) och Supervision, vilket förbättrar praktiska färdigheter.
  • Utbildning och implementering av en segmenteringsmodell med hjälp av YOLOv8, få praktisk erfarenhet.

Vanliga frågor

Q1. Vad är skillnaden mellan objektdetektering och bildsegmentering med YOLOv8?

S. Objektdetektering innebär att identifiera och lokalisera flera objekt i en bild, vanligtvis genom att rita avgränsande rutor runt dem. Bildsegmentering, å andra sidan, delar upp en bild i segment eller regioner baserat på pixellikhet, vilket ger en mer detaljerad förståelse av objektgränser.

Q2. Hur jämförs YOLOv8 med tidigare versioner av YOLO (t.ex. YOLOv3)?

S. YOLOv8 förbättrar tidigare versioner genom att införliva framsteg inom nätverksarkitektur, träningstekniker och optimering. Det kan erbjuda bättre noggrannhet, hastighet och effektivitet jämfört med YOLOv3.

Q3. Kan jag använda YOLOv8 för objektdetektering i realtid på inbäddade enheter?

S. YOLOv8 kan användas för objektdetektering i realtid på inbäddade enheter, beroende på maskinvarukapacitet och modelloptimering. Det kan dock kräva optimeringar som modellbeskärning eller kvantisering för att uppnå realtidsprestanda på enheter med begränsade resurser.

Q4. Vilka är fördelarna med att använda Roboflow för datauppsättningsanteckning jämfört med andra verktyg?

S. Roboflow erbjuder intuitiva annoteringsverktyg, datauppsättningshanteringsfunktioner och stöd för olika annoteringsformat. Det effektiviserar anteckningsprocessen, möjliggör samarbete och ger versionskontroll, vilket gör det enklare att skapa och hantera datauppsättningar för datorseendeprojekt.

plats_img

Senaste intelligens

plats_img