Вторник, 10 июля 2018 16:35

Определение Руки. Нейронная сеть на Raspberry Pi.

Оцените материал
(0 голосов)

Определение объекта Нейронной сетью

ithand
ithand2
ouch
ideia
idea2
idea3
sila
vopros

Несколько дней назад я повредил запястье правой руки в спортзале. Впоследствии каждый раз, когда я использовал компьютерную мышь, это вызывало боль из-за угла в запястье.

Тогда мне пришла в голову мысль «было бы здорово, если бы мы могли превратить любую поверхность в трекпад». Конечно есть уже готовые устройства к примеру, такое как Leap Motion. Я не знал, смогу ли я сделать решение самостоятельно, но я решил попробовать.

В этой статье описывается, что из этого вышло.

Прежде чем мы начнем, я хочу сразу предупредить -

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

Давайте начнем.

 

Шаг 1. Оборудование

Сборка камеры Raberry Pi
Сборка камеры Raberry Pi

Я установил raspberry pi вместе с raspberry pi камерой на высоте около 45 см. Это дает нам зону наблюдения около 25 х 25 см под камерой.

Raspberry pi и raspberry pi - камера легко доступны.

Вы можете найти у нас на сайте, как запустить Ваш raspberry pi. Установка ОС Запуск RASPBERRY PIRASPBERRY PI 

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

 

Шаг 2. Часть кода

Фото с рукой
Фото без руки

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

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

 

Шаг 3. Получение изображений

Получение изображений Rasberry Pi

Я удалил меня для входа в Raspberry pi и сделал кучу изображений, используя следующую команду.

sudo raspistill -w 640 -h 480 -rot 90 -t 250000 -t1 5000 -o frame%04d.jpg

Я сделал 80 изображений с рукой и 80 изображений, которые не содержат руки. 160 изображений недостаточно, чтобы правильно обучать нейронную сеть, но должно быть достаточно для доказательства концепции.

Помимо 160 изображений, я сделал еще 20 изображений, чтобы проверить нашу сеть после ее обучения.

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

 

Шаг 4. Используемые инструменты и язык

Keras
anaconda navigator

Я написал свою нейронную сеть используя библиотеку глубокого обучения на python под названием Keras и  сам код написан на jupyter-notebook от Anaconda Navigator.

 

Шаг 5. Подготовка набора данных для обучения

dataset

Сначала  я включил все библиотеки, необходимые для этого проекта, включая PIL, matplotlib, numpy, os и Keras.

dataset 2

Во второй ячейке python notebookя определяю пути к набору данных и распечатываю количество отсчетов Теперь нам нужно загрузить все изображения в массив numpy, следовательно, в третьей ячейке я создал массив numpy из 82 (количество образцов для руки) +75 (количество образцов без руки), т. Е. 157x100x100x3. 157 - общее количество изображений, которые у меня есть, 100x100 - это размер изображения, размер которого изменен, а 3 - для слоев красного, зеленого и синего цветов.

dataset 3

В четвертой и пятой ячейках мы загружаем изображения, содержащие руку, а затем изображения, которые не содержат руки в массиве numpy. В шестой ячейке мы делим каждое значение на 255, следовательно, ограничиваем диапазон значений от 0 до 1. 

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

Двигаемся вперед.

dataset 4

Затем нам нужно пометить каждое изображение, поэтому мы создаем одномерный массив numpy длиной 157. Первые 82 записи установлены в 1, а остальные 75 записей установлены на 0, передавая нейронную сеть, в которой первые 82 изображения относятся к одному классу и остаются от другого. (

Теперь давайте создадим нейронную сеть.

 

Шаг 6. Нейронная сеть

Архитектура Нейронной Сетиneural network

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

 

Шаг 7. Обучение Нейронной сети

training neural network

В десятой ячейке мы настраиваем оптимизатор нейронной сети на «adam» и функцию потерь на «binary_crossentropy». Они играют важную роль в обновлении сетевых весов. Наконец, когда мы запускаем одиннадцатую ячейку, нейронная сеть начинает тренироваться. Пока сеть тренируется, посмотрите на функцию потерь и убедитесь, что она уменьшается.

 

Шаг 8. Тестирование Нейронной сети

testing neural network

После обучения нейронной сети нам необходимо подготовить набор тестовых данных. Мы повторяем процедуру, выполняемую для подготовки тренировки, установленной в 3-й, 4-й, 5-й и 6-й ячейках тестовых данных для создания набора тестов. Мы также готовим ярлык для тестового набора, но на этот раз мы запускаем модель на этих наборах данных, чтобы получать прогнозы, а не тренироваться.

 

Шаг 9. Результаты

result neural network

 

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

 

Шаг 10. Обнаружение объекта

object detection

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

 

Шаг 11. Маркировка

Координаты объекта
labeling2
labeling3
labeling4
labeling5
labeling6
labeling7

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

Прикрепленное изображение файла csv содержит метку для каждого изображения. Обратите внимание, что координаты нормализуются с размером изображения, т. Е. Если верхняя координата X составляет 320 пикселей в изображении с шириной 640 пикселей, мы будем обозначать ее как 0,5.

 

Шаг 12. Графический интерфейс для маркировки

labelinggui1
labelinggui3
labelinggui2
labelinggui4

Возможно, вам интересно, как мне удалось пометить все 82 изображения, так что я написал графический интерфейс в python, который помог мне с этой задачей. После загрузки изображения в графическом интерфейсе. Я оставил клик на верхней координате и щелкнул правой кнопкой мыши по нижней координате вероятного ограничивающего прямоугольника вокруг руки. Затем эти координаты записываются в файл, следующий за следующим щелчком мыши, чтобы загрузить следующее изображение. Я повторил эту процедуру для всех 82 поездов и 4 тестовых изображений. Как только лейблы были готовы, это было время тренировки. Код Labeling GUILabeling GUI

 

Шаг 13. Необходимые библиотеки

libraries 1

libraries2
libraries3
libraries4
libraries5
libraries6

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

  • PIL для манипулирования изображениями,
  • matplotlib для печати,
  • numpy для работы матрицы,
  • os для операционной системы, зависящей от функциональности и
  • keras для нейронной сети.

 

Шаг 14. Оставшиеся ячейки

remainingcells1
remainingcells2
remainingcells3
remainingcells4
remainingcells5
remainingcells6
remainingcells7

Во 2-й, 3-й, 4-й и 5-й ячейки мы загружаем изображения в массив numpy и создаем четырехмерный массив из файла csv, чтобы действовать как метки. В ячейке №6 мы создаем нашу нейронную сеть. Его архитектура идентична нейронной сети, используемой для классификации, за исключением размера выходного слоя, которая равна 4, а не 1. Другое отличие происходит от используемой функции потерь, которая представляет собой ошибку среднего квадрата. В ячейке №8 мы начинаем обучение нашей нейронной сети после обучения. Я запустил эту модель на тестовом наборе, чтобы получить предсказания для ограничивающего прямоугольника на оверлейных координатах ограничительной рамки, которые они выглядели довольно точными.

Источник

Author

Bender

Я поделюсь с тобой всеми знаниями, которые доступны мне.

Комментарии (0)

There are no comments posted here yet

Оставьте свой комментарий

  1. Posting comment as a guest. Sign up or login to your account.
Вложения (0 / 3)
Share Your Location

О нас

Основой деятельностью портала является показ и объяснение что представляет собой выражени "Робот", "Робототехника", "Законы робототехники", "Мехатроника", "Искусственный интеллект(ИИ)". 

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