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

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

Введение

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

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

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

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

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

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

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

  4. Поиск похожих изображений

В этом примере вы пройдете эти шаги, чтобы создать систему поиска изображений для поиска набора данных о цветах [3]. Этот набор данных содержит около 3670 изображений 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 - Выберите функции изображений для извлечения

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

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

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

Отображаемое изображение - от Mario.

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

Следующая функция описывает алгоритм, используемый для извлечения цветовых функций из заданного изображения. Эта функция будет использоваться как 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.

[~,~,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 false, чтобы загрузить предварительно обученный bagOfFeatures. doTraining установлено значение false, поскольку процесс обучения занимает несколько минут. В остальном примере используется предварительно обученная bagOfFeatures чтобы сэкономить время. Если вы хотите воссоздать colorBag локально задайте doTraining true и рассмотрите настройки Computer Vision Toolbox, чтобы сократить время вычислений.

doTraining = false;

if doTraining
    %Pick a random subset of the flower images
    trainingSet = splitEachLabel(flowerImageSet, 0.6, 'randomized');
    
    % Create a custom bag of features using the 'CustomExtractor' option
    colorBag = bagOfFeatures(trainingSet, ...
        'CustomExtractor', @exampleBagOfFeaturesColorExtractor, ...
        'VocabularySize', 5000);
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 к true.

Шаг 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.4822
    0.2143
    0.1389
    0.1384
    0.1320

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

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

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

Заключение

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

Ссылки

[1] Sivic, J., Zisserman, A.: Video Google: Подход поиска текста к соответствию объектов в видео. В: ICCV. (2003) 1470-1477

[2] Philbin, J., Chum, O., Isard, M., A., J.S., Zisserman: Object retrieval с большими словарями и быстрым пространственным совпадением. В: CVPR. (2007)

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