Отобразите извлечение Используя индивидуально настраиваемый набор признаков

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

Введение

Системы Извлечения изображений на основе содержимого (CBIR) используются, чтобы найти изображения, которые визуально похожи на изображение запроса. Применение систем CBIR может быть найдено во многих областях, таких как веб-поиск продукта, наблюдение и визуальная идентификация места. Общий метод, используемый, чтобы реализовать систему CBIR, является мешком визуальных слов, также известных как набор признаков [1,2]. Набор признаков является методом, адаптированным, чтобы отобразить извлечение от мира поиска документов. Вместо того, чтобы использовать фактические слова в качестве в поиске документов, набор признаков использует функции изображений как визуальные слова, которые описывают изображение.

Функциями изображений является важная часть систем CBIR. Эти функции изображений используются, чтобы измерить подобие между изображениями и могут включать глобальные функции изображений, такие как цвет, структура и форма. Функциями изображений могут также быть локальные функции изображений, такие как ускоренные устойчивые функции (SURF), гистограмма градиентов (HOG) или локальные бинарные шаблоны (LBP). Преимущество подхода набора признаков - то, что тип функций, использованных, чтобы создать визуальный словарь слова, может быть настроен, чтобы соответствовать приложению.

Скорость и КПД поиска изображений также важны в системах CBIR. Например, может быть приемлемо выполнить поиск грубой силы в небольшой коллекции изображений меньше, чем 100 изображения, где функции от изображения запроса сравниваются с функциями от каждого изображения в наборе. Для больших наборов поиск грубой силы не выполним, и должны использоваться более эффективные поисковые методы. Набор признаков предоставляет краткую схему кодирования, чтобы представлять большое количество изображений с помощью разреженного набора визуальных гистограмм слова. Это включает компактное устройство хранения данных и эффективный поиск через структуру данных инвертированного индекса.

Computer Vision Toolbox™ служит настраиваемой основой набора признаков, чтобы реализовать поисковую систему изображений. Следующие шаги обрисовывают в общих чертах процедуру:

  1. Выберите функции изображений извлечения

  2. Создайте набор признаков

  3. Индексируйте изображения

  4. Ищите подобные изображения

В этом примере вы пройдете эти шаги, чтобы создать поисковую систему изображений для поиска цветочного набора данных [3]. Этот набор данных содержит приблизительно 3 670 изображений 5 различных типов цветов.

Загрузите этот набор данных для использования в остальной части этого примера.

% Location of the compressed data set
url = 'http://download.tensorflow.org/example_images/flower_photos.tgz';

% Store the output in a temporary folder
downloadFolder = tempdir;
filename = fullfile(downloadFolder,'flower_dataset.tgz');

Обратите внимание на то, что загрузка набора данных от сети может занять очень долгое время в зависимости от вашего Интернет-соединения. Команды ниже блокируют MATLAB в течение того промежутка времени. В качестве альтернативы можно использовать веб-браузер, чтобы сначала загрузить набор на локальный диск. Если вы выбираете тот маршрут, повторно указываете переменную 'URL' выше на файл, который вы загрузили.

% Uncompressed data set
imageFolder = fullfile(downloadFolder,'flower_photos');

if ~exist(imageFolder,'dir') % download only once
    disp('Downloading Flower Dataset (218 MB)...');
    websave(filename,url);
    untar(filename,downloadFolder)
end

flowerImageSet = imageDatastore(imageFolder,'LabelSource','foldernames','IncludeSubfolders',true);

% Total number of images in the data set
numel(flowerImageSet.Files)
ans = 3670

Шаг 1 - выбирает функции изображений извлечения

Тип функции, использованной для извлечения, зависит от типа изображений в наборе. Например, при поиске коллекции изображений, составленной из сцен (пляжи, города, магистрали), желательно использовать глобальную функцию изображений, такую как цветная гистограмма, которая получает цветное содержимое целой сцены. Однако, если цель состоит в том, чтобы найти конкретные объекты в коллекциях изображений, то локальными функциями изображений, извлеченными вокруг объекта keypoints, является лучший выбор.

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

% Display a one of the flower images
figure
I = imread(flowerImageSet.Files{1});
imshow(I);

Отображенное изображение Марио.

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

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

type exampleBagOfFeaturesColorExtractor.m
function [features, metrics] = exampleBagOfFeaturesColorExtractor(I) 
% Example color layout feature extractor. Designed for use with bagOfFeatures.
%
% Local color layout features are extracted from truecolor image, I and
% returned in features. The strength of the features are returned in
% metrics.

%   Copyright 2014-2020 The MathWorks, Inc.

[~,~,P] = size(I);

isColorImage = P == 3; 

if isColorImage
    
    % Convert RGB images to the L*a*b* colorspace. The L*a*b* colorspace
    % enables you to easily quantify the visual differences between colors.
    % Visually similar colors in the L*a*b* colorspace will have small
    % differences in their L*a*b* values.
    Ilab = rgb2lab(I);                                                                             
      
    % Compute the "average" L*a*b* color within 16-by-16 pixel blocks. The
    % average value is used as the color portion of the image feature. An
    % efficient method to approximate this averaging procedure over
    % 16-by-16 pixel blocks is to reduce the size of the image by a factor
    % of 16 using IMRESIZE. 
    Ilab = imresize(Ilab, 1/16);
    
    % Note, the average pixel value in a block can also be computed using
    % standard block processing or integral images.
    
    % Reshape L*a*b* image into "number of features"-by-3 matrix.
    [Mr,Nr,~] = size(Ilab);    
    colorFeatures = reshape(Ilab, Mr*Nr, []); 
           
    % L2 normalize color features
    rowNorm = sqrt(sum(colorFeatures.^2,2));
    colorFeatures = bsxfun(@rdivide, colorFeatures, rowNorm + eps);
        
    % Augment the color feature by appending the [x y] location within the
    % image from which the color feature was extracted. This technique is
    % known as spatial augmentation. Spatial augmentation incorporates the
    % spatial layout of the features within an image as part of the
    % extracted feature vectors. Therefore, for two images to have similar
    % color features, the color and spatial distribution of color must be
    % similar.
    
    % Normalize pixel coordinates to handle different image sizes.
    xnorm = linspace(-0.5, 0.5, Nr);      
    ynorm = linspace(-0.5, 0.5, Mr);    
    [x, y] = meshgrid(xnorm, ynorm);
    
    % Concatenate the spatial locations and color features.
    features = [colorFeatures y(:) x(:)];
    
    % Use color variance as feature metric.
    metrics  = var(colorFeatures(:,1:3),0,2);
else
    
    % Return empty features for non-color images. These features are
    % ignored by bagOfFeatures.
    features = zeros(0,5);
    metrics  = zeros(0,1);     
end

Шаг 2 - создает набор признаков

С заданным типом функции следующий шаг должен изучить визуальный словарь в bagOfFeatures использование набора учебных изображений. Код, показанный ниже выборов случайное подмножество изображений от набора данных для обучения и затем, обучает bagOfFeatures использование опции 'CustomExtractor'.

Установите doTraining ко лжи, чтобы загрузить предварительно обученный bagOfFeatures. doTraining установлен в ложь, потому что учебный процесс занимает несколько минут. Остальная часть примера использует предварительно обученный bagOfFeatures сэкономить время. Если вы хотите воссоздать colorBag локально, установите doTraining к истине и полагают, что Настройки Computer Vision Toolbox уменьшают время вычислений.

doTraining = false;

if doTraining
    %Pick a random subset of the flower images.
    trainingSet = splitEachLabel(flowerImageSet, 0.6, 'randomized');
    
    % Specify the number of levels and branching factor of the vocabulary
    % tree used within bagOfFeatures. Empirical analysis is required to
    % choose optimal values.
    numLevels = 1;
    numBranches = 5000;
    
    % Create a custom bag of features using the 'CustomExtractor' option.
    colorBag = bagOfFeatures(trainingSet, ...
        'CustomExtractor', @exampleBagOfFeaturesColorExtractor, ...
        'TreeProperties', [numLevels numBranches]);
else
    % Load a pretrained bagOfFeatures.
    load('savedColorBagOfFeatures.mat','colorBag');
end

Шаг 3 - индексирует изображения

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

if doTraining
    % Create a search index.
    flowerImageIndex = indexImages(flowerImageSet,colorBag,'SaveFeatureLocations',false);
else
    % Load a saved index
    load('savedColorBagOfFeatures.mat','flowerImageIndex');
end

Поскольку процессы шага индексации тысячи изображений, остальная часть этого примера использует сохраненный индекс, чтобы сэкономить время. Можно воссоздать индекс локально установкой doTraining к истине.

Шаг 4 - ищет подобные изображения

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

% Define a query image
queryImage = readimage(flowerImageSet,200);

figure
imshow(queryImage)

Отображенное изображение RetinaFunk.

% Search for the top 5 images with similar color content
[imageIDs, scores] = retrieveImages(queryImage, flowerImageIndex,'NumResults',5);

retrieveImages возвращает идентификаторы изображений и множество каждого результата. Баллы сортируются от лучше всего до худшего.

scores
scores = 5×1

    0.4776
    0.2138
    0.1386
    0.1382
    0.1317

imageIDs соответствуйте изображениям в наборе изображений, которые похожи на изображение запроса.

% Display results using montage. 
figure
montage(flowerImageSet.Files(imageIDs),'ThumbnailSize',[200 200])

Отображенные изображения RetinaFunk, Дженни Доунинг, Mayeesherr, daBinsi, и Стивом Снодгрэссом.

Заключение

Этот пример показал вам, как настроить bagOfFeatures и как использовать indexImages и retrieveImages создать поисковую систему изображений на основе цветных функций. Методы, показанные здесь, могут быть расширены к другим типам функции дальнейшей настройкой функций, использованных в bagOfFeatures.

Ссылки

[1] Сивич, J., Зиссермен, A.: Видео Google: текстовое извлечение приближается, чтобы возразить соответствию в видео. \in: ICCV. (2003) 1470-1477

[2] Philbin, J., Приятель, О., Isard, M. A. J.S., Зиссермен: Объектное извлечение с большими словарями и быстро пространственное соответствие. \in: CVPR. (2007)

[3] TensorFlow: как переобучить классификатор изображений для новых категорий.