Оцените видео классификатор

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

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

Загрузите предварительно обученный классификатор видео SlowFast. Размер загруженного zip-файла составляет приблизительно 245 Мбайт.

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);
    disp('Downloaded.');
end

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

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

Отобразите имена метки класса предварительно обученного видео классификатора.

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

Загрузите видео для оценки

Это примеры используют видео, сохраненные в папках именами, которые соответствуют их меткам. Извлеките видео последовательности определенных меток сцены и сохраните их в папке под названием "videoScenes". Чтобы изучить, как извлечь видео последовательности из набора видео и соответствующей информации о метке сцены основной истины, смотрите Обучающие данные Извлечения для Видео Классификации.

Используйте функцию поддержки downloadGroundTruthData, заданный в конце этого примера, чтобы загрузить видеоизображения и соответствующую сцену основной истины помечают информацию.

groundTruthFolder = fullfile(downloadFolder,"groundTruthFolder");
trainingFolder = fullfile(downloadFolder,"videoScenes");
groundTruthAlreadyExtracted = downloadGroundTruthData(groundTruthFolder,trainingFolder,classes);

Используйте функцию поддержки extractVideoScenes, заданный в конце этого примера, чтобы извлечь видеоизображения из сцены основной истины помечают информацию. Извлеките данные о видеоизображении только, когда достоверные данные не были извлечены прежде.

if ~groundTruthAlreadyExtracted    
    extractVideoScenes(groundTruthFolder,trainingFolder,classes);
end

Классифицируйте видеофайлы

Используйте folders2labels создать информацию о метке из папок и перечислить все файлы в "videoScenes" папка.

[trueLabels, filenames] = folders2labels(trainingFolder,...
    "FileExtensions",".avi", ...
    "IncludeSubfolders",true);

Предварительно выделите категориальные значения метки с пустыми именами метки.

numFiles = numel(filenames);
emptyLabelNames = repmat("",numFiles,1);
predictedLabels = categorical(emptyLabelNames,string(classes));

Выберите 5 случайным образом выбранных видео последовательностей, чтобы классифицировать видео, однородно покрыть полноту файла, чтобы найти класс действия, который преобладает в видео.

numSequences = 5;

Для того, чтобы классифицировать и присвоить метку каждому из видеофайлов в наборе, используйте classifyVideoFile функция.

for ii = 1:numFiles
    filename = filenames(ii);    
    predictedLabels(ii) = classifyVideoFile(slowFastClassifier, filename,...
        "NumSequences", numSequences);
end

Вычислите видео точность

Вычислите среднюю видео точность для видео классификатора.

videoAccuracy = sum(trueLabels == predictedLabels)/numel(trueLabels)
videoAccuracy = 1

Отобразите матрицу неточностей.

figure
chart = confusionchart(trueLabels,predictedLabels);

Вспомогательные Функции

downloadGroundTruthData

downloadGroundTruthData функционируйте видеоданные основной истины загрузок и его соответствующий набор меток сцены.

function groundTruthAlreadyExtracted = downloadGroundTruthData(groundTruthFolder,trainingFolder,classes)

% If the video scenes are already extracted, no need to download
% the dataset and extract video scenes.
if isfolder(trainingFolder)
    classFolders = fullfile(trainingFolder, string(classes));
    groundTruthAlreadyExtracted = true;
    for ii = 1:numel(classFolders)
        if ~isfolder(classFolders(ii))
            groundTruthAlreadyExtracted = false;
            break;
        end
    end
    if groundTruthAlreadyExtracted
        return;
    end
end
if ~isfolder(groundTruthFolder)
    mkdir(groundTruthFolder);
end
downloadURL = "https://ssd.mathworks.com/supportfiles/vision/data/videoClipsAndSceneLabels.zip";
filename = fullfile(groundTruthFolder,"videoClipsAndSceneLabels.zip");
if ~isfile(filename)
    disp("Downloading the video clips and the corresponding scene labels to " + groundTruthFolder);
    websave(filename,downloadURL);    
end

% Unzip the contents to the download folder.
unzip(filename,groundTruthFolder);
end

extractVideoScenes

extractVideoScenes функционируйте извлекает учебные видеоданные из набора видео и его соответствующего набора меток сцены, при помощи функций sceneTimeRanges и writeVideoScenes.

function extractVideoScenes(groundTruthFolder,trainingFolder)
labelDataFiles = dir(fullfile(groundTruthFolder,"*_labelData.mat"));
labelDataFiles = fullfile(groundTruthFolder,{labelDataFiles.name}');
numGtruth = numel(labelDataFiles);

% Load the label data information and create ground truth objects.
gTruth = groundTruth.empty(numGtruth,0);
for ii = 1:numGtruth
    ld = load(labelDataFiles{ii});
    videoFilename = fullfile(groundTruthFolder,ld.videoFilename);
    gds = groundTruthDataSource(videoFilename);
    gTruth(ii) = groundTruth(gds,ld.labelDefs,ld.labelData);
end

% Gather all the scene time ranges and the corresponding scene labels 
% using the sceneTimeRanges function.
[timeRanges, sceneLabels] = sceneTimeRanges(gTruth);

% Specify the subfolder names for each duration as the scene label names. 
foldernames = sceneLabels;

% Delete the folder if it already exists.
if isfolder(trainingFolder)
    rmdir(trainingFolder, 's');
end
% Video files are written to the folders specified by the folderNames input.
writeVideoScenes(gTruth,timeRanges,trainingFolder,foldernames);
end