Objectherkenning op je eigen webcam met Python en Yolo

De AI-hype richt zich momenteel volledig op generatieve AI. Maar een ander onderwerp waar kunstmatige intelligentie specifiek sterk in is, is computervisie, de taak van het begrijpen van digitale beelden.


Lang voordat de wereld überhaupt van kunstmatige intelligentie hoorde, richtten AI-onderzoekers zich al op computervisietaken zoals het herkennen van handgeschreven karakters. Omdat deze karakters klein en niet al te complex waren, konden ze worden herkend door eenvoudige neurale netwerken die niet de rekenkracht nodig hadden die we vandaag de dag zien.


Maar naarmate computergeheugen en rekenkracht groter werd, nam ook de complexiteit toe van dingen die in afbeeldingen konden worden herkend.


Als we even vooruitspoelen naar vandaag zien we dat objectherkenningsmodellen zoals Yolo zo zijn krachtig geworden dat je ze op je eigen laptop kunt draaien, met live videobeelden van je eigen webcam.


Wil je leren hoe? Lees snel verder!


Objecten herkend via je eigen webcam met Yolo



Maar allereerst, wat is objectherkenning en hoe werkt Yolo?

Als we het hebben over objectherkenning in AI, hebben we het vaak over de dubbele taak van het herkennen van objecten in digitale beelden en het lokaliseren ervan.


Dit wordt vaak gebruikt in beveiligingssurveillance, maar ook bij het detecteren van slachtoffers tijdens grootschalige rampen, of zelfs schattingen van schendingen van sociale afstand tijdens de Covid-19-pandemie.


Deze modellen gebruiken zogenaamde convolutienetwerken - CNN's voor kort - om patronen in foto's te herkennen. In plaats van naar het hele plaatje in één keer te kijken, scannen deze CNN's het plaatje stukje voor stukje. Denk hierbij aan het kijken naar een afbeelding door een rietje. Door deze gefilterde stukjes herhaaldelijk toe te passen, leert het netwerk complexe patronen in de gegevens te herkennen.


Yolo staat voor You Only Look Once. Het is vernoemd naar het feit dat het model objecten in één keer verwerkt in plaats van meerdere keren, wat de standaard was vóór Yolo. Als gevolg hiervan staat Yolo bekend om haar snelheid. Daarnaast is het model ook opvallend nauwkeurigheid. Deze twee kenmerken maken Yolo perfect voor het analyseren van realtime videobeelden.


Yolo is ontwikkeld in Python door Ultralytics, maar gebruikt C onder de motorkap, een veel snellere programmeertaal. Het model is open source gepubliceerd, en de broncode is gemakkelijk te vinden op Github.


Yolo aansluiten op je webcam

Yolo draait op Python, dus als je dat nog niet hebt gedaan, is het eerste wat je moet doen Python installeren. Om Yolo voor python te installeren, open je een terminal/CMD en gebruik je het volgende commando:



   $ pip install ultralytics



Daarnaast, om webcambeelden vast te leggen, zullen we OpenCV gebruiken, een open-source computervisiepakket in Python. Om deze module te installeren, open je de terminal/CMD en gebruik je het volgende commando:



   $ pip install opencv-python



Vervolgens maak je een nieuw Python-bestand - bijvoorbeeld main.py - en kopieer/plak je de volgende code:


# 1. Import modules 
#  - ultralytics, for object recognition
#  - cvs, for video capturing
#  - math, for rounding results from Yolo
from ultralytics import YOLO
import cv2
import math 

# 2. Create a video capture 1280 by 960 format
cap = cv2.VideoCapture(0)
cap.set(3, 1280)
cap.set(4, 960)

# 3. Create a Yolo model - version 8
model = YOLO("yolo-Weights/yolov8n.pt")

# 4. Define all classes that Yolo can recognize
classNames = [
    "person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train", "truck", "boat",
    "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat",
    "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella",
    "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat",
    "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup",
    "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli",
    "carrot", "hot dog", "pizza", "donut", "cake", "chair", "sofa", "pottedplant", "bed",
    "diningtable", "toilet", "tvmonitor", "laptop", "mouse", "remote", "keyboard", "cell phone",
    "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors",
    "teddy bear", "hair drier", "toothbrush"
]

# 5. Loop infinitely, so we never stop capturing and recognizing
while True:
    # 6. Capture video and process with Yolo model
    success, img = cap.read()
    results = model(img, stream=True)

    # 7. Loop over all processed video frames
    for r in results:
        boxes = r.boxes
        
        # 8. Loop over all detected objects' bounding boxes
        for box in boxes:
            # 9. Get bounding box coordinates
            x1, y1, x2, y2 = [int(value) for value in box.xyxy[0]]
            
            # 10. Draw rectangle on bounding box
            cv2.rectangle(img, (x1, y1), (x2, y2), (255, 0, 255), 3)

            # 11. Get class name of object and draw into image, and also print to output
            className = classNames[int(box.cls[0])]
            cv2.putText(img, className, [x1, y1], cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
            print("Class name -->", className)
            
            # 12. Get confidence of found classs and print to output
            confidence = math.ceil((box.conf[0] * 100)) / 100
            print("Confidence --->", confidence)
    
    # 13. Show the altered image with detected objects 
    cv2.imshow('Webcam', img)
    if cv2.waitKey(1) == ord('q'):
        break

# 14. Cleanup capture windows
cap.release()
cv2.destroyAllWindows()
    


Deze code doet de volgende dingen (zie de opmerkingen in de code):

  1. Allereerst worden de modules ultralytics (voor objectdetectie), cv2 (voor het vastleggen van de webcam) en math (voor het afronden van resultaten) geïmporteerd.
  2. Vervolgens wordt een videocapture van 1280 bij 960 gemaakt.
  3. Ten derde wordt een Yolo-model - versie 8 - gemaakt.
  4. Alle classnamen die het Yolo-model kan detecteren, worden gedefinieerd.
  5. Een oneindige lus wordt gestart, zodat we nooit stoppen met vastleggen en herkennen.
  6. De webcambeelden worden vastgelegd en de afbeeldingen worden verwerkt door het Yolo-model.
  7. Vervolgens lopen we over alle verwerkte videoframes.
  8. En we lopen over alle gedetecteerde objecten in een bepaald frame.
  9. Vervolgens worden de begrenzingskadercoördinaten van het object gevonden.
  10. En er wordt een rechthoek in de afbeelding getekend met deze coördinaten.
  11. Vervolgens wordt de classnaam van het gedetecteerde object gevonden, getekend en weergegeven.
  12. Ook wordt de zekerheid van de gedetecteerde objectklasse gevonden en weergegeven.
  13. Ten slotte tekenen we elk videoframe, inclusief het gedetecteerde begrenzingskader en de classnaam.
  14. En wanneer de toepassing eindigt, wordt de videocapture opgeruimd.


Tot slot hoeven we alleen het Python-programma uit te voeren. Het resultaat? Je live webcamstream met geannoteerde objecten in de video.


Veel plezier met detecteren!