Классифицируйте видео веб-камеры потоковой передачи Используя классификатор видео SlowFast

В этом примере показано, как классифицировать потоковое видео от веб-камеры с помощью предварительно обученного Классификатора Видео SlowFast. Чтобы узнать больше, как обучить видео сеть классификатора для вашего набора данных, посмотрите Распознавание Жеста с помощью Видео и Глубокого обучения.

Загрузите предварительно обученный видео классификатор

Загрузите предварительно обученный классификатор видео SlowFast.

downloadFolder = fullfile(tempdir,"gesture");
zipFile = "slowFastPretrained_fourClasses.zip";
if ~isfile(fullfile(downloadFolder,zipFile))
    disp("Downloading the pretrained network...");    
    downloadURL = "https://ssd.mathworks.com/supportfiles/vision/data/" + zipFile;
    zipFile = fullfile(downloadFolder,zipFile);
    websave(zipFile,downloadURL);
    unzip(zipFile,downloadFolder);
end

Загрузите предварительно обученный классификатор видео SlowFast.

pretrainedDataFile = fullfile(downloadFolder,"slowFastPretrained_fourClasses.mat");
pretrained = load(pretrainedDataFile);
slowFastClassifier = pretrained.data.slowFast;

Отобразите имена метки класса предварительно обученного видео классификатора. Любой жест, такой как "хлопание" и "wavingHello" на веб-камере будет распознан Классификатором Видео SlowFast.

classes = slowFastClassifier.Classes
classes = 4×1 categorical
     clapping 
     noAction 
     somethingElse 
     wavingHello 

Setup веб-камера и видеоплеер

В этом примере объект веб-камеры используется, чтобы получить потоковое видео. Видеоплеер используется, чтобы отобразить потоковое видео наряду с предсказанным классом.

Создайте объект веб-камеры использование webcam функция.

cam = webcam;

Создайте Видеоплеер с помощью vision.VideoPlayer функция. Убедитесь, что поместили Видеоплеер в положение, где можно ясно видеть потоковое видео при выполнении классификации.

player = vision.VideoPlayer;

Классифицируйте потоковое видео веб-камеры

Задайте, как часто классификатор должен быть применен к входящим видеокадрам.

classifyInterval = 10;

Значение 10 эффективности времени выполнения балансов против эффективности классификации. Увеличьте это значение, чтобы улучшать производительность во время выполнения за счет недостающих жестов от живого видеопотока.

Получите длину последовательности Классификатора Видео SlowFast. Классифицируйте только после получения, по крайней мере, sequenceLength количество кадров от веб-камеры.

sequenceLength = slowFastClassifier.InputSize(4);

Задайте максимальное количество систем координат, чтобы получить в цикле с помощью maxNumFrames переменная. Убедитесь, что вы махаете одной из рук, чтобы распознать "wavingHello" пометьте, и хлопок с помощью обеих рук для классификатора, чтобы распознать "clapping" метка.

maxNumFrames = 280;

Получите снимок состояния веб-камеры в цикле. Обновите последовательность потокового видео классификатора с помощью updateSequence метод, и классифицирует последовательность потоковой передачи с помощью classifySequence метод.

numFrames = 0;
text = "";

while numFrames <= maxNumFrames
    frame = snapshot(cam);
    
    numFrames = numFrames + 1;
    slowFastClassifier = updateSequence(slowFastClassifier,frame);
    if mod(numFrames, classifyInterval) == 0 && numFrames >= sequenceLength
        [label,scores] = classifySequence(slowFastClassifier);
        if ~isempty(label)
            text = string(label) + "; " + num2str(max(scores), "%0.2f");
        end
    end
    frame = insertText(frame,[30,30],text,'FontSize',18);
    step(player,frame);
end