Как разделить или разделить мое изображение и метку таким образом, чтобы они могли использоваться в качестве функций для машинного обучения? - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь выполнить классификацию пикселей для сегментации изображений с использованием машинного обучения, например SVM, RandomForest et c.

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

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
feature_img = np.zeros((img.shape[0], img.shape[1], 4))     # container array, first three dimensions for the rgb values, and the last will hold the grayscale
feature_img[:, :, :3] = img
feature_img[:, :, 3] = img_gray
features = feature_img.reshape(feature_img.shape[0] * feature_img.shape[1], feature_img.shape[2])

gt_features = gt_img.reshape(gt_img.shape[0] * gt_img.shape[1], 1)

Для изображения размером 512*512 вышеупомянутое даст особенности формы [262144, 4] и сопровождающая gt_feature формы [262144, 1].

это дает мне x и y для sklearn.svm.SVC и, как упоминалось выше, это работает хорошо ... но изображение очень шумное .., так как SVM хорошо работает с данными с большей размерностью, я собираюсь исследовать это, разбив изображение на windows.

Исходя из приведенного выше кода, я хотел разделить свое изображение of size [512, 1024] на блоки размером [64*64] и использовать их для обучения SVM. Следуя вышеприведенному формату, я написал приведенный ниже код, чтобы разделить свое изображение на блоки, а затем .reshape() в нужном формате для классификатора, но оно не работает должным образом:

win_size = 64
feature_img = blockshaped(img_gray, win_size, win_size)
feature_label = blockshaped(gt_img, win_size, win_size)

# above returns arrays of shape [128, 64, 64]

features = feature_img.reshape(feature_img.shape[1] * feature_img.shape[2], feature_img.shape[0])
# features is of shape [4096, 128]

 label_ = feature_label.reshape(feature_label.shape[0] * feature_label.shape[1] * feature_label.shape[2], 1)
# this, as expected returns ``[524288, 1]``

Функция blockshaped ответ из приведенного здесь ответа: Разрезать двумерный массив на более мелкие двумерные массивы

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

Как бы я go расставил свои данные, которые я разбил на windows, в форме, которая может быть тренировался классификатор?

1 Ответ

2 голосов
/ 08 февраля 2020

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

...