%% Detekcja obiektów w czasie rzeczywistym z użyciem YOLO v4 (MATLAB) % Ten skrypt wykorzystuje pretrenowany detektor YOLO v4 (Deep Learning Toolbox + Computer Vision Toolbox) % do wykrywania obiektów w strumieniu wideo z kamery laptopa. Podgląd na żywo można zakończyć, naciskając 'q'. % % Kluczowa zmiana: etykiety zamieniamy na string array, a nie na obiekt (categorical). %% 1. Załaduj pretrenowany detektor YOLO v4 disp("Ładowanie pretrenowanego detektora YOLO v4 (CSPDarkNet53, COCO)..."); detector = yolov4ObjectDetector("csp-darknet53-coco"); disp("Detektor załadowany."); %% 2. Inicjalizacja kamery cams = webcamlist; if isempty(cams) error('Nie wykryto żadnej kamery. Sprawdź połączenie i sterowniki.'); end cam = webcam(1); % (Opcjonalnie) ustaw rozdzielczość: % disp(cam.AvailableResolutions); % cam.Resolution = '640x480'; %% 3. Utwórz okno figure i ustaw obsługę klawisza 'q' hFig = figure( ... 'Name', "Detekcja obiektów YOLO v4 – naciśnij 'q', aby zakończyć", ... 'NumberTitle', 'off', ... 'KeyPressFcn', @(src, ev) assignin('base','keyPressed', ev.Key) ... ); assignin('base', 'keyPressed', ''); % Aby uniknąć ponownego tworzenia obrazu w osi, pobierz pierwszą klatkę: frame0 = snapshot(cam); hAx = axes('Parent', hFig); hImage = imshow(frame0, 'Parent', hAx); title(hAx, "Trwa detekcja obiektów..."); %% 4. Główna pętla detekcji disp("Rozpoczynam detekcję YOLO v4. Naciśnij 'q', aby zakończyć."); while ishandle(hFig) % 4.1. Pobierz bieżącą klatkę z kamery rgbFrame = snapshot(cam); % 4.2. Wykonaj detekcję za pomocą detektora YOLO v4 [bboxes, scores, labelsCat] = detect(detector, rgbFrame, ... 'MiniBatchSize', 1, ... 'Threshold', 0.5); % labelsCat jest typu categorical → przekształcamy do string array: labelsStr = string(labelsCat); % np. ["person", "dog", ...] % 4.3. Przygotuj etykiety (string array typu ["person: 0.87", "dog: 0.65", ...]) if ~isempty(bboxes) % Zaokrąglamy wyniki do dwóch miejsc po przecinku: scoresRounded = round(scores, 2); % Budujemy string array: annotLabels = labelsStr + ": " + string(scoresRounded); % annotLabels ma teraz np. ["person: 0.87", "dog: 0.65"] % Wstawiamy adnotacje: rgbFrame = insertObjectAnnotation( ... rgbFrame, ... 'rectangle', ... bboxes, ... annotLabels, ... % przekazujemy string array 'Color', 'magenta', ... 'FontSize', 12, ... 'LineWidth', 2 ... ); end % 4.4. Wyświetl zaktualizowaną klatkę w oknie set(hImage, 'CData', rgbFrame); drawnow; % 4.5. Czy naciśnięto 'q'? key = evalin('base', 'keyPressed'); if strcmpi(key, 'q') break; end assignin('base', 'keyPressed', ''); end %% 5. Zwolnienie zasobów if ishandle(hFig) close(hFig); end clear cam; disp("Zakończono detekcję obiektów przy użyciu YOLO v4.");