Русский
Русский
English
Статистика
Реклама

Jetson

Перевод Как за 60 создать систему распознавания лиц с помощью Python и Nvidia Jetson Nano 2GB

02.03.2021 16:05:07 | Автор: admin
Теперь с помощью алгоритмов распознавания лиц и Python вы сможете с лёгкостью отслеживать всех людей, которые приближаются к вашей двери.Теперь с помощью алгоритмов распознавания лиц и Python вы сможете с лёгкостью отслеживать всех людей, которые приближаются к вашей двери.

Новый набор инструментов для разработчиков Nvidia Jetson Nano 2GB представляет собой одноплатный компьютер с графическим ускорителем стоимостью 59$, работающий под управлением программного обеспечения с искусственным интеллектом.

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


Что такое Nvidia Jetson Nano 2GB?

Jetson Nano 2GB это одноплатный компьютер с четырёхъядерным ARM-процессором 1,4 ГГц и встроенным графическим процессором Nvidia Maxwell. Это самая дешёвая модель Nvidia Jetson практически того же класса, что и одноплатный компьютер Raspberry Pi.

Компьютер Nvidia Jetson Nano 2GB имеет много общего с Raspberry Pi оба представляют собой одноплатные компьютеры на ОС Linux. Отличие состоит в том, что с целью ускорения работы моделей глубокого обучения модуль Nvidia Jetson оснащён 128-ядерным графическим процессором Nvidia и поддерживает программно-аппаратную архитектуру параллельных вычислений (CUDA).Компьютер Nvidia Jetson Nano 2GB имеет много общего с Raspberry Pi оба представляют собой одноплатные компьютеры на ОС Linux. Отличие состоит в том, что с целью ускорения работы моделей глубокого обучения модуль Nvidia Jetson оснащён 128-ядерным графическим процессором Nvidia и поддерживает программно-аппаратную архитектуру параллельных вычислений (CUDA).

Если вы уже знакомы с линейкой продуктов Raspberry Pi, то вам всё должно быть понятно. Единственным различием двух одноплатных компьютеров является то, что в Jetson Nano установлен графический процессор Nvidia. Компьютер может запускать приложения с ускорением вычислений на графических процессорах (например, модели глубокого обучения) намного быстрее, чем одноплатный Raspberry Pi, у которого нет графического процессора, способного работать с большинством технологий глубокого обучения.

Наборов инструментов для разработчиков с ИИ и модулями ускорителя существует множество, однако у продукта Nvidia есть перед ними одно важное преимущество он непосредственно совместим с библиотеками ИИ для настольных систем и не требует преобразования моделей глубокого обучения ни в какие специальные форматы для их запуска. Для ускорения вычислений на графическом процессоре в продукте Nvidia используются те же самые библиотеки CUDA, что и практически во всех базирующихся на Python системах глубокого обучения. Другими словами, вы можете взять существующую программу глубокого изучения на Python и запустить её на Jetson Nano 2GB (лишь немного её изменив) и в результате получить довольно сносную производительность (при условии, что ваше приложение сможет работать на 2 Гб оперативной памяти). Возможность взять код в Python, который был написан для мощнейшего сервера, и практически без изменений перенести его на автономное устройство стоимостью 59 долларов это ли не заманчиво?

В новом наборе инструментов Jetson Nano 2GB реализованы некоторые новые функции, которых не было в предыдущих версиях оборудования Nvidia. В первой модели Jetson Nano по непонятной причине не была реализована поддержка WiFi, данная же модель поставляется с подключаемым модулем WiFi, поэтому вам не придётся возиться с ethernet-кабелями. В новом модуле также был заменён вход по питанию установлен более современный порт USB-C, а также усовершенствованы некоторые возможности программного обеспечения. Теперь вам не нужно беспокоиться, например, о включении файла подкачки, модуль сделает это за вас.

Приобретение простого в использовании аппаратного устройства с настоящим графическим процессором обойдется вам менее чем в 60$ этот шаг со стороны Nvidia следует признать достаточно агрессивным. По всей видимости, этим они желают показать, что хотят составить прямую конкуренцию Raspberry Pi и пытаются захватить рынок образования / продуктов для программистов-любителей. Будет весьма интересно наблюдать, как на это отреагирует рынок.

Что ж, давайте приступим к сборке нашей системы

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

1. Одноплатный компьютер Nvidia Jetson Nano 2GB (59$).

Продукт доступен для предварительного заказа (по состоянию на 5 октября 2020 г.). Сам продукт, как ожидается, будет выпущен в конце октября. Я не знаю, какую цену установит Nvidia на продукт после его релиза, но следует иметь в виду, что предыдущая модель Jetson Nano в течение нескольких месяцев после релиза была в дефиците.

Полная открытость: модуль Jetson Nano 2GB мне достался бесплатно за рецензию на продукты Nvidia, однако с Nvidia у меня нет ни финансовых, ни редакционных отношений. Вот как получилось, что мне удалось составить данную инструкцию до выхода продукта.

2. Адаптер питания с разъёмом USB-C (возможно, такой у вас уже есть?).

В новом компьютере Jetson Nano 2GB для питания используется разъём USB-C. Адаптер питания в комплект не входит, но у вас наверняка завалялся где-то лишний.

3. Камера: либо веб-камера с USB-выходом (возможно, у вас такая уже имеется?), либо камера Raspberry Pi Camera Module v2.x (прибл. 30$).

Если вы захотите поместить небольшую камеру в чехол, отличным выбором станет модуль Raspberry Pi Camera v2.x (примечание: модуль v1.x работать не будет). Приобрести их можно на Amazon или у множества реселлеров.

Некоторые веб-камеры с USB-выходом, например Logitech C270 или C920, прекрасно работают с Jetson Nano 2GB, так что, если у вас уже есть такая камера, можно, не задумываясь, использовать её. Ниже приводится неполный перечень USB-камер, которые должны работать.

Прежде чем торопиться покупать что-то новое, сначала проверьте: а может быть, вполне подойдут уже имеющиеся у вас USB-устройства? Не на всех из них может быть реализована поддержка драйверов Linux, но, возможно, вам удастся найти устройство с соответствующей поддержкой. Я подключил обычный адаптер HDMI-на-USB за 20$ (заказывал на Amazon), и он подошёл идеально. В качестве источника видеосигнала по HDMI мне удалось задействовать свою высококлассную цифровую камеру, причём без каких бы то ни было дополнительных настроек. Красота!

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

  • Карта памяти microSD, на ней должно быть не менее 32 ГБ свободного пространства. На неё мы установим Linux. Если у вас имеется любая карта microSD, можете использовать её.

  • Устройство чтения карт microSD, с помощью которого мы установим на компьютер программное обеспечение Jetson.

  • Проводная USB-клавиатура и проводная USB-мышь. Эти устройства будут использоваться для управления Jetson Nano.

  • Любой монитор или телевизионный экран, на которые можно напрямую подавать сигнал HDMI (не через переходник HDMI-на-DVI). Монитор будет использоваться для визуального контроля ваших действий. Монитор вам потребуется для первоначальной настройки Jetson Nano (даже если потом Jetson Nano будет запускаться без монитора).

Загрузка программного обеспечения Jetson Nano 2GB

Перед подключением компонентов к Jetson Nano необходимо вначале загрузить образ программного обеспечения для Jetson Nano. Стандартный образ программного обеспечения Nvidia включает в себя Ubuntu Linux 18.04 с предустановленными Python 3.6 и OpenCV.

Ниже приводится инструкция по загрузке программного обеспечения Jetson Nano на SD-карту:

  1. Скачайте Jetson Nano Developer Kit SD Card Image на сайте Nvidia.

  2. Скачайте Etcher программу, которая запишет образ программного обеспечения Jetson на SD-карту.

  3. Запустите программу Etcher и используйте её для записи загруженного образа Jetson Nano Developer Kit SD Card Image на SD-карту. Это займёт приблизительно 20 минут.

Пора распаковывать остальное оборудование!

Подключаем всё что можно

Прежде всего выньте модуль Jetson Nano 2GB из коробки:

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

Затем к одному из USB-портов необходимо подключить входящий в комплект WiFi-адаптер с разъёмом USB:

После этого подключается камера.

Если используется модуль камеры Raspberry Pi v2.x, его необходимо подсоединить с помощью ленточного соединительного кабеля. Найдите разъём для ленточного соединительного кабеля на Jetson, поднимите крышку разъёма, вставьте в разъём кабель и закройте крышку разъёма. Убедитесь, что металлические контакты на ленточном соединительном кабеле смотрят внутрь радиатора:

Если используется веб-камера с разъёмом USB, просто подключите её к одному из USB-портов, порт ленточного кабеля для этого не нужен.

Теперь подключаем всё остальное:

  • подключите мышь и клавиатуру к USB-портам;

  • подключите монитор с помощью HDMI-кабеля;

  • подключите кабель питания USB-C, чтобы система могла загрузиться.

Если используется модуль камеры Raspberry Pi, в результате у вас получится примерно такая конструкция:

Если используется источник видео с USB, конструкция получится примерно такая:

При подключении кабеля питания начнётся автоматическая загрузка Jetson Nano. Через несколько секунд на мониторе появится экран инициализации Linux. Следуйте инструкциям на экране для создания учётной записи и подключения к WiFi. Все действия будут элементарные.

Установка необходимых библиотек Linux и Python для распознавания лиц

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

На рабочем столе Jetson Nano откройте окно LXTerminal и выполните следующие команды. Если система запросит пароль, нужно будет ввести тот же пароль, который был указан при создании пользовательской учётной записи:

sudo apt-get updatesudo apt-get install python3-pip cmake libopenblas-dev liblapack-dev libjpeg-dev

Вначале обновляем apt стандартный инструмент для установки программного обеспечения Linux, его мы будем использовать для установки других необходимых нам системных библиотек. Затем устанавливаем несколько Linux-библиотек, без которых наша программа не будет работать (эти библиотеки не предустановлены).

В последнюю очередь устанавливаем библиотеку Python face_recrecognition и её зависимости, в том числе библиотеку машинного обучения dlib. Это можно сделать автоматически, запустив единственную команду:

sudo pip3 -v install Cython face_recognition

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

Когда процесс завершится, ваш компьютер Jetson Nano 2GB с графическим ускорителем и программно-аппаратной архитектурой параллельных вычислений (CUDA) будет готов к распознаванию лиц. Теперь переходим к самому интересному!

Запуск демонстрационной версии приложения распознавания лиц для домофона

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

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

Сначала скачайте код. Полный код с комментариями я разместил здесь, однако вы можете поступить ещё проще загрузить код на Jetson Nano из командной строки:

wget -O doorcam.py tiny.cc/doorcam2gb

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

Вставка с кодомСледуйте инструкциям, затем сохраните код, выйдите из GEdit и запустите код:

gedit doorcam.py

На рабочем столе появится окно с видео. Каждый раз, когда новый человек будет подходить к камере, система будет регистрировать его лицо и рассчитает продолжительность нахождения такого человека перед дверью. Если один и тот же человек уйдет и вернётся через 5 минут или позже, система зарегистрирует новый визит и заново рассчитает продолжительность. Чтобы в любое время выйти из программы, нужно нажать на клавиатуре клавишу 'q'.

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

Превращаем систему в автономное аппаратное устройство

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

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

7-дюймовый сенсорный HDMI-экран, способный запитываться от USB-порта:

И обычный зарядный батарейный блок (power bank) с выходом USB-C для подачи питания:

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

Всё работает идеально. Сенсорный экран работает как обычная USB-мышь без дополнительных настроек. Есть единственный недостаток: если Jetson Nano 2GB станет потреблять больше энергии, чем может выдавать USB-аккумулятор, быстродействие графического процессора может снизиться. Но и в том, и в другом случае результаты получаются вполне удовлетворительные.

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

Обзор кода Python для домофона

Хотите понять, как работает код? Давайте разберёмся.

Сначала в код необходимо импортировать библиотеки, которые мы собираемся использовать. Самые важные из них OpenCV (в Python она называется cv2), которую мы будем использовать для считывания изображений с камеры, и face_recognition, которую мы будем использовать для обнаружения и сравнения лиц.

import face_recognitionimport cv2from datetime import datetime, timedeltaimport numpy as npimport platformimport pickle

После этого нам нужно указать, как будет осуществляться доступ к камере, так как процесс получения изображения с модуля камеры Raspberry Pi работает иначе, чем процесс получения изображения с USB-камеры. Для этого нужно просто изменить эту переменную на True или False, в зависимости от оборудования:

# Set this depending on your camera type:# - True = Raspberry Pi 2.x camera module# - False = USB webcam or other USB video input (like an HDMI capture device)USING_RPI_CAMERA_MODULE = False

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

known_face_encodings = []known_face_metadata = []

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

У нас имеется функция, сохраняющая и загружающая данные об известных лицах. Это функция сохранения (save):

def save_known_faces():    with open("known_faces.dat", "wb") as face_data_file:        face_data = [known_face_encodings, known_face_metadata]        pickle.dump(face_data, face_data_file)        print("Known faces backed up to disk.")

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

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

def register_new_face(face_encoding, face_image):    known_face_encodings.append(face_encoding)known_face_metadata.append({        "first_seen": datetime.now(),        "first_seen_this_interaction": datetime.now(),        "last_seen": datetime.now(),        "seen_count": 1,        "seen_frames": 1,        "face_image": face_image,    })

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

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

def lookup_known_face(face_encoding):    metadata = None    if len(known_face_encodings) == 0:        return metadata    face_distances = face_recognition.face_distance(        known_face_encodings,         face_encoding    )    best_match_index = np.argmin(face_distances)    if face_distances[best_match_index] < 0.65:        metadata = known_face_metadata[best_match_index]        metadata["last_seen"] = datetime.now()        metadata["seen_frames"] += 1        if datetime.now() - metadata["first_seen_this_interaction"]                  > timedelta(minutes=5):            metadata["first_seen_this_interaction"] = datetime.now()            metadata["seen_count"] += 1    return metadata

В этой части кода мы делаем несколько важных вещей:

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

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

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

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

def main_loop():    if USING_RPI_CAMERA_MODULE:        video_capture =             cv2.VideoCapture(                get_jetson_gstreamer_source(),                 cv2.CAP_GSTREAMER            )    else:        video_capture = cv2.VideoCapture(0)

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

Итак, начинаем захватывать кадры с видео:

while True:    # Grab a single frame of video    ret, frame = video_capture.read()    # Resize frame of video to 1/4 size    small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)    # Convert the image from BGR color    rgb_small_frame = small_frame[:, :, ::-1]

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

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

Теперь мы можем обнаружить все лица на изображении и преобразовать каждое лицо в кодированное изображение. Это делается всего двумя строками кода:

face_locations = face_recognition.face_locations(rgb_small_frame)face_encodings = face_recognition.face_encodings(                     rgb_small_frame,                      face_locations                  )

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

for face_location, face_encoding in zip(                       face_locations,                        face_encodings):metadata = lookup_known_face(face_encoding)    if metadata is not None:        time_at_door = datetime.now() -             metadata['first_seen_this_interaction']        face_label = f"At door {int(time_at_door.total_seconds())}s"    else:        face_label = "New visitor!"        # Grab the image of the face        top, right, bottom, left = face_location        face_image = small_frame[top:bottom, left:right]        face_image = cv2.resize(face_image, (150, 150))        # Add the new face to our known face data        register_new_face(face_encoding, face_image)

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

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

for (top, right, bottom, left), face_label in                   zip(face_locations, face_labels):    # Scale back up face location    # since the frame we detected in was 1/4 size    top *= 4    right *= 4    bottom *= 4    left *= 4    # Draw a box around the face    cv2.rectangle(        frame, (left, top), (right, bottom), (0, 0, 255), 2    )    # Draw a label with a description below the face    cv2.rectangle(        frame, (left, bottom - 35), (right, bottom),         (0, 0, 255), cv2.FILLED    )    cv2.putText(        frame, face_label,         (left + 6, bottom - 6),         cv2.FONT_HERSHEY_DUPLEX, 0.8,         (255, 255, 255), 1    )

Я также хотел вывести в верхней части экрана пополняемый список последних посетителей с указанием количества посещений вашего дома:

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

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

number_of_recent_visitors = 0for metadata in known_face_metadata:    # If we have seen this person in the last minute    if datetime.now() - metadata["last_seen"]                          < timedelta(seconds=10):# Draw the known face image        x_position = number_of_recent_visitors * 150frame[30:180, x_position:x_position + 150] =              metadata["face_image"]number_of_recent_visitors += 1        # Label the image with how many times they have visited        visits = metadata['seen_count']        visit_label = f"{visits} visits"if visits == 1:            visit_label = "First visit"cv2.putText(            frame, visit_label,             (x_position + 10, 170),             cv2.FONT_HERSHEY_DUPLEX, 0.6,             (255, 255, 255), 1        )

Наконец, мы можем вынести текущий кадр видео на экран и поверх этого кадра вывести все наши пояснения:

cv2.imshow('Video', frame)

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

if len(face_locations) > 0 and number_of_frames_since_save > 100:    save_known_faces()    number_of_faces_since_save = 0else:    number_of_faces_since_save += 1

Ко всему этому ради порядка добавляем пару строк кода, отключающего камеру при выходе из программы.

Код запуска программы находится в самом низу:

if __name__ == "__main__":    load_known_faces()    main_loop()

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

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

Интересный факт: похожие системы отслеживания лиц установлены вблизи многих рекламных стендов с объявлениями на улицах и автовокзалах. Система определяет, кого из прохожих интересует данное объявление и как долго люди его изучают. Возможно, полчаса назад это прозвучало бы для вас дико, но вы ты только создали точно такую же систему всего за 60$!

Расширение возможностей программы

Данная программа пример того, как с небольшим количеством кода Python 3, запущенного на дешёвом одноплатном компьютере Jetson Nano 2GB, можно создать мощную систему.

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

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

Узнайте больше о платформе Nvidia Jetson

Узнайте больше о том, как создавать устройства с помощью аппаратной платформы Nvidia Jetson, запишитесь на новый бесплатный учебный курс Nvidia по Jetson. Более подробная информация приведена на сайте Nvidia. Вы также также можете посетить отличные общественные ресурсы, например сайт JetsonHacks.

Узнайте подробности, как получить Level Up по навыкам и зарплате или востребованную профессию с нуля, пройдя онлайн-курсы SkillFactory со скидкой 40% и промокодомHABR, который даст еще +10% скидки на обучение.

Другие профессии и курсы
Подробнее..

Edge платы для домашнего Computer Vision

13.04.2021 06:09:41 | Автор: admin

Я люблю делать всякие странные штуки с Computer Vision. Из того, что я выкладывал на Хабре - умная кормушку для птиц и камера для слежения за ребенком. По работе примерно тем же занимаюсь. Так что слежу за актуальным рынком embedded устройств для ComputerVision. Прошлый обзор я делал полтора года назад. Для Embedded это долго. В этом я сосредоточусь на устройствах которые вышли недавно + некоторый анализ что из этих устройств можно использовать дома/для хобби.

Рассказ будет построен следующим образом:

  • Продуктовые железки которые стали классикой продакшна / железки которые почти доросли до таких.Их можно взять и запустить из коробки. Большие OpenSource комьюнити/персональные фреймворки. Время развертывания обученной сети на такой железке в 1-2 дня.

  • Продуктовые железки которые почти стали классикой, но по которым слишком мало открытых проектов/документации/где часть проекта закрыта. В таких проектах сложно ожидать большой подставы, и скорее всего все будет более-менее будет работать. Но вот что нужно будет сделать для работы сети, и как её сконвертировать, как перенести - нельзя будет оценить заранее.

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

  • Железка есть информации почти нет/нельзя получить без запросов. На рынке нет истории использования/успеха.

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

  • Далеко не все из перечисленного я лично использовал/тестировал

  • Далеко не все перечислено. Я уверен что забыл/не знаю многое. И очень надеюсь что в комментарии накидаете чего-нибудь интересного

  • Я фокусируюсь на устройствах где есть GPU/NPU или прочие ускорители инференса. Безусловно, есть всякие FPGA, и прочее, но я не считаю их применимыми для хоббийных проектов. (что такое NPU GPU TPU и другие аббревиатуры - можно прочитать в этой замечательной статье)

Часть 1. Ближе всего к продукту

С одной стороны, весь этот раздел можно было бы свести к простому перечислению:

  • Jetson

  • Intel

  • Coral

  • Android телефоны

  • Прочие Embedded, устройства с хорошим процессором, без NPU/GPU

И в этом списке за последние 2 года появился бы лишь Coral. Но, в реальности, все сильно интереснее. Появились не только и не столько новые архитектуры, как имплементации/доработки старых. О чем мы и поговорим.

В мире Jetsonов новинок нет. Сейчас в продаже:

  • jetson nano

  • jetson xavier nx

  • jetson agx

  • jetson tx2

12ого началась конференция GTC от NVIDIA, но ничего нового на ней не объявили, так что, скорее всего, на следующий год ничего нового не будет.

Встречаются имплементации Jetson'а, под другие экосистемы. Самое известное - AWS Panorama. Jetson находящийся внутри экосистемы Амазона.

PanoramaPanorama

Jetson, безусловно, одна из самых удобных плат для хобби. Есть разводка GPIO, много кода который работает из коробки. Нейронные сети можно никуда не конвертировать, используя в оригинальном фреймворке.
Cтоит понимать, что из всех четырех Jetson'ов для хобби лучше всего подходит Nano. Он стоит лишь 100$, что значительно меньше следующего в серии NX, стоящего 400$. В теории, TX2в середине, но его почти нет в продаже + менее удобная плата. Проектов на Jetson очень много. Например из того что было в медийном пространстве - 1, 2. Вот тут есть неплохая подборка.
Лично я участвовал где-то в 5-7 проектах где Jetson был основной платформой. 2-3 из них переросли в полноценные продукты. Но, вынужден сказать, что для хобби его не использовал ни разу. Почему? Какая-то совокупность факторов всегда. Nano у меня был первой серии, там были баги по питанию. Иногда была не нужна производительность дополнительная. Иногда хотелось опробовать чего-то нового.

В отличие от Jetson, на базе Movidius появляются интересные штуки. В первую очередь это M.2 и mPCIe карты. Какие-то даже уже были, когда я писал прошлый обзор: 1, 2, 3.
Сейчас их очень много от разных производителей.

Удобны ли ли они для каких-нибудь прототипов и хобийных проектов? Мне кажется, что ниша есть, но очень узкая:

  • Когда надо много производительности (есть сборки где есть несколько мовидиусов)

  • Когда USB соединение слишком нестабильно, но M.2/PCIe хватит (переносные устройства)

Во вторую очередь - это ряд устройств от luxonis. Они устраивали большую компанию на кикстартере про OAK и OAK-D. OAK это платы где movidius воткнут не на материнскую плату, а на плату с камерой. Кроме того, у них есть несколько устройств с movidius когда он стоит на плате 1, 2. Я не буду вдаваться подробнее тут, кому интересно - про них я делал более подробный обзор у себя в блоге/на Youtube:

Кому лень читать/смотреть - вот краткая выдержка:

  • + Минус одно USB соединение + к стабильности - для части проектов полезно

  • - От USB все равно не уйти - до прода скорее всего не дойдет

  • + Неплохой дизайн, неплохой корпус

  • - Заменили хороший OpenVino на какой-то мутный DepthAI

  • - Дорого. Дороже чем собрать такое с оригинальным Movidius'ом, дороже чем с Jetson Nano

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

Мне куда больше понравились эти две платы 1, 2. Но тут сразу понятно, что на первой оочень слабый процессор, а вторая дорогая и там есть лишнее соединение.

Кроме luxonis до movidius'а в камере догадался FLIR, достаточно крупный производитель камер. Они выпустили FireFly DL, который явно на порядки более продуктовый чем OAK, а стоит только на 100$ дороже (+объектив).

Чтобы закончить с Movidius окончательно. По простоте использования/наличию документации/комментариям и поддержке - на мой взгляд Movidius - это один из самых разумных ускорителей для своих проектов на нейронных сетях. Его минус - сложный переход с продакшну, и необходимость конвертации сети. То что вышло за последние годы - расширяет возможности использования. Но все же мне не хватает плат сравнимых с RPi3 где мовидиус бы стоял напрямую на плате.

Google Coral. Вот тут много нового. В своем прошлом обзоре я был крайне недоволен им - очень ограниченные платы, очень бажные. Но прогресс. Баги пофикшены, выпущена новая линейка. Есть почти все то же самое что и в movidius, только напрямую от производителя - отдельные платы, стики, M.2, pci-e, чистые чипы, и.т.д..

В качестве основного фреймворка - специальный tflite, где уже сильно меньше потерь на конвертации. Но, как видно, слоев все равно сильно меньше чем в том же ONNX.
Из плюсов, про которые не сказал - на базе Coral уже сторонние производители создают свои решения. Например Asus. Из минусов - считанные разы слышал что его использовали в продакшене. И, обычно, для каких-то простых задач.
Для себя я понимаю почему я избегаю Coral - при прочих равных не хочу трогать TensorFlow. А по текущим характеристикам он нигде не превосходит вариантов выше.

Телефоны. Так же, стоит отметить, многие телефоны получили поддержку из плат сопроцессоров для нейронных сетей. Есть несколько фреймфорков для инференса моделей на них. Например тут и тут описывал. Зачастую телефон стал удобнее чем embedded для пилота и хобби. Основной минус - отсутствие периферии. Второй серьезный минус для меня - внутренняя инфраструктура приложений. Конечно, Unity и Flutter упрощают логику использования. Но все же, лично для меня, телефоны сильно сложнее чем Linux-системы.
С другой стороны, в телефоне уже есть и камера и акселерометр, и интернет.

Прочее. Под "прочим" я в первую очередь подразумеваю системы где заход в нейронные сети идет со стороны процессора. Например в процессорах Intel за счет OpenVino можно сильно оптимизировать сети. На некоторых процессорах, например на RaspberryPI есть оптимизация под инструкции Neon. RPi4 вполне может справляться с какими-то задачами детекции и трекинга в реальном времени. Так что если вам нужно с помощью машинного зрения раз в день проверять рассаду - думаю подойдет.

Часть 2. Работает, но мало информации

Есть такая забавная штука. В ML сейчас 90% знаний открыто. Есть статьи, большая часть публикаций с OpenSource. Подробнейшие фреймворки на Nvidia и Intel. Но рынок аппаратных платформ был исторически не такой. Хотите подключить камеру по csi-mpi к своей платформе? Будьте добры купите дорогущий мануал по протоколу. Хотите разрабатывать на нашей платформе? Для этого вам нужно специальное программное обеспечение которое просто так вы не скачаете. И много фирм по производству железа по-другому и не мыслят. Как результат мы имеем полтора гайда на платформу до её покупки. Невозможность протестировать до покупки. Отсутствие форумов по теме. И проблему с каждой функцией где что-то пошло не так.

При этом платформы становятся популярнее и популярнее, реализовать можно все больше и больше. К таким платформам я в первую очередь отношу:

  • RockChip

  • Gyrfalcon

Обе платформы я видел в проде. Даже немного экспериментировал. Но у обоих платформ крайне неудобный фреймворк переноса сетей/использования.

RochChip. Основная платформа на которой все делается - Rockchip 3399Pro. Самая популярная реализация, наверное - Firefly, RockPiN10 или Toybrick.

Что забавно, у того же ASUS есть версия не только на базе Google Coral, но и на базе RockChip.
Сейчас разрабатывается новая версия - 1, 2.
В целом, плюс RockChip'а - это плата которую любят все разработчики железа. Есть референсный дизайн, комплектующие, и.т.д. Собрать продукт проще и быстрее чем на Jetson.
Но перенос сети весьма непредсказуем. Документация куцая и полукитайская. Как поддерживается - не понятно. Я видел несколько проектов где сети все же перенесли. Но, гарантировать что это всегда можно, нельзя.

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

Забавно, что платы на его базе в продаже почти отсутствуют. Что-то из того что есть: 1, 2, 3 .

Если я правильно понимаю, Gyrfalcon ориентирован на корпоративный рынок. Отсюда и закрытость инфраструктуры и мало число девайсов в продаже. Глобально, с прошлой моей статьи ничего особо не поменялось.

Делать ли свои проекты на базе этих платформ? Подходят ли они для хобби? В целом, такое мне кажется возможным. Главное чтобы были простые сетки. Классификация/базовая детекция, и.т.д.
По цене такие платформы достаточно дешевы и сравнимы с OpenVino|Jetson вариантами.
Но надо серьезно понимать зачем так делать. Это может быть:

  • желание сделать продукт из своей разработки

  • желание распаять свою систему

  • нехватка в Jetson|RPi каких-то возможностей

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

Часть 3. Внешне все выглядит неплохо, есть какая-то документация, но примеров нет

Пожалуй, сюда я отнесу только одну плату Khadas VIM3 . Много кто о ней знает, но не видел ни одного человека который бы что-то на ней сделал. Есть в открытой продаже, просто купить. Заявлены неплохие параметры по скорости.

Судя по документации перенос моделей достаточно простой. Но, так как никто не пробовал/не тестировал, - не понятны ограничения. Сама плата собрана на базе процессора Amlogic A311D, который содержит NPU модуль. Amlogic многие позиционируют как конкурент RockChip, сравнивая их. Но сравнений именно NPU модулей - нет.

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

Часть 4. Железки есть, информации нет

Большая часть плат тут имеет очень слабую документацию. Часть плат - это отладочные платы для мобильных платформ. Другая часть - платы специально под ML, но по которым очень мало информации и данных в интернете.

BeagleV. Плата которая пока не вышла, но выглядит неплохо. Разработана на базе процессора U74 от SiFive. Используется RISC-V архитектура.

BeagleBoard - странная плата с комьюнити вокруг. Именно вокруг этого комьюнити частично построена плата BeagleV. Плата сделана на базе NPU модуля от Texas Instruments. Вроде даже какие-то репозитории есть:

  1. Фреймворк от TI для обучения нейронных сетей. Аж 55 звезд на гитхабе.

  2. Репозиторий платы. Аж 88 звезд.

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

Пример настоящего Edge (минимальное использование ЦПУ и энергоэффективности) это - Sipeed Maixduino и Grove AI Hat. Но, разработка на них, судя по отзывам, которые я слышал, ужасна. Сети плохо поддерживаются, мало производительности. Вот тут пример использования. Ну, по сути все проблемы обычного Arduino.
Я видел людей которые делали и адекватные проекты на их базе, и хоббийные. Но я не готов:)

Глобально, Qualcomm - это, конечно, производитель процессоров для мобильных. Но, на их же базе, есть какое-то количество именно embedded платформ. При этом, Qualcomm - имеет свой SDK, и свою платформу для исполнения нейронных сетей. Года 2.5 назад я сталкивался с ней. И тогда там была жесть. Простейший слой сложения не поддерживался. Что там говорить про сплиты или объединения. По сути работал лишь VGG на трехканальный вход.
Сейчас, судя по слухам все лучше. К тому же, должен нормально работать Tensorflow lite.
Но вот с платами под эмбеддед у Qualcomm плохо. Есть вот такое (но стоит почти 500 баксов). Или вот такое (мало информации, но выглядит прикольно, за 300 баксов камера + корпус + ускоритель = неплохо).

Примерно так же себя ведет Huawei. Есть фреймворк. Не пользовался, и не знаю. Есть какое-то количество плат. Должен работать Tensorflow lite.
Но, мне сложно придумать где такая плата будет иметь смысл на использование.

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

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

P.S.

Про девайсы которые попадают мне в руки/про которые я читаю - иногда пишу у себя в блоге (telegramm, vk). Наверное, через год-два проапдейчу тут что накопится.
Прошлый апдейт делал на ютубе.

Подробнее..

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

25.05.2021 14:04:29 | Автор: admin

К старту курса "Machine Learning и Deep Learning" мы решили поделиться переводом обзора AttendSeg новой архитектуры нейронной сети, разработанной исследователями искусственного интеллекта из DarwinAI и Университета Ватерлоо, которая позволит выполнять сегментацию изображений на маломощных вычислительных устройствах, также с низкой вычислительной мощностью.


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

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

В своей последней работе учёным из DarwinAI и Университета Ватерлоо удалось создать нейронную сеть, которая обеспечивает околооптимальную сегментацию и достаточно мала, чтобы подойти устройствам с ограниченными ресурсами. Нейронная сеть под названием AttendSeg подробно описана в статье, которая была принята на конференции по компьютерному зрению и распознаванию образов (CVPR) в этом году.

Классификация, обнаружение и сегментация объектов

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

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

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

Классификация изображений в сравнении с обнаружением объектов и семантической сегментациейКлассификация изображений в сравнении с обнаружением объектов и семантической сегментацией

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

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

Машинное обучение для пограничных устройств

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

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

Архитектура нейронной сети семантической сегментации на устройстве AttendSegАрхитектура нейронной сети семантической сегментации на устройстве AttendSeg

С помощью AttendSeg исследователи из DarwinAI и Университета Ватерлоо попытались решить проблемы семантической сегментации на устройстве.

"Идея создания AttendSeg была продиктована как нашим желанием продвинуть TinyML, так и наблюдаемыми DarwinAI потребностями рынка, рассказал TechTalks Александр Вонг, соучредитель DarwinAI и доцент Университета Ватерлоо. Существует множество промышленных приложений для высокоэффективных подходов к сегментации на пограничных устройствах, и именно отзывы на эту тему и потребности рынка, которые я вижу, стимулируют такие исследования".

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

Модель глубокого обучения AttendSeg выполняет семантическую сегментацию с точностью, почти не уступающей RefineNet, при этом сокращая количество параметров до 1,19 млн. Интересно, что исследователи также обнаружили, что снижение точности параметров с 32 бит до 8 бит не привело к значительному снижению производительности и позволило им уменьшить объём памяти AttendSeg в 4 раза. Модель требует чуть больше 1 МБ памяти, что достаточно мало, чтобы поместиться на большинстве пограничных устройств.

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

Эксперименты показывают, что AttendSeg обеспечивает оптимальную семантическую сегментацию при сокращении количества параметров и объёма памятиЭксперименты показывают, что AttendSeg обеспечивает оптимальную семантическую сегментацию при сокращении количества параметров и объёма памяти

Конденсаторы внимания для компьютерного зрения

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

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

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

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

Машиноуправляемое проектирование нейронных сетей

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

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

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

Для своих экспериментов исследователи использовали машиноуправляемую архитектуру, чтобы настроить AttendSeg для Nvidia Jetson, аппаратных комплектов для робототехники и приложений ИИ на пограничных устройствах. Но AttendSeg не ограничивается Jetson.

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

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

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

Таким образом машинное обучение сегодня управляет архитектурой глубоких нейронных сетей, позволяя находить оптимальные для конкретных устройств конфигурации. Если вы хотите начать эксперименты с моделями машинного обучения и глубокими нейронными сетями и вам интересна эта сфера в целом от обработки естественного языка до генеративно-состязательных сетей вы можете присмотреться к курсу "Machine Learning и Deep Learning", партнёром которого является компания NVIDIA разработчик упомянутой в этой статье Jetson энергосберегающей системы, предназначенной для ускорения машинного обучения.

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru