Вторник, 11 сентября 2018 10:59

Создание дрона отслеживающего людей.

Оцените материал
(1 Голосовать)

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

1 H2hHVfrzDJIwLGcozSHmHw

Используемые части.

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

Parrot AR.Drone

Raspberry Pi 3 Model B

Софт:

Nanonets

 

История

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

0 Y4 aOYjJuZpw XSH

Drone Footage: Изображение предоставлено Нью-Йоркским кинофестивалем (http://www.nycdronefilmfestival.com/)

Однако есть некоторые недостатки: управлять дроном довольно сложно. Даже при использовании новейших методов управления программным обеспечением Вы должны быть осторожны во время пилотирования беспилотного летательного аппарата, так как потеря контроля над ним может вызвать падение или столкновения дрона препятствием что повлечет потерю тысяч долларов. Неопытным пилотам трудно летать на БЛА, но зато у них получаются забавные кадры.

1 ThHzrV3R01opdhyj1oZ RA

Неопытный пилот влетает дроном прямо в свою голову.

Автономные самоуправляемые дроны

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

0 hbFtWlo8XlIk8BZb

Кадры из Skydio Drone - (все права на изображения принадлежат Skydio)

 

Процесс, создания Автономного дрона.

Создание полностью автономного дрона - довольно сложная задача, связанная с рядом проблем в области:

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

1 NdVFy8tpK5oIBBNnwB6hA

В этом уроке мы сосредоточимся на обнаружении объектов, используя последние прорывы в области глубокого обучения. Я покажу, как реализовать простую версию обнаружения человека и после, использования модели обнаружения объекта в TensorFlow и Nanonets Machine Learning API.

 

Шаг 1: Футажи с Дронов

В качестве первого шага нам нужно получить несколько видеороликов. У вас есть два варианта: заснять собственное видео со своего дрона или использовать уже отснятые видеоролики.

Здесь вы можете найти ролики выбрав модель дрона:

Вы можете найти футажи, которые Вы можете использовать:

 

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

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

1 rZ8fA0HdCiPvfWODjuqvfg

Мы будем использовать два подхода:

  • Модель обнаружения объекта TensorFlow: доступно в репозитории разработчика GitHub. Мы будем использовать модель SSD MobileNet v1.
  • Nanonets Machine Learning API: его можно найти nanonets/object-detection-api. Он значительно проще в использовании, TensorFlow и требует меньше затрат по времени и строчек кода.

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

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

Модель обнаружения объекта TensorFlow

А) Загрзука TensorFlow

Эта часть кода загружает выбранную модель (через MODEL_NAME).

Б) Постройка графика и переменных TensorFlow

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

В) Определение метода прогнозирования

Теперь мы добавляем новый метод для нашего класса, чтобы делать прогнозы. Этот метод получает изображение, подает его на вход нашей модели TensorFlow и оценивает выходные переменные, создавая сеанс TensorFlow. Модель обнаружения объекта имеет ряд полезных выходных переменных: модель выводит ограничивающие поля для всех объектов, которые, по ее мнению, находили в изображении, и, кроме этого, выводит классы обнаружения (то есть, что такое объект, индексированный от 1 до 90) и даже показатель его обнаружения, который определяет, насколько точно, что определенный объект действительно присутствует на изображении.

Это важно, потому что, как Вы увидите, что многие объекты имеют очень низкий балл и являются ошибочно определенными. Мы можем установить порог, который указывает, какой уровень баллов мы считаем правильным. Наш порог довольно низок, всего 0,5, потому что мы имеем дело с изображениями людей, стоящих спиной к камере, бегающих и находящихся в довольно шумных условиях. Для визуализации ограничивающих прямоугольников мы используем функции рисования из библиотеки изображений Python (PIL) для рисования прямоугольников непосредственно на нашем изображении.

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

Г) Запуск Прогнозирования на тестовых изображениях

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

API машинного обучения NanoNets

Используя API NanoNets, мы можем сделать прогноз всего за 2 шага:

А) Получение бесплатного API ключа

Получите ключ API из http://app.nanonets.com/user/api_key. Обратите внимание, что Вам нужно будет зарегистрироваться, используя ваш адрес электронной почты. Теперь добавьте вновь созданный ключ API в текущий сеанс терминала с помощью следующей команды:

export NANONETS_API_KEY=replace_your_api_key

Б) Прогнозирование

введите следующий код в файл «prediction.py».:

prediction.py:
import requests, os, sys
from PIL import Image, ImageDraw
model_id = "ca9df6e0-37a7-4155-bb8e-5ad2ccb675bf"
api_key = os.environ.get('NANONETS_API_KEY')
image_path = sys.argv[1]
url = 'https://app.nanonets.com/api/v2/ObjectDetection/Model/'
url += model_id + '/LabelFile/'
data = {'file': open(image_path, 'rb'),'modelId': ('', model_id)}
response = requests.post(url, auth=requests.auth.HTTPBasicAuth(api_key, ''), files=data)
result = response.json()["result"][0]
im = Image.open(image_path)
draw = ImageDraw.Draw(im)
for b in result["prediction"]:
  box = (b["xmin"],b["ymin"],b["xmax"],b["ymax"])
  draw.rectangle(box, fill=None, outline=128)
im.show()
print(response.text)

Вы можете запустить файл «prediction.py» на любом тестовом изображении, подаваемом в качестве аргумента командной строки. Мы загрузили несколько изображений для тестирования.

python prediction.py path_to_image.jpg

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

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

self flying drone WnfpSNHsEY

Определение личности человека.

 

Шаг 3: Сопровождение человека/ Планирование маршрута

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

Чтобы действительно обнаружить человека в пространстве, нам понадобится также определение глубины, но эти данные тяжело получить, поэтому мы можем попытаться использовать некоторые трюки с нашей информацией о выделенном объекте. Как только дрон обнаружил человека, в нем, в основном, есть 4 значения, описывающих окно: его верхний левый угол (x1, y1) и его нижний правый угол (x2, y2). Учитывая это, мы также можем легко вычислить центр прямоугольника, а также его площадь. Чтобы вычислить область, нам нужно вычислить ширину как (x2-x1) и высоту как (y2-y1) и умножить их. Что касается центра, то он вычисляется просто как (x2 + x1) / 2 и (y2 + y1) / 2. Почему эта информация полезна? Центр прямоугольника может рассказать нам, находится ли человек в центре изображения или если он находится справа или слева. С помощью этой информации мы можем отправить инструкцию к беспилотнику поворота влево или вправо относительно вертикальной оси, чтобы человек всегда находился в центре кадра. Точно так же мы можем заставить дрона подняться или опуститься, если человек обнаружен в верхней части кадра. Площадь прямоугольника может дать нам приблизительную информацию о том, насколько близко человек. Большой прямоугольник означает, что человек очень близко, а крошечный прямоугольник указывает, что человек далеко. Основываясь на этой информации, мы можем перемещать дрон вперед или назад, чтобы дрон всегда был на определенном расстоянии от человека. Здесь Вы можете ознакомиться с моим псевдокодом.

def compute_drone_action((x1,y1), (x2,y2)):
  #define the possible turning and moving action as strings
 turning = ""
  moving = ""
  raise = ""
 area, center = compute_area_and_center((x1,y1), (x2, y2))
 #obtain a x center between 0.0 and 1.0
  normalized_center[x] = center[x] / image.width
 #obtain a y center between 0.0 and 1.0  
  normalized_center[y] = center[y] / image.width
 if normalized_center[x] > 0.6 :
     turning = "turn_right"
  elif normalized_center[x] < 0.4 :
     turning = "turn_left"
 if normalized_center[y] > 0.6 :
    raise = "upwards"
  elif normalized_center[y] < 0.4 :
    raise = "downwards"
 #if the area is too big move backwards
  if area > 100 : 
    moving = "backwards" 
  elif area < 80 :
    moving = "ahead"
 return turning, moving, raise

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

1 1Jfggy7jPBNP9 vKJYr2ow

Подлёт к человеку после его обнаружения.

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

1 1qzMKdG2mV QlwYUYTdf0A

Обучение собственной модели. Что делать, если я хочу отслеживать автомобиль или лодку?

0 wukd0PQmIjAKVqsD

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

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

Обучение новой модели имеет несколько проблем:

  1. Интенсивность вычислений. Обучение может занять много времени и иметь огромную вычислительную мощность, часто требуя дни обработки на графических процессорах.
  2. Аннотации. Аннотирование набора данных означает обозначение позиций всех объектов, представляющих интерес для учебных образов, путем указания их ограничивающих прямоугольников. Обычно это трудоемкая задача.
  3. Обучение с нуля: обучение любой объектной модели обнаружения с нуля требует огромного количества данных, как правило, порядка 10 000-100 000 изображений. Это не только увеличивает вычислительную мощность, время вычисления и требования к аннотации, но просто получение такого большого набора данных может быть затруднено.
  4. Выбор модели: выбор правильной модели является жестким, существует множество различных моделей, таких как YOLO, SSD, Resnet и т. Д., Которые отличаются производительностью в зависимости от задачи.
  5. Hyperparameter Tuning: выбор правильных параметров так же важно, как выбор правильной модели. Существует 100 таких гиперпараметров, как количество слоев, эпох, отсева и скорость обучения среди других.

Обучение модели с помощью Nanonets

Здесь NanoNets входит. NanoNets предлагает решения для смягчения всех вышеперечисленных задач:

  • Мощность облачных вычислений: NanoNets использует Amazon Web Services (AWS) на бэкэнд, что означает, что все интенсивные вычисления выполняются на мощных кластерах с десятками процессоров и графических процессоров.
  • Профессиональные аннотаторы: у NanoNets есть команда экспертов-аннотаторов, которые будут аннотировать ваши изображения по цене 0,2 $ за изображение. Если вы предпочитаете сами делать аннотации, оно поддерживает как форматы XML, так и JSON.
  • Предварительно разработанные модели: Nanonets использует Learning Learning. Их модели обнаружения объектов предварительно обучены на большом количестве различных изображений животных, людей, транспортных средств и т. Д. Таким образом, их нейронная сеть уже умеет разбирать большинство объектов и нуждается лишь в небольшом количестве дополнительного обучения для конкретной классификации задача, например, различать автомобили и грузовики, или между кошками и собаками.

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

Githab Sample 1 Зеркало

 

Источник

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

О нас

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

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