В этом примере показано, как создать систему Извлечения изображений на основе содержимого (CBIR) с помощью индивидуально настраиваемого рабочего процесса набора признаков.
Системы Извлечения изображений на основе содержимого (CBIR) используются, чтобы найти изображения, которые визуально похожи на изображение запроса. Применение систем CBIR может быть найдено во многих областях, таких как веб-поиск продукта, наблюдение и визуальная идентификация места. Общий метод, используемый, чтобы реализовать систему CBIR, является мешком визуальных слов, также известных как набор признаков [1,2]. Набор признаков является методом, адаптированным, чтобы отобразить извлечение от мира поиска документов. Вместо того, чтобы использовать фактические слова в качестве в поиске документов, набор признаков использует функции изображений как визуальные слова, которые описывают изображение.
Функциями изображений является важная часть систем CBIR. Эти функции изображений используются, чтобы измерить подобие между изображениями и могут включать глобальные функции изображений, такие как цвет, структура и форма. Функциями изображений могут также быть локальные функции изображений, такие как ускоренные устойчивые функции (SURF), гистограмма градиентов (HOG) или локальные бинарные шаблоны (LBP). Преимущество подхода набора признаков - то, что тип функций, использованных, чтобы создать визуальный словарь слова, может быть настроен, чтобы соответствовать приложению.
Скорость и КПД поиска изображений также важны в системах CBIR. Например, может быть приемлемо выполнить поиск грубой силы в небольшой коллекции изображений меньше, чем 100 изображения, где функции от изображения запроса сравниваются с функциями от каждого изображения в наборе. Для больших наборов поиск грубой силы не выполним, и должны использоваться более эффективные поисковые методы. Набор признаков предоставляет краткую схему кодирования, чтобы представлять большое количество изображений с помощью разреженного набора визуальных гистограмм слова. Это включает компактное устройство хранения данных и эффективный поиск через структуру данных инвертированного индекса.
Computer Vision Toolbox™ служит настраиваемой основой набора признаков, чтобы реализовать поисковую систему изображений. Следующие шаги обрисовывают в общих чертах процедуру:
Выберите функции изображений извлечения
Создайте набор признаков
Индексируйте изображения
Ищите подобные изображения
В этом примере вы пройдете эти шаги, чтобы создать поисковую систему изображений для поиска цветочного набора данных [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
Тип функции, использованной для извлечения, зависит от типа изображений в наборе. Например, при поиске коллекции изображений, составленной из сцен (пляжи, города, магистрали), желательно использовать глобальную функцию изображений, такую как цветная гистограмма, которая получает цветное содержимое целой сцены. Однако, если цель состоит в том, чтобы найти конкретные объекты в коллекциях изображений, то локальными функциями изображений, извлеченными вокруг объекта keypoints, является лучший выбор.
Давайте запустимся путем просмотра одного из изображений, чтобы понять то, как приблизиться к проблеме.
% Display a one of the flower images
figure
I = imread(flowerImageSet.Files{1});
imshow(I);
Отображенное изображение Марио.
В этом примере цель состоит в том, чтобы искать подобные цветы в наборе данных с помощью информации о цвете в изображении запроса. Простой функцией изображений на основе пространственного размещения цвета является хорошее место, чтобы запуститься.
Следующая функция описывает алгоритм, используемый, чтобы извлечь цветные функции из данного изображения. Эта функция будет использоваться в качестве пользовательского экстрактора функции в 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
С заданным типом функции следующий шаг должен изучить визуальный словарь в bagOfFeatures
использование набора учебных изображений. Код, показанный ниже выборов случайное подмножество изображений от набора данных для обучения и затем, обучает bagOfFeatures
использование опции 'CustomExtractor'.
Установите doTraining
ко лжи, чтобы загрузить предварительно обученный bagOfFeatures. doTraining
установлен в ложь, потому что учебный процесс занимает несколько минут. Остальная часть примера использует предварительно обученный bagOfFeatures
сэкономить время. Если вы хотите воссоздать colorBag
локально, установите doTraining
к истине и полагают, что параллельные вычисления включения уменьшают время вычислений.
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
к истине.
Последний шаг должен использовать 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
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: как переобучить классификатор изображений для новых категорий.