Я пытаюсь сделать распознавание пластин. Сверточная нейронная сеть, у меня есть CSV с filepath и пластинами, что-то вроде этого:
img_path,plate
path.png,P990124
Я преобразовываю пластину в массив 7x36, используя этоконвертер:
settings.CHARS = 'ABCDE...0123..89'
def get_letter_vector(char: str) -> list:
if len(char) > 1:
return None
if char not in settings.CHARS:
return None
letter_vector = list(numpy.zeros(len(settings.CHARS), dtype=int))
letter_vector[settings.CHARS.index(char)] = 1
return letter_vector
def get_word_matrix(word: str):
return [get_letter_vector(c) for c in word]
Например, для пластины «P990124» я бы получил 7x36, как это [[0,0,0,1,0,0], [0,1,0,0,0 ...] ...]
Я получаю сообщение об ошибке при попытке обучить CNN:
Epoch 1/5
WARNING:tensorflow:From C:\Users\sclennin\PycharmProjects\venvs\sv-anpr-cnn\lib\site-packages\tensorflow_core\python\ops\math_grad.py:1394: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where
WARNING:tensorflow:Entity <function Function._initialize_uninitialized_variables.<locals>.initialize_variables at 0x000001D3E05F1678> could not be transformed and will be executed as-is. Please report this to the AutoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: module 'gast' has no attribute 'Num'
2019-09-20 16:10:50.904720: W tensorflow/core/common_runtime/base_collective_executor.cc:216] BaseCollectiveExecutor::StartAbort Invalid argument: {{function_node __inference_Dataset_map_read_image_98}} Matrix size-incompatible: In[0]: [32768,4], In[1]: [3,1]
[[{{node rgb_to_grayscale/Tensordot/MatMul}}]]
[[IteratorGetNext]]
1/Unknown - 0s 471ms/step
1/Unknown - 0s 472ms/stepTraceback (most recent call last):
File "<input>", line 1, in <module>
File "C:\Program Files\JetBrains\PyCharm 2019.2.1\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile
pydev_imports.execfile(filename, global_vars, local_vars) # execute the script
File "C:\Program Files\JetBrains\PyCharm 2019.2.1\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "C:/Users/sclennin/PycharmProjects/sv-anpr-cnn/train.py", line 63, in <module>
CNNMODEL.fit(dataset_train, epochs=5)
File "C:\Users\sclennin\PycharmProjects\venvs\sv-anpr-cnn\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 728, in fit
use_multiprocessing=use_multiprocessing)
File "C:\Users\sclennin\PycharmProjects\venvs\sv-anpr-cnn\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 324, in fit
total_epochs=epochs)
File "C:\Users\sclennin\PycharmProjects\venvs\sv-anpr-cnn\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 123, in run_one_epoch
batch_outs = execution_function(iterator)
File "C:\Users\sclennin\PycharmProjects\venvs\sv-anpr-cnn\lib\site-packages\tensorflow_core\python\keras\engine\training_v2_utils.py", line 86, in execution_function
distributed_function(input_fn))
File "C:\Users\sclennin\PycharmProjects\venvs\sv-anpr-cnn\lib\site-packages\tensorflow_core\python\eager\def_function.py", line 457, in __call__
result = self._call(*args, **kwds)
File "C:\Users\sclennin\PycharmProjects\venvs\sv-anpr-cnn\lib\site-packages\tensorflow_core\python\eager\def_function.py", line 520, in _call
return self._stateless_fn(*args, **kwds)
File "C:\Users\sclennin\PycharmProjects\venvs\sv-anpr-cnn\lib\site-packages\tensorflow_core\python\eager\function.py", line 1823, in __call__
return graph_function._filtered_call(args, kwargs) # pylint: disable=protected-access
File "C:\Users\sclennin\PycharmProjects\venvs\sv-anpr-cnn\lib\site-packages\tensorflow_core\python\eager\function.py", line 1141, in _filtered_call
self.captured_inputs)
File "C:\Users\sclennin\PycharmProjects\venvs\sv-anpr-cnn\lib\site-packages\tensorflow_core\python\eager\function.py", line 1224, in _call_flat
ctx, args, cancellation_manager=cancellation_manager)
File "C:\Users\sclennin\PycharmProjects\venvs\sv-anpr-cnn\lib\site-packages\tensorflow_core\python\eager\function.py", line 511, in call
ctx=ctx)
File "C:\Users\sclennin\PycharmProjects\venvs\sv-anpr-cnn\lib\site-packages\tensorflow_core\python\eager\execute.py", line 67, in quick_execute
six.raise_from(core._status_to_exception(e.code, message), None)
File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError: Matrix size-incompatible: In[0]: [32768,4], In[1]: [3,1]
[[{{node rgb_to_grayscale/Tensordot/MatMul}}]]
[[IteratorGetNext]] [Op:__inference_distributed_function_827]
Function call stack:
distributed_function -> distributed_function
Я использую следующую модель:
settings.INPUT_SHAPE = (256, 128, 1)
model = tf.keras.models.Sequential([
# Convolucional 5x5 x128 y64 z48
layers.Conv2D(48, (5, 5), activation='relu', input_shape=settings.INPUT_SHAPE),
# Maxpool 2x2 x64 y32 z48
layers.MaxPooling2D((2, 2)),
# Flatten model
layers.Flatten(),
# Fullyconnected 2048
layers.Dense(2048, activation='relu'),
layers.Reshape((settings.VALID_PLATE_SIZE - 1, len(settings.CHARS)))
])
И это подготовка, которую я делаю, когда пытаюсь обучить сеть
def read_image(filename, label):
image_string = tf.io.read_file(filename)
image_decoded = tf.image.decode_png(image_string)
image_resized = tf.image.resize(image_decoded, (settings.INPUT_SHAPE[0], settings.INPUT_SHAPE[1]))
image_reshaped = tf.image.rgb_to_grayscale(image_resized)
# image_reshaped = tf.expand_dims(image_resized, axis=0)
return image_reshaped, label
def prepare_dataset(csv: str) -> tuple:
l = []
with open(csv) as f:
l += f.readlines()
# ejemplo de linea D573_901.frontal_p398543.jpg.png
return [os.path.join(settings.PLACAS_GENERADAS_TRANSFORMADAS_DIR, fn)[:-1] for fn in l],\
[utils.get_word_matrix(fn[:8].replace('_', '')) for fn in l]
# train_images, train_labels = prepare_dataset(settings.TRAIN_CSV_DIR)
slices = prepare_dataset(settings.TRAIN_CSV_DIR)
dataset_train = tf.data.Dataset.from_tensor_slices(slices)
dataset_train = dataset_train.map(read_image).batch(settings.BATCH_SIZE)
print(dataset_train)
model.compile(
optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.CategoricalCrossentropy(),
metrics=['mae', 'mse', 'acc']
)
print('================ TRAINING ================')
model.fit(dataset_train, epochs=5)