Использовать 2D Convolution как "1D Convolution" на изображениях? - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть изображения размером 256 × 192 пикселя, и я ищу небольшой и быстрый cnn как «предварительный сканер», чтобы найти интересные части изображения (например, фрагменты 52x52, 32x32 и т. Д.), Которые будут проверяться с помощью более сложного cnn. Причиной этого маленького cnn является использование во встроенной системе с ограниченными ресурсами.

К сожалению, я новичок в этой теме, tenorflow и keras. Моя первая идея состояла в том, чтобы создать сеть только с одним 2D конвоном, который работает как 1d конв. В этом случае ядро ​​должно иметь высоту 192 и ширину 1 (может быть, позже 3).

Это модель, которую я строю на tenorflow 2:

# Model
model = models.Sequential()
model.add(layers.Conv2D(5, (1, 192), activation='relu', input_shape=(256, 192, 3)))

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

Идеячтобы получить одно значение в строке, которое указывает, может ли быть что-то «интересное» в этой строке. На основе этой информации и соседей большая часть изображения будет вырезана и передана в более сложный формат.

Я подготовил обычные изображения с разрешением 256x192 пикселей и для каждого изображения текстовый файл с 256 значениями (0,0или 1.0). Каждый 0/1 представляет одну строку и указывает, есть ли в этом ряду что-то интересное.

Это был мой наивный план, но тренировка сразу прекращается с ошибкой, которую я не понимаю:

ValueError: Dimensions must be equal, but are 32 and 256 for 'metrics/accuracy/Equal' (op: 'Equal') with input shapes: [32,256], [32,256,1].

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

Редактировать:

Как и требовалось, полный, грязный код. Если есть какие-то серьезные недостатки, пожалуйста, прощайте. Это мой первый эксперимент на Python.

import tensorflow as tf
import os
from tensorflow.keras import datasets, layers, models
from PIL import Image
from numpy import asarray

train_images = []
train_labels = []
test_images = []
test_labels = []

# Prepare
dir = os.listdir('images/gt_image')
split = len(dir)*0.2

c = 0

for file in dir:
    c = c + 1

    im = Image.open('images/gt_image/' + file)

    data = im.load()
    image = []

    for x in range(0, im.size[0]):
        row = []
        for y in range(0, im.size[1]):
            row.append([x/255 for x in data[x, y]])
        image.append(row)
    if c <= split:
        test_images.append(image)
    else:
        train_images.append(image)

    file = open('images/gt_labels/' + file + '.txt', 'r')
    label = file.readlines()[0].split(', ')

    if c <= split:
        test_labels.append(label)
    else:
        train_labels.append(label)
print('prepare done')

# Model
model = models.Sequential()
model.add(layers.Conv2D(5, (1, 192), activation='relu', input_shape=(256, 192, 3)))

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.summary()

print('compile done')

# Learning
history = model.fit(train_images, train_labels, epochs=10,
                    validation_data=(test_images, test_labels))
...