В этом примере показано, как оценить предварительно обученный Классификатор Видео 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