Переделываем базу российских дорожных знаков для тренировки нейросети tensorflow

08.06.2017
By

В сети есть база российских дорожных знаков, на которой можно потренировать нейросеть 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 процента

(+ 1 сутки)

Информация из «Маркса» – для успешной тренировки должно быть не менее 100 фотограций в каждой категории. Изучив базу,, увидел, что количество снимков по категориям сильно разнится – от 40 до 3000. Попробовал сделать в каждой категории не менее 10 снимков. Результат чуть-чуть улучшился, но не кардинально. ( около 20 процентов на 8000 итераций).

Выделил 10 первых категорий знаков в тестовую базу и простым копи паст увеличил количество снимков в каждой до 1000 штук. Результат после тренировки получился совсем другой – около 35 процентов! Так что для тензорфлоу очень важно количество снимков в категории. при увеличении количества снимков до 2000 результат распознавания на 8000 шагов не изменился… около 35 процентов. на 4000 шагах также результат сопоставимый – 32 процента. посмотрим, будут ли улучшения на 16000 шагов… 38 процентов…

Ок. попробуем сделать в каждой категории не менее 400-500 снимков и запустить на 50000 шагов…. (часа на 3 минимум…):)

Получилось на 2, 5 часа…

результат нулевой – 23 процента…

качество снимков?

Добавить комментарий