Классификатор крупномасштабных изображений - PullRequest
9 голосов
/ 18 апреля 2011

У меня есть большой набор растительных изображений, помеченных ботаническим названием. Какой алгоритм лучше всего использовать для обучения на этом наборе данных, чтобы классифицировать немаркированную фотографию? Фотографии обрабатываются так, что 100% пикселей содержат растение (например, крупные планы листьев или коры), поэтому нет других объектов / пустого пространства / фона, которые алгоритм должен был бы отфильтровать.

Я уже пытался сгенерировать функции SIFT для всех фотографий и подать эти пары (функция, метка) в LibLinear SVM, но точность составила жалкие 6%.

Я также пытался передать эти же данные в несколько Weka классификаторов. Точность была немного лучше (25% с Logistic, 18% с IBk), но Weka не рассчитан на масштабируемость (он загружает все в память). Поскольку набор функциональных данных SIFT состоит из нескольких миллионов строк, я мог протестировать Weka только со случайным срезом 3%, поэтому он, вероятно, не является репрезентативным.

РЕДАКТИРОВАТЬ: Некоторые образцы изображений:

Pachira aquatica Fagus grandifolia

Ответы [ 4 ]

7 голосов
/ 18 апреля 2011

Как правило, вы не будете тренироваться непосредственно на функциях SIFT. Кластеризируйте их (используя k-средства) и затем обучайтесь на гистограмме идентификаторов принадлежности к кластеру (то есть k-мерного вектора, который в позиции i подсчитывает, сколько объектов было назначено для я -й кластер).

Таким образом, вы получаете один выход для каждого изображения (и один k-мерный вектор объектов).

Вот квази-код (с использованием mahotas и milk в Pythonn):

from mahotas.surf import surf
from milk.unsupervised.kmeans import kmeans,assign_centroids
import milk

# First load your data:
images = ...
labels = ...

local_features = [surfs(im, 6, 4, 2) for im in imgs]
allfeatures = np.concatenate(local_features)
_, centroids = kmeans(allfeatures, k=100)
histograms = []
for ls in local_features:
     hist = assign_centroids(ls, centroids, histogram=True)
     histograms.append(hist)

cmatrix, _ = milk.nfoldcrossvalidation(histograms, labels)
print "Accuracy:", (100*cmatrix.trace())/cmatrix.sum()
4 голосов
/ 19 апреля 2011

Это довольно сложная проблема.

Вы можете попробовать модель BoW .

По сути, вы извлекаете функции SIFT для всех изображений, а затем используете K-средства для кластеризации элементов в визуальные слова. После этого используйте вектор BoW для обучения классификаторов.

См. Статью в Википедии выше и справочные документы для получения более подробной информации.

3 голосов
/ 18 апреля 2011

Возможно, вам нужно лучшее выравнивание и, возможно, не больше возможностей. Невозможно получить приемлемую производительность, если у вас нет соответствий. Вам необходимо знать, какие точки на одном листе соответствуют точкам на другом листе. Это одна из проблем «святого Грааля» в компьютерном зрении.

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

1 голос
/ 21 августа 2014

Вы можете реализовать модель BoW в соответствии с этим Дескриптором Bag-of-Features в SIFT Features с OpenCV . Это очень хороший учебник для реализации модели BoW в OpenCV.

...