Cloud of Science. 2018. T. 5. № 4 http:/ / cloudofscience.ru
Прототипирование высокоскоростной нейронной сети в ПЛИС для классификации изображений видеопотока
Р. А. Соловьев, А. Г. Кустов, Д. В. Тельпухов, В. С. Рухлов
Институт проблем проектирования в микроэлектронике РАН 124365, Москва, Зеленоград, ул. Советская, 3
e-mail: [email protected]
Аннотация. Аппарат нейронных сетей сложен с вычислительной точки зрения и требует использования сложного аппаратного обеспечения, такого как графические процессоры (GPU). В настоящее время активно развивается направление, связанное с проектированием нейронных сетей для использования в мобильных и встроенных устройствах. Такие сети отличаются малым числом весов и относительно небольшим числом арифметических операций, однако они также выполняются на программном уровне и используют для работы вычисления с плавающей точкой. В устройствах, где требуется высокая скорость работы, например обработка видео в реальном времени (30 кадров в секунду), мобильные сети зачастую не обеспечивают достаточный уровень быстродействия. Для решения проблемы на этапе, когда уже подготовлена и обучена модель в реальном устройстве, можно применить набор оптимизаций, позволяющих ускорить выполнение вычислений в несколько раз. Предлагается перейти от вычислений на программном уровне к аппаратной реализации, а также перейти от вычислений с плавающей точкой к фиксированной точке. Предлагается набор методов для проектирования нейросети, для повышения быстродействия и точности в случае использования фиксированной точки. Приводится пример проектирования устройства для решения конкретной практической задачи. Показывается, как можно адаптировать существующие наборы данных (датасеты) для использования в других задачах распознавания. Приводится пример разработки проекта для прототипирования в ПЛИС с использованием камеры и устройства вывода. Финальный проект, реализованный на базе предложенных методик, успешно работает в реальном времени с питанием от USB на отладочной плате De0Nano на базе ПЛИС Cyclone IV. Ключевые слова: сверточные нейронные сети, ПЛИС, фиксированная точка, двухмерная свертка.
1. Введение
Последние исследования в области нейронных сетей показали, что они хорошо справляются с множеством задач, связанных с классификацией и обработкой изображений, аудио- и видеоданных, причем в некоторых случаях даже лучше
человека [1, 2]. Большинство современных архитектур имеют в своем составе convolution (сверточные) блоки (например VGG [1], Inception [3], ResNet [4], U-Net [5]). Такие сети называются сверточными (convolutional neural nets — CNN). А размерность и вычислительная сложность во время классификации так велика, что с вычислениями плохо справляются даже мощные процессоры общего назначения CPU. Для полноценной работы с современными нейросетями используют мощные и, как следствие, дорогие GPU (видеокарты) [6]. Особенно это актуально для обработки видеоинформации в реальном времени.
Те структурные свойства нейросетей, которые обеспечивают высокую точность классификации изображений, в ряде случаев легко переносятся на аппаратную платформу. К их числу можно отнести:
1. Регулярность — все слои имеют похожую структуру (Conv3*3, Conv1*1, MaxPooling, Fully-Connected, GlobalAvgPooling).
2. Маленькая размерность блока свертки: 3*3.
3. Активация Relu (сравнение значения с 0), в отличие от популярных ранее функций активации Sigmoid и Tanh, обладающих большей вычислительной сложностью.
4. Гибкая регулировка размеров нейронной сети. Так, за счет разного числа блоков свертки (чем их больше, тем быстрее будет работать нейронная сеть). В случае ПЛИС или СБИС, например, это позволит прошивать одну и ту же нейронную сеть на кристаллах с разной скоростью работы.
Существует также направление, связанное с проектированием нейронных сетей для использования в мобильных устройствах: MobileNets [7], SqueezeNet [8]. Они отличаются малым числом весов и относительно небольшим числом арифметических операций. Однако они также выполняются на программном уровне и используют для работы вычисления с плавающей точкой. В устройствах, где требуется высокая скорость работы, например обработка видео в реальном времени, где требуется обрабатывать видеопоток со скоростью 30 кадров в секунду, использование даже мобильных сетей может быть недостаточно без существенной оптимизации.
Для использования нейросетей на этапе, когда у нас есть обученная модель в реальном устройстве, можно применить такие методы оптимизации структуры, которые позволят ускорить выполнение вычислений в несколько раз. Например, с помощью компрессии весов [9] или уменьшения размерности данных [10].
Поскольку потребности в аппаратуре для работы с нейронными сетями постоянно растут, то требуется разработка специальных аппаратных блоков для использования в СБИС и ПЛИС для ускорения расчетов. Ускорение расчетов может до-
Р. А. Соловьев,
A. Г. Кустов, Д. В. Тельпухов,
B. С. Рухлов
Прототипирование высокоскоростной нейронной сети в ПЛИС для классификации изображений видеопотока
стигаться за счет: аппаратной реализации свертки, аппаратный блок для вычисления свертки работает быстрее, чем свертка, выполненная на программном уровне; перехода от вычислений с плавающей запятой к фиксированной запятой; уменьшения размерности данных при вычислениях с сохранением приемлемой точности; окращения части нейронной сети с сохранением точности классификации; модификации структуры нейронной сети с незначительным уменьшением точности (или даже без нее) с увеличением скорости работы и уменьшением размера аппаратной реализации и хранимых весов.
В статье исследуются методы, которые подойдут для реализации нейронных сетей в небольших специализированных микроэлектронных устройствах, в которых использование GPU является нерентабельным по причине существенного энергопотребления и высокой стоимости.
2. Постановка задачи
Для имплементации была выбрана задача распознания рукописных цифр, полученных с камеры в реальном времени. Вывод информации о результатах работы должен производиться на электронный LED экран. Скорость распознания цифр должна превышать 30 FPS, т. е. нейросеть должна обрабатывать одно изображение со скоростью 1 изображение за 33 мс. Полученная аппаратная реализация должна быть готова для переноса в отдельное заказное устройство СБИС для массового производства.
3. Выбор ПЛИС и оборудования для прототипирования аппаратной реализации
Для прототипирования была выбрана отладочная плата DeONano [11]. Выбор был обусловлен следующим:
1. На плате установлена ПЛИС от Intel (Altera), находящаяся в массовом производстве и дешевая по стоимости.
2. ПЛИС Cyclone IV имеет довольно низкую производительность и количество логических ячеек. Если нейронная сеть будет работать с требуемой скоростью на этой ПЛИС, то скорость работы на другой современной ПЛИС будет выше.
3. Использование отладочной платы решает часть проблем с подключением периферийных устройств, таких как камера и сенсорный дисплей. В дополнение на самой плате есть память RAM в размере 32 МБайт, которая может использоваться для хранения весов нейронной сети.
Общая структура платы и внешних устройств приведена на рис. 1.
Рисунок 1. Отладочная плата DE0Nano и внешние устройства
Для получения изображения была выбрана камера OV7670, представленная на рис. 2, так как она имеет хорошие характеристики для своей ценовой категории (представлены на рис. 3). При этом для распознания цифр не требуется высокое разрешение, поскольку в любом случае изображение будет уменьшаться до размеров 28^28 пикселов и переводиться в градиенты серого. Камера имеет несколько режимов съемки, с максимальным разрешением 640^480. Для представленной задачи такое большое разрешение избыточно, поэтому можно использовать разрешение QVGA 320x240 с целью сократить поток данных для передачи с сенсора в память SDRAM.
Key Specifications__
Array Element (VGA) 640 x 480
Power Supply Digital Core 1.8VDC ±10%
Analog 2.45V to 3.0V
I/O 1.7V to 3.0V
Power Requirements Active TßD
Standby <20 pA
Temperature Range Operation -30°C to 70° C
Stable Image O'C to 50°C
Output Formats (8-bit) • YUV/YCbCr 4:2:2 . RGB565/555 » GRB 4:2:2 * Raw RGB Data
Lens Size 1/6"
Chief Ray Angle 24"
Maximum Image Transfer Rate 30 fps for VGA
Sensitivity 1.1 V/Lux-sec
S/N Ratio 40 dB
Dynamic Range TBD
Scan Mode Progressive
Electronics Exposure Up to 510:1 (for selected fps)
Pixel Size 3.6 jjmx3.6 Mm
Dark Current 12 mV/sat 60°C
Well Capacity 17 Ke
Image Area 2.36 mm x 1 76 mm
Package Dimensions 3785 pm x 4235 pm
Рисунок 2. Внешний вид камеры OV7670
Рисунок 3. Спецификация камеры OV7670
Р. А. Соловьев, Прототипирование высокоскоростной
A. Г. Кустов, нейронной сети в ПЛИС для классификации Д. В. Тельпухов, изображений
B. С. Рухлов видеопотока
Данная камера имеет также несложный механизм подключения. Для взаимодействия с пользователем используется всего лишь 7 выводов. Данные передаются пользователю по 8-битной шине с применением стробов синхронизации VSYNC и HREF. Для настройки параметров камеры используются синхронизирующий сигнал SIOC и сигнал данных SIOD. Сигнал PWDN служит для включения камеры, а RESET — сброса работы. Остальные выводы используются для FIFO, находящемся на плате камеры. Распиновка камеры представлена на рис. 4.
Рисунок 4. Выводы камеры OV7670 Временные диаграммы работы камеры представлены на рис. 5.
Рисунок 5. Временные диаграммы работы камеры
Информация о цвете передается за 2 такта. Упаковка данных представлена на рис. 6.
Рисунок 6. Передача данных о цвете в камере
В качестве устройства вывода был выбран TFT дисплей ILI9341 c разрешением 320 х 240, представленный на рис. 7. Дисплей на основе микроконтроллера оснащен цветным (18-битный цвет — 262 144 цветов) сенсорным дисплеем с диагональю 2,4 дюйма. Также он имеет подсветку. Его удобно использовать благодаря большому углу обзора. Контрастность и динамические свойства ЖКИ индикатора H24TM84A позволяют воспроизводить видео. Контроллер ЖКИ содержит буфер RAM, что снижает требования к микроконтроллеру прибора. Дисплей управляется по последовательной SPI шине, как показано на рис. 8.
Рисунок 7. Внешний вид дисплея ILI9341
Рисунок 8. Передача данных по SPI интерфейсу
Р. А. Соловьев, Прототипирование высокоскоростной
A. Г. Кустов, нейронной сети в ПЛИС для классификации Д. В. Тельпухов, изображений
B. С. Рухлов видеопотока
Схема подключения камеры и экрана к плате De0Nano изображена на рис. 9. Соединяются узлы с одинаковыми именами. Узлы, обозначенные как 'х', остаются неподключенными.
Рисунок 9. Схема подключения камеры и экрана к De0Nano
Все компоненты выбирались с учетом их стоимости. Средняя стоимость экрана — 7 долларов, камеры — 7 долларов. Отладочная плата, использующаяся для прототипирования устройства, является самым дорогим компонентом и стоит около 80 долларов. Дальнейшее удешевление проекта возможно за счет отказа от использования отладочной платы, содержащей избыточные компоненты, и реализации собственной печатной платы с размещением на ней чипа ПЛИС, памяти, интерфейсов ввода/вывода и т. д.
4. Подготовка набора данных для обучения
Для задачи распознавания цифр существует известный набор данных MNIST [12]. Однако непосредственное использование этого набора для обучения нейронной сети невозможно, так как он сильно отличается от изображений, полученных с камеры (рис. 10).
Рисунок 10. Изображение из набора MNIST (слева) и изображение, полученное с камеры (справа)
Главные отличия:
1. Изображение с МШ8Т — светлые цифры на темном фоне, тогда как на камере наоборот, темные цифры на светлом фоне.
2. Изображение с камеры приходит цветным.
3. Размер изображений МШ8Т 28^28 пикселов, а изображение с камеры 320 х 240 пикселов.
4. На изображении с камеры присутствуют шумы и артефакты, а цифры могут быть сдвинуты и немного повернуты, в то время как цифры в МШ8Т всегда находятся строго по центру, а фон всегда однородный и идеально черный.
5. В отличие от МШ8Т нам также потребуется добавить отдельный одиннадцатый класс «отсутствие цифры на изображении».
Зная, что максимальная точность распознания для набора МШ8Т крайне высокая (современные сети распознают цифры с точностью более 99.5% [13]), было принято решение уменьшать изображения с камеры до 28 х 28 пикселов и переводить изображения в градации серого. Тем самым были решены следующие проблемы.
1. Нет существенных потерь в точности, так как даже на небольших изображениях цифры все равно легко распознаются человеком.
2. Для однородных цифр цвет не имеет значения и не влияет на их распознание на изображении.
3. Шумное изображение с камеры при уменьшении и усреднении соседних пикселов становится более четким. Часть шумов нейтрализуется.
4. Поскольку планировалось выполнять преобразование изображения на аппаратном уровне, потребовалось заранее продумать минимальный набор арифметических функций, которые эффективно приведут изображение к нужному виду.
Алгоритм для перевода изображений в нужный формат следующий.
1. Из изображения 320 х 240 берется только центральная часть размером 224 х 224 пиксела. Выбор числа 224 обусловлен тем фактом, что
Р. А. Соловьев,
A. Г. Кустов, Д. В. Тельпухов,
B. С. Рухлов
Прототипирование высокоскоростной нейронной сети в ПЛИС для классификации изображений видеопотока
224 = 28-8, что позволит впоследствии легко перейти к нужному размеру изображения.
2. Далее эта часть изображения преобразуется в оттенки серого. В связи с особенностями человеческого зрения [14] для перевода в оттенки серого используется не среднее, а взвешенное среднее с коэффициентами порядка 60% на зеленый, 30% на красный и 10% на синий. Для облегчения перевода на аппаратном уровне была использована следующая формула: = (80 + 5Я + 3Б)/16.
3. Умножение на 8 и деление на 16 реализовано сдвигами.
4. Далее изображение 224 х 224 разбивается на блоки 8 х 8. В каждом из таких блоков ищется среднее значение, формируя соответствующий пиксель в изображении 28 х 28.
Полученный алгоритм работает очень быстро на аппаратном уровне.
Для того чтобы использовать изображения из базы данных МККТ для обучения нейросети, использовался метод генерации аугментированных изображений на лету. В этом методе при формировании следующего минибатча для обучения к каждому изображению применяется набор различных фильтров. Эта техника используется для увеличения размера набора данных без существенных усилий, а также для приведения набора данных к требуемому виду, как в нашем случае.
Применялся следующий набор фильтров:
1. Инверсия цвета.
2. Случайный поворот на 10 градусов в обе стороны.
3. Случайное увеличение, уменьшение изображения на 4 пиксела.
4. Случайное изменение интенсивности изображения (от 0 до 80).
5. Добавление случайного шума от 0 до 10 %.
Дополнительно в минибатчи подмешивались реальные изображения, полученные с камеры.
5. Разработка нейронной сети с повышенной скоростью
Типовая структура сверточной нейронной сети приведена на рис. 11. Позже появились некоторые усовершенствованные структуры с разветвлениями [3, 4], но суть осталась той же: размер изображения от слоя к слою уменьшается, а количество фильтров растет. В конце сверточной сети образуется набор признаков, которые подаются на классификационный слой (или слои) и выходные нейроны сигнализируют вероятность принадлежности изображения к конкретному классу.
работы
Рисунок 11. Структура сверточной нейросети
Был предложен следующий набор правил для конструирования нейронной сети для минимизации общего числа хранимых весов (что критично для мобильных систем) и облегчения перехода к вычислениям с фиксированной точкой.
1. Требуется минимизировать число полносвязных слоев, которые являются основным потребителем памяти для хранения весов. В идеале он должен быть только один на последнем слое нейронной сети.
2. По возможности сократить число фильтров на каждом сверточном слое. Но каждое такое сокращение может привести к ухудшению свойств сети. Важно найти хороший баланс между точностью и количеством весов.
3. Отказаться от использования смещения (bias). Это важно при переходе от плавающей к фиксированной точке. Из-за того, что наличие сложения с константой мешает контролировать диапазон значений и ошибка от округления смещения на каждом слое имеет свойство накапливаться.
4. Использовать активации простого типа. Наиболее подходящая активация RELU. Следует избегать активаций sigmoid, tahn и т. д., которые содержат деление и возведение в степень, и другие сложные с точки зрения аппаратной реализации функции.
5. Минимизировать число разнородных слоев, чтобы один аппаратный блок мог выполнять вычисления на большом числе участков маршрута.
Перед переводом нейронной сети в аппаратный вид ее требуется обучить на подготовленном наборе данных и получить ее математическую модель для тестирования. Математическая модель готовилась на базе языка Python и модуля для работы с нейронными сетями Keras с бекэндом Tensorflow. В публикации [15] была предложена архитектура нейронной сети VGG Simple (рис. 12).
Р. А. Соловьев, Прототипирование высокоскоростной
A. Г. Кустов, нейронной сети в ПЛИС для классификации Д. В. Тельпухов, изображений
B. С. Рухлов видеопотока
zm opaddiiig2d_inp ut_1 (bip utLayer) input (None. 1. 28. 28)
output: (None, i, 28, 28)
zerop a ckluiai ci l (ZeroPa ckliiiglD) iiipul: (None. 1, 28. 28)
output: (Noue. 1.30. 30)
convolntiou2d_l (Convolution2D) input; (None. 1.30,30)
output: (None. 4.28. 28)
-
zerop adding d 2 (Za oPa cldkig2D) iuput: (None. 4. 28. 28)
output: (None. 4,30. 30)
convolutioii2d_2 (ConvolutioiiiD) input: (None, 4.30. 30)
output: (None, 4,28. 28)
■
inaxpooling2(1_l (MaxPooliiigZ iliput: (None, 4, 28, 28)
output: (None, 4,14,14)
zeiopncldiiia2d 3 (ZeioPadditialD) input: (None,-). 14.14)
output: (None. 4.16.16)
■
convoliitiou2d_3 (Couvoliitioii2D) input: (None, 4.16.16)
output: (None, 8.14,14)
zeropadding2d_4 (ZeroPadclmg2D) input: (None. 8.14.14)
output: (None. 8.16.16)
couvolution2d_4 (Couvolutiou2D) input: (None, 8,16,16)
output (None. 8,14.14)
шахрооВпк2 d_2 (MaxPoofina2D) input: (None. 8.14.14)
output (None. 8,7, 7)
flatten_l (Flatten) input: (None. 8,7, 7)
output: (Noue. 392)
densel (Dense) input: (None, 392)
output (None. 64)
diopout l (Dropout) input: (None. 64)
output: (None, 64)
dense_2 (Dense) input: (None. 64)
out]} lit: (None, 64)
input: (None, 64)
output: (None. 64)
dense_3 (Dense) input: (None, 64)
output: (None, 10)
Г
Рисунок 12. Структура нейронной сети VGG Simple
Несмотря на высокую скорость работы, главной проблемой этой модели стало количество весов, размер которых превышал емкость ПЛИС, а обмен с внешней памятью накладывает дополнительные временные затраты. Дополнительно в этой модели присутствует bias, который тоже надо хранить и который требует дополнительных блоков для обработки и имеет тенденцию к накоплению ошибки при переходе к фиксированной точке. Поэтому данная структура была модифицирована за счет исключения больших полносвязных слоев и смещения. В нейросеть был добавлен слой GlobalMaxPooling вместо GlobalAvgPooling, который обычно используют, например, в ResNet50. Эффективность этих слоев примерно одинаковая, в то время как аппаратная сложность нахождения максимума с вычислительной точки зрения значительно проще, чем поиск среднего значения.
Внесенные изменения не привели к снижению точности работы нейросети. Новая структура приведена на рис. 13. Изменение структуры нейросети позволило снизить количество весов с 25 тысяч до примерно 4.5 тысяч, что позволило хранить все веса во внутренней памяти ПЛИС.
inputl: InputLayei' input: (None. 28, 28,1)
output: (None, 28, 28,1)
convl: Conv2D input: (None, 28, 28,1)
output: (None, 28, 28, 4)
activatioii_l: Activation input: (None, 28, 28,4)
output": (None, 28, 28,4)
conv2: Conv2D input: (None, 28, 28, 4)
output: (None, 28, 28.4)
activatiou_2: Activation input: (None. 28, 28.4)
output: (None. 28, 28,4)
pooll: MaxPooling2D input: (None, 28,28, 4)
output: (None, 14,14, 4)
conv3: Conv2D input: (None, 14,14,4)
output: (None, 14,14, 8)
activation_3: Activation input: (None. 14, 14. 8)
output: (None, 14.14, 8)
conv4: Couv2D input: (None, 14,14, 8)
output: (None, 14,14, 8)
ac1iva1iou_4: Activation input: (None, 14,14, 8)
output: (None, 14,14, 8)
pool2: MaxPoolnigiD input: (None, 14,14, 8)
output: (None, 7, 7, 8)
conv5: Conv2D input: (None, 7, 7, 8)
output: (None. 7, 7,16)
activation ?: Activation input: (None, 7, 7,16)
output: (None. 7, 7,16)
convâ: Couv2D input: (None, 7, 7,16)
output: (None, 7. 7,16)
activatiou_6: Activation input: (None, 7,7,16)
output: (None. 7,7,16)
global_max_pooliiig2d_l GlobalMaxPooljiig2D
input: (None, 7,7,16)
output: (None. 16)
dense_l: Dense input: (None, 16)
output: (None, 11)
activatiou_7: Activation input: (None, 11)
output: (None, 11)
Рисунок 13. Структура нейронной сети Low Weights Digit Detector (LWDD)
На модифицированном наборе MNIST с аугментациями нейронная сеть довольно быстро тренируется до ~96% точности (рис. 14).
О 50 LOG 150 200
Рисунок 14. Процесс тренировки сети Low Weights Digit Detector на модифицированном
MNIST наборе
Р. А. Соловьев, Прототипирование высокоскоростной
A. Г. Кустов, нейронной сети в ПЛИС для классификации Д. В. Тельпухов, изображений
B. С. Рухлов видеопотока
Полученные оценки ниже, чем точность, полученная исследователями на наборе MNIST, но, как было указано ранее, изображения с камеры приходят на вход устройства зашумленными, находятся не в центре кадра и фон не является полностью однородным.
6. Перевод вычислений от плавающей к фиксированной точке
В нейронных сетях вычисления традиционно проводятся с плавающей точкой на GPU (быстро) или CPU (медленно), например, с использованием типа float32. При реализации на аппаратном уровне вычисления с плавающей точкой работают медленнее, чем с фиксированной точкой из-за сложностей с контролем мантиссы и показателя степени при различных операциях.
Рассмотрим первый слой нейросети типа Convolution (рис. 15) — в большинстве сверточных нейросетей этот блок является основным.
Рисунок 15. Схематическое изображение операции Convolution
На входе слоя находится двухмерная матрица (исходная картинка) 28 х 28, значения которой находятся на интервале [0; 1).
Известно также, что если a е[-1;1] и b е[-1;1] то a * b е[-1;1].
Формула для расчета конкретного пикселя в позиции (i, j) второго слоя с учетом того, что используется Convolution с размером 3 х 3:
= b +
+W00 • Р,-1, j -1 + W01 • Pi-1, j + 0 + W02 • P,-1, j+1 + +W10 • Pi+0,j-1 + W11 • Pi+0,j + 0 + W12 • Pi+0,j +1 + +W20 • P,+1, j -1 + W21 • Pi+1,j + 0 + W22 • P,+1, j +1 .
Поскольку веса w . и смещение b известны, то можно рассчитать потенциальный минимум mn и максимум mx на втором слое. Пусть M = max(| mx |,| mn |). Если разделить ■ и b на значение M, то можно гарантировать, что при любой
конфигурации входных данных значение на втором слое не превысит 1. Назовем M коэффициентом редукции слоя. На втором слое получается такая же ситуация, как и на первом, а именно, на входе слоя значение из промежутка [-1; 1] и рассуждения можно повторить.
Можно легко показать, что для предложенной нейронной сети на последнем слое после всех редукций весов позиция максимума на последнем нейроне не изменится, т. е. нейронная сеть будет работать эквивалентно нейронной сети без редукции с точки зрения вычислений с плавающей точкой.
Выполнив редукцию на каждом слое, мы можем перейти от вычислений с плавающей точки к вычислениям с фиксированной точкой, поскольку мы точно знаем диапазон значений на каждом этапе вычислений.
Для представления чисел размерности N бит будем использовать следующую нотацию:
xb = [ x • 2n ].
Если z = x + y, тогда сложение
z ' = xb + yb = [ x • 2n ] + [ y • 2W ] = [(x + y) • 2N ] = [ z • 2N ] = [ zb];
умножение
z ' = xb • yb = [ x-2N]-[y • 2N ] = [( x •y) • 2n • 2N ] = [ z • 2N • 2N ] = [ zb •],
т. е. после умножения требуется разделить результат на 2N, чтобы получить реальное значение или же просто выполнить сдвиг на N позиций.
Если перебирать все возможные входные изображения и ориентироваться на потенциальный минимум и максимум, то коэффициенты редукции могут оказаться очень большими, и точность будет теряться от слоя к слою довольно быстро, что может потребовать большой разрядности фиксированной точки для хранения весов и промежуточных результатов вычислений. Чтобы этого не произошло, можно использовать все (или некоторую часть) изображения тренировочного набора, как наиболее вероятные, чтобы найти максимальные и минимальные значения на каждом слое. Как показали эксперименты, использование тренировочного набора позволяет сильно уменьшить коэффициенты редукции. При этом желательно брать коэффициенты с небольшим запасом либо ориентируясь на значение 3 sigma или же увеличивая максимум на несколько процентов.
Однако при некоторых условиях возможно переполнение и выход за границы рассчитанного диапазона. Для этого в аппаратной реализации требуется детектор таких случаев и замена переполненных значений на максимум для данного слоя.
Р. А. Соловьев,
A. Г. Кустов, Д. В. Тельпухов,
B. С. Рухлов
Прототипирование высокоскоростной нейронной сети в ПЛИС для классификации изображений видеопотока
Впрочем, этого можно достигнуть лишь небольшой модификацией блока выполнения свертки.
При вычислениях с фиксированной точкой с ограниченной разрядностью весов и промежуточных вычислений неизбежно возникают ошибки округления, которые накапливаются от слоя к слою и могут привести к некорректной работе нейронной сети. Некорректной работой мы считаем ошибку классификации при сравнении с математической моделью, а не с реальным ответом. Чтобы проверить корректность работы, требуется прогнать все тестовые изображения на математической модели с плавающей точкой и на математической модели (или в тест-бенч на Verilog) с фиксированной точкой и затем сравнить ответы на выходе нейронной сети. Отношение количества несовпадений к общему числу тестов и будет мерой ошибки для заданной разрядности весов и промежуточных вычислений. При выборе разрядности можно ориентироваться на разрядность, при которой число ошибок равно 0.
При вычислении на сверточных блоках возможны две различные стратегии.
1. Округление после каждой элементарной операции сложения и умножения.
2. Вычисление с полной точностью и округление в самом конце операции свертки.
Было проведено два эксперимента для того, чтобы определить наиболее эффективный подход (табл. 1). В случае с округлением вначале, для нулевого расхождения с моделью требуется 17 бит на хранение числа, для округления в конце всего 12 бит.
Таблица 1. Ошибка по сравнению с математической моделью
Разрядность весов Округление вначале, % Округление в конце, %о
10 32.03 1.96
11 15.03 0.65
12 11.76 0.00
13 9.15 0.00
14 3.27 0.00
15 1.96 0.00
16 0.65 0.00
17 0.00 0.00
18 0.00 0.00
Округление после каждой операции немного увеличивает скорость, но существенно увеличивает накладные расходы на память. Поэтому в общем случае выгодно выполнять операцию округления после сверточного блока.
7. Имплементация аппаратной реализации в ПЛИС
В ПЛИС для хранения кадра с камеры используется SDRAM. В памяти SDRAM, распаянной на плате De0-Nano, были выделены две равные области для двух кадров — в одну область записывается кадр, а из другой области памяти считывается предыдущий. После окончания вывода эти области меняются своими назначениями. При использовании памяти SDRAM в данном исследовании необходимо учитывать два важных момента: во-первых, память работает на высокой частоте — 143 МГц, и перед нами появляется новая проблема — передача данных из камеры в память SDRAM; во-вторых, для достижения максимального быстродействия писать в SDRAM следует целыми транзакциями, которые называются burst. Для решения этих проблем наилучшим вариантом является использование буфера FIFO, который реализован непосредственно в памяти ПЛИС. Основная идея такова: камера на низкой частоте заполняет FIFO, после чего контроллер SDRAM считывает данные на высокой частоте и сразу одной транзакцией записывает их в память. Вывод данных на TFT-экран организован по такому же принципу. Данные из SDRAM записываются в FIFO экрана, а затем извлекаются на частоте 10 МГц. После опустошения FIFO операция повторяется.
Процесс перемещения данных о кадре через разные участки памяти представлен на рис. 16, а функциональная схема проекта по модулям Verilog показана на рис. 17.
данные с FIFO SDRAM FIFO данные на ^
камеры ^ камеры экрана экран
Рисунок 16. Передача данных о кадре
Картинка с камеры после ее прохождения через SDRAM выводится на экран как есть, а также поступает на нейросеть для ее распознавания через модуль преобразования изображения в серые оттенки и уменьшения разрешения. После окончания работы нейросети результат также выводится непосредственно на экран. Так как у камеры существует большое количество параметров ее работы, они заложены в отдельный модуль, который выгружает их в камеру перед началом работы.
Р. А. Соловьев, Прототипирование высокоскоростной
A. Г. Кустов, нейронной сети в ПЛИС для классификации Д. В. Тельпухов, изображений
B. С. Рухлов видеопотока
Рисунок 17. Схематичное представление аппаратной реализации Аппаратная реализация нейросети схематично представлена на рис. 18.
Рисунок 18. Схематичное представление аппаратной реализации нейросети
Входное изображение после преобразования сохраняется в базе данных, в которой также хранятся заранее полученные и зашитые весовые коэффициенты для каждого слоя. По мере необходимости данные оттуда выгружаются через контроллер в небольшую память для их дальнейшего использования. Всем происходящим в нейросети управляет главный модуль, в котором заложена последовательность и параметры слоев нейросети. В аппаратной реализации применяются не все слои
тестируемой нейросети, часть из них заменена на другие функции. Например, здесь нет слоя ZeroPadding, вместо него применяется модуль контроля границ промежуточного изображения, что позволяет сократить количество используемой памяти чипа. Также здесь нет слоя GlobalMaxPooling, он заменен на функцию в Convolution слое, которая сразу же получает результат слоя GlobalMaxPooling, находя самое большое значение в промежуточном изображении. Остальные слои реализованы в виде отдельных модулей. Так как Convolution и Dense слои могут использовать сверточные блоки для своих расчетов, оба из них имеют к ним доступ. В модули заложена функция активации ReLU, которая по мере необходимости используется. На последнем слое применяется функция активации Softmax, но не в явном виде, а замененная на обычный Maximum, поскольку позиция нейрона у обеих этих функций всегда одинакова. Эта модифицированная активация вынесена в отдельный модуль, выходом которого является результат работы всей нейросети.
Для реализации нейронной сети был использован специализированный Convolution блок, который за один такт выполняет свертку размерности 3 х 3 (можно сделать такой же блок для других размерностей 4 х 4, 5 х 5 и т. д. в случае если они присутствуют в нейронной сети). Блок представляет собой скалярное произведение векторов и содержит 9 умножений и 8 сложений. Этот же блок используется для вычислений на полносвязном Dense слое, за счет разбиения всего набора сложений и умножения на блоки по 9 нейронов.
8. Дополнительная оптимизация вычислений
Для увеличения производительности был применен ряд методик, которые позволили сократить количество тактов, требуемых для классификации одного изображения.
8.1. Увеличение числа сверточных блоков
Для увеличения производительности, в случае наличия свободного места в ПЛИС, количество блоков свертки можно увеличить, тем самым кратно увеличивая производительность. Рассмотрим второй сверточный блок в предложенной нейронной сети LWDD. На входе слоя 4 изображения размером 28 х 28, дано 16 блоков весов. Чтобы рассчитать набор выходных изображений слоя, также состоящих из 4 изображений, то для одного и того же набора пикселов потребуется выполнить четыре умножения на разные наборы весов. На это потребуется не менее 4 тактов при условии наличия лишь одного блока свертки, но если таких блоков будет 4, то потребуется лишь один такт, тем самым скорость расчета Convolution слоя вырастет в 4 раза.
Р. А. Соловьев, Прототипирование высокоскоростной
A. Г. Кустов, нейронной сети в ПЛИС для классификации Д. В. Тельпухов, изображений
B. С. Рухлов видеопотока
8.2. Сдвиговый регистр
Для выполнения элементарной операции свертки требуется получить значения 9 соседних пикселей с входного изображения. Затем следующие 9 пикселей, 6 из которых уже были получены на прошлом шаге (рис. 19).
Для сокращения времени вызова необходимых данных в схему был добавлен сдвиговый регистр, сохраняющий при поступлении в него новые данные и «выталкивающий» из себя в это же время старые. Таким образом, на каждом шаге требуется получить лишь 3 новых значения вместо 9.
Рисунок 19. Механизм работы сдвигового регистра. Синим цветом отмечены данные, полученные на предыдущем шаге для предыдущей свертки
8.3. Хранение всех данных для одной операции Convolution по одному адресу
При вызове необходимых для расчетов данных на каждое значение тратится один такт. Поэтому чтобы сократить время, затрачиваемое на загрузку нужных данных, а также для удобства обращения к ним, перед тем как положить во внутреннюю память ПЛИС, данные укладываются вместе в блоки по 9 штук и после доступны по одному адресу. При таком расположении в памяти извлечение весов можно выполнить за один такт и тем самым ускорить вычисление сверточного слоя. Пример приведен на рис. 20.
11 bit 11 bit 11 bit 11 bit 11 bit 11 bit 11 bit 11 bit 11 bit
99 bit
Рисунок 20. Хранение всех весов слоя в виде одного блока
9. Экспериментальные результаты
Проект был успешно синтезирован в ПЛИС. Подробности по занимаемым логическим ячейкам и памяти приведены в табл. 2.
Таблица 2. Информация по ресурсам, занимаемым устройством в ПЛИС
после этапа Place & Route
Логические ячейки (доступно 22320) 9-bit elements (132) Внутренняя память (доступно: 608256 бит) PLLs (4)
Преобразователь входного изображения 964 (4%) 0 (0%) 0 (0%) 0 (0%)
Нейронная сеть 4014 (18%) 23 (17%) 285428 (47%) 0 (0%)
База данных с весами 0 (0%) 0 (0%) 70980 (12%) 0 (0%)
Хранение промежуточных результатов вычислений 1 (<1%) 0 (0%) 214448 (35%) 0 (0%)
Всего занято 5947 (27%) 23 (17%) 371444 (61%) 2 (50%)
Обработка изображений происходит в реальном времени и исходное изображение вместе с полученным результатом выводится на дисплей. На классификацию одного изображения требуется порядка 230 тысяч тактов, и общая скорость обработки получилась с большим запасом в 150 кадров/сек. Детальное распределение тактов по разным этапам приведено в табл. 3.
Таблица 3. Количество тактов на каждом этапе обработки изображения в ПЛИС
Этап обработки Количество тактов
Загрузка начальной картинки 1570
Загрузка весов для первого conv слоя 76
Первый conv слой 12605
Загрузка весов для второго conv слоя 291
Второй conv слой 50416
Третий maxp слой 3164
Загрузка весов для четвертого conv слоя 580
Четвертый conv слой 25569
Загрузка весов для пятого conv слоя 1155
Пятый conv слой 51136
Шестой maxp слой 1623
Загрузка весов для седьмого conv слоя 2309
Седьмой conv слой 27009
Загрузка весов для восьмого conv слоя 4611
Восьмой conv слой (+GlobalMaxPooling) 54016
Загрузка весов для девятого dense слоя 356
Девятый dense слой 244
Сохранение результата 16
Всего 236746
Р. А. Соловьев, Прототипирование высокоскоростной
A. Г. Кустов, нейронной сети в ПЛИС для классификации Д. В. Тельпухов, изображений
B. С. Рухлов видеопотока
При нехватке производительности и в случае наличия свободных логических ячеек ускорить вычисления можно за счет добавления дополнительных сверточных блоков, которые выполняют вычисления в параллель, как это было показано в [15]. В табл. 4 указано число тактов, требуемых на обработку одного кадра для разного числа сверточных блоков.
Таблица 4. Количество тактов на каждом этапе обработки изображения в ПЛИС
Тактов на 1 кадр
1 сверточный блок 236746
2 сверточных блока 125320
4 сверточных блока 67861
В табл. 5 приведено количество ресурсов, занимаемых в ПЛИС всем проектом для разной размерности весов и разного числа сверточных блоков. Цветом отмечены варианты, которые Quartus не смог синтезировать из-за нехватки ресурсов в ПЛИС.
Таблица 5. Количество ресурсов на весь проект
Размер- Число Log. Memory Embedded Задержка Максимальное
ность сверточ- cells (608256) Multiplier крит. кол-во кадров в
весов ных (22320) 9-bit пути секунду
блоков elements
(132)
11 бит 1 3750 232111 25 21.840 193
2 4710 309727 41 22.628 352
4 6711 464959 77 23.548 625
12 бит 1 3876 253212 25 24.181 174
2 4905 337884 41 24.348 327
4 10064 589148 77 - -
13 бит 1 3994 274313 25 22.999 183
2 5124 366041 41 25.044 318
4 8437 549497 77 - -
10. Заключение
Предложена универсальная методика проектирования нейросетей в микроэлектронных устройствах малой производительности, таких как ПЛИС и небольшие микроконтроллеры для встраиваемых систем. Устройство, построенное по предложенной методике, работает в реальном времени на ПЛИС при питании от USB порта, которого хватает на функционирование камеры, экрана и нейросети.
Устройство может быть реализовано на основе микроконтроллеров. Предложенное в статье решение является универсальным и его можно использовать для проектирования аппаратных нейронных сетей при решении других задач компьютерного зрения. Наличие большого запаса по скорости обработки позволит решать более сложные задачи распознания в реальном времени на той же аппаратуре.
Демонстрационное видео с результатом работы устройства доступно на Youtube [16]. Код математической модели и Verilog доступны на GitHub [17].
Литература
[1] Simonyan K., Zisserman A. Very deep convolutional networks for large-scale image recognition // Conference paper. ICLR 2015. arXiv preprint arXiv:1409.1556. 2014.
[2] He K. et al. Delving deep into rectifiers: Surpassing human-level performance on imagenet classification // Proceedings of the IEEE international conference on computer vision. 2015. P. 1026-1034.
[3] Szegedy C. et al. Going deeper with convolutions // Proceedings of the 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2015.
[4] He K. et al. Deep residual learning for image recognition // Proceedings of the 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2016. P. 770-778.
[5] Ronneberger O., Fischer P., Brox T. U-net: Convolutional networks for biomedical image segmentation // International Conference on Medical image computing and computer-assisted intervention. — Springer, Cham, 2015. P. 234-241.
[6] Abadi M. et al. TensorFlow: A System for Large-Scale Machine Learning // Proceedings of the 12th USENIX Symposium on Operating Systems Design and Implementation OSDI. 2016. Vol. 16. P. 265-283.
[7] Howard A. G. et al. Mobilenets: Efficient convolutional neural networks for mobile vision applications // arXiv preprint arXiv:1704.04861. 2017.
[8] Iandola F. N. et al. SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and < 0.5 MB model size // Conference paper at ICLR 2017. arXiv preprint arXiv:1602.07360. 2016.
[9] Han S., Mao H., Dally W. J. Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding // Conference paper at ICLR 2016. arXiv preprint arXiv:1510.00149. 2015.
[10] Jouppi N. Google supercharges machine learning tasks with TPU custom chip // Google Blog, May. 2016. Vol. 18.
[11] http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=165& No=593&PartNo=2
[12] LeCun Y., Bottou L., Bengio Y., Haffner P. Gradient-based learning applied to document recognition. Proceedings of the IEEE, 1998. Vol. 86. No. 11. P. 2278-2324.
[13] Regularization of Neural Networks using DropConnect, 2013, https://cs.nyu.edu/~wanli/ dropc/dropc.pdf
[14] Burger W., Burge M. J. Principles of Digital Image Processing Core Algorithms. Springer Science & Business Media. 2010. P. 110-111.
Р. А. Соловьев,
A. Г. Кустов, Д. В. Тельпухов,
B. С. Рухлов
Прототипирование высокоскоростной нейронной сети в ПЛИС для классификации изображений видеопотока
[15] Соловьев Р. А., Кустов А. Г., Рухлов В. С., Щелоков А. Н., Пузырьков Д. В. Аппаратная реализация сверточной нейронной сети в ПЛИС на базе вычислений с фиксированной точкой // Известия ЮФУ. Технические науки. 2017. № 7 (192). С. 186-197.
[16] https://www.youtube.com/watch?v=Lhnf596о0сс
[17] https://github.com/ZFTurbo/Verilog-Generator-of-Neural-Net-Digit-Detector-for-FPGA Авторы:
Роман Александрович Соловьев — кандидат технических наук, ведущий научный сотрудник отдела методологии проектирования интегральных схем, Институт проблем проектирования в микроэлектронике РАН
Дмитрий Владимирович Тельпухов — кандидат технических наук, заведующий отделом методологии проектирования интегральных схем, Институт проблем проектирования в микроэлектронике РАН
Александр Георгиевич Кустов — инженер-исследователь отдела методологии проектирования интегральных схем, Институт проблем проектирования в микроэлектронике РАН
Владимир Сергеевич Рухлов — младший научный сотрудник отдела методологии проектирования интегральных схем, Институт проблем проектирования в микроэлектронике РАН
Hardware Implementation of a Convolutional Neural Network in FPGA Based on Fixed Point Calculations
R. A. Solovyev, A. G. Kustov, D. V. Telpukhov, V. S. Ruhlov
Institute for Design Problems in Microelectronics of Russian Academy of Sciences Sovetskaya st., 3, Moscow, Zelenograd, 124365 e-mail: [email protected]
Abstract. Methods for solving image-processing problems with the help of neural networks are more and more used in actual practice. However, apparatus of neural networks is complex from computational point of view and requires the use of complex hardware. For full-fledged operating modern neural networks, graphics processors (GPUs) are usually used. There is also such trend as design of neural networks for mobile devices. Their major features are small number of weights and relatively small number of arithmetic operations. However, they are also executed at software level and use floating-point calculations. For devices where high operation speed is required, for example, real-time video processing (30 frames per second), the use of mobile networks without significant optimization may not provide sufficient performance. To use neural networks at the stage when the model is already prepared and trained (that is, weights are obtained) in a real device, we can apply a set of optimizations to speed up computations manifold. We suggest to move from computing at software level to hardware implementation, and to move from floating-point to fixed point calculations. A set of methods for neural networks design is proposed to improve performance and accuracy of fixed point calculations. An example of designing a device solving particular practical problem is given. We show how existing datasets can be adapted for other recognition tasks. We also provide an example of project development for FPGA prototyping using camera and output device. Final project implemented on the basis of the proposed methods successfully works using USB power in real time at De0Nano debug board based on Cyclone IV FPGA. Keywords: convolutional neural nets, FPGA, fixed point calculations, 2D convolution.
References
[1] Simonyan K., Zisserman A. (2015) Very deep convolutional networks for large-scale image recognition. Conference paper. ICLR 2015. arXiv preprint arXiv:1409.1556.
[2] He K. et al. (2015) Delving deep into rectifiers: Surpassing human-level performance on imagenet classification. Proceedings of the IEEE international conference on computer vision, pp. 1026-1034.
[3] Szegedy C. et al. (2015) Going deeper with convolutions. Proceedings of the 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR).
[4] He K. et al. (2016) Deep residual learning for image recognition. Proceedings of the 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), pp. 770-778.
[5] Ronneberger O., Fischer P., Brox T. (2015) U-net: Convolutional networks for biomedical image segmentation. International Conference on Medical image computing and computer-assisted intervention. Springer, Cham, pp. 234-241.
[6] Abadi M. et al. (2016) TensorFlow: A System for Large-Scale Machine Learning. Proceedings of the 12th USENIX Symposium on Operating Systems Design and Implementation OSDI (Vol. 16), pp. 265283.
[7] Howard A. G. et al. (2017) Mobilenets: Efficient convolutional neural networks for mobile vision applications // arXiv preprint arXiv:1704.04861.
[8] Iandola F. N. et al. (2017) SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and < 0.5 MB model size. Conference paper at ICLR 2017. arXiv preprint arXiv:1602.07360.
[9] Han S., Mao H., Dally W. J. (2016) Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding. Conference paper at ICLR. arXiv preprint arXiv:1510.00149.
[10] Jouppi N. (2016) Google supercharges machine learning tasks with TPU custom chip. Google Blog, May. Vol. 18.
[11] http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=165& No=593&PartNo=2
[12] LeCun Y., Bottou L., Bengio Y., Haffner P. (1998) Gradient-based learning applied to document recognition. Proceedings of the IEEE. Vol. 86. No. 11. P. 2278-2324.
[13] https://cs.nyu.edu/~wanli/dropc/dropc.pdf
[14] Burger W., Burge M. J. (2010) Principles of Digital Image Processing Core Algorithms. Springer Science & Business Media. P. 110-111.
[15] Solov'yev R. A., Kustov A. G., Rukhlov V. S, Shchelokov A. N., Puzyr'kov D. V. (2017) Izvestiya YUFU. Tekhnicheskiye nauki. 7(192):186-197. [In Rus]
[16] https://www.youtube. com/watch?v=Lhnf5 96o0cc
[17] https://github.com/ZFTurbo/Verilog-Generator-of-Neural-Net-Digit-Detector-for-FPGA