В чем тут идея, изображение полученное с камеры проходит несколько этапов преобразования для того чтобы мы могли распознать на нем объект. Сначала мы преобразуем изображение в HSV формат который мы использовали в предыдущим примере. Потом с помощью алгоритма определяющего контур ищем объект нужного цвета. Вот тут и нужны параметры полученные в прошлом примере, из-за того что у вас может отличатся освещение или камера то эти параметры всегда нужно подбирать экспериментально. Этот контур можно увидеть на скриншоте ниже, от состоит из синих точек. Далее мы ищем 2 самые удаленные друг от друга точки и строим вокруг них окружность. Далее определяем площадь этой окружности, выводя сообщение о том что она слишком близка или далека от камеры. Тут вы можете проявить изобретательность и добавить например движение робота за объектом если он далеко и от него если близко, также можно определить положение объекта на экране таким образом заставив робота следовать за объектом.
Изображение, полученное с камеры, проходит несколько этапов преобразования для того, чтобы мы могли распознать на нем объект. Сначала мы преобразуем изображение в HSV формат, который мы использовали в предыдущим примере. Потом с помощью алгоритма, определяющего контур, ищем объект нужного цвета. Вот тут и нужны параметры полученные в прошлом примере, из-за того что у вас может отличатся освещение или камера то эти параметры всегда нужно подбирать экспериментально. Этот контур можно увидеть на изображении выше, он состоит из синих точек. Далее мы ищем две самые удаленные друг от друга точки и строим вокруг них окружность, определяем площадь этой окружности, выводя сообщение о том что она слишком близко или далеко от камеры. Здесь можно добавить, например, движение робота за объектом если он далеко и от него если он близко, также можно определить положение объекта на экране, таким образом заставив робота следовать за объектом.
## Машинное обучение
Тут в качестве примера я предложу вам обучить свою нейронную серь на открытом датасете который содержит тысячи изображений цифр - MNIST. Этот датасет уже встроен в библиотеку keras.
Для того чтобы использовать нейронную сеть ее нужно сначала обучить, для этого я предлагаю использовать сервис google colaboratiry - https://colab.research.google.com/notebooks/intro.ipynb, потому что обучение сетей требует значительных вычислительных мощностей, а гугл готов нам предоставить их бесплатно в образовательных целях. Данный сервис представляет из себя страницу jupiter noutbook код в которой исполняется поблочно. давайте рассмотрим блоки которые нам необходимы для получения обученной сети:
Для того чтобы использовать нейронную сеть ее нужно сначала обучить, для этого я предлагаю использовать сервис google colaboratory - https://colab.research.google.com/notebooks/intro.ipynb, потому что обучение сетей требует значительных вычислительных мощностей, а компания Google готова нам предоставить их бесплатно в образовательных целях. Данный сервис представляет из себя страницу jupiter notebook, код в которой исполняется поблочно. Давайте рассмотрим блоки, которые нам необходимы для получения обученной сети:
1) Импорт библиотек
@ -825,7 +825,7 @@ from tensorflow import keras
from tensorflow.keras import layers
```
2) Скачивание датасета и преобразованиего в необходимый формат:
2) Скачивание датасета и преобразование его в необходимый формат:
Это сработает только для Python 3.7 в случае установленной более новой версии найдите версию tensorflow здесь (https://github.com/lhelontra/tensorflow-on-arm/releases) или используйте ```pyenv```, также версия tensorflow должна совпадать с версией на колабе иначе ничего не заработает.
Это сработает только для Python 3.7. В случае установленной более новой версии найдите подходящую версию tensorflow здесь (https://github.com/lhelontra/tensorflow-on-arm/releases) или используйте ```pyenv```, также версия tensorflow должна совпадать с версией на google colaboratory, иначе ничего не заработает.
После этого запускаем
Теперь запустим следующий скрипт:
```python
import cv2
@ -1020,11 +1018,9 @@ if __name__ == '__main__':
print(e)
```
Распознование можно разделить на 2 этапа, первый - это предобработка изображения, а второе это распознавание.
На первом этапе (который выделен в отдельную функцию) мы ищем все контура изобрадений (то-же чсамое что мы делали для распознавания цветного круга), потом перебераем контура отсеивая не подходящие. Первым делом мы отбрасываем контура маленькой площади, затем выбрасываем контура вытянутые по горизонтале (цифры вытянуты по вертикале), потом переводим изображение в черно-белый формат, сжимаем до 28х28 и преврящаем в монохромное. Это формат необходимый для обученной нами ранее сетки. Далее мы применяем еще один фильтр, суть которого заключается в том что мы отбразываем изображения в которых черного чвета больше чем белого. И после этого закидываем в нейронную сеть.
Распознование можно разделить на два этапа, первый - это предобработка изображения, а второй - это само распознавание.
После чего подготовленное изображение попадает в нейронную сеть, а дальше скрипт выдает предпологаемое число. Тут необходимо помнить что данный датасет собран на числах написанных ручкой в маленькой тетрадной клетке, из-за чего в реальность точность будет около 75%, несмотря на то что на тестовых данных было 99%. Также озображение должно быть хорошо исвещено что-бы корректно распознатся.
На первом этапе (который выделен в отдельную функцию *find_number(frame)* ) мы ищем все контура изображений (тоже самое, что мы делали в предыдущем примере для распознавания цветного круга), потом перебераем контуры, отсеивая неподходящие. Первым делом мы отбрасываем контуры маленькой площади, затем выбрасываем контуры, вытянутые по горизонтали (так как все цифры вытянуты по вертикали), потом переводим изображение в черно-белый формат, сжимаем до размера 28х28 и делаем его монохромным. Это формат необходимый для обученной нами ранее сетки. Далее мы применяем еще один фильтр, суть которого заключается в том, что мы отбрасываем изображения, в которых черного цвета больше чем белого. И после этого отправляем подготовленное изображение в нейронную сеть, а она выдает предполагаемое число. Тут необходимо помнить, что данный датасет собран на числах написанных ручкой в маленькой тетрадной клетке, из-за чего в реальность точность будет около 75%, несмотря на то что на тестовых данных было 99%. Также озображение должно быть хорошо освещено чтобы корректно распознатся.