Pull to refresh
5
0
Send message
Рассмотрим пример классификации номеров автомобилей.
В датасете, в директориях train, val находятся директории классов данных: type_id_0..type_id_n — где type_id_i — к примеру, название страны. Type_id был полезен для дальнейшей статистики, чтобы определить на каких классах данных модель хуже обучилась, почему. Можно это и не использовать и все закинуть в type_id_1.

Формируем файл следующей структуры:
val_labels = {«file_name_1.jpg»: {«number»: «959205766», «type_id»: «type_id_1»}}
Здесь: file_name_1.jpg — название изображения, number — label изображения, type_id — к примеру, название страны.
Архитектура моделей одинаковая. Отличие только в аугментации данных, изначальной инициализации весов и перемешивании данных при обучении.
Если сделать все идентичным, то обучим две одинаковые модели и их предсказания также будут одинаковыми.
На GeForce GTX 1070 распознавание номера проходит быстро: примерно 17 мс.
Однако сегментация сетью PSPNet входного изображения размера (512,512) занимает примерно 100 мс.

Так что, для распознавания номера в режиме реального времени можно использовать данную сеть, но нужно будет использовать другую модель сегментации.
Критерий обучения для каждой из сетей — CTCLoss. О нем можно почитать из источника 4.

Я не до конца понял вопрос: «Вопрос, а что будет, если им дать обе выборки? Тоже каждая из них должна ведь выявить? и устранить? То есть две сети не нужды.»
Я обучал две сети на одной выборке, с разной аугментацией размера изображения и последовательности семплов. Сделал это для того, чтобы процесс оптимизации моделей немного отличался и конечная решающая функция была немного различна, тогда их предсказания будут более независимыми.
Если на входе нет правильных данных, ты на выходе вероятнее всего не предскажем ничего.

Выявлены все ошибки.

По поводу O и 0. В сети используется LSTM. Рекуррентная сеть позволяет искать зависимости между символами, поэтому, возможно, она обобщится на случаи: если в номере нет символов латиницы, то, если на первом месте либо О либо 0, выбрать О. Я обучал композицию этих моделей на распознавание расшифровки штрихкода. В датасете для всех штрихкодов EAN_13, начинающихся на 0, один этот символ не учитывался в эталонном значении. Модели обучились распознавать EAN_13 и, если в начале 0, обрезать его.
1. Спасибо за замечание. MongoDB переехала из другого проекта) Обязательно исправлю.

2. В проекте я не добавил код тестирования модели, но он может быть легко взят из файла train:

preds = self.model_init.model(images)
probs, preds_copy = preds.max(2)
sim_preds = self.model_init.converter.decode(preds_copy.data, preds_size.data, raw=False)

Здесь images — изображения после трансформации
sim_preds — результат в символьном виде

Для загрузки претренированной модели в файле конфигурации пропишите путь в:

[crnn_big_size]
path_pretrained = путь до модели
Если модели распознали разные номера, алгоритм выводит пустое значение, то есть false, если одинаковые true.
Если использовать одну модель, она всегда предсказывает результат, даже если изображение размыто и номер на читаем.
Благодаря использованию композиции мы отсекаем те случаи, когда модели предсказывают разные номера, предполагая, что одна из них ошибается. то есть, отсекаем False Positive случаи, или, другими словами, ошибку второго рода.
В таком случае, мы значительный процент False Positive переводим в True Negative.
Но в таким случаи мы отсекаем еще и небольшой процент верных номеров, то есть появляется False Negative.

Information

Rating
Does not participate
Registered
Activity