Оглавление:

Это рука? (Камера Raspberry Pi + нейронная сеть) Часть 1/2: 16 шагов (с изображениями)
Это рука? (Камера Raspberry Pi + нейронная сеть) Часть 1/2: 16 шагов (с изображениями)

Видео: Это рука? (Камера Raspberry Pi + нейронная сеть) Часть 1/2: 16 шагов (с изображениями)

Видео: Это рука? (Камера Raspberry Pi + нейронная сеть) Часть 1/2: 16 шагов (с изображениями)
Видео: Лекция 1. Введение в анализ изображений 2024, Ноябрь
Anonim
Это рука? (Камера Raspberry Pi + нейронная сеть) Часть 1/2
Это рука? (Камера Raspberry Pi + нейронная сеть) Часть 1/2
Это рука? (Камера Raspberry Pi + нейронная сеть) Часть 1/2
Это рука? (Камера Raspberry Pi + нейронная сеть) Часть 1/2
Это рука? (Камера Raspberry Pi + нейронная сеть) Часть 1/2
Это рука? (Камера Raspberry Pi + нейронная сеть) Часть 1/2

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

Вот когда меня осенило: «Было бы здорово, если бы мы могли преобразовать любую поверхность в трекпад», и я не знаю почему, но по какой-то причине я подумал о ней, о фильме «ЕЕ», я позволю вам, ребята, понять это из. Это была захватывающая мысль, но я не знал, смогу ли я это сделать, я решил попробовать.

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

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

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

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

Шаг 1. Видео

Image
Image

Вот крошечное 5-минутное видео, охватывающее все шаги. Взглянем.

Шаг 2: Оборудование

Аппаратное обеспечение
Аппаратное обеспечение

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

Камера Raspberry Pi и Raspberry Pi легко доступны, просто погуглите, и вы сможете найти местный магазин.

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

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

Шаг 3: фрагмент кода

Часть кода
Часть кода
Часть кода
Часть кода

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

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

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

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

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

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

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

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

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

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

Используемые инструменты и язык
Используемые инструменты и язык
Используемые инструменты и язык
Используемые инструменты и язык

Я написал свою нейронную сеть в библиотеке глубокого обучения Python под названием Keras, а код написан на блокноте jupyter из навигатора anaconda.

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

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

Сначала (Изображение №1) я включил все библиотеки, необходимые для этого проекта, включая PIL, matplotlib, numpy, os и Keras. Во второй ячейке записной книжки Python (Изображение №2) я определяю пути к набору данных и распечатываю количество образцов. Теперь нам нужно загрузить все изображения в массив numpy, поэтому в третьей ячейке (Image # 2) я создал массив numpy из 82 (количество образцов рук) +75 (количество образцов без рук), то есть 157x100x100x3. 157 - это общее количество изображений, которые у меня есть, 100x100 - это размер нашего изображения с измененным размером, а 3 - для слоев красного, зеленого и синего цветов в изображении.

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

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

Идем дальше.

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

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

Шаг 7: нейронная сеть

Нейронная сеть
Нейронная сеть
Нейронная сеть
Нейронная сеть

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

Шаг 8: обучение нейронной сети

Обучающая нейронная сеть
Обучающая нейронная сеть

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

Шаг 9: Тестирование нейронной сети

Тестирование нейронной сети
Тестирование нейронной сети

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

Шаг 10: Результат и следующая часть…

Результат и следующая часть…
Результат и следующая часть…

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

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

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

Все запросы приветствуются.

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

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

Изменить: - Следующие шаги относятся ко второй части.

Шаг 11: Обнаружение объекта

Обнаружение объекта
Обнаружение объекта

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

Шаг 12: видео

Image
Image

3-минутное видео, объясняющее все оставшиеся шаги. Взглянем.

Шаг 13: маркировка

Маркировка
Маркировка
Маркировка
Маркировка
Маркировка
Маркировка

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

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

Шаг 14: Маркировка графического интерфейса

Маркировка графического интерфейса
Маркировка графического интерфейса
Маркировка GUI
Маркировка GUI
Маркировка графического интерфейса
Маркировка графического интерфейса
Маркировка GUI
Маркировка GUI

Вам может быть интересно, как мне удалось пометить все 82 изображения, ну, я написал графический интерфейс на Python, который помог мне с этой задачей. Как только изображение загружено в графический интерфейс. Я щелкнул левой кнопкой мыши по верхней координате и правой кнопкой мыши по нижней координате вероятной ограничительной рамки вокруг руки. Эти координаты затем записываются в файл, после чего я нажимаю кнопку «Далее», чтобы загрузить следующее изображение. Я повторил эту процедуру для всех 82 поездов и 4 тестовых изображений. Когда этикетки были готовы, пришло время обучения.

Шаг 15: Необходимые библиотеки

Необходимые библиотеки
Необходимые библиотеки
Необходимые библиотеки
Необходимые библиотеки
Необходимые библиотеки
Необходимые библиотеки

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

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

Шаг 16: оставшиеся клетки

Оставшиеся клетки
Оставшиеся клетки
Оставшиеся клетки
Оставшиеся клетки
Оставшиеся клетки
Оставшиеся клетки
Оставшиеся клетки
Оставшиеся клетки

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

Спасибо за прочтение.

Рекомендуемые: