В сети есть база российских дорожных знаков, на которой можно потренировать нейросеть tensorflow https://yadi.sk/d/TX5k2hkEm9wqZ
База называется RTSD – по ней есть следующая информация – https://cyberleninka.ru/article/n/rossiyskaya-baza-izobrazheniy-avtodorozhnyh-znakov
Но все файлы ы ней хранятся в единой директории, без разбивки по типам. Для понимания, какие знаки относятся к какому типу есть несколько csv файлов – например gt_train.csv имеет следующую структуру
filename,class_number
000000.png,18
000001.png,18
000002.png,18
000003.png,18
000004.png,9
000005.png,18
название файцла и класс.
файл number_to_classes.csv -
class_number,sign_class
0,1_1
1,1_11
2,1_11_1
3,1_12
4,1_12_2
5,1_13
расшифровывает классы в соответствии с классами знаков из ПДД.
кроме того, они в png – их надо преобразовать пакетно в jpg (xnconvert) сначала, переименовать их названия в файле csv (.png на .jpg).
для сортировки знаков по папкам сделана следующая простая программа на Python:
# -*- coding: utf-8 -*- # program for preparing folders and put all road sign files according rules in csv import os import shutil import pandas as pd import numpy as np def move_files_(root, target): # делаем относительные пути полными root = os.path.abspath(root) #print(root) target = os.path.abspath(target) #print(target) # проверяем существование приемника if not os.path.isdir(target): os.makedirs(target) data = pd.read_csv(csvfile_names,delimiter=',',dtype='a') string_sign = np.array(data['class_number']+';'+data['filename']) #data1 = pd.read_csv(csvfile_classes,delimiter=',',dtype='a') #string_classes = np.array(data1['class_number']+';'+data1['sign_class']) for path, dirs, files in os.walk(root): for name in files: tmp, name = os.path.split(os.path.join(path, name)) dst_dir_end = '' for records in string_sign: arr = records.split(';') if arr[1] == name: #num_class = arr[0] dst_dir_end = arr[0] #for records1 in string_classes: #arr1 = records1.split(';') #if arr1[0] == num_class: #dst_dir_end = arr1[1] target_end = target + "/"+ dst_dir_end dst_dir = os.path.join(target_end, os.path.relpath(tmp, root)) if not os.path.isdir(dst_dir): os.makedirs(dst_dir) shutil.move(os.path.join(tmp, name), os.path.join(dst_dir, name)) print name if __name__ == '__main__': csvfile_names = '/home/tensorflow/raw_for_tensorflow/traffic_ru/rtsd-r1/gt_train_jpg.csv' csvfile_classes = '/home/tensorflow/raw_for_tensorflow/traffic_ru/rtsd-r1/numbers_to_classes.csv' root1 = '/home/tensorflow/raw_for_tensorflow/traffic_ru/rtsd-r1/train_jpg/' target1 = '/home/tensorflow/raw_for_tensorflow/traffic_ru/rtsd-r1/mod_train/' move_files_(root1, target1)
В итоге получается такая папка с вложенными папками, в которых хранятся картинки.
Компилирование программы $ bazel build tensorflow/examples/image_retraining:retrain заняло примерно 50 минут.
Сама тренировка сети с использованием tensorflow-gpu (GeForce G720 2Gb) идет ощутимо быстрее ( раза в три) и займет, вероятно, не более 1 часа.
В каждой категории должно быть не менее 30 файлов ( лучше около 100, чтобы не сгенерировалась ошибка исполнения программы dividion by zero.
Обязательно сохраняйте все сгнерированные файлы bottleneck – для ускорения процедуры тренировки нейросети.
тренировка на 4000 шагах дала результаты менее 14 процентов.
потренируем на 8000 шагах (также получилось 14,5 процентов)
bazel-bin/tensorflow/examples/image_retraining/retrain \
–how_many_training_steps=8000 \
–image_dir ~/raw_for_tensorflow/traffic_ru/rtsd-r1/mod
следующая итерация – 20000 шагов….. – 19% распознавание
следующая итерация 100000 шагов … 24% … что-то не то в подготовке картинок – попробуем сделать из в оттенках серого…
первое изменение графических файлов – оттенки серого (сделать) и единый стандартный размер 48×48 (уже присутствует)… Также делаем пакетное преобразование с использованием xnconvert… не хочется тратить время на Python и OpenCV… Вот кстати неплохая статья для понимания, как же лучше оптимизировать задачу распознавания….
В оттенках серого на 8000 шагов качество распознавания не улучшилось кардинально – только 15 процентов.
пробуем на 20000 шагах – 19,6% ….
то есть тот же прибор, вид сбоку…
Надо добавлять операцию «тиснение» к оттенкам серого…. Тиснение делается методом свертки http://robocraft.ru/blog/computervision/427.html с ядром или вот статья
на 2000 шагах получилось всего 9%….
В режиме black/white на 20000 итераций получилось 7,6 процента…
Складывется впечатление, что тензорфлоу работает как человеческий разум…
Вернемся к цветным изображениям, но почистим их от откровенного мусора ( процентов 15 снимков)…
чуда не случилось… 19,7 процента
Информация из «Маркса» – для успешной тренировки должно быть не менее 100 фотограций в каждой категории. Изучив базу,, увидел, что количество снимков по категориям сильно разнится – от 40 до 3000. Попробовал сделать в каждой категории не менее 10 снимков. Результат чуть-чуть улучшился, но не кардинально. ( около 20 процентов на 8000 итераций).
Выделил 10 первых категорий знаков в тестовую базу и простым копи паст увеличил количество снимков в каждой до 1000 штук. Результат после тренировки получился совсем другой – около 35 процентов! Так что для тензорфлоу очень важно количество снимков в категории. при увеличении количества снимков до 2000 результат распознавания на 8000 шагов не изменился… около 35 процентов. на 4000 шагах также результат сопоставимый – 32 процента. посмотрим, будут ли улучшения на 16000 шагов… 38 процентов…
Ок. попробуем сделать в каждой категории не менее 400-500 снимков и запустить на 50000 шагов…. (часа на 3 минимум…):)
Получилось на 2, 5 часа…
результат нулевой – 23 процента…
качество снимков?