Классифицируйте последовательность изображений в Simulink с импортированной сетью TensorFlow

В этом примере показано, как импортировать предварительно обученную сеть TensorFlow™ в сохраненном формате модели при помощи importTensorFlowNetwork, и затем используйте блок Predict, чтобы классифицировать последовательность изображений в Simulink®. Импортированная сеть содержит слои, которые не поддерживаются для преобразования на встроенные в MATLAB® слои. importTensorFlowNetwork автоматически генерирует пользовательские слои, когда вы импортируете эти слои. Блок Predict предсказывает ответы для данных во входе при помощи обучившего сеть, что вы задаете использование параметров блоков.

importTensorFlowNetwork требует Конвертера Deep Learning Toolbox™ для пакета поддержки Моделей TensorFlow. Если этот пакет поддержки не установлен, то importTensorFlowNetwork обеспечивает ссылку на загрузку.

Загрузите данные изображения

Загрузите выборочные данные цифры как datastore изображений. imageDatastore автоматически помечает изображения на основе имен папок и хранит данные как ImageDatastore объект.

digitDatasetPath = fullfile(matlabroot,"toolbox","nnet","nndemos", ...
    "nndatasets","DigitDataset");
imds = imageDatastore(digitDatasetPath, ...
    IncludeSubfolders=true,LabelSource="foldernames");

Для воспроизводимости задайте seed для генератора случайных чисел MATLAB. Случайным образом выберите восемь изображений от datastore изображений, создайте массив изображений inputIms, и отобразите выбранные изображения при помощи montage (Image Processing Toolbox).

rng("default")
perm = randperm(10000,8);
for i = 1:8
    inputIms(:,:,:,i) = imread(imds.Files{perm(i)});
end
montage(inputIms,size=[1 NaN]);

Импортируйте предварительно обученную сеть TensorFlow

Задайте папку модели, которая содержит предварительно обученную сеть digitsDAGnetwithnoise в сохраненном формате модели. digitsDAGnetwithnoise может классифицировать изображения цифр.

if ~exist("digitsDAGnetwithnoise","dir")
    unzip("digitsDAGnetwithnoise.zip")
end
modelFolder = "./digitsDAGnetwithnoise";

Задайте имена классов.

classNames = {'0','1','2','3','4','5','6','7','8','9'};

Импортируйте сеть TensorFlow в сохраненном формате модели. По умолчанию, importTensorFlowNetwork импортирует сеть как DAGNetwork объект.

net = importTensorFlowNetwork(modelFolder,Classes=classNames);
Importing the saved model...
Translating the model, this may take a few minutes...
Finished translation. Assembling network...
Import finished.

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

analyzeNetwork(net)

Импортированная сеть содержит слои, которые не поддерживаются для преобразования на встроенные слои MATLAB. Программное обеспечение автоматически генерирует пользовательские слои gaussian_noise_1 и gaussian_noise_2. Функциональный importTensorFlowNetwork сохраняет каждый сгенерированный пользовательский слой в отдельный .m файл в пакете +digitsDAGnetwithnoise в текущей папке. Для получения дополнительной информации об этих сгенерированных пользовательских слоях смотрите Импорт Сеть TensorFlow с Автоматически сгенерированными Пользовательскими Слоями.

Сохраните импортированную сеть в файле MAT.

filename = "digitsNet.mat";
save(filename,"net")

Создайте модель Simulink

Этот пример предоставляет модели Simulink slexDigitsImportedNetworkPredictExample.slx. Можно открыть модель Simulink (обеспеченный в этом примере) или создать новую модель путем выполнения шагов, описанных в этом разделе.

Откройте модель Simulink slexDigitsImportedNetworkPredictExample.slx.

SimMdlName = "slexDigitsImportedNetworkPredictExample"; 
open_system(SimMdlName)

1. Чтобы создать новую модель Simulink, откройте шаблон Blank Model и добавьте блок Predict из библиотеки Deep Learning Toolbox™. Блок Predict предсказывает ответы для данных во входе при помощи обучившего сеть, что вы задаете использование параметров блоков. Вход с блоком может быть h w c N числовым массивом, где h, w, и c являются высотой, шириной и количеством каналов изображений, соответственно, и N является количеством изображений.

Дважды кликните блок Predict, чтобы открыть диалоговое окно Block Parameters. Выберите Network from MAT-file для Сетевого параметра. Нажмите Browse в разделе File Path, чтобы задать сеть как digitsNet.mat сеть в текущей папке.

2. Вставьте блок Video from Workspace из библиотеки Computer Vision Toolbox™. Дважды кликните блок Video from Workspace, чтобы открыть диалоговое окно Block Parameters. Задайте Сигнал как inputIms, Шаг расчета как 1, и Form выход после окончательного значения как Содержащий окончательное значение.

3. Проверяйте, совпадает ли размер входных изображений с сетевым входным размером. Если они не соответствуют, необходимо изменить размер входных данных путем добавления блока Resize от библиотеки Computer Vision Toolbox до модели.

Отобразите размер изображения и входной размер сети.

size(inputIms)
ans = 1×4

    28    28     1     8

netInputSize = net.Layers(1).InputSize
netInputSize = 1×3

    28    28     1

Вход является последовательностью восьми полутоновых изображений (с одним каналом), которые являются 28 28 пикселями в размере. Размер изображения совпадает с сетевым входным размером.

4. Добавьте блок To Workspace в модель и поменяйте имя переменной на yPred. Соедините блок Video from Workspace с входом блока Predict и блока To Workspace к выходу блока Predict.

5. Откройте диалоговое окно Configuration Parameters. На вкладке Modeling нажмите Model Settings. При выборе Решателя, Типе набора к Fixed-step, и Решатель набора к discrete (no continuous states).

Предскажите Используя модель Simulink

Симулируйте модель и сохраните симуляцию выход в modelOutput. Поле modelOutput.yPred.Data содержит результаты классификации.

modelOutput = sim(SimMdlName)
modelOutput = 
  Simulink.SimulationOutput:

                   tout: [8x1 double] 
                  yPred: [1x1 timeseries] 

     SimulationMetadata: [1x1 Simulink.SimulationMetadata] 
           ErrorMessage: [0x0 char] 

Отобразите последовательность изображений и результатов классификации.

tiledlayout(1,12,TileSpacing="None");
for i = 1:size(inputIms,4)
    nexttile
    imshow(inputIms(:,:,:,i))
    label = modelOutput.yPred.Data(:,:,i)==1;
    title([classNames{label}],FontSize=20)
end

Смотрите также

| | |

Похожие темы