форматирование картинки для ядра svm - PullRequest
0 голосов
/ 25 января 2019

У меня возникли трудности с получением серии изображений в правильном формате для подачи в sklearn.svm.SVC.

Это мой первый проект по распознаванию изображений, и поэтому я немного страдаю.

У меня есть цикл, который выводит кучу RGB-изображений base64 (разных размеров) на фрейм данных

imageData = mpimg.imread(io.BytesIO(base64.b64decode(value)),format='JPG')

затем я конвертирую изображение RGB в оттенки серого и сглаживаю

data_images = rgb2gray(imageData).ravel()

где rgb2gray:

def rgb2gray(rgb):
    r, g, b = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2]
    gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
    return gray

Если я смотрю на различия в размере

df_raw.sample(10)

enter image description here

Мы видим, что длины пикселей изображения не совпадают между моими сэмплами. Я немного запутался здесь о том, как действовать. Из-за отсутствия лучшей идеи я решил добавить отступ, основанный на картинке с самым большим размером,

df_raw.picLen.max()

Затем добавляем количество нулей в конец каждого массива 1D изображений.

def padPic(x,numb,maxN):
    N = maxN-len(x)
    out = np.pad(x,(numb,N),'constant')
    return out

вызывающий

df_raw['picNew'] = df_raw.apply(lambda row: padPic(row['pic'],0,df_raw.picLen.max()), axis=1)
df_raw['picNewLen']  = df_raw.apply(lambda row: len(row['picNew']), axis=1)

Теперь у меня есть массивы одного размера enter image description here

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

from sklearn.svm import SVC
X_train, X_test, y_train, y_test = train_test_split(df_raw.picNew, df_raw.name, test_size = 0.2, random_state=42)

проверьте размер:

print('Training data and target sizes: \n{}, {}'.format(X_train.shape,y_train.shape))
print('Test data and target sizes: \n{}, {}'.format(X_test.shape,y_test.shape))

Данные обучения и размеры целей: (198,), (198,) Данные испытаний и цели размеры: (50,), (50,)

после того, как я убедил себя, что все готово, тогда я пытаюсь соответствовать модели

svm = SVC()
svm.fit(X_train, y_train)

это выдает ошибку, и я не могу понять, почему:

/ opt / wakari / anaconda / envs / ulabenv_2018-11-13_10.15.00 / lib / python3.5 / site-packages / numpy / core / numeric.py в asarray (a, dtype, order) 499 500 "" " -> 501 возвращаемый массив (a, dtype, copy = False, order = order) 502 503

ValueError: установка элемента массива с последовательностью.

Я думаю, что это связано с размером массива, но я не могу понять это. : - /

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

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Я понял проблему.

Спасибо Артему за то, что он поймал мою очевидную проблему не кодирования классов, но в конце концов это была не моя проблема.

Оказывается, способ представления массива изображений был неверным. Исходный массив был df_raw['picNew'].shape, который оценивается как

(248,)

Мне нужно было двухмерное представление

np.stack(df_raw['picNew'] , axis=1).shape

(830435, 248)

Все хорошо сейчас.

Я до сих пор не уверен в том, что самый «правильный» способ изменить размер изображения до одинаковой длины. Добавление 0 к длине массива кажется немного простым ... Так что, если у кого-то есть идея:)

0 голосов
/ 25 января 2019

Я почти уверен, что это связано с использованием списка в столбце объектов и строк в качестве целевых значений. Для последнего Вам нужно использовать класс LabelEncoder, чтобы превратить их в нормализованные метки классов, как того требует fit ().

Смотрите описание здесь: https://scikit -learn.org / стабильный / модули / полученные / sklearn.preprocessing.LabelEncoder.html

Это необходимо сделать перед разделением поезда / теста, чтобы убедиться, что все имена «видны» LabelEncoder.

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

Кроме того, изменение размера перед выравниванием должно работать лучше, чем заполнение.

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