Необходимо провести предварительную подготовку системы. Для того, чтобы все работало сразу после загрузки, необходимо установить Python версии 3.6.1 (это важно, именно эта версия). ссылка: https://www.python.org/downloads/release/python-361/
Если на компьютере присутствует другая версия Python, то ее необходимо удалить, либо изменить настройки системных переменных и поставить версию 3.6.1 по умолчанию.
После загрузки Python необходимо установить следующий пакет команд, указанный в Таблице 1, при помощи следующей команды (обязательно указывать версию):
pip install [название библиотеки]==[версия]
Keras 2.1.5 matplotlib 3.1.1 numpy 1.17.3 opencv-python 4.1.1.26 pandas 0.25.3 Pillow 6.2.1 tensorboard 1.10.0 tensorflow 1.5.0 tensorflow-estimator 2.0.1
После настройки системы необходимо скачать проект из репозитория при помощи следующей команды в Git консоли: git clone git@github.com:ZFTurbo/Verilog-Generator-of-Neural-Net-Digit-Detector-for-FPGA.git
После успешной загрузки системы необходимо последовательно запустить в консоли файлы из списка при помощи команды: python [имя файла]
- r01_train_neural_net_and_prepare_initial_weights.py
- r02_rescale_weights_to_use_fixed_point_representation.py
- r03_find_optimal_bit_for_weights.py
- r04_verilog_generator_grayscale_file.py
- r05_verilog_generator_neural_net_structure.py
В результате выполнения программ можно будет получить информацию, описанную на рисунках.
При первом запуске файла под номером 2 будет загружен датасет MNIST, который представляет собой набор из 70000 картинок с изображением рукописных цифр от 0 до 9. Затем будет осуществлена подгонка весов нейронной сети.
Служебная информация выполнения других файлов не несет сильной смысловой нагрузки.
После выполнения работы всех файлов, создается проект, который можно открыть и скомпилировать в Quartus, затем проект можно загрузить на плату и при правильной сборке, проект будет работать корректно.
Так как задание предполагает переобучение нейронной сети, то необходимо провести исследование программного кода. Из названия первого файла, можно сделать вывод, что обучение проходит в нем. Переходим в часть if name == 'main': , где происходит выполнение основного кода. Из следующей строки:
if not os.path.isfile(final_model_path) or continue_training == 1:
можно сделать вывод, что при отсутствии файлов с расширением .h5 в директории \weights происходит переобучение на основе датасета, возвращаемого функцией
def load_mnist_data(type='channel_last')
Исходя из этого, приходим к выводу что в этой функции необходимо подменить загружаемый датасет.
Устанавливаем пакет emnist, который содержит в себе популярный датасет из рукописных букв A-Z и a-z размером 130000 картинок, используя команду
pip install emnist
Производим замену функции на функцию представленную в Приложении 1 в главе Приложения
Также необходимо изменить архитектуру нейронной сети в функции:
def keras_model_low_weights_digit_detector()
Заменив выходной слой размерности 10 на 26, чтобы нейронная сеть распознавала 26 классов.
Затем запускаем первый файл и ждем 7 часов.
После успешной тренировки сети, проверяем ее работу на тестовом датасете из первых 10 букв алфавита сгенерированном при помощи кода, указанного в Приложении 2 в главе Приложения.
Точность снизилась на некоторое значение, но можно сказать, что сеть натренирована удачно.
После этого выполняем те же действия, что и в первой части. На камере должны выводиться цифры от 0 до 9 обозначающие следующие буквы:
0 1 2 3 4 5 6 7 8 9
A B C D E F G H I J