В этом примере показано, как создать систему извлечения изображений на основе содержимого (CBIR) с использованием настраиваемого рабочего процесса пакета функций.
Системы извлечения изображений на основе содержимого (CBIR) используются для поиска изображений, визуально похожих на изображение запроса. Применение систем CBIR можно найти во многих областях, таких как веб-поиск продуктов, наблюдение и визуальная идентификация мест. Обычным методом, используемым для реализации системы CBIR, является пакет визуальных слов, также известный как пакет признаков [1,2]. Пакет признаков - это техника, адаптированная к извлечению изображения из мира поиска документа. Вместо использования фактических слов, как при извлечении документа, пакет функций использует функции изображения в качестве визуальных слов, описывающих изображение.
Особенности изображения являются важной частью CBIR-систем. Эти элементы изображения используются для определения сходства между изображениями и могут включать глобальные элементы изображения, такие как цвет, текстура и форма. Элементы изображения также могут быть локальными элементами изображения, такими как ускоренные устойчивые элементы (SURF), гистограмма градиентов (HOG) или локальные двоичные шаблоны (LBP). Преимущество подхода Bag-of-features состоит в том, что тип функций, используемых для создания визуального словаря, может быть настроен в соответствии с приложением.
Скорость и эффективность поиска изображения также важны в CBIR-системах. Например, может быть приемлемым выполнение поиска грубой силы в небольшой коллекции изображений, состоящей менее чем из 100 изображений, где признаки из изображения запроса сравниваются с признаками из каждого изображения в коллекции. Для больших коллекций поиск грубой силы невозможен, и необходимо использовать более эффективные методы поиска. Пакет признаков обеспечивает краткую схему кодирования для представления большой коллекции изображений с использованием разреженного набора визуальных гистограмм слов. Это обеспечивает компактное хранение и эффективный поиск через структуру данных инвертированного индекса.
Программа Computer Vision Toolbox™ обеспечивает настраиваемую структуру набора функций для реализации системы поиска изображений. Процедуру описывают следующие шаги:
Выберите элементы изображения для извлечения
Создание пакета элементов
Проиндексировать изображения
Поиск похожих изображений
В этом примере вы выполните следующие действия, чтобы создать систему поиска изображений для поиска набора данных цветов [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
Тип элемента, используемого для извлечения, зависит от типа изображений в коллекции. Например, при поиске коллекции изображений, состоящей из сцен (пляжей, городов, автомагистралей), предпочтительно использовать функцию глобального изображения, такую как цветовая гистограмма, которая фиксирует цветовое содержание всей сцены. Однако если целью является поиск конкретных объектов в коллекциях изображений, то локальные элементы изображения, извлеченные вокруг ключевых точек объектов, являются лучшим выбором.
Начнем с просмотра одного из изображений, чтобы получить представление о том, как подойти к проблеме.
% Display a one of the flower images
figure
I = imread(flowerImageSet.Files{1});
imshow(I);
Отображаемое изображение - Марио.
В этом примере целью является поиск аналогичных цветов в наборе данных с использованием цветовой информации в изображении запроса. Простое изображение, основанное на пространственной компоновке цвета, является хорошим местом для начала.
Следующая функция описывает алгоритм, используемый для извлечения цветовых признаков из данного изображения. Эта функция будет использоваться как extradyFcn в течение bagOfFeatures для извлечения цветовых элементов.
type exampleBagOfFeaturesColorExtractor.mfunction [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
После определения типа функции следующим шагом будет изучение визуального словаря в bagOfFeatures использование набора обучающих изображений. Код, показанный ниже, выбирает случайное подмножество изображений из набора данных для обучения, а затем тренируется bagOfFeatures с помощью параметра CustomExtractor.
Набор doTraining для ложной загрузки предварительно подготовленных элементов 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
Теперь, когда 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.
Последним шагом является использование retrieveImages функция поиска похожих изображений.
% Define a query image
queryImage = readimage(flowerImageSet,200);
figure
imshow(queryImage)
Отображаемое изображение используется RetiaFunk.
% 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
imageIDs соответствуют изображениям в наборе изображений, которые аналогичны изображению запроса.
% Display results using montage. figure montage(flowerImageSet.Files(imageIDs),'ThumbnailSize',[200 200])

Отображаемыми изображениями являются РетинаФунк, Дженни Даунинг, Майешерр, даБинси и Стив Снодграсс.
В этом примере показано, как настроить bagOfFeatures и как использовать indexImages и retrieveImages для создания системы извлечения изображений на основе цветовых элементов. Методы, показанные здесь, могут быть расширены на другие типы функций путем дальнейшей настройки функций, используемых в bagOfFeatures.
[1] Сивич, Дж., Зиссерман, А.: Видео Google: Метод поиска текста для сопоставления объектов в видео. В: ICCV. (2003) 1470-1477
[2] Филбин, Дж., Чум, О., Изард, М., А., Дж. С., Зиссерман: Поиск объектов с большими словарями и быстрое пространственное согласование. В: CVPR. (2007)
[3] TensorFlow: как переподготовить классификатор изображений для новых категорий.