Я пытаюсь выполнить классификацию пикселей для сегментации изображений с использованием машинного обучения, например 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, в форме, которая может быть тренировался классификатор?