Разработка роботизированной платформы

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,15 Мб
  • Опубликовано:
    2017-08-20
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка роботизированной платформы

Оглавление

Введение

1. Анализ существующих технических решений

1.1 Беспилотные автомобили

1.2 Boston Dynamics

1.3 Прочие системы

1.4 Выводы к разделу 1

2. Структурное решение

2.1 Структурное решение для клиентской части

2.2 Структурное решение серверной части

2.3 Выводы к разделу 2

3. Выбор элементной базы

3.1 Выбор основных вычислительных и исполнительных компонентов

3.1.1 Arduino Uno

3.1.2 Iskra Neo

3.1.3 Raspberry Pi 3

3.1.4 LinkIt One

3.2 Выбор дополнительных радиоэлементов и элементов питания

3.3 Выводы к разделу 3

4. Выбор языков программирования и инструментальных средств разработки

4.1 Выводы к разделу 4

5. Выбор алгоритма самообучения

5.1 Выводы к разделу 5

6. Методы решения поставленных задач

6.1 Проектирование алгоритма самообучения

6.2 Предварительная обработка входных данных

6.2.1 Оператор Собеля

6.2.2 Цветовая схема градаций серого

6.2.3 Необработанные изображения

6.2.4 Результаты исследования зависимости

6.3 Проектирование программных интерфейсов

6.3.1 Разработка программного интерфейса управления клиентом

6.3.2 Разработка программного интерфейса считывания данных

6.3.3 Разработка программного скрипта передачи и приёма данных

6.4 Методы проведения тестирования системы

Выводы к разделу 6

Заключение

Список использованных источников

Приложения

Исходный код скрипта, передающий коды действий клиенту

Исходный код скрипта, считывающий показания датчиков

Исходный код класса "teacher"

Исходный код класса "neuron"

Исходный код класса "som"

Введение


Актуальность

Сегодня во многих сферах человеческой деятельности используются те или иные средства автоматизации проектирования, разработки, производства и оказания услуг. Средства автоматизации процессов интегрируются повсеместно: в медицине, логистике, промышленности, экономике, средствах передвижения и прочих областях. Рост же вычислительных мощностей используемого оборудования и переход на всё более высокие абстракции в программном обеспечении позволяют разрабатывать системы, по принципам работы близкие к тому, как работает человеческий мозг, который в свою очередь способен обрабатывать обширный спектр видов информации, использовать накопленный ранее опыт и принимать решения в зависимости от имеющейся ситуации. Алгоритмы, реализованные с целью решения задач путями, зависящими от конкретной окружающей обстановки, позволяют реализовывать так называемые алгоритмы искусственного интеллекта и использующие их интеллектуальные системы. Эти алгоритмы позволяют использовать также эвристические подходы в считывании информации и решать в некотором смысле творческие задачи.

Отдельным пластом методов реализации алгоритмов искусственного интеллекта являются набирающие популярность среди разработчиков методы машинного обучения. Суть этих методов сводится к известным методам дедуктивного и индуктивного обучения. В первом случае предполагается наиболее прямая формализация знаний экспертов рассматриваемой предметной области и перенос их в базу знаний системы. При использовании методов обучения типа индуктивных на основе уже полученных данных и знаний система автоматически ищет и выстраивает закономерности между входными и выходными параметрами. Однако в последнем случае важно то, что обучаемая система не требует полного перебора возможных значений и способна аппроксимировать получаемую информацию к уже имеющейся в базе знаний. Это даёт значительное преимущество по сравнению с более старшими статистическими методами, которые нуждаются в как можно более полной выборке возможных наборов входных данных и для которых в случае возникновения ситуации, не описанной в этой выборке, решения не предусмотрены и отсутствуют. Подобные методы часто используются в решении задач кластеризации данных, распознавания, диагностики и прогнозирования.

Преимущества обучаемых систем перед необучаемыми в особенности проявляются при решении задач эвристическими методами, при работе с нечёткой логикой, с естественными языками, с большими объёмами данных, а также в условиях возможной "зашумлённости" (наличия ошибочных данных) в наборе входных параметров. Самостоятельно анализируя входные и выходные значения, обучаемая система способна обрабатывать их гораздо быстрее человека, при этом учитывая возможность возникновения как ошибочных, так и корректных, но ранее не встречавшихся ситуаций.

Большинство существующих сегодня систем, использующих в своей работе алгоритмы искусственного интеллекта и методы машинного обучения, в частности, разработаны с целью решения достаточно узконаправленных задач. Для разработки систем, работающих в разных условиях и с разными наборами входных и выходных, необходимо либо вносить изменения в уже существующие алгоритмы, либо разрабатывать новые. Чтобы избежать трат ресурсов на подобные действия, в рамках данной работы было выдвинуто предложение разработать такую самообучающуюся (включающую в принцип своей работы методы машинного обучения без попутного вмешательства человека) систему, которая в максимально возможной степени не зависела бы от типов и вида входных и выходных данных и была бы способна охватить сразу множество видов решаемых задач. Сам алгоритм самообучения и обработки входных данных при этом следует выделить в отдельный модуль, который в том числе может располагаться удалённо по отношению к остальным частям системы. Такой подход позволит понизить связность системы, максимально абстрагироваться от конкретных решаемых задач и сделать разрабатываемую систему интегрируемой в другие различные по назначению системы.

Стоит при этом упомянуть, что все существующие сегодня автоматизированные системы могут быть разделены на системы пакетной обработки данных, системы разделения времени и системы реального времени. Так как последние являются наиболее требовательными к скорости и надёжности выполнения алгоритмов и работы интерфейсов, а остальные типы систем можно реализовать на основе систем реального времени практически без затрат, следует проектировать и тестировать разрабатываемый алгоритм самообучения оптимально именно по отношению к системам реального времени. При этом одним из примеров системы, в которую будет интегрирован алгоритм, является роботизированная платформа, способная в короткие сроки выполнять поставленные задачи - например, передвижение в пространстве, мониторинг окружающей среды, интеллектуальная система безопасности и т.д.

Как один из ярких примеров использования алгоритмов машинного обучения в системах реального времени и кластеризации входных данных следует рассмотреть разрабатываемые сегодня многими компаниями и организациями беспилотные транспортные средства. Их особенностью является полная автономность в процессе работы, позволяющая не только избежать влияния на передвижения человеческого фактора, но и эффективнее использовать возможности транспортных средств (далее - "ТС"), целесообразнее прокладывать маршруты, вести диагностику внутренних систем ТС, использовать ТС в опасных условиях или при перевозке опасных грузов, предоставлять более широкие возможности по использованию ТС людьми с ограниченными возможностями. На сегодняшний день существует ряд проектов по разработке подобных транспортных средств, потому наработки и открытия в этой области могут стать полезными для разрабатывающих подобные системы групп и компаний. Модель же беспилотного ТС (такой моделью может являться роботизированная передвигающаяся платформа с реализованными в ней интерфейсами обмена данными об окружающей среде и системой распознавания и фиксации верных и ошибочных действий) может позволить протестировать предложенную ранее систему самообучения и на основе полученных по ней результатов создать базу для дальнейшей разработки системы принятия решений, не зависящей от вида входных и выходных данных.

Исходя из вышеописанных соображений, авторы данной работы выявили следующие цели и задачи.

Цели и задачи

Цель: разработать алгоритм самообучения, способный решать широкий спектр задач и не зависящий от вида входных и выходных данных с последующей интеграцией в систему контроля роботизированной передвигающейся платформой.

Задачи:

анализ существующих технических решений;

разработка общей концепции системы;

выбор инструментальных и технических средств выполнения;

выбор метода самообучения;

разработка программного обеспечения самообучающейся системы;

разработка аппаратной части системы (роботизированной передвигающейся платформы) для дальнейшего тестирования алгоритма;

разработка физических и программных интерфейсов аппаратной части системы;

интеграция самообучающейся системы в полученный прототип устройства;

тестирование и отладка системы.

алгоритм искусственный интеллект программирование

После выполнения выявленных задач и по достижении поставленной цели работы полученная система должна удовлетворять следующим требованиям.

Требования к работе системы

Предполагается, что разрабатываемое устройство (роботизированная передвигающаяся платформа) по окончании разработки должно быть способно осуществлять передвижение в пространстве по двум координатам (на горизонтальной поверхности), при этом без заранее предусмотренных решений на каждую возможную ситуацию. Организация принятия решений и дообучения системы должна быть реализована в отдельном программно-аппаратном модуле, а взаимодействие между вычислительной и исполняющей частями системы должно производиться посредством реализованных в рамках работы интерфейсов.

С точки зрения алгоритма самообучения, разрабатываемое программное обеспечение системы должно с заданными точностью и надёжностью выявлять решения, приводящие к корректным действиям клиента в имеющихся в каждый конкретный момент условиях. Для выполнения этой задачи программное обеспечение системы должно удовлетворять следующим выдвигаемым перед ним требованиям:

иметь возможность получать входные значения и выполнять их предварительную обработку (нормализацию и дискретизацию);

быть способным проводить кластеризацию полученных данных;

проводить анализ зависимостей между возможными входными и выходными данными;

корректировать получаемые вышеописанным образом зависимости;

осуществлять взаимодействие с исполняющей (клиентской) частью системы;

хранить полученные результаты после завершения работы.

В свою очередь к исполняющей части системы, включая её аппаратную составляющую, предъявляются следующие требования:

способность получать и сохранять данные об окружающей среде посредством использования цифровых либо аналоговых датчиков;

возможность преобразования получаемых данных в формат, удобный для дальнейшей передачи вычислительной части системы и обработки;

обеспечение корректного и своевременного выполнения необходимых в каждой конкретной ситуации действий - под корректностью в данном случае подразумевается отсутствие действий, ведущих к столкновению платформы и иных объектов, а также долговременных безосновательных простоев.

Отдельные требования для механической составляющей аппаратной части системы (роботизированной платформы):

способность передвигаться в пространстве по плоским и слабо наклонным поверхностям;

обеспечение физической устойчивости.

Планируемые результаты

В качестве критериев оценки результатов были приняты время отклика клиентской части системы, время отклика серверной части системы, среднее время обучения системы для данного объёма обучающей выборки, процент верных действий клиента (качество обучения). Верными считаются те действия платформы, в результате которых она не столкнулась с препятствием и не остановилась без видимой причины (учитывается только последнее совершённое действие).

По вышеуказанным критериям были предположены следующие результаты:

время отклика клиентской части системы - не более 0.5 секунд (исходя из максимально возможной скорости записи изображения с видеокамеры в поток с последующей его передачей в виде структуры по протоколу TCP/IP);

время отклика серверной части системы - не более 0.5 секунд (исходя из необходимости синхронизации с клиентом);

среднее время обучения системы для входных данных объёмом 100 МБ - не более 4 часов (из соображений ограничения времени тестирования);

процент верных действий клиента - более 80%.

Инструментальные и программные средства

В рамках выполнения данной работы были использованы следующие инструментальные и программные средства разработки:

интегрированная среда разработки Qt версии 5.0.1 (включая программные библиотеки Qt);

текстовый редактор Vim;

компилятор GCC версии 6.3;

система контроля версий Git и основанный на ней веб-сервис GitHub;

интегрированная среда разработки Arduino IDE версии 1.8.2 (включая как официальные, так и неофициальные программные библиотеки).

Аппаратные средства

Для реализации аппаратной части роботизированной платформы (далее - клиента) были использованы следующие аппаратные средства:

одноплатный компьютер Raspberry Pi 3 B;

программно-аппаратная платформа Arduino Uno;

ультразвуковой дальномер HC-SR04;

видеокамера Raspicam v2.1;

коллекторных двигателя;

вычислительный центр (персональный компьютер) (далее - сервер);

дополнительные радиоэлементы и элементы питания (подробнее см. в пункте 4 "Выбор элементной базы").

1. Анализ существующих технических решений


В наши дни существует ряд примеров как коммерческих, так и свободных интеллектуальных систем, основанных на алгоритмах самообучения и кластеризации данных. Большинство из таких систем на сегодня представляют по большей части научно-исследовательский интерес, не решая конкретных существующих проблем человеческой жизнедеятельность. Однако существуют и внедрённые в готовые проекты реализации алгоритмов, позволяющие искать решение для отдельных поставленных перед ними задач. Рассмотрим различные существующие аппаратно-программные решения и используемые в них модели и алгоритмы.

 

1.1 Беспилотные автомобили


Наиболее близкой к классу решаемых в данной работе задач сферой является разработка беспилотных транспортных средств. Как оговаривалось в разделе введения, эти ТС имеют значительные преимущества над пилотируемыми аналогами. Безусловно, для реализации подобных аппаратно-программных комплексов требуется использовать методы обработки и кластеризации входных данных с последующей интеграцией в интеллектуальную систему.

Одним из наиболее активно развивающихся и на данный момент имеющих наибольшую базу тестов (более 1 миллиона км пробега автомобилей) является проект Google Car компании Google Inc. Это ТС запланировано как наиболее простой в эксплуатации малогабаритный автомобиль, рассчитанный на перевозку одновременно 1-5 человек. Помимо непосредственно принятия решений и расчёта маршрутов система Google Car обеспечивает минимальный износ внутренних компонентов, мониторинг состояния компонентов, а также корректировку маршрута в соответствие с дорожными условиями. Важной особенностью в работе автомобилей Google Car является многостороннее распознавание объектов окружающей среды. Для его выполнения система анализирует не только графическое изображение объектов, но и их относительную скорость, расстояние до них, температуру объектов, а также строит полноценную объёмную модель окружающей среды, используя лазерный сканер, испускающий лазерные импульсы в 64 направлениях вокруг автомобиля. Таким образом, на основе глубокого анализа окружающей среды, а также использовании данных о расположении важных дорожных объектов (дорожные знаки, светофоры и пр.) можно подготовить обширную базу знаний, состоящую из возможных ситуаций и соответствующих им действиях автомобиля. [1]

Другим крупным проектом в сфере разработки беспилотных ТС является Spirit of Berlin Свободного университета Берлина. Команда разработчиков Spirit of Berlin первой в Германии получила лицензию на разработку беспилотного автомобиля и вела разработку с целью участия в соревновании DARPA Grand Challenge, проводимого среди разработчиков беспилотных ТС для дальнейшего использования министерством обороны Соединённых штатов Америки. Соревнование проводилось в условиях городской среды, и беспилотные автомобили команд-участников должны были не только доехать до установленного пункта, но и соблюдать правила дорожного движения, иметь возможность маневрировать в потоке автомобилей и осуществлять парковку. Так же, как и многие другие проекты беспилотных автомобилей, Spirit of Berlin в процессе работы строит модель окружающей среды по данным с датчиков и прокладывает маршрут, используя систему глобального позиционирования. В состав системы входят следующие аппаратные компоненты:

система позиционирования GPS;

лазерных дальномера, установленные на переднем и заднем бамперах;

лазерный сканер;

сонаправленных видеокамеры, составляющие стереопару;

"всенаправленная" (omnidirectional) камера;

вычислительный мейнфрейм из двух компьютеров, соединённых по протоколу Ethernet.

Реализация системы предполагает работу в условиях городской среды, используя установленные в ней камеры и датчики не только для составления карты окружающей среды, но и для распознавания дорожной разметки и движения по ней. При этом лазерные датчики, расположенные в передней и задней частях автомобиля, используются лишь для корректировки данных с GPS-навигатора, данные с которого, получаемые в режиме реального времени, являются решающими при принятии решений системой. Стереопара, получаемая из двух видеокамер, установленных в передней части автомобиля, позволяет избавиться при реализации системы от использования дальномеров и вспомогательных датчиков распознавания объектов - получаемая информация по структуре аналогична информации, получаемой человеческой зрительной системой. Полученное с камеры изображение проходит через подсистему предварительной обработки, где к изображению применяется оператор Собеля, выделяющий границы объектов на изображении и переводящий изображение в чёрно-белый формат. Это позволяет уменьшить объём поступающей информации и ускорить в дальнейшем её обработку. Кроме того, оператор Собеля хорошо подходит для распознавания дорожной разметки и дорожных знаков. Вся обработка данных производится на вычислительном мейнфрейме повышенной надёжности - в случае выхода из строя одного из компьютеров мейнфрейма, второй "на лету" включается в работу системы, обеспечивая бесперебойное функционирование. В результате была получена система, обладающая повышенной надёжностью и способная производить максимально быстрые расчёты. Несмотря на то, что система не вошла в число победителей соревнования, по ней имеются достаточно обширные результаты успешного тестирования на специальном полигоне при средней скорости передвижения автомобиля, равной примерно 60 км/ч. [2]

В вышеупомянутом соревновании DARPA Grand Challenge победителем стала команда Tartan Racing с их проектом Boss. Для работы системы управления и принятия решений в ней также используются GPS-навигатор, радары, камеры и лазерные сканеры. При этом алгоритм работы состоит из трёх "слоёв": планирования задачи, планирования поведения и планирования движения. Первый слой работает непосредственно с системой глобального позиционирования и прокладывает маршрут внутри города, определяя, по каким улицам движения будет оптимальным. Слой планирования поведения отвечает за выполнение правил дорожного движения. Так, с его помощью система распознаёт, когда следует поменять полосу движения и определяет приоритет участников движения на перекрёстках. После внесения исправлений в траекторию поведенческий слой передаёт свои выходные данные слою движения. Слой движения выполняет наиболее тонкие расчёты, связанные с объездов возникающих на пути препятствий. Таким образом, слои, передавая друг другу посредством программных интерфейсов обработанные ими данные об окружающей среде, выполняют последовательно сужающиеся по значимости и увеличивающиеся по требованиям к скорости обработки данных задачи. Устроенная таким образом архитектура позволяет параллельно работать над разработкой и отладкой разных по виду задач, ослабляя связность элементов системы. [3]

 

1.2 Boston Dynamics


Boston Dynamics - корпорация, занимающаяся разработкой передвигающихся роботов для выполнения разных видов задач. В рамках данной работы следует рассмотреть основные разработки этой компании как пример реализации подвижных роботизированных платформ с элементами распознавания объектов окружающей среды и системой принятия решений. Финансированием Boston Dynamics занимается отдел министерства обороны США DARPA, а также на протяжении некоторого времени компания числилась дочерней фирмой Google Inc.

Одной из наиболее успешных (и наиболее приближенных к разрабатываемой аппаратной системе) разработок Boston Dynamics стал проект BigDog. На его базе в дальнейшем были разработаны многие проекты компании, такие как Cheetah (самый быстрый на сегодня робот-шагоход), LittleDog (почти полный аналог BigDog), LS3 (концепт боевого робота). BigDog представляет собой шагающего робота на 4 роботизированных ногах (Рис.1).

Рис.1 Внешний вид Boston Dynamics BigDog

Основное назначение BigDog - перемещение по пересечённой местности, где это возможно, с переносом грузов с суммарным весом до 150 кг. Для ориентации на местности и распознавания окружающих объектов робот использует стереопару из 2 видеокамер и лазерный сканер, позволяющий создавать объёмную модель окружающей среды. На момент окончания разработок BigDog был способен переносить груз заявленного веса, передвигаться по горизонтальным и наклонным (до 45 градусов) поверхностям, удерживать равновесие в случае возможного падения и восстанавливать исходное положение после падения. Для удержания равновесия и передвижения по наклонным плоскостям встроенная интеллектуальная система анализирует положение "тела" робота относительно его ног. В зависимости от полученных углов наклона (в двух координатах на горизонтальной плоскости) система принимает решение о направлении движения ног и о длине каждого шага. Так, при спуске с горы робот сокращает длину шагов для сохранения горизонтального положения, а при падении в сторону система старается передвигать ноги в сторону падения, осуществляя попытку удержать устройство от падения. Несмотря на значительные успехи в разработке системы и дальнейших планах компании по её развитию в направлении большей автономности, аппаратная платформа имела значительный недостаток - электромоторы, двигающие робота, издавали громкий звуковой шум. Недостаток так и не был устранён, и от системы пришлось отказаться. Однако, как было сказано ранее, Boston Dynamics продолжают разрабатывать другие системы, где используются наработки из проекта BigDog. [4]

Другим важным проектом Boston Dynamics стал антропоморфный робот Atlas (Рис. 2), о разработке которого Boston Dynamics объявили в 2016 году.

Рис.2 Внешний вид Boston Dynamics Atlas

 также предназначен для передвижения по пересечённой местности, где не может проехать колёсная платформа. Однако в отличие от BigDog и производных от него проектов Atlas имеет лишь две ноги и две роботизированные руки. С помощью рук робот способен осуществлять подъём и перенос грузов, а также карабкаться по наклонным поверхностям. Как и BigDog, робот способен удерживать состояние равновесия и подниматься в случае падений. Для ориентации в пространстве и распознавания объектов в нём используется вращающийся лазерный сканер, установленный в верхней части. На данный момент алгоритм, встроенный в Atlas, позволяет ему распознавать по особым меткам грузы, переносить их, выбирать оптимальные для прохождения к выбранному пункту маршруты с учётом наклона поверхности, преодолевать препятствия, в том числе открывать двери. [5] На данный момент какой-либо другой информации о работе и сферах использования робота не предоставляется, однако имеющиеся на сегодня результаты работы системы показывают высокую скорость и корректность работы робота.

 

1.3 Прочие системы


Как видно из предыдущих пунктов, сегодня методы машинного обучения и принятия решений алгоритмами искусственного интеллекта используются в ряде крупных коммерческих проектов, в том числе финансируемых правительствами стран. Большинство из них действительно связаны с автоматизацией передвижений и перевозки грузов, что позволяет использовать накопленные крупными командами наработки для выполнения поставленных в рамках данной работы задач. Однако существуют также разработки, в обозримом будущем представляющие лишь научный интерес и осуществляющиеся как развитыми компаниями, так и отдельными разработчиками-любителями. Обычно информации о деталях работы таких проектов и используемых в них алгоритмах больше, так как они не представляют собой корпоративной тайны, а потому лучше освещены самими разработчиками. Рассмотрим некоторые из них.

Примером самообучающейся системы можно считать связку алгоритма принятия решений "AlphaGo" и аппаратуры, которая делала ходы. AlphaGo - это программа для игры в го, разработанная компанией Google DeepMind. Эта система знаменита тем, что стала первой в мире системой искусственного интеллекта, которая выиграла матч с профессиональным игроком в го (игра с Фань Хуэем в октябре 2015 года). Основным отличием данной программы от подобных является то, что изначально она не была заточена на выигрыш, а лишь "знала" правила игры. Также, в отличие от ранних систем, она не имела непосредственного взаимодействия с базой данных сыгранных партий во время игры. Принцип её действия основан на обучении нейросети с помощью базы данных прошлых игр, а также на дообучении во время игры. Так, например, AlphaGo после матча с Фань Хуэем смогла обыграть свою же "старую" версию до матча. Чтобы оценить позицию или предсказать следующий ход, AlphaGo использует свёрточные нейронные сети. На её вход подаётся несколько обработанное изображение доски с дополнительной информацией. Единственный приём, который изначально знает сеть - "ситё" (захват в лестницу). Для отбрасывания "плохих" ходов AlphaGo использует стратегические нейронные сети - они искусственно уменьшают возможное число ходов. Именно эта нейронная сеть обучается по методу обучения с подкреплением во время игры. Программу периодически заставляют играть со своей видоизменённой версией, чтобы избежать явления переобучения. После отсеивания заведомо плохих ходов строится дерево возможных ходов с текущей позиции игры, производя возможные правдоподобные симуляции развития игровой ситуации. Во время игры для каждого хода подсчитывается оценка, которая позволяет понять, насколько хорошим является рассматриваемый вариант хода. Для решения подобных вычислительных задач, требуются большие вычислительные мощности. Обучение системы происходило на платформе Google Cloud в течение нескольких недель. При игре используется порядка 1200 процессоров и 180 графических процессоров. При этом сами игроки и обозреватели характеризуют отдельные ходы программы как "креативные" и освещающие нетипичные решения, которые игроки могут использовать в дальнейших партиях [6]. [7] Данная система является примером использования "многоярусных" нейросетей, использующих несколько последовательно выстроенных методов обучения без предварительного наличия информации о среде своего применения. Кроме того, методы, использованные в ней, теперь применяются DeepMind в других сферах, включающих в себя алгоритмы искусственного интеллекта.

Одним из проектов выпускных студенческих работ Королевского технологического института в Стокгольме, Швеция, стала разработка автономной роботизированной передвигающейся платформы, способной объезжать препятствия. Как видно из постановки этой задачи, данный проект максимально близок по идее и реализации к системе, разрабатываемой в данной работе. Работа по созданию платформы была выполнена студентом вышеупомянутого института Джейкобом Экезундом в 2016 году. Для реализации поставленной задачи он использовал роботизированную платформу с тремя колёсами, драйвером электромоторов, программно-аппаратной платформой Arduino Uno и двумя ультразвуковыми дальномерами HC-SR04 (Рис.3 и Рис.4).

Рис.3 Схема соединений устройства роботизированной передвигающейся платформы

Рис.4 Внешний вид готовой роботизированной передвигающейся платформы

Ультразвуковые дальномеры расположены на передней и правой частях платформы. Во время работы платформа постоянно едет вперёд, одновременно "прижимаясь" вправо. Однако она удерживает дистанцию в 15 сантиметров путём регулярного считывания значений с дальномеров и корректировки направления и скорости вращения двух задних электромоторов. При этом в случае, если передний дальномер не обнаруживает объектов, расположенных ближе, чем в 50 сантиметрах от него, скорость выбирается максимальной, что соответствует подаче постоянного напряжения с контроллера двигателей на электромоторы. Если же расстояние меньше 50 сантиметров, то скорость может варьироваться между значениями в 0, 20, 50 и 80 процентов от максимальной, что достигается путём подачи контроллером переменного напряжения с разной временной задержкой на максимальном значении напряжения. Таким образом, платформа совершает круговые движения против часовой стрелки по предоставленному ей помещению. Несмотря на относительную простоту такой системы, в рамках выполнения поставленных в данной работе задач полезно рассмотреть принципы управления платформой на низком уровне и основы работы с датчиками.

1.4 Выводы к разделу 1


На сегодняшний день существуют программы и рабочие прототипы устройств, в основе работы которых лежат алгоритмы принятия решений, кластеризации данных и самообучения. В рамках выполнения данной работы были использованы наработки из этих систем, а также учтены достоинства и недостатки отдельных подходов к реализации разрабатываемой системы. Так, были приняты решения об использовании в работе нейронных сетей, позволяющих не зависеть от смысла, вкладываемого в те или иные входные данные, проведении предварительного сжатия данных, позволяющего ускорить дальнейшие этапы работы системы и заимствованы основы проектирования аппаратной исполнительной части (роботизированной платформы).

2. Структурное решение


В рамках выполнения данной работы одной из первых задач являлось создание общей структурной схемы системы. Для этого были выявлены следующие задачи, которые должна решать система, будучи включённой в работу роботизированной передвигающейся платформы:

а) получать информацию об окружающей среде;

б) обеспечивать стабильное соединение между сервером и клиентом посредством сетевых протоколов;

в) обеспечивать максимально быстрый поиск решений в ситуациях, встречавшихся ранее;

д) обеспечивать принятие решений для ситуаций, не встречавшихся ранее;

е) передавать выбранное решение в виде кода действия клиенту;

ж) в любой ситуации обеспечивать корректное выполнение клиентом действий, эквивалентных кодам действий.

Рассмотрим подробнее особенности каждой из поставленных задач:

для получения информации об окружающей среде (пункт а) система может использовать ультразвуковой дальномер и цифровую видеокамеру. Такой набор аппаратных средств был выбран ввиду того, что он обеспечивает одновременно достаточное время отклика клиента, относительную простоту реализации интерфейсов и полноту информации об окружающей среде;

для обеспечения соединения между сервером и клиентом (пункт б) был выбран стандарт связи 802.11b (Wi-Fi, 2.4 ГГц). Этот стандарт позволяет обеспечивать стабильное удалённое соединение на достаточном расстоянии и с достаточной шириной и скоростью работы канала, что обеспечивает достаточное время отклика сервера, минимизированное время передачи данных между сервером и клиентом, а также позволяет сделать сервер и клиент физически независимыми, что важно при условии, что сервер является массивным и крупногабаритным относительно платформы клиента. Передача данных производится с использованием TCP-сокетов;

для поиска решения в ситуации, встреченной системой ранее (пункт в), было принято решение формировать базу знаний из описывающих встреченные ситуации значений и выбранных для этих ситуаций решений (кодов действий). При этом такая база знаний должна храниться локально в файловой системе клиента для устранения задержек, связанных с запаковкой данных, передачей их с клиента на сервер и обратно и распаковкой данных. При этом максимальную скорость обработки встреченной ранее ситуации будет обеспечивать также и то, что локальная хранилище данных клиента содержится на microSD-карте класса V30, что позволяет с минимальными задержками искать объёмные данные по файлу базы знаний. Идентичный файл базы знаний также хранится и в файловой системе сервера;

для обеспечения принятия решения в ситуации, не встречавшейся ранее (пункт д), была разработана самообучающаяся система, позволяющая аппроксимировать ситуацию к встречавшейся ранее и выбрать для неё наиболее подходящее решение. Эта система в процессе работы клиента должна быть запущена на сервере в режиме прослушивания;

для обеспечения выполнения клиентом корректных действий (пункт ж) была составлена таблица возможных действий. Эти действия с указанием их кодов приведены в Таблице 1. По полученному (от сервера, либо из локальной базы знаний) коду действия клиент выставляет значения собственных скорости и направления движения. Эти значения также приведены в Таблице 1 для каждого из двух двигателей, соответственно каждому коду действия. Все значения, записанные в Таблице 1, являются безразмерными величинами. В процессе выполнения действий клиент записывает в локальный лог-файл информацию о корректности своих действий. Корректным считается действие, в результате которого клиент не остановился без причины и не столкнулся с препятствием.

Таблица 1. Соответствие кодов действий клиента, их кодов и значений скорости и направлений движения клиента для каждого из двигателей

Наименование действия

Код действия

Значение направления движения

Значение скорости движения/Значение подаваемого напряжения, В



Левый двигатель

Правый двигатель

Левый двигатель

Правый двигатель

Остановка

0

Как на предыдущем шаге

Как на предыдущем шаге

0/0

0/0

Движение вперёд

1

1

1

255/5

255/5

Движение вперёд и влево

2

1

1

128/3.3

255/5

Движение вперёд и вправо

3

1

1

255/5

128/3.3

Движение назад

4

-1

-1

255/5

255/5

Движение назад и влево

5

-1

-1

128/3.3

255/5

Движение назад и вправо

6

-1

-1

255/5

128/3.3


Для ситуаций, в которых клиент не может получить код действия (прервано соединение с сервером, невозможно получить доступ к локальной базе знаний, либо время получения кода действия оказывается больше времени между получением значений предыдущей и текущей ситуаций) предусмотрено действие по умолчанию, эквивалентное действию "Остановка". При этом в таком случае действие записывается как ошибочное в лог-файл (беспричинная остановка).

Для реализации системы, выполняющей поставленные задачи, были предложены следующие структурные решения для клиентской и серверной частей.

 


2.1 Структурное решение для клиентской части


Для решения поставленных задач была составлена структурная схема клиента, представленная на Рис. 5.

Рис.5 Структурная схема клиента

Расшифровка условных обозначений компонентов системы приведена в Таблице 2. Стрелками показаны направления передачи данных между компонентами.

Таблица 2. Условные обозначения компонентов системы

Условное обозначение

Расшифровка

SB-computer

Одноплатный компьютер

Microcontroller

Программно-аппаратная платформа микроконтроллера

Motor shield

Плата аппаратного драйвера электродвигателей

Processing center

Вычислительный центр (сервер)

Database

Локальная база знаний клиента

Camera

Цифровая видеокамера

Rangefinder

Ультразвуковой дальномер

Wi-Fi module

Модуль Wi-Fi, обеспечивающий соединение по стандарту 802.11b

Left Motor

Левый коллекторный электродвигатель

Right Motor

Правый коллекторный электродвигатель


Наличие сервера на структурной схеме клиента обусловлено необходимостью показать схему обмена данными между клиентом и сервером. С учётом выбранных аппаратных средств разработки (см. раздел 1, подраздел 1.4 "Аппаратные средства") получаем структурную схему клиента, представленную на Рис.6.

Рис.6 Структурная схема клиента с учётом выбранных аппаратных средств

Wi-Fi модуль при этом фактически входит в состав одноплатного компьютера Raspberry Pi 3 B и показан на Рис.1 и Рис.2 отдельным компонентом для большей наглядности используемых физических интерфейсов.

Полученная структурная схема клиента обеспечивает его модульность, независимость компонентов друг от друга, а также удобство обмена данными между клиентом и сервером.

 

2.2 Структурное решение серверной части


Задачей серверной части является преобразование "ситуации" (вектора чисел) в номер одного из возможных действий. Задача разработки такого программного обеспечения разбивается на несколько подзадач:

а) Разработка алгоритма принятия решений (нейросети);

б) Разработка оболочки над алгоритмом принятия решений, которая будет осуществлять первичное обучение нейросети;

в) Разработка интерфейса между нейросетью и клиентской частью, будет служить конечным транслятором "ситуации" в номер действия.

Эти подзадачи в рамках ООП образуют следующий набор классов:

а) нейрон - элементарная частица нейросети. Предполагается реализация метода, позволяющая измерить Евклидово расстояние до другого нейрона;

б) нейросеть - контейнер для нейронов, обладающий функционалом, необходимым для обучения. Конкретный набор методов зависит от выбора конкретного типа нейросети;

в)"учитель" - оболочка над нейросетью, которая должна обладать функционалом обучения сети, а так же быть интерфейсом между нейросетью и клиентской частью, который должен обладать функционалом приёма ситуации от клиента и возврата клиенту номера действия.

В соответствии с определённым набором классов, разработана диаграмма классов (Рис. 7).

Рис. 7. Диаграмма классов серверной части

Следует отметить, что у "ситуации" и "нейрона" класс один и тот же в силу того, что для ситуации все поля и методы класса Neuron одинаковы.

Основными полями класса NeuralNetwork являются:

а) map - вектор нейронов;

б) mapUsage - вектор показателей того, использовался ли соответствующий нейрон в данной эре;

Основными методами класса NeuralNetwork являются:

а) addNewCenter (Neuron situation) - на вход метода подаётся ситуация, которая становится новым нейроном сети;

б) correctWinnerCoordinate (Neuron situation, int winID) - изменить координаты нейрона-победителя;

в) getCluster (Neuron situation) - получить номер кластера по поданной ситуации. Второй параметр отвечает за возможность создания нового нейрона из данной ситуации.

Основными полями класса Teacher являются:

а) map - объект класса NeuralNetwork;

б) translator - двумерный вектор, хранящий статистику соотношения действия и номера кластера при обучении;

Основными методами класса Teacher являются:

а) train (float Rcritical, float v, float dv) - обучить имеющуюся нейросеть всеми имеющимися обучающими выборками с поданными параметрами нейросети;

б) situationToAction (Neuron situation) - выдать номер действия по поданной ситуации.

 

2.3 Выводы к разделу 2


Разработана общая структурная схема устройства-клиента;

выбраны методы взаимодействия устройств внутри системы и построена таблица кодирования условных сигналов для обмена информацией внутри клиента и между клиентом и сервером;

разработана структура программного обеспечения на серверной части.

3. Выбор элементной базы


3.1 Выбор основных вычислительных и исполнительных компонентов


Для разработки аппаратных и программных интерфейсов было принято решение использовать программируемые микроконтроллеры. При этом было выявлено два варианта: использование отдельно микроконтроллеров (например, STM32F1) и программаторов к ним или использование готового набора смонтированных печатных плат, таких как Arduino или Iskra Neo. Использование собранного набора значительно проще, так как на плату изначально смонтированы непосредственно микроконтроллер, программатор, интерфейсные порты, аналоговые и цифровые входы и выходы (далее - "пины"), а также имеется возможность подключение готовых модулей и датчиков. Также для подобных плат существует множество удобных в использовании программных библиотек, по которым имеется большое количество наработок и документации. Таким образом, плата может быть запущена “из коробки”, не нуждается в пайке и большом количестве коммуникаций. Отдельный же контроллер требует подключения программатора и адаптеров для подключения внешних устройств по интерфейсам - например, USB или Ethernet. И хотя в большинстве случаев использование отдельного микроконтроллера является более дешёвым и гибким вариантом, выбор был остановлен на использовании готовых плат.

Среди наборов смонтированных печатных плат яркими представителями являются Arduino, Raspberry Pi, Iskra Neo и LinkIt One. Рассмотрим их по отдельности.

 

3.1.1 Arduino Uno

Аппаратно-программная платформа Arduino широко известна и популярна в использовании, так как стала одной из первых плат, позволяющих без лишних усилий создавать прототипы устройств. Благодаря этому у платформы имеются обширное сообщество, содержательная документация, а также множество недорогих, простых в эксплуатации подключаемых модулей, плат расширения и программных библиотек. [8] Помимо этого, разработчики предоставляют собственную IDE (среду разработки), которая позволяет скомпилировать и загрузить на плату исполняемый код. Одной из важных особенностей платы является наличие как цифровых, так и аналоговых пинов (контактов), способных работать в дуплексном режиме. Также преимуществом Arduino является сравнительная дешивизна аппаратной составляющей.

 

3.1.2 Iskra Neo

Плата Iskra Neo является “клоном" Arduino от российской компании “Амперка”, представляя собой плату с аналогичным размещением пинов и портов, однако доступна она по более низкой цене. Несмотря на более низкую стоимость (при равных технических характеристиках), Iskra Neo не имеет такого большого распространения, что сказывается на качестве технической поддержки, количестве свободной информации и известных показателях надёжности.

 

3.1.3 Raspberry Pi 3

Raspberry Pi отличается от предыдущих рассмотренных плат тем, что является полноценным одноплатным микрокомпьютером со сравнительно большим объёмом оперативной памяти, возможностями подключения microSD-носителя с предустановленной операционной системой и прямого подключения к сети. [9]

Таким образом, Raspberry Pi является более мощным устройством, чем контроллер, целью которого являются считывание данных с датчиков и подача напряжения на движущие элементы роботизированной платформы. Однако в дальнейшем Raspberry Pi также используется для наиболее ресурсоёмких процессов - обработки изображения с видеокамеры, соединения с вычислительным центром по Wi-Fi и принятии и передаче контроллеру решения о необходимом действии.

 

3.1.4 LinkIt One

LinkIt One является платой, разработанной совместно компаниями MediaTek и Seeed Studio. Так же, как и Raspberry Pi, эта плата представляет из себе сравнительно мощный одноплатный компьютер. Преимуществом её является полное совпадение расположения пинов с Arduino, что делает её хорошо совместимой с этой контроллерной платой. Также LinkIt имеет множество интерфейсов - I2C, SPI, UART, преобразователь UART-USB, Bluetooth - и встроенную систему глобального позиционирования. Однако её стоимость в России значительно превышает стоимость аналогов, а по сравнению с Raspberry Pi плата имеет слишком малый объём оперативной памяти и слишком низкую тактовую частоту процессора.

Таким образом, исходя из вышеописанных факторов, было принято решение использовать комбинацию плат Arduino Uno и Raspberry Pi 3.

 

3.2 Выбор дополнительных радиоэлементов и элементов питания


Для реализации клиентской части системы необходимо выбрать не только модели основных вычислительных/исполнительных компонентов и датчиков, но также и элементы, обеспечивающие подачу на компоненты электропитания и корректные значения токов и напряжений в цепи. Для выбора соответствующей элементной базы необходимо составить принципиальную схему устройства. Составленная принципиальная схема приведена на Рис.3. Так как драйвер электродвигателей целиком адаптирован для работы с платой Arduino Uno и его входные пины расположены идентично пинам Arduino Uno, принципиальная схема клиента была разбита на две части. Подключение электропитания и электродвигателей к драйверу двигателей показано на Рис.4. При этом схемы на Рис.8 и Рис.9 непосредственно связаны цифровыми и аналоговыми пинами Arduino Uno и драйвера двигателей.

Рис.8 Принципиальная схема клиентской части системы

Рис.9 Принципиальная схема подключения электропитания и электродвигателей к драйверу двигателей клиентской части системы

В качестве источника тока 2.1 А на Рис.3 был выбран элемент питания Qumo PowerAid 10000. В качестве источника напряжения 7.5 В на Рис.4 был выбран блок из 5 последовательно включённых гальванических элементов с напряжением 1.5 В на каждом из них. Итоговая элементная база представлена в Таблице 3.

Таблица 3. Элементная база клиентской части системы

Наименование элемента/компонента, номинал

Наименование выбранной модели

Количество

Одноплатный компьютер

Raspberry Pi 3 B

1

Аппаратно-программная платформа микроконтроллера

Arduino Uno

1

Источник тока, 2.1 А

Qumo PowerAid 10000

1

Источник напряжения, 1.5 В

Varta 4103 (A286/LR03/AAA) 1

5

Резистор, 10 кОм

CF-25 (С1-4)

2

Цифровая видеокамера

Raspicam v2.1

1

Ультразвуковой дальномер

HC-SR04

1

Коллекторный электродвигатель

DG02S-A130

2

Драйвер электродвигателей

Amperka Motor shield

1


В результате подбора описанной элементной базы была собрана аппаратная платформа клиентской части системы, позволяющая осуществлять удалённое, либо автономное управление по передвижению клиента, а также обеспечить бесперебойный обмен данными между клиентом и сервером системы.

 

3.3 Выводы к разделу 3


Рассмотрены возможные популярные варианты микроконтроллерных плат и одноплатных компьютеров, выбраны наиболее подходящие по критериям необходимого набора функций, технических характеристик, объёму открытой документации и материальной доступности;

для выполнения поставленных задач выбраны основные цифровые датчики, механические элементы и дополнительные радиоэлементы;

составлена принципиальная схема устройства-клиента.

4. Выбор языков программирования и инструментальных средств разработки


Для реализации как клиентской, так и серверной частей системы необходимо было выбрать инструментальные и языковые (языки программирования) средства разработки. Рассмотрим их выбор для каждой из частей системы.

При выборе инструментальных и языковых средств разработки для написания программного обеспечения клиентской части системы следует иметь в виду, что для работы клиента не требуется объёмное ПО, потому нет смысла пользоваться сложными интегрированными средами разработки (далее - IDE) и создавать крупные проекты из множества файлов. Весь программный интерфейс можно спроектировать в рамках относительно небольшого исполняемого файла скрипта. При этом таких скриптов требуется по одному для управления каждой из плат Rapberry Pi и Arduino.

Для платы Arduino Uno разработчики поставляют собственную IDE "Arduino IDE", которая помимо текстового редактора содержит набор готовых программных библиотек, а также инструменты для компиляции и загрузки готового скрипта на микроконтроллер платы через USB-порт компьютера. Использование данной IDE сильно упрощает и ускоряет написание программного интерфейса платы, а также гарантирует стабильное выполнение загруженных посредством этой среды скриптов (внутри среды скрипты имеют название "скетчи"). Программирование в среде производится на языке программирования C, что позволяет сочетать удобство и гибкость написания программы с малым количеством используемых ресурсов (что особенно важно ввиду наличия у платформы Arduino Uno всего 32 кБ доступной оперативной памяти) и высокой скоростью исполнения скомпилированной программы. Исходя из всех вышеописанных преимуществ для написания программного интерфейса (далее - "прошивка") платы Arduino Uno были выбраны "Arduino IDE" в качестве инструментального средства разработки и язык программирования C в качестве языкового средства разработки.

Разработчики одноплатного компьютера Raspberry Pi не предоставляют собственных инструментальных средств разработки, однако для работы с платой предлагают использовать собственный дистрибутив операционной системы (далее - "ОС") Linux на базе дистрибутива Debian под названием "Raspbian". Использование этого дистрибутива позволяет проектировать и реализовывать сравнительно сложное программное обеспечение с использованием крупных поддерживаемых инструментальных средств. Однако в рамках выполнения поставленных перед клиентской частью задач (обмен данными с сервером, обмен данными с локальной базой знаний, получение и компоновка полученных с дальномера и видеокамеры данных и подача кодов действий платформе Arduino посредством USB-интерфейса) достаточно использовать простые интерпретируемые языки программирования, такие как Python или Shell. Написанные на этих языках скрипты работают медленнее, чем аналогичные программы на компилируемых языках, однако предполагаемой скорости вычислений достаточно для получения ожидаемых результатов, при этом преимущества написания интерпретируемых скриптов следующие:

значительно сокращаются объём написанного кода и время его написания;

упомянутые скриптовые языки имеют удобный синтаксис работы со списками и массивами, не зависящими от типов данных, хранимых в них;

не требуется установка дополнительных пакетов IDE, компиляторов и прочих - интерпретатор языка Shell уже предустановлен в ОС Raspbian (для запуска скриптов, написанных на языке Python, необходимо установить интерпретатор Python);

готовые скрипты можно добавить в init-скрипт ОС - благодаря этому написанный скрипт будет автоматически запускаться при загрузке системы и будет равносилен прошивке платы;

на языке Python имеются готовые как официальные, так и неофициальные библиотеки, позволяющие эффективно работать с цифровыми пинами платы и с камерой Raspicam, включенной непосредственно в интерфейс камеры, смонтированный на плате.

По вышеописанным причинам для написания программного интерфейса одноплатного компьютера Raspberry Pi в качестве языковых средств были выбраны языки Python и Shell, а в качестве инструментальных средств разработки - свободно распространяемый редактор Vim. Редактор Vim был выбран ввиду его удобства при написании программных скриптов на упомянутых языках, большого объёма функциональных возможностей и наличия сравнительно большого опыта работы с редактором у авторов данной работы.

Серверная часть системы решает намного более сложные задачи, нежели клиентская часть. Также при обучении нейросети выполняется большое количество расчетов (самая вычислительно сложная часть - определение расстояния между N-мерными векторами в силу большой мерности пространства). Поэтому для реализации серверной части программного обеспечения целесообразно использовать один из компилируемых языков программирования, так как интерпретируемые языки, как правило, работают по менее эффективному коду. К тому же язык должен отвечать следующим требованиям:

кроссплатформенность (разработка и реализация алгоритма будет происходить на компьютере с ОС Windows, обучение нейросети - на сервере с ОС Linux);

поддержка параллельных вычислений (для более эффективного обучения на многоядерном сервере);

простота интеграции приложения в общую структурную схему устройства.

По вышеперечисленным причинам, а так же исходя из опыта разработки исполнителя, для реализации серверной части был выбран язык С++.

В качестве среды разработки серверной части была выбрана IDE Qt Creator по причинам:

поддержка кроссплатформенности (во время разработки и тестирования могут потребоваться изменения в коде программы);

встроенный отладчик с графическим интерфейсом более удобен, чем, например, gbe - отладчик с консольным интерфейсом;

поддержка отладки многопоточных приложений;

привычная для исполнителя среда разработки;

наличие встроенной документации на Qt библиотеки (у серверной машины может не быть доступа к Internet).

 

4.1 Выводы к разделу 4


Рассмотрены основные существующие инструментальные и языковые средства разработки. Для поставленных задач выбраны наиболее подходящие с точек зрения доступности, практичности и наличию необходимых программных библиотек и фреймворков средства.

5. Выбор алгоритма самообучения


В настоящее время существует большое количество методов автоматизированного принятия решений. Большая их часть относится к машинному обучению - разделу искусственного интеллекта, изучающего методы построения моделей, способных обучаться, и алгоритмов для их построения и обучения. В свою очередь, методы машинного обучения разделяются по способам обучения [10]:

обучение с учителем - способ машинного обучения, в ходе которого испытуемая система принудительно обучается с помощью примеров "стимул-реакция". Для каждого прецедента задаётся пара "ситуация, требуемое решение";

обучение без учителя - способ машинного обучения, при котором испытуемая система спонтанно обучается выполнять поставленную задачу без вмешательства со стороны экспериментатора. Для каждого прецедента задаётся только "ситуация", требуется сгруппировать объекты в кластеры, используя данные о попарном сходстве объектов, и/или понизить размерность данных;

обучение с подкреплением - способ машинного обучения, в ходе которого испытуемая система (агент) обучается, взаимодействуя с некоторой средой. Для каждого прецедента имеется пара "ситуация, принятое решение".

Идея алгоритма обучения в рамках поставленных задач состоит в том, чтобы "показать" обучающемуся алгоритму как нужно себя вести, записывая обучающую выборку, которая представляет собой:

описание ситуации, в которой мы сейчас находится платформа (т.е. показания имеющихся датчиков, преобразованных в N-мерный вектор);

действие, которое сделал эксперт (пользователь) в данной ситуации.

Очевидно, что сформировать такие пары на каждую уникальную ситуацию невозможно. Возможности формирования подобной базы знаний ограничиваются заданием действий в небольшом количестве ситуаций, которые очень мало покрывают множество всех возможных вариантов. Поэтому целесообразно объединять ситуации между собой, чтобы выявить похожие. Тогда возможно в большем объёме покрыть возможные ситуации. Отсюда задача машинного обучения сводится к задаче кластеризации входных данных, а также к реализации интерфейса, производящего трактовку номера кластера в действие.

Так как заранее неизвестно ни количество кластеров, ни признаки, по которым будет происходить кластеризация, в разрабатываемой системе отсутствует "учитель" (здесь важно подчеркнуть разницу между "учителем" в области машинного обучения и "экспертом", который будет задавать "правильные" действия). Поэтому для кластеризации данных необходимо воспользоваться одним из методов обучения без учителя. Среди этих методов наиболее распространены:

иерархическая кластеризация или таксономия - совокупность алгоритмов упорядочивания данных, визуализация которых обеспечивается с помощью графов. Алгоритмы упорядочивания данных указанного типа исходят из того, что некое множество объектов характеризуется определённой степенью связности. Предполагается наличие вложенных групп (кластеров различного порядка);

нейронная сеть Кохонена - класс нейронных сетей, основным элементом которых является слой Кохонена. Слой Кохонена состоит из адаптивных линейных сумматоров ("линейных формальных нейронов"). Как правило, выходные сигналы слоя Кохонена обрабатываются по правилу "Победитель получает всё";

метод ближайших соседей (k-means) - действие алгоритма таково, что он стремится минимизировать суммарное квадратичное отклонение точек кластеров от центров этих кластеров. [11]

Несмотря на то, что метод k-средних довольно популярен при кластеризации, у него имеется ряд существенных недостатков:

не гарантируется достижение глобального минимума суммарного квадратичного отклонения V, а только одного из локальных минимумов;

результат зависит от выбора исходных центров кластеров, их оптимальный выбор неизвестен;

число кластеров необходимо знать заранее.

Так как проводить подробное исследование n-мерных векторов затруднительно, для решения поставленных задач метод ближайших соседей не подходит.

Схожими недостатками обладают и методы иерархической кластеризации. Для того чтобы построить оптимальное дерево решений, необходима трудоёмкая обработка входных данных. Поэтому в качестве алгоритма кластеризации ситуаций целесообразно использовать один из группы нейросетей Кохонена. К примеру, самоорганизующаяся карта Кохонена не требовательна к входным данным - для нее входными данными являются n-мерные вектора-ситуации. Также при её реализации нет необходимости проводить подробное исследование данных - достаточно подсчитать средние расстояния между наборами ситуаций в обучающей выборке.

Идея транслятора "кластер-действие" состоит в том, что в ходе обучения заполняется база данных вида, представленного в Таблице 4.

Таблица 4. Вид базы данных транслятора

Кластер №1

Количество действий №1

Количество действий №m

Количество действий №1

Количество действий №m

Кластер №n

Количество действий №1

Количество действий №m


На стадии обучения при подаче примера из обучающей выборки в Карту мы получаем на выходе из неё номер кластера, в который попал данный вектор-ситуация. В соответствующей номеру кластера и номеру действия ячейке счётчик увеличивается на 1 (начальная инициализация всех ячеек - 0).

На стадии использования инструмента трактовки на входе мы имеем номер кластера, к которому принадлежит данная ситуация, а на выходе мы получаем номер действия. Оно выбирается по максимальному значению количества действий для данного кластера, т.е. если внутри кластера чаще всего "правильным" действием было действие №k, то именно оно будет выполнено при использовании. Это позволяет уменьшить влияние человеческого фактора, несмотря на то, что обучение, по сути, происходит по подобию действий эксперта (человека).

 

5.1 Выводы к разделу 5


Поставленные задачи входят в рамки алгоритмов обучения без учителя;

нейронная сеть Кохонена является наиболее подходящим алгоритмом для выполнения поставленных задач;

сформирована структура записей для базы данных транслятора.

6. Методы решения поставленных задач


6.1 Проектирование алгоритма самообучения


Рассмотрим принцип действия самоорганизующейся карты Кохонена (далее - "Карта"). Карта представляет собой один слой нейронов, на каждый выходной кластер приходится один нейрон. Первой стадией использования Карты является её обучение. Оно происходит по следующему алгоритму [12]:

а) задаётся критическое расстояние Rкр - это расстояние, которое соответствует минимальному возможному Евклидову расстоянию между местонахождением нейрона-победителя в N-мерном пространстве и местонахождением текущего примера из обучающей выборки;

б) на вход Карты подаётся i-ый пример из обучающей выборки, выбранный из неё случайным образом;

в) рассчитываются Евклидовы расстояния (формула 6.1) между i-ым примером и каждым нейроном Карты. По минимальному расстоянию определяется номер нейрона-победителя;

д) если расстояние от i-ого примера до нейрона-победителя больше, чем Rкр, то образуется новый нейрон с таким же расположением в N-мерном пространстве, как и i-ый пример из выборки;

е) если расстояние от i-ого примера до нейрона-победителя меньше или равно Rкр, то считается, что i-ый пример выборки принадлежит нейрону-победителю. Производится смещение нейрона победителя в сторону i-ого примера с некоторым коэффициентом V (формула 6.2), который линейно уменьшается с возрастанием номера эпохи;

ж) переход на п. б) данного алгоритма, если остались примеры в обучающей выборке;

к) если примеров в выборке не осталось, то номер эпохи увеличивается, V уменьшается на DV (уменьшение скорости обучения), нейроны, к которым в течение этой эпохи не был привязан ни один пример из обучающей выборки, удаляются из Карты.

Обучение происходит выполнения одного из условий окончания:

задано и достигнуто максимальное количество эпох обучения (в нашем случае);

задано и достигнуто предельное физическое время обучения;

в течение последней эпохи обучения нейроны не изменили своего положения в N-мерном пространстве на значение, большее заданного числа.

 (6.1)

где i - параметр N-мерного вектора, j - номер текущего нейрона, W - имеющийся в нейросети нейрон, X - пример из обучающей выборки.

 (6.2)

где q - номер состояния j-ого нейрона, i - параметр N-мерного вектора, X - вектор расположения текущего примера выборки, V - скорость обучения.

Отдельной задачей можно выделить подбор варьируемых параметров Карты - Rкр, V, DV. Касаемо выбора первоначального параметра скорости обучения V, следует исходить из соображений о том, что на начальных стадиях обучения Карты (первые эпохи обучения) центры кластеров подбираются с высокой погрешностью, по конкретному примеру из выборки. В связи с этим целесообразно перемещать центр кластера к новому примеру выборки с достаточно большим (но, очевидно, меньше 1) коэффициентом. Для данной работы первоначальной скоростью обучения было выбрано значение V = 0.7, т.е. центр кластера перемещается в сторону нового примера, попавшего в этот кластер, на 70% расстояния между ними. Это позволит на начальных стадиях обучения довольно быстро приблизиться к "идеальному" центру.

Коэффициент DV выбирается исходя из предполагаемого количества эпох обучения - нам нужно добиться минимального V на последних эпохах обучения - около 0.05. В результате пробных запусков обучения Карты было установлено, что количество эпох обучения, при котором явление переобучения не наблюдается, около 50. Исходя из этой информации, значение DV выбрано равным 0.013.

Для выбора Rкр необходимо провести исследование входных данных, как отмечалось выше. Это связано с тем, что при выборе слишком большого Rкр в ходе обучения образуется слишком малое количество кластеров, что приведёт к плохой распознаваемости (различные по требуемому действию ситуации с большой вероятностью попадут в один кластер, соответственно, в большом числе случаев действие будет выдаваться ошибочно). С другой стороны, при выборе слишком малого Rкр количество кластеров будет чрезмерно большим (крайний случай - на каждую ситуацию образуется собственный кластер), соответственно пропадает смысл кластеризации.

Как отмечено в разделе 5, для реализации алгоритма кластеризации был использован язык С++. Самоорганизующаяся карта была сформирована в класс SOM (NeuralNetwork на диаграмме классов). Также в отдельный класс "neuron" вынесен объект "нейрон". Заголовки вышеописанных классов представлены ниже.

som. h:

private::: vector<neuron> map; // Вектор нейронов:: vector<bool> mapUsage; // вектор, обозначающий использование нейронов на данной эпохе

double v; // Скорость обучения

double dv; // Изменение скорости обучения при переходе между эпохами

unsigned int addNewCenter (neuron neu); // Добавление neu в качестве центра кластера

unsigned int correntWinnerWeight (neuron neu, int winID); // перерасчет значения центра кластера tAnswer [4]; // массив значений функции getMin при параллельных вычислениях (4 потока)

public:

SOM (); // конструктор по умолчанию

bool setVandDV (double _v, double _dv); // установка V и DV

unsigned int sendNeuron (neuron neu, bool isNoChange = false); // получить номер кластера для ситуации neu

std:: vector<bool> getUsage (); // вернуть вектор использования

void endOfEra (); // действия в конце каждой эры

void getMin (unsigned int id, unsigned int begin, unsigned int end, neuron neu); // функция подсчета минимального расстояния от ситуации до каждого кластера. Вызывается параллельно.

neuron. h:

neuron (); // конструктор по умолчанию

neuron (QString imageName, QString prefix); // конструктор, загружающий "ситуацию"

double getDistance (neuron other); // Евклидово расстояние до другого нейрона

void saveToFile (FILE *f); // запись нейрона в файл

void loadFromFile (FILE *f); // загрузка нейрона из файла

void normalize (unsigned int maxValue = 255, unsigned int minValue = 0); // нормализация параметров нейронаloadFromImage (QString imageName, QString prefix); // метод, повторяющий функционал конструктора clear (); // очистка значений нейрона

Для подсчёта статистики выполняемого действия на каждый кластер, а так же для обучения нейросети, был сформирован класс teacher. Помимо обучения нейронной сети этот класс выступает в качестве интерфейса между нейронной сетью и клиентом. Заголовок данного класса представлен ниже.

teacher. h

public:

teacher (); // конструктор по умолчанию

void train (std:: string trainingSetFolder, float Rcritical, float v, float dv); // провести тренировку нейронной сетиtest (std:: string testFolder, int testNumber); // протестировать нейросеть на имеющихся примерах:std:: vector<unsigned int> clusterAction; *map; // указатель на объект "нейросеть"

std:: vector<clusterAction> translator; // вектор, хранящий информацию о попадании действия в кластер

std:: vector<situation_act> currentTrainingSet; // вектор, хранящий текущую обучающую выборку

void loadLastState (); // загрузить последнее имеющееся состояние нейросети и транслятора

bool loadNextDataBase (std:: string trainingSetFolder); // загрузить базу данных в память

void teachCurrentTrainingSet (float Rcritical, float v, float dv); // провести тренировку нейросети на текущей выборке

unsigned int situationToAction (neuron situation); // интерфейс между нейросетью и клиентом

 


6.2 Предварительная обработка входных данных


Для решения поставленных задач помимо сборки аппаратной составляющей системы необходимо было также разработать программную составляющую. Для этого сперва были оценены характеристики и объёмы данных, которыми обмениваются клиент и сервер внутри системы. Оценка производилась с учётом следующих пунктов:

изображения, получаемые с видеокамеры, имеют разрешение 320x240 пикселей, где каждый пиксель представлен тремя значениями, лежащими на промежутке [0; 255] (цветовая схема RGB) [13];

значение, получаемое с ультразвукового дальномера, представлено в виде числа с плавающей точкой и лежит на промежутке [20; 4000] (по техническим характеристикам дальномер способен измерять расстояние в промежутке от 20 до 4000 мм [14]);

как отмечено в введении, для передачи одного фрагмента данных (значения пикселов одного изображения вместе с соответствующим значением расстояния) от клиента серверу с использованием TCP-сокетов требуется около 0.5 секунд реального времени.

Исходя из вышеописанных данных, было принято решение о применении предварительной обработки входных данных перед их непосредственной передачей на вход алгоритму самообучения.

Так как для каждого пикселя не является критичным определённая погрешность его значений, было принято решение о дискретизации этих значений. Также обеспечить более быструю работу сервера (с потерей информации) могло проведение дискретизации значений расстояний до объектов, получаемых с ультразвукового дальномера.

Основой для выбора шагов дискретизации послужили результаты проведённых в рамках исследования эмпирических вычислений времени отклика серверной части системы и качества самообучения (отношения количество верно решённых ситуаций к общему количеству ситуаций). В результате были получены следующие значения шагов дискретизации:

для значений пикселов изображений - 32 единицы;

для значений расстояний до объектов - 10 мм.

Таким образом, после проведения дискретизации количество возможных значений пикселов снижается с 256 до 8, а количество возможных значений расстояний до объектов - с 3981 до 398. При этом расширение градации допустимых значений (уменьшение шагов дискретизации значений) на практике не влечёт за собой значительного для данной работы отклонения в получаемом качестве обучения, однако сказывается на времени отклика сервера.

Дискретизация значений производится на стороне сервера с использованием программного интерфейса между непосредственно программой, реализующей алгоритм самообучения и программным интерфейсом, получающим данный от клиента. Такая схема позволяет программе самообучения не зависеть от типа входных данных и обрабатывающих их интерфейсов предварительной обработки данных.

Однако для решения поставленных задач оказалось недостаточным проведение предварительной обработки входных данных посредством только дискретизации их значений. Для дальнейшего уменьшения объёма поступающих для дообучения карты Кохонена данных было принято решение по использованию алгоритмов предварительной обработки входных данных. Сегодня существуют и повсеместно применяются различные алгоритмы предобработки изображений для использования их в работе интеллектуальных систем. Как правило, их можно разделить на алгоритмы поиска и выделения объектов на изображении и на алгоритмы общей обработки, меняющие представление закодированной в изображении информации, но не изменяющие формат изображения и способ его декодирования вычислительной системой.

Так как выявление объектов на изображении - ресурсоёмкая задача, она не позволяет удерживать поставленные в задачах ограничения по времени отклика серверной части системы. Исходя из этого, следует использовать какой-либо алгоритм предварительной обработки, не меняющей структуру входного графического потока. В качестве возможных вариантов были выявлены два алгоритма преобразования:

алгоритм выделения границ объектов (например, преобразование Собеля, преобразование Робертса);

алгоритм уменьшения количества компонент каждого пикселя (например, перевод изображения в цветовую схему градаций серого).

Ввиду сравнительно большой длительности генерации и обработки реальных входных данных, поступающих от клиента, было принято решение использовать синтезированные изображения, меньшие в размере, более контролируемые с точки зрения внесения изменений, влияющих на обучение и допускающие генерацию с полным перебором (без повторов).

В качестве синтезированных данных были синтезированы изображения буквенных символов, которые системе предстояло распознавать с использованием реализованного алгоритма самообучения. Такой тип входных данных позволяет однозначно определить корректность работы алгоритма и скорость обучения карты Кохонена.

Для генерации поочерёдно использовались все латинские буквенные символы, каждому из которых в соответствие были поставлены несколько цветов символа, несколько цветов фона изображения, располагавшегося на слой ниже символа, а также несколько размеров символа и шрифтов. Все возможные комбинации вышеупомянутых параметров были перебраны в скрипте генерации, написанном на языке Shell, и реализованы в виде изображений формата GIF. Примеры вариантов синтезированных изображений для символа "a" приведены на Рис.10.

Рис.10 Примеры вариантов синтезированных изображений

Утилитой, проводящей генерацию изображений, является утилита "convert" свободно распространяемого пакета "ImageMagick".

Из возможных методов предварительной обработки изображений были выбраны следующие варианты:

применение оператора Собеля;

перевод изображения в градации серого.

Помимо данных, обработанных вышеуказанными методами, для исследования также были использованы исходные изображения, что позволило оценить, насколько оправданным является использование методов предварительной обработки данных по отношению к работе с необработанными исходными изображениями.

Для оценки эффективности указанных методов предварительной обработки для каждого из методов были проведены следующие этапы:

а) нормализация значений входных данных;

б) расчёт оптимальных Rкр;

в) проведение обучения карты Кохонена с попутным распознаванием символов на синтезированных изображениях.

Рассмотрим принцип выполнения и особенности каждого из этапов.

Нормализация значений входных данных (этап а) происходит над значениями пикселов вида 0xAABBCCDD, где AA - байт, представляющий компоненту красного цвета, BB - зелёного цвета, CC - синего цвета, DD - компоненты яркости. Удобно представлять эти компоненты как координаты в 4-мерном евклидовом пространстве. Тогда не составляет труда нормализовать значения пикселов в промежутке от 0 до 1.

Для расчёта оптимальных значений Rкр (этап б) между парами разных сгенерированных ранее изображений итеративно вычисляются расстояния посредством вычитания значений пикселов этих изображений. При этом на каждой итерации количество пар изображений возрастает. Количество итераций равно 300, что соответствует промежутку от 1 до 300 пар сравниваемых одновременно изображений. После этого вычисляются три значения Rкр, равные 60, 70 и 80 процентам от среднего значения получившихся при вычитании изображений расстояний.

Для проведения обучений карты Кохонена (этап в) было выбрано одинаковое для всех методов предварительной обработки данных количество эпох, равное 100. Непосредственно распознавание изображённых буквенных символов проводилось каждые 10 эпох (промежуточные тесты нейросети). Суть этого тестирования сводилась к распознаванию символов на синтезированных изображениях и получению отношения количества верных результатов к размеру всей выборки. Определение верного результата производилось путём считывания имени файла с входным изображением - непосредственно в имя файла на фиксированную позицию при генерации заносился символ, отображённый на соответствующем изображении.

Рассмотрим принципы работы использованных методов предварительной обработки, а также результаты исследования скорости и качества обучения нейросети для каждого из них.

 

6.2.1 Оператор Собеля

Алгоритм Собеля при наличии исходного изображения позволяет устранить всю излишнюю (для многих вычислительных задач) информацию из этого изображения, оставляя только контуры объектов, либо границы между контрастирующими фрагментами. Для этого в каждой точке изображения (пикселе) вычисляется аппроксимированное значение градиента яркости, которое после и подменяет собой значение выбранного пикселя. [15]

Для получения изображений с применённым оператором Собеля для исходных изображений были использованы соответствующие опции утилиты "convert" пакета "ImageMagick". После получения обработанных изображений над ними были проведены этапы вычислений, описанные в основном подразделе. График полученных расстояний между изображениями представлен на Рис.11

Рис.11 График расстояний между изображениями с применением оператора Собеля

Для изображений, обработанных по алгоритму Собеля, были получены следующие значения Rкр: 5, 10, 15.

Как будет видно позже, с использованием алгоритмов распознавания границ расстояние (разница) между изображениями получается минимальным. Это происходит вследствие того, что для отображения контуров используется малое количество значащих пикселов по сравнению с возникающим, одинаковым для всех обработанных изображений, фоном.

6.2.2 Цветовая схема градаций серого

Благодаря переводу изображений в цветовую схему градаций серого можно избавиться от 75% объёма информации за счёт устранения из символьной записи значений каждого пиксела цветовых компонент, оставляя только компоненту яркости. При этом сам процесс обработки не требует значительных затрат вычислительных ресурсов, что важно в рамках работы систем реального времени. Для получения результатов скорости и качества работы алгоритма карты Кохонена синтезированные изображения были переведены в цветовую схему градаций серого с помощью соответствующего ключа утилиты "convert" пакета "ImageMagick".

Предполагалось, что по сравнению с данными, полученными после обработки изображений оператором Собеля, изображения в градациях серого будут иметь большие различия значений пикселов, что позволит увеличить значения выбираемых Rкр и, как следствие, увеличить качество обучения карты Кохонена. График расстояний, вычисленных между изображениями по алгоритму, указанному в основном подразделе, приведён на Рис.12.

Рис.12 График расстояний между изображениями в цветовой схеме градаций серого

Полученные значения Rкр на практике оказались равны 6, 10 и 15.

Следует отметить, что предварительная обработка изображений путём перевода их в градации серого неэффективна, когда речь идёт о низкоконтрастных изображениях, либо об изображениях, фрагменты которых по значениям пикселов близки к нулевым по отношению к двум цветам (например, близкие к синим или к красным фрагменты). В таких случаях после перевода изображений в градации серого фрагменты будут сливаться, и система окажется не в состоянии их различить. Дальнейшая дискретизация значений пикселов лишь ослабляет способность системы к корректному распознаванию упомянутых фрагментов.

 

6.2.3 Необработанные изображения

Очевидным недостатком использования не обработанных предварительно изображений является относительно большой объём исходных данных, что сказывается на потреблении вычислительных ресурсов любой системы. Однако полезно оценить конкретные отношения объёмов исходных данных к объёмам обработанных данных и соответствующие отношения значений качества и скорости работы алгоритма.

После работы алгоритма исследования, описанного в основном подразделе, для необработанных изображений были получены расстояния между ними, график для которых приведён на Рис.13.

Рис.13 График расстояний между необработанными изображениями

Для изображений, оцененных без предварительной обработки, были получены следующие значения Rкр: 20, 30, 35.

 

6.2.4 Результаты исследования зависимости

Результаты исследования зависимости результатов работы разрабатываемого алгоритма от использования вышеописанных методов предварительной обработки входных данных представлены в Таблице 5 и в Таблице 6. Таблица 5 показывает результаты исследования качества обучения карты Кохонена, Таблица 6 - усреднённое время проведения пятой эпохи обучения, после которой скорость обучения отклоняется незначительно.

Таблица 5. Результаты исследования качества обучения с использованием различных методов обработки входных данных

Наименование метода обработки данных

Rкр

Качество обучения, %

Метод Собеля

5

24


10

16


15

5

Перевод в градации серого

6

67


10

52


15

27


Результаты исследования качества обучения с использованием различных методов обработки входных данных

Наименование метода обработки данных

Rкр

Качество обучения, %

Без предварительной обработки

20

69


30

46


35

41


Таблица 6

Результаты исследования времени обучения карты Кохонена с использованием различных методов обработки входных данных

Наименование метода обработки данных

Время обучения, мс

Метод Собеля

17590

Перевод в градации серого

27989

Без предварительной обработки

80703


Как видно из полученных результатов, оптимальным с точки зрения соотношения "Время обучения/Качество обучения" является метод предварительной обработки по переводу изображения в цветовую схему градаций серого. Почти не отличаясь по полученным значениям качества обучения от использования необработанных изображений, этот метод значительно превосходит метод Собеля по качеству обучения и требует незначительно больше времени на обучение в рамках одной эпохи.

 

6.3 Проектирование программных интерфейсов


Для обеспечения полноценной работы клиента необходимым является наличие программных интерфейсов, обеспечивающих обмен данными внутри системы и осуществляющих управление клиентом. Разработка программного обеспечения клиента была разбита на следующие этапы:

разработка программного интерфейса управления клиентом на базе платформы Arduino Uno;

разработка программного интерфейса, осуществляющего считывание данных с ультразвукового дальномера и с цифровой видеокамеры на базе одноплатного компьютера Raspberry Pi;

разработка программного скрипта, осуществляющего передачу данных от клиента серверу и получение клиентом данных от сервера на базе одноплатного компьютера Raspberry Pi с последующей передачей полученного кода действия платформе Arduino Uno.

Рассмотрим подробнее каждый из упомянутых этапов.

 

6.3.1 Разработка программного интерфейса управления клиентом

Для управления передвижениями клиента платформа Arduino Uno получает от Raspberry Pi номер действия в виде целого числа. Номер действия считывается по смонтированному в платформе по умолчанию Serial-порту, осуществляющему также и питание платы. Далее по полученному коду действия на выходы аналоговых пинов подаются напряжения в соответствие с Таблицей 1. После каждого нового полученного значения необходима задержка для завершения переходного процесса внутри электродвигателей и преодоления клиентом некоторого расстояния. Для лучшей синхронизации по времени отклика Raspberry Pi значение задержки было выбрано равным 0.5 секунд. Весь соответствующий программный код интерфейса Arduino Uno был написан на языке C++.

 

6.3.2 Разработка программного интерфейса считывания данных

На сегодня имеется большое число свободных реализаций программных интерфейсов по считыванию данных с цифровых датчиков и видеокамер на базе Raspberry Pi. В рамках данной работы были использованы реализации таких интерфейсов, представленные в официальной документации к плате Raspberry Pi 3, ультразвуковому дальномеру HC-SR04 и видеокамере Raspicam. Эти программные коды были объединены в единый скрипт на языке Python в рамках выполнения цикла обмена данными между клиентом и сервером. При этом никакой предварительной обработки данных на стороне клиента не ведётся - вся полученная с датчиков информация в исходном виде отправляется серверу по беспроводному каналу данных, где в дальнейшем осуществляется более быстрая предварительная обработка полученных данных.

 

6.3.3 Разработка программного скрипта передачи и приёма данных

Для реализации обмена данными между сервером и клиентом были реализованы серверный и клиентский TCP-сокеты (для каждой стороны - по два сокета). Для избегания путаницы в терминах в рамках данного подраздела будем называть серверную часть системы "вычислительным центром", а клиентскую часть - "исполнителем". В начале работы системы на стороне вычислительного центра запускается серверный сокет в режиме прослушивания. Сразу после этого клиентский сокет исполнителя подключается к нему и дожидается поступления данных с датчиков. При этом с цифровой камеры изображение записывается не в файл, а в поток данных (стрим), из которого формируются структуры ограниченного размера для последующей передачи данных. Как только исполнитель сформировал данные, необходимые для передачи, и передал их вычислительному центру, на стороне исполнителя в режиме прослушивания открывается серверный сокет, ожидающий кода действия от вычислительного центра. В это время вычислительный центр, получивший данные от исполнителя, запускает дообучение карты Кохонена и, получив от неё результат (код действия), передаёт его исполнителю в строковом виде. Исполнитель, считав код действия, по каналу USB-SerialPort передаёт этот код в виде целого числа плате Arduino Uno, а также записывает значения, полученные с датчиков и код действия, полученный от вычислительного центра, соответственно друг другу, в файл локальной базы знаний. После этого описанный алгоритм повторяется.

Следует заметить, что перед попыткой передачи данных вычислительному центру исполнитель ищет в локальной базе знаний ситуацию, в которой он находится, по полученным с датчиков значениям. Если такая ситуация присутствует в базе знаний, то исполнитель получает код действия из неё, не проводя передачу данных вычислительному центру и не принимая от него данных.

Также важно, что при формировании обучающей выборки вычислительный центр не осуществляет дообучения карты Кохонена, получая коды действий в соответствие с нажимаемыми пользователем клавишами на клавиатуре. Для формирования обучающей выборки был написан отдельный скрипт на языке Python, практически идентичный тому, что описан в данном подразделе для вычислительного центра. Разница присутствует лишь в методе получения кода действия.

 

6.4 Методы проведения тестирования системы


Для проверки выполнения поставленных задач и оценки полученных результатов по выбранным критериям оценивания необходимо определить этапы тестирования. Для поставленных задач были выявлены следующие шаги оценивания работы системы:

а) тестирование выбранного алгоритма самообучения;

б) формирование обучающей выборки;

в) запуск системы с записью логов работы.

Рассмотрим подробнее каждый из этапов.

Для тестирования алгоритма самообучения на стороне серверной части системы (этап а) были проведены первоначальное тестирование надёжности, тестирование работоспособности и тестирование на реальных данных. Результаты первых двух видов тестирования были обеспечены выполнением шагов, описанных в разделе 7.1 При этом были получены приемлемые показатели формирования и обучения карты Кохонена. После этого необходимо было оценить работы алгоритма на данных, соответствующим реальной работе системы. Для этого был сгенерирован и нормализован массив входных значений, по структуре идентичных формируемым клиентом в процессе его работы.

Формирование обучающей выборки (этап б) происходило с использованием отдельного скрипта на языке Python, выполняемого на стороне сервера. Скрипт в режиме ожидания считывает нажатия пользователем клавиш на клавиатуре и в соответствие каждой клавише передаёт клиенту код действия. Соответствие нажатых клавиш, их кодов в таблице ANSI, а также кодов действий клиента, показаны в Таблице 7

Таблица 7. Соответствие клавиш, их кодов и кодов действий клиента при формировании обучающей выборки

Клавиша

Код клавиши в таблице ANSI

Код действия

W

\xb [119

1

Q

\xb [113

2

E

\xb [101

3

X

\xb [120

4

Z

\xb [122

5

C

\xb [99

6

S

\xb [115

0


Как только запущенный скрипт получает код нажатой клавиши, он преобразует его в код действия и с помощью TCP-сокета передаёт клиенту. При этом на клиенте выставлена относительная временная задержка до завершения каждого действия, однако в случае необходимости пользователь может асинхронно сменить выполняемое действие, нажав клавишу требуемого в данной ситуации действия. При получении кода очередного действия клиент формирует структуру данных из значений, полученных ранее с датчиков и полученного кода действия и выполняет действие, параллельно записывая сформированную структуру в локальную базу знаний.

Для составления корректной обучающей выборки были произведены запуски системы при нахождении клиента в наборе отличных друг от друга ситуаций. Управление производилось с применением визуальной оценки корректности действий клиента в реальном времени. При этом все действия, при которых значений расстояния до ближайшего объекта расположено вне промежутка допустимых значений (такое происходит в случае расположения ближайшего объекта вплотную к клиенту) считаются ошибочными, информация о чём заносится в локальный файл-лог поведения системы. При отсутствии управляющих сигналов (отсутствии поступающих с сервера кодов действий) клиент не совершает никаких действий и не записывает какой-либо информации в лог и базу знаний. Это позволяет избежать попадания в выборку некорректных данных, возникающих в результате ряда причин, среди которых важной является возможность наличия помех, не дающих клиенту в имеющейся ситуации получить код действия и совершить требуемое от него передвижение.

После записи нескольких файлов обучающих выборок и перебора достаточного количества ситуаций, в которых может оказаться клиент, по этим выборкам происходит обучение карты Кохонена с последующим тестированием всей системы (этап в). После обучения карты Кохонена на данных из обучающих выборок полученная нейронная сеть продолжает работать на стороне сервера, не мешая работе скрипта интерфейса. В заключение система запускается в режиме полного функционирования сервера и клиента, осуществляя работу по алгоритму, описанному в разделе 6.1 Параллельно с выполнением алгоритма осуществляется запись в лог-файл таких данных как:

время отклика серверной части системы;

время отклика клиентской части системы,

а также помечаются ситуации, в которых было выполнено верное действие и ситуации, в которых было выполнено ошибочное действие.

Полученные в результате выполнения всех этапов тестирования данные представлены в разделе 7.

 

Выводы к разделу 6


Для улучшения показателей качества и скорости работы необходима предварительная обработка данных;

наиболее подходящим методом предварительной обработки изображений является перевод изображений в цветовую схему градаций серого;

алгоритм самообучения не претерпел изменений для двух разных задач, что важно в рамках разрабатываемой системы.

Заключение


Пример функционирования системы

После окончательной сборки устройства клиента, написания и отладки программного обеспечения сервера и программных интерфейсов стал возможным запуск и тестирование системы целиком.

В разделе 6.2 была показана работа алгоритма самообучения в отдельности от клиента. Для тестирования же всей системы необходимо было выбрать трассу, по которой будет передвигаться клиент для сбора данных для обучающей выборки. Так как принципиально с точки зрения показаний дальномера возможны две ситуации - расстояние меньше установленного предельного и расстояние больше предельного, необходимо было подготовить две тестовые трассы с разными расстояниями до препятствий. С точки зрения данных с камеры же важно вовремя распознавать боковые препятствия и препятствия, возвышающиеся над поверхностью и не фиксируемые дальномером. В соответствие с выявленными типами препятствий были выбраны две площадки для обучения системы.

Первая площадка представляет собой многокомнатное помещение с относительно большими по площади открытыми пространствами и располагающимися на одном уровне препятствиями. Приблизительный план помещения показан на Рис.14

Рис.14 План помещения-площадки для формирования обучающей выборки

Вторая площадка была собрана искусственно в виде трассы с несколькими поворотами, разной высотой препятствий, препятствиями, возвышающимися над поверхностью и шириной проездов, ограниченной снизу физической шириной платформы. Схема трассы приведен на Рис.15. Выбранное направление движения клиента по трассе обозначено стрелками.

Рис.15 Схема искусственной трассы-площадки для формирования обучающей выборки

Важно, что при накоплении обучающей выборки, а также при дальнейшем тестировании работы системы были соблюдены приблизительно равные внешние условия - одинаковое освещение и температура окружающей среды около 21°C (соблюдение температурного режима важно для однородности показаний дальномера). В таких условиях максимальное достигнутое значение пикселей изображения камеры равно 125 (при поднесении к камере белого листа бумаги освещённой стороной).

Во время обучения управление клиентом производилось напрямую с сервера, с клавиатуры. Посредством скрипта на языке Python код нажатой клавиши транслировался в номер действия, который затем передавался клиенту и обрабатывался в рамках выполнения описанного в разделе 6.3 скрипта. При этом структуры, описывающие ситуации и действия, переданные сервером, записывались соответственно в бинарные файлы в локальную файловую систему, формируя обучающие выборки. Оценка необходимого в каждой ситуации действия производилась визуально со стороны оператора сервера. Основное направление движения клиента - движение вперёд, перед собой. Остальные действия применялись в ситуациях, когда движение вперёд невозможно без столкновения. В случае же, если клиент оказался на очень близком перед собой расстоянии от препятствия, осуществлялось движение назад. Таким образом, в обучающих выборках преобладали действия "движение вперёд" и "движение вперёд с поворотом". Движение назад и остановка встречаются в меньших количествах, но были дополнительно синтезированы ситуации, в которых клиенту необходимо отъехать назад - это повысило качество обучения и дальнейшее поведение системы в подобных ситуациях. Каждая выборка записывалась до достижения объёма выходного файла, приблизительно равного 200 МБ, что соответствует примерно 500 выполненным действиям. Таким образом для каждой площадки было получено по 10 обучающих файлов. После этого файлы использовались в качестве входных параметров для алгоритма самообучения.

Для выбора приемлемого Rкр была проведена тестовая эра обучения с большим Rкр, записаны расстояния между поступающей ситуацией до каждого из имеющихся кластеров. После сортировки полученных данных был получен график расстояний между кластерами и ситуациями, представленный на Рис.16.

Рис.16 Средние расстояния между кластерами и текущей ситуацией

По графику видно, что преобладающее большинство ситуаций находятся друг от друга на расстоянии больше 60. Это значение и было выбрано в качестве Rкр.

После того, как был получен набор из обучающих выборок, можно обучить нейросеть. Для этого были определены параметры нейросети в пункте 6.1 В среднем на одну эпоху уходило по 400 секунд, т.е. весь поступивший набор обучающих данных (20 выборок) был обработан примерно за 220 часов. Результатом обучения нейросети является обученная нейросеть, которая способна определить, к какому кластеру принадлежит ситуация и выдать его номер.

В ходе обучения велась статистика попадания определённого действия в кластер. В итоге эта информация была преобразована в строгую привязку номера кластера в действие. Полученная таким образом база знаний была записана в отдельный файл и сохранена в файловой системе клиента. Копия файла была сохранена на сервере. Во время работы системы (клиента вместе с сервером) в случае столкновения клиента с незнакомой ситуацией нейросеть дообучалась на сервере и возвращала необходимое действие клиенту, которое заносилось в файлы базы знаний соответственно ситуации.

Для результирующего тестирования клиент с уже имеющейся базой знаний был установлен в следующие ситуации:

а) по бокам и впереди от клиента нет препятствий, улавливаемых камерой и дальномером, соответственно;

б) препятствие находится перед клиентом на расстоянии 45 сантиметров;

в) препятствие находится перед клиентом на расстоянии 10 сантиметров;

д) сплошное препятствие находится справа от клиента;

е) сплошное препятствие находится слева от клиента;

ж) сплошные препятствия находятся по обеим сторонам от клиента так, что между ними клиент может проехать, двигаясь вперёд.

В соответствии с описанными ситуациями были получены следующие реакции клиента, соответственно:

а) клиент двигался вперёд;

б) клиент двигался либо вперёд, либо прямо и в сторону (без столкновений);

в) клиент двигался назад, назад и в сторону (без столкновений), реже - вперёд и в сторону (столкновение);

д) клиент двигался вперёд, либо вперёд и влево (без столкновений);

е) клиент двигался вперёд (без столкновений);

ж) клиент двигался вперёд (без столкновений), реже - осуществлял попытку повернуть, что приводило к зацикленным поворотам на одном месте.

В ходе проведения результирующего тестирования были выявлены времена отклика клиента при разных условиях. При наличии ситуации в базе знаний клиент реагировал на действие с задержкой приблизительно 0.3 секунды. В случае же отсутствия ситуации в базе и необходимости дообучения нейросети время отклика увеличивалось вплоть до 1.1 секунд.

По результатам тестирования нейросети на одной из обучающих выборок видно, что верное решение принимается в 93% случаев. Отсутствие полностью правильных решений объясняется тем, что обучающая выборка генерировалась путём ручного управления человеком, который в некоторых ситуациях мог допускать ошибки в управлении, соответственно, нет гарантии, что обучающая выборка верна на 100%.

При тестировании на реальной модели процент правильных решений был несколько ниже тестирования на обучающей выборке. Это объясняется наличием ситуаций, которые не были затронуты при генерации обучающей выборки. Метод оценки поведения модели - визуальный, так как изначально не предъявлялись требования к соблюдению ряда правил среды.

Полученные результаты

В результате выполнения данной работы были разработаны и протестированы серверная и клиентская часть системы с самообучением в ходе существования. Клиентская часть представляет собой передвигающуюся роботизированную платформу, на примере которой показана эффективность работы системы в динамически изменяющихся условиях, когда критичными факторами являются соблюдение требуемых временных задержек, а также надёжность системы по части принятия верных для имеющейся ситуации действий.

В результате проведения обучения системы и её финального тестирования были получены следующие результаты:

среднее время отклика клиентской части системы - 0.45 секунд;

среднее время отклика серверной части системы - 0.47 секунд;

среднее время обучения системы для входных данных объёмом 200 МБ - 23 минуты;

процент верных действий клиента - 83%.

Все полученные результаты соответствуют результатам, предполагаемым в начале выполнения работ и позволяют системе надёжно работать и выполнять набор требуемых от неё функций.

Выводы

Все реализованные структурные и технические решения позволяют системе функционировать надлежащим образом;

реализация вычислительной части системы (сервера), включающей нормализацию входных данных, позволяет осуществлять модульное подключение к ней разнообразных клиентских систем и устройств, осуществляющих обмен данными разного формата, включая параллельную работу нескольких устройств с разным набором функций;

уязвимым местом системы является обработка данных для последующей их передачи от клиента к серверу - из-за необходимости формирования структур, включающих данные, изначально записываемые в поток, увеличивается время формирования и передачи данных, что может оказаться критичным в системах реального времени;

перед выполнением этапа обучения системы важно выполнение этапа предварительной обработки данных, заключающейся в их дискретизации и избавлению от избыточных объёмов данных;

алгоритм самообучения не нуждается в изменениях при смене области применения - это проверено опытным путём на задаче распознавания буквенных символов на изображении и на реальных поставленных в рамках этой работы задачах.

Развитие и совершенствование разработанной системы

Для дальнейшего развития системы и возможного улучшения получаемых результатов были выявлены следующие пути работ:

объединение клиентской и серверной частей в единое устройство (при наличии возможности), что позволит избежать использования сетевых протоколов передачи данных и уменьшить время отклика каждой из частей системы;

разработка системы предварительного анализа входных и выходных данных системы, позволяющей максимально автоматизировать процесс нормализации данных и минимизировать вмешательство пользователей;

для систем, включающих клиент, схожий с разработанным (роботизированная передвигающаяся платформа) - увеличение количества датчиков, добавление контактных датчиков для более точной фиксации столкновений клиента, расширение угла обзора цифровой видеокамеры, что позволит более точно определять имеющуюся ситуацию и контролировать происходящие вокруг события.

Результаты, полученные каждым автором работы

Ниже представлены списки проделанных каждым автором работ в рамках выполнения всей работы.

Некрасов Даниил:

выбор и реализация алгоритма самообучения;

выбор и реализация методов предварительной обработки входных данных;

проведение конечного обучения и тестирования системы.

Русанов Андрей:

выбор элементной базы клиентской части системы;

реализация программных интерфейсов клиентской и серверной частей системы;

сборка устройства-клиента;

тестирование и отладка клиентской части системы.

Список использованных источников


1.      Guizzo E.: How google’s self-driving car works // IEEE Spectrum Online, October, vol.18, 2011.

2.      Rojo J., Rojas R.: Spirit of Berlin: An Autonomous Car for the DARPA Urban Challenge Hardware and Software Architecture, 2007.

.        Marc Raibert, Kevin Blankespoor, Gabriel Nelson, Rob Playter: BigDog, the Rough-Terrain Quadruped Robot, Boston Dynamics, Waltham, USA, 2008

.        Atlas - The Agile Anthropomorphic Robot // BOSTONDYNAMICS.com: официальный сайт компании Boston Dynamics. URL: http://www.bostondynamics.com/bd_about.html (дата обращения: 21.04.2017)

.        Metz C.: Google's AI Wins Pivotal Second Game in Match With Go Grandmaster. // Wired News, 10 March 2016

.        Maas D.: How AlphaGo Works. // Maas Digital, 28 January 2016

.        Documentation for Arduino Uno // ARDUINO. CC: официальный сайт разработчиков. URL: https: // www.arduino. cc/en/Main/ArduinoBoardUno (дата обращения: 20.10.2016)

.        Raspberry Pi documentation // RASPBERRYPI.org: официальный сайт разработчиков / Raspberry Pi Foundation. URL: https: // www.raspberrypi.org/documentation/ (дата обращения: 10.01.2017)

.        Флах П. Машинное обучение. Наука и искусство построения алгоритмов, которые извлекают знания из данных // Litres, 2017.

.        Hartigan J. A., Wong M. A. Algorithm AS 136: A k-means clustering algorithm // Journal of the Royal Statistical Society. Series C (Applied Statistics). - 1979. - Т.28. - №.1. - С.100-108.

.        Кохонен Т. Самоорганизующиеся карты Пер. с англ // М.: Бином. Лаборатория знаний. - 2008

.        RaspiCam Documentation // RASPBERRYPI.org: официальный сайт разработчиков / Raspberry Pi Foundation, июль 2013. URL: https: // www.raspberrypi.org/wp-content/uploads/2013/07/RaspiCam-Documentation. pdf

.        Ultrasonic ranging module: HC-SR04 documentation // ITead Studio. URL: http://iarduino.ru/lib/HC-SR04. pdf (дата обращения: 3.03.2017)

.        Некоторые подходы к организации содержательного поиска изображений и видеоинформации // Под ред. ИПМ им. М.В. Келдыша РАН, Россия, Москва. 2002

Приложения


Приложение 1

 

Исходный код скрипта, передающий коды действий клиенту

#! /usr/bin/python3socketsys,tty,termios= socket. socket (socket. AF_INET, socket. SOCK_STREAM)='192.168.43.122'=8000. connect ( (host,port))

#! /usr/bin/env pythonsystermioscontextlib

@contextlib. contextmanagerraw_mode (file):_attrs = termios. tcgetattr (file. fileno ())_attrs = old_attrs [:]_attrs [3] = new_attrs [3] & ~ (termios. ECHO | termios. ICANON):. tcsetattr (file. fileno (), termios. TCSADRAIN, new_attrs):. tcsetattr (file. fileno (), termios. TCSADRAIN, old_attrs)main ():'exit with ^C or ^D'raw_mode (sys. stdin)::True:= sys. stdin. read (1)not ch or ch == chr (4):(1):=ord (ch)k! ='': breakk==119:. send ('1')k==120:. send ('4')k==101:. send ('3')k==113:. send ('2')k==122:. send ('5')k==99:. send ('6')k==115:. send ('0'):"not an arrow key!"(KeyboardInterrupt, EOFError):__name__ == '__main__': ()

s. close ()

Приложение 2

 

Исходный код скрипта, считывающий показания датчиков

import RPi. GPIO as GPIOiotimesocket import *io import BytesIOtime import sleeppicamera import PiCameraPIL import Imagestructserial= '192.168.43.122'= 8000= (host,port)_socket = socket (AF_INET, SOCK_STREAM)_socket. bind (addr)_socket. listen (5), addr = tcp_socket. accept (). setwarnings (False). setmode (GPIO. BOARD)= 16= 18. setup (TRIG, GPIO. OUT, initial=0). setup (ECHO, GPIO. IN)= io. BytesIO ()= PiCamera (). color_effects = (128,128). resolution = (320,240). start_preview ()= serial. Serial ('/dev/ttyUSB0', 9600)= open ('out', 'wb'):True:= conn. recv (1024). output (TRIG,1). sleep (0.00001). output (TRIG,0)GPIO. input (ECHO) == 0:= time. time ()GPIO. input (ECHO) == 1:= time. time ()= int ( (stop - start) *17000). capture (stream, format='jpeg'). seek (0)= Image. open (stream)

#stream. seek (0)

#stream. truncate (0)= []= list (image. getdata ())rgbpixel in rgblist:. append (rgbpixel [0]);. append (distance). append (int (comand)). write (str (graylist) + '\n'). write (str (comand) +'; \n'). sleep (0.3). write ('0; \n'). seek (0). truncate (0)KeyboardInterrupt:. cleanup ()_socket. close ()

Приложение 3

Исходный код класса "teacher"

teacher. h

#ifndef teacher_H

#define teacher_H

#include "som. h"

#include "neuron. h"

#include <stdio. h>

#include <algorithm>situation_act

{situation;int act;

};

#define IMAGE_LEN 76800

#define MAXERA 100

#define ACTIONMAX 7

#define MAPS_FOLDER "saves/maps"

#define TRANSLATOR_FOLDER "saves/translator"teacher

{:();train (std:: string trainingSetFolder, float Rcritical, float v, float dv);test (std:: string testFolder, int testNumber);:std:: vector<unsigned int> clusterAction;*map;:: vector<clusterAction> translator;:: vector<situation_act> currentTrainingSet;currentDataBaseNumber;lastMapNumber;lastTranslatorNumber;int start_with_era;loadLastState ();loadNextDataBase (std:: string trainingSetFolder);teachCurrentTrainingSet (float Rcritical, float v, float dv);int situationToAction (neuron situation);nextEra ();:: vector<situation_act> loadSituationVector (FILE *f);discretSensorValue (double val);:: string getFileName (const std:: string folder, const int counter);writeTranslatorToFile (FILE *f, unsigned int currEra);getLastFileNumberInFolder (const std:: string folder);

};

#endif // teacher_H

teacher. cpp

#include "teacher. h":: teacher ()

{= 0;= new SOM ();_with_era = 0;();

}teacher:: loadLastState ()

{*f;= getLastFileNumberInFolder (MAPS_FOLDER);= fopen (getFileName (MAPS_FOLDER, lastMapNumber++). data (), "r");(f)>loadState (f);(f);= getLastFileNumberInFolder (TRANSLATOR_FOLDER);= fopen (getFileName (TRANSLATOR_FOLDER, lastTranslatorNumber++). data (), "r");(f)

{

// TODO("Translator: Loading from file\n");int size;(f, "%u\n", &start_with_era);_with_era++; // because in file we save the last era number(f, "%d\n",&size);(unsigned int i = 0; i < size; i++)

{. push_back (clusterAction (ACTIONMAX, 0));(unsigned int j = 0; j < ACTIONMAX; j++)(f, "%d", &translator. at (i). at (j));

}

}(f);

}teacher:: train (std:: string trainingSetFolder, float Rcritical, float v, float dv)

{("Train\n");(loadNextDataBase (trainingSetFolder))

{

// FILE *f;

// f = fopen ("ro. txt", "w");

// for (int i = 0; i < currentTrainingSet. size () - 1; i++)

// for (int j = i + 1; j < currentTrainingSet. size (); j++)

// fprintf (f, "%f\n", currentTrainingSet. at (i). situation. getDistance (currentTrainingSet. at (j). situation));

// fclose (f);("Database loaded\n");(Rcritical, v, dv);

}("Not found database file anymore\n");

}teacher:: loadNextDataBase (std:: string trainingSetFolder)

{*f;:: string filename = getFileName (trainingSetFolder, currentDataBaseNumber++);= fopen (filename. data (), "r");(! f)false;= loadSituationVector (f);true;

}:: vector<situation_act> teacher:: loadSituationVector (FILE *f)

{("Loading file: \n");:: vector<situation_act> res;. clear ();(f)

{tempNeu;tmp;_act situation;(EOF! = fscanf (f, " ["))

{(res. size () % 100 == 0)("Current lenght of res: %d\n",res. size ());. clear ();

// read cam image(unsigned int i = 0; i < IMAGE_LEN; i++)

{(f, "%d,", &tmp);. w. push_back (double (tmp / 8) / 15);

}

// read sensor(f, "%d,", &tmp);. w. push_back (discretSensorValue (tmp));

// read action(f, "%d] \n", &tmp);

// insert into situatin vector. situation = tempNeu;. act = tmp;. push_back (situation);

}(f);

}res;

}teacher:: teachCurrentTrainingSet (float Rcritical, float v, float dv)

{("Training on database: %d\n", currentDataBaseNumber - 1);>Rcritical = Rcritical;>setVandDV (v - (dv * start_with_era), dv);(unsigned int era = start_with_era; era < MAXERA; era++)

{("Start of %d era\n", era);();

// end of Era actions::: vector<bool> neuronUsage = map->getUsage ();(unsigned int i = 0; i < neuronUsage. size ();)(neuronUsage [i])++;

{. erase (translator. begin () + i);. erase (neuronUsage. begin () + i);

}>endOfEra ();(era && era % 10 == 0)

{*f;= fopen (getFileName (MAPS_FOLDER, lastMapNumber++). data (), "w");(f)

{>saveStateToFile (f);(f);

}("Save map state error: folder not found. \n");= fopen (getFileName (TRANSLATOR_FOLDER, lastTranslatorNumber++). data (), "w");(f)

{(f, era);(f);

}("Save translator state error: folder not found. \n");

}_with_era = 0;

}int teacher:: situationToAction (neuron situation)

{= map->sendNeuron (situation, true);

}teacher:: writeTranslatorToFile (FILE *f, unsigned int currEra)

{(f, "%d\n", currEra);(f, "%d\n", translator. size ());(unsigned int i = 0; i < translator. size (); i++)

{(unsigned int j = 0; j < translator. at (i). size (); j++)(f, "%d", translator. at (i). at (j));(f, "\n");

}

}teacher:: getLastFileNumberInFolder (const std:: string folder)

{*f;counter = 0;

// search last file( (f = fopen (getFileName (folder, counter++). data (), "r")))

{(f)(f);

}- = 2;= fopen (getFileName (folder, counter). data (), "r");(f)(f);counter;

}teacher:: test (std:: string testFolder, int testNumber)

{("Testing: \n");:: vector<situation_act> testSituationVector;*f;= fopen (getFileName (testFolder, testNumber). data (), "r");int cluster;good = 0;maxID;(f)

{= loadSituationVector (f);(unsigned int i = 0; i < testSituationVector. size (); i++)

{= map->sendNeuron (testSituationVector. at (i). situation, true);(cluster >= translator. size ())("Test fail! (New cluster number) \n");

{= 0;(unsigned int j = 1; j < ACTIONMAX; j++)(translator. at (cluster). at (j) > translator. at (cluster). at (maxID))= j;(maxID == testSituationVector. at (i). act)++;

}

}("Total: %d; good: %d (%0.2f\%) \n", testSituationVector. size (), good,

* float (good) / testSituationVector. size ());(f);

}

}teacher:: nextEra ()

{:: clock_t start;= std:: clock ();:: srand (std:: time (0));:: random_shuffle (currentTrainingSet. begin (), currentTrainingSet. end ());situation;currentAct;int currentClusterNumber;(unsigned int i = 0; i < currentTrainingSet. size (); i++)

{= currentTrainingSet. at (i). situation;= currentTrainingSet. at (i). act;= map->sendNeuron (situation);(currentClusterNumber == translator. size ())

// if new cluster. push_back (clusterAction (ACTIONMAX, 0));. at (currentClusterNumber). at (currentAct) ++;

}("Era time: %d s\n", int ( (std:: clock () - start) / (double) (CLOCKS_PER_SEC / 1000)) / 1000);

}teacher:: discretSensorValue (double val)

{

// return val / 255;(val < 40)0;(val > 50)1;0.5;

}:: string teacher:: getFileName (const std:: string folder, const int counter)

{:: string filename (folder);. append ("/");. append (std:: to_string (counter));. append (". txt");filename;

}

Приложение 4

Исходный код класса "neuron"

neuron. h

#ifndef NEURON_H

#define NEURON_H

#include<vector>

#include<math. h>

#include<stdio. h>

#include<limits. h>

#include<ctime>neuron

{::: vector<double> w; // coordinates in n-dimensional space();getDistance (neuron other);saveToFile (FILE *f);loadFromFile (FILE *F);normalize (unsigned int maxValue = 255, unsigned int minValue = 0);clear ();

};

#endif // NEURON_H

neuron. cpp

#include "neuron. h":: neuron ()

{. clear ();

}neuron:: getDistance (neuron other)

{sum = 0;(unsigned int i = 0; i < w. size (); i++)+= pow (w [i] - other. w [i],

);sqrt (sum);

}neuron:: saveToFile (FILE *f)

{(unsigned int i = 0; i < w. size (); i++)(f,"%f ",w. at (i));(f,"\n");

}neuron:: normalize (unsigned int maxValue, unsigned int minValue)

{

// normalize in loadFromImage by calling redF, greenF, blueF

}neuron:: clear ()

{. clear ();

}

Приложение 5

 

Исходный код класса "som"

som. h

#ifndef SOM_H

#define SOM_H

#include <vector>

#include "neuron. h"

#include <stdio. h>

#include <thread>

#define VMIN 0.05SOM

{::: vector<neuron> map; // neuron map:: vector<bool> mapUsage; // vector of map usagev; // speed of studydv; // delta of study speedint addNewCenter (neuron neu);int correntWinnerWeight (neuron neu, int winID);tAnswer [4];:();setVandDV (double _v, double _dv);int sendNeuron (neuron neu, bool isNoChange = false);:: vector<bool> getUsage ();endOfEra ();saveStateToFile (FILE *f);loadState (FILE *f);getMin (unsigned int id, unsigned int begin, unsigned int end, neuron neu);Rcritical; // The maximum Euclidean distance between an example of inputs and weights of the neuron-winner

// If distance is less than this variable a new neuron will be created

};

#endif // SOM_H

som. cpp

#include "som. h":: SOM ()

{= 1;= 0.5;

}SOM:: setVandDV (double _v, double _dv)

{(_v >= VMIN && _v <= 1 && _v > _dv && _dv > 0)

{= _v;= _dv;true;

}false;

}SOM:: endOfEra ()

{(v - dv >= VMIN)- = dv;(unsigned int i = 0; i < map. size ();)(mapUsage [i])

{[i] = false;++;

}

{. erase (map. begin () + i);. erase (mapUsage. begin () + i);

}

}SOM:: saveStateToFile (FILE *f)

{(f,"%d\n",map. size ());(f,"%d\n",map. at (0). w. size ());(unsigned int i = 0; i < map. size (); i++). at (i). saveToFile (f);

}SOM:: loadState (FILE *f)

{("SOM: Loading from file\n");int _size, _size_neu;(f,"%d",&_size);(f,"%d",&_size_neu);tempNeu;tempValue;(unsigned int i = 0; i < _size; i++)

{. clear ();(unsigned int j = 0; j < _size_neu; j++)

{(f, "%lf", &tempValue);. w. push_back (tempValue);

}. push_back (tempNeu);. push_back (false);

}

}SOM:: getMin (unsigned int id, unsigned int begin, unsigned int end, neuron neu)

{int minDistanceID = begin;minDistance = neu. getDistance (map [begin]), currentDistance;(unsigned int i = begin + 1; i <= end; i++)

{= neu. getDistance (map [i]);(currentDistance < minDistance)

{= i;= currentDistance;

}

}[id] = minDistanceID;

}int SOM:: sendNeuron (neuron neu, bool isNoChange)

{. normalize ();

// if we have an empty map, add first neuron(map. empty ())addNewCenter (neu); // create new claster centerminDistanceID;minDistance, currentDistance;

// search for winner neuron(map. size () < 4)

{= 0;= neu. getDistance (map [minDistanceID]);(unsigned int i = 1; i < map. size (); i++)

{= neu. getDistance (map [i]);(currentDistance < minDistance)

{= i;= currentDistance;

}

}

}

{:: thread t1 (&SOM:: getMin, this, 0, 0, map. size () / 4 - 1, neu);:: thread t2 (&SOM:: getMin, this, 1, map. size () / 4, map. size () / 2 - 1, neu);:: thread t3 (&SOM:: getMin, this, 2, map. size () / 2, 3 * map. size () / 4 - 1, neu);:: thread t4 (&SOM:: getMin, this, 3, 3 * map. size () / 4, map. size () - 1, neu);. join ();. join ();. join ();. join ();= tAnswer [0];= neu. getDistance (map [minDistanceID]);(int i = 1; i < 4; i++)

{= neu. getDistance (map [tAnswer [i]]);(currentDistance < minDistance)

{= tAnswer [i];= currentDistance;

}

}

}(isNoChange)minDistanceID;(minDistance > Rcritical)

// create new claster centeraddNewCenter (neu);

// correct winner weightcorrentWinnerWeight (neu, minDistanceID);

}:: vector<bool> SOM:: getUsage ()

{mapUsage;

}int SOM:: addNewCenter (neuron neu)

{. push_back (neu);. push_back (true);map. size () - 1;

}int SOM:: correntWinnerWeight (neuron neu, int winID)

{(unsigned int i = 0; i < neu. w. size (); i++)[winID]. w [i] = map [winID]. w [i] + v * (neu. w [i] - map [winID]. w [i]);[winID] = true;winID;

}

Похожие работы на - Разработка роботизированной платформы

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!