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

Исходный узел: 807925

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

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

Обзор решения

Пошаговое руководство включает в себя следующие шаги:

  1. Подготовьте свой набор данных для ввода в алгоритм машинного обучения.
  2. Обучите модель с помощью Amazon SageMaker.
  3. Тестовая модель с настраиваемыми зонами ограничения.
  4. Разверните решение в AWS DeepLens.

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

Следующая диаграмма иллюстрирует архитектуру решения.

Предпосылки

Для завершения этого прохождения у вас должны быть следующие предварительные условия:

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

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

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

Чтобы начать обучение вашей модели, сначала создайте корзину S3 для хранения данных обучения и вывода модели. Для проектов AWS DeepLens имена сегментов S3 должны начинаться с префикса deeplens-. Вы используете эти данные для обучения модели с помощью SageMaker, полностью управляемой службы, которая предоставляет возможность быстро создавать, обучать и развертывать модели машинного обучения.

Обучите модель с Amazon SageMaker

Вы используете записные книжки SageMaker Jupyter в качестве среды разработки для обучения модели. Jupyter Notebook - это веб-приложение с открытым исходным кодом, которое позволяет создавать и обмениваться документами, содержащими живой код, уравнения, визуализации и повествовательный текст. Для этого поста мы предоставляем Train_Object_Detection_People_DeepLens.ipynb, полный блокнот, которым вы можете следовать.

Чтобы создать пользовательскую модель обнаружения объектов, вам необходимо использовать экземпляр учебного задания с поддержкой графического процессора (GPU). Графические процессоры отлично справляются с распараллеливанием вычислений, необходимых для обучения нейронной сети. Хотя записная книжка представляет собой единственный экземпляр ml.t2.medium, в учебном задании специально используется экземпляр ml.p2.xlarge. Чтобы получить доступ к экземпляру учебного задания с поддержкой графического процессора, вы должны подать заявку на увеличение лимита услуг в Центр поддержки AWS.

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

  1. На консоли SageMaker выберите Экземпляры ноутбуков.
  2. Выберите Создать блокнот.
  3. Что касается Имя экземпляра блокнота, введите имя экземпляра записной книжки.
  4. Что касается Тип экземпляра, выберите t2.средний.

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

  1. Что касается Роль IAM, выберите Создать новую роль.

Убедитесь, что это Управление идентификацией и доступом AWS (IAM) роль имеет доступ к сегменту S3, который вы создали ранее (префикс deeplens-).

  1. Выберите Создать блокнот. Запуск вашего экземпляра записной книжки может занять несколько минут.
  1. Когда статус на странице экземпляров записной книжки изменится на InService, выберите Открытый Юпитер чтобы запустить только что созданный экземпляр ноутбука Jupyter.
  2. Выберите Загрузите загрузить Train_Object_Detection_people_DeepLens.ipynb файл, который вы скачали ранее.

  1. Откройте блокнот и пройдите до конца.
  2. Если вас спросят о настройке ядра, выберите conda_mxnet_p36.

Записная книжка Jupyter содержит сочетание ячеек с текстом и кодом. Чтобы запустить фрагмент кода, выберите ячейку и нажмите Shift + Enter, Во время работы ячейки рядом с ячейкой появляется звездочка. Когда ячейка заполнена, выходной номер и новая выходная ячейка появляются под исходной ячейкой.

  1. Загрузите набор данных из общедоступной корзины S3 в локальный экземпляр SageMaker и разархивируйте данные. Это можно сделать, выполнив код в записной книжке:
     !aws s3 cp s3://deeplens-public/samples/pedestriansafety/humandetection_data.zip . !rm -rf humandetection/ !unzip humandetection_data.zip -d humandetection 

  2. Преобразуйте набор данных в формат (ЗаписьIO), который можно передать в алгоритм SageMaker:
     !python $mxnet_path/tools/im2rec.py --pass-through --pack-label $DATA_PATH/train_mask.lst $DATA_PATH/ !python $mxnet_path/tools/im2rec.py --pass-through --pack-label $DATA_PATH/val_mask.lst $DATA_PATH/ 

  3. Перенесите файлы RecordIO обратно в Amazon S3.

Теперь, когда вы закончили всю подготовку данных, вы готовы обучать детектор объектов.

Есть много разных типов алгоритмов обнаружения объектов. Для этого поста вы используете Алгоритм обнаружения Single-Shot MultiBox (SSD). Алгоритм SSD обеспечивает хороший баланс скорости и точности, что делает его идеальным для работы на периферийных устройствах, таких как AWS DeepLens.

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

  1. Настройте гиперпараметры и каналы данных. Рассмотрите возможность использования следующего примера определения гиперпараметров:
     od_model = sagemaker.estimator.Estimator(training_image, role, train_instance_count=1, train_instance_type='ml.p2.xlarge', train_volume_size = 50, train_max_run = 360000, input_mode= 'File', output_path=s3_output_location, sagemaker_session=sess) od_model.set_hyperparameters(base_network='resnet-50', use_pretrained_model=1, num_classes=2, mini_batch_size=32, epochs=100, learning_rate=0.003, lr_scheduler_step='3,6', lr_scheduler_factor=0.1, optimizer='sgd', momentum=0.9, weight_decay=0.0005, overlap_threshold=0.5, nms_threshold=0.45, image_shape=300, num_training_samples=n_train_samples) 

В записной книжке есть несколько предварительно выбранных гиперпараметров по умолчанию. Для обнаружения пешеходов вы обучаете модель 100 эпохам. Этот шаг обучения должен занять около 2 часов с использованием одного экземпляра ml.p2.xlarge. Вы можете поэкспериментировать с различными комбинациями гиперпараметров или потренироваться на большее количество эпох для повышения производительности. Для получения информации о последних ценах см. Цены на Amazon SageMaker.

  1. Вы можете начать обучение с одной строчки кода и отслеживать точность с течением времени на консоли SageMaker:
    od_model.fit(inputs=data_channels, logs=True) 

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

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

Когда работа будет завершена, вы можете найти файлы обученной модели в сегменте S3 и папке, указанной ранее в s3_output_location:

s3_output_location = 's3://{}/{}/output'.format(BUCKET, PREFIX)

В этом посте мы показываем результаты проверки, установленной для завершения 10-й и 100-й эпох. В конце 10-й эпохи мы видим валидационное МАР примерно 0.027, тогда как 100-й эпохи было примерно 0.42.

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

Тестовая модель с настраиваемыми зонами ограничения

Перед развертыванием обученной модели в AWS DeepLens вы можете протестировать ее в облаке с помощью конечной точки, размещенной в SageMaker. Конечная точка SageMaker - это полностью управляемая служба, которая позволяет делать выводы в реальном времени через REST API. SageMaker позволяет быстро развертывать новые конечные точки для тестирования ваших моделей, поэтому вам не нужно размещать модель на локальном экземпляре, который использовался для обучения модели. Это позволяет делать прогнозы (или выводы) из модели на изображениях, которые алгоритм не видел во время обучения.

Вам не обязательно использовать тот же тип инстанса, который вы использовали для обучения. Обучение - это длительная и трудоемкая работа, требующая другого набора требований к вычислительным ресурсам и памяти, которых обычно не требует хостинг. Вы можете выбрать любой тип экземпляра, на котором хотите разместить модель. В этом случае мы выбрали для обучения экземпляр ml.p3.2xlarge, но мы решили разместить модель на менее дорогом экземпляре ЦП, ml.m4.xlarge. В следующем фрагменте кода показано развертывание конечной точки.

object_detector = od_model.deploy(initial_instance_count = 1, instance_type = 'ml.m4.xlarge') 

Обнаружение в настраиваемой зоне ограничения (регион интереса)

Формат вывода может быть представлен как [индекс_класса, оценка_ уверенности, xmin, ymin, xmax, ymax]. Прогнозы с низким уровнем достоверности часто имеют более высокие шансы на ложноположительный или ложноотрицательный результат, поэтому вам, вероятно, следует отказаться от прогнозов с низким уровнем достоверности. Вы можете использовать следующий код, чтобы определить, перекрывается ли ограничивающая рамка человека с зоной ограничения.

def inRestrictedSection(ImShape = None, R1 = None, restricted_region = None, kclass = None, score = None, threshold = None): statement = 'Person Not Detected in Restricted Zone' if (kclass == 1) and (score > threshold): Im1 = np.zeros((ImShape[0],ImShape[1],3), np.int32) cv2.fillPoly(Im1, [R1], 255) Im2 = np.zeros((ImShape[0],ImShape[1],3), np.int32) if restricted_region is None: restricted_region = np.array([[0,ImShape[0]],[ImShape[1],ImShape[0]],[ImShape[1],0], [0,0]], np.int32) cv2.fillPoly(Im2, [restricted_region], 255) Im = Im1 * Im2 if np.sum(np.greater(Im, 0))>0: statement = 'Person Detected in Restricted Zone' else: statement = statement return statement 

По умолчанию весь кадр оценивается на предмет присутствия человека. Однако вы можете легко указать интересующую область, в которой присутствие человека считается повышенным риском. Если вы хотите добавить настраиваемую зону ограничения, добавьте координаты вершин области, представленной [ось X, ось Y], и создайте многоугольник. Координаты необходимо вводить либо по часовой стрелке, либо против часовой стрелки. См. Следующий код:

restricted_region = None #restricted_region = np.array([[0,200],[100,200],[100,0], [10,10]], np.int32) 

В следующем примере кода показаны пешеходы, идентифицированные в зоне ограниченного доступа:

file_name = 'humandetection/test_images/t1_image.jpg' img = cv2.imread(file_name) img =cv2.cvtColor(img,cv2.COLOR_BGR2RGB) thresh = 0.2 height = img.shape[0] width = img.shape[1] colors = dict() with open(file_name, 'rb') as image: f = image.read() b = bytearray(f) ne = open('n.txt','wb') ne.write(b) results = object_detector.predict(b, initial_args={'ContentType': 'image/jpeg'}) detections = json.loads(results) object_categories = ['no-person', 'person'] for det in detections['prediction']: (klass, score, x0, y0, x1, y1) = det if score < thresh: continue cls_id = int(klass) prob = score if cls_id not in colors: colors[cls_id] = (random.random(), random.random(), random.random()) xmin = int(x0 * width) ymin = int(y0 * height) xmax = int(x1 * width) ymax = int(y1 * height) R1 = np.array([[xmin,ymin],[xmax,ymin],[xmax,ymax], [xmin,ymax]], np.int32) cv2.polylines(img,[R1],True, (255,255,0), thickness = 5) cv2.polylines(img,[restricted_region],True, (255,0,0), thickness = 5) plt.imshow(img) print(inRestrictedSection(img.shape,R1 = R1, restricted_region= restricted_region, kclass = cls_id, score = prob, threshold=0.2)) 

Следующие изображения показывают наши результаты.

Разверните решение в AWS DeepLens

Преобразуйте модель для развертывания в AWS DeepLens

При развертывании модели SSD, обученной SageMaker, в AWS DeepLens необходимо сначала запустить развернуть.py чтобы преобразовать артефакт модели в развертываемую модель:

!rm -rf incubator-mxnet !git clone -b v1.7.x https://github.com/apache/incubator-mxnet MODEL_PATH = od_model.model_data TARGET_PATH ='s3://'+BUCKET+'/'+PREFIX+'/patched/' !rm -rf tmp && mkdir tmp rm -rf tmp && mkdir tmp !aws s3 cp $MODEL_PATH tmp !tar -xzvf tmp/model.tar.gz -C tmp !mv tmp/model_algo_1-0000.params tmp/ssd_resnet50_300-0000.params !mv tmp/model_algo_1-symbol.json tmp/ssd_resnet50_300-symbol.json !python incubator-mxnet/example/ssd/deploy.py --network resnet50 --data-shape 300 --num-class 2 --prefix tmp/ssd_ !tar -cvzf ./patched_model.tar.gz -C tmp ./deploy_ssd_resnet50_300-0000.params ./deploy_ssd_resnet50_300-symbol.json ./hyperparams.json !aws s3 cp patched_model.tar.gz $TARGET_PATH

Импортируйте вашу модель в AWS DeepLens

Чтобы запустить модель на устройстве AWS DeepLens, необходимо создать проект AWS DeepLens. Начните с импорта вашей модели в AWS DeepLens.

  1. На консоли AWS DeepLens под Полезные ресурсы, выберите Модели.
  2. Выберите Импортировать модель.

  1. Что касается Источник импорта, наведите на Внешне обученная модель.
  2. Введите местоположение Amazon S3 исправленная модель которые вы сохранили после запуска deploy.py на шаге выше.
  3. Что касается Каркас модели, выберите MXNet.
  4. Выберите Импортировать модель.

Создать функцию вывода

Функция вывода передает каждый кадр камеры в модель для получения прогнозов и запускает любую настраиваемую бизнес-логику с использованием результатов вывода. Ты используешь AWS Lambda для создания функции, которую вы развертываете в AWS DeepLens. Функция выполняет логический вывод локально на устройстве AWS DeepLens.

Во-первых, нам нужно создать функцию Lambda для развертывания в AWS DeepLens.

  1. Скачать вывод лямбда-функции.
  2. На лямбда-консоли выберите функции.
  3. Выберите Создать функцию.
  4. Выберите Автор с нуля.
  5. Что касается Имя функциивведите имя.
  6. Что касается Время выполнения, выберите Python 3.7.
  7. Что касается Выберите или создайте роль исполнения, выберите Использовать существующую роль.
  8. Выберите сервис-ролевое / AWSDeepLensLambdaRole.
  9. Выберите Создать функцию.

  1. На странице сведений о функции на странице Действия Меню, выберите Загрузить ZIP-файл.

  1. Загрузить вывод Лямбда файл, который вы скачали ранее.
  2. Выберите Сохранить чтобы сохранить код, который вы ввели.
  3. На Действия Меню, выберите Опубликовать новую версию.

Публикация функции делает ее доступной в консоли AWS DeepLens, чтобы вы могли добавить ее в свой собственный проект.

  1. Введите номер версии и выберите Опубликовать.

Понимание функции вывода

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

  • label.txt - Содержит отображение вывода нейронной сети (целые числа) на понятные человеку метки (строка)
  • лямбда_функция.py - Содержит код для вызываемой функции для создания прогнозов для каждого кадра камеры и отправки результатов.

В lambda_function.py вы сначала загружаете и оптимизируете модель. По сравнению с облачными виртуальными машинами с графическим процессором AWS DeepLens имеет меньшую вычислительную мощность. AWS DeepLens использует оптимизатор моделей Intel OpenVino для оптимизации модели, обученной в SageMaker, для работы на его оборудовании. Следующий код оптимизирует вашу модель для локального запуска:

client.publish(topic=iot_topic, payload='Optimizing model...') ret, model_path = mo.optimize('deploy_ssd_resnet50_300', INPUT_W, INPUT_H) # Load the model onto the GPU. client.publish(topic=iot_topic, payload='Loading model...') model = awscam.Model(model_path, {'GPU': 1}) 

Затем вы запускаете модель кадр за кадром поверх изображений с камеры. Смотрите следующий код:

while True: # Get a frame from the video stream ret, frame = awscam.getLastFrame() if not ret: raise Exception('Failed to get frame from the stream') # Resize frame to the same size as the training set. frame_resize = cv2.resize(frame, (INPUT_H, INPUT_W)) # Run the images through the inference engine and parse the results using # the parser API, note it is possible to get the output of doInference # and do the parsing manually, but since it is a ssd model, # a simple API is provided. parsed_inference_results = model.parseResult(model_type, model.doInference(frame_resize)) 

Наконец, вы отправляете результаты предсказания текста обратно в облако. Просмотр текстовых результатов в облаке - удобный способ убедиться, что модель работает правильно. Каждое устройство AWS DeepLens имеет выделенную тему iot_topic, автоматически создаваемую для получения результатов логического вывода. См. Следующий код:

# Send results to the cloud client.publish(topic=iot_topic, payload=json.dumps(cloud_output)) 

Создайте собственный проект AWS DeepLens

Чтобы создать новый проект AWS DeepLens, выполните следующие действия:

  1. На консоли AWS DeepLens на Проекты выберите страницу Создать проект.
  2. Что касается Тип проекта, наведите на Создать новый пустой проект.
  3. Выберите Следующая.

  1. Назовите свой проект yourname-pedestrian-detector-.
  2. Выберите Добавить модель.
  3. Выберите только что созданную модель.
  4. Выберите Добавить функцию.
  5. Найдите созданную ранее лямбда-функцию по имени.
  6. Выберите Создать проект.
  7. На Проекты на странице выберите проект, который хотите развернуть.
  8. Выбрали Развернуть на устройстве.
  9. Что касается Целевое устройство, выберите свое устройство.
  10. Выберите Обзор.
  11. Просмотрите свои настройки и выберите Развертывание.

Развертывание может занять до 10 минут в зависимости от скорости сети, к которой подключен AWS DeepLens. После завершения развертывания вы должны увидеть зеленый баннер на странице с сообщением «Поздравляем, ваша модель теперь работает локально на AWS DeepLens!»

Чтобы увидеть вывод текста, прокрутите вниз на странице сведений об устройстве до Выход проекта раздел. Следуйте инструкциям в разделе, чтобы скопировать тему и перейти на Ядро Интернета вещей AWS консоль, чтобы подписаться на тему. Вы должны увидеть результаты, как на следующем снимке экрана.

Пошаговые инструкции по просмотру видеопотока или вывода текста см. Просмотр результатов из AWS DeepLens.

Примеры использования в реальном мире

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

  • Понимание того, сколько людей в определенный день вошло в зону ограниченного доступа, чтобы на строительных площадках можно было определить места, требующие дополнительных знаков безопасности. Это можно сделать, собрав результаты и используя их для создания информационной панели с помощью Amazon QuickSight. Для получения дополнительных сведений о создании панели мониторинга с помощью QuickSight см. Создайте систему отслеживания осанки на рабочем месте с помощью AWS DeepLens и GluonCV.
  • Сбор выходных данных из AWS DeepLens и настройка Raspberry Pi для подачи оповещения, когда кто-то входит в зону ограниченного доступа. Дополнительные сведения о подключении устройства AWS DeepLens к устройству Raspberry Pi см. В разделе Создание сортировщика мусора с помощью AWS DeepLens.

Заключение

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

Более подробное описание этого учебного руководства и других учебных пособий, примеров и идей проектов с помощью AWS DeepLens см. В разделе Рецепты AWS DeepLens.


Об авторах

Яш-Шах Специалист по анализу данных в лаборатории Amazon ML Solutions Lab, где он работает над целым рядом сценариев использования машинного обучения - от здравоохранения до производства и розничной торговли. Он имеет формальный опыт работы в области человеческого фактора и статистики и ранее входил в группу Amazon SCOT, занимающуюся разработкой продуктов, которые помогут продавцам 3P эффективно управлять запасами.

Фу Нгуен является менеджером по продукту AWS Panorama. Он создает продукты, которые позволяют разработчикам с любым уровнем подготовки легко и просто познакомиться с машинным обучением.

Источник: https://aws.amazon.com/blogs/machine-learning/protecting-people-through-virtual-boundaries-computer-vision/

Отметка времени:

Больше от Блог машинного обучения AWS