通过计算机视觉通过虚拟边界保护人们远离危险区域

源节点: 807925

随着公司欢迎更多的自动机器人和其他重型设备进入工作场所,我们需要确保设备可以在队友周围安全运行。 在这篇文章中,我们将向您展示如何使用计算机视觉和 AWS DeepLens,这是支持AWS深度学习的摄像机,旨在供开发人员学习机器学习(ML)。 使用本文中的机器学习技术,您可以为受限区域建立虚拟边界,这些边界可以在人们接近时自动关闭设备或发出警报。

对于此项目,您将使用以下方法训练自定义对象检测模型: 亚马逊SageMaker 并将模型部署到AWS DeepLens设备。 对象检测是一种ML算法,它将图像作为输入并识别对象及其在图像中的位置。 除了虚拟边界解决方案之外,当您需要检测某些对象在图像中的位置或计算图像中所需对象的实例数时(例如,对存储箱中的项目进行计数),可以应用本文中学习的技术。在零售货架上。

解决方案概述

本演练包括以下步骤:

  1. 准备数据集以输入ML算法。
  2. 使用Amazon SageMaker训练模型。
  3. 具有自定义限制区域的测试模型。
  4. 将解决方案部署到AWS DeepLens。

我们还将讨论可以在其中应用此解决方案的其他实际用例。

下图说明了解决方案体系结构。

先决条件

要完成本演练,您必须具有以下先决条件:

准备数据集以输入ML算法

这篇文章使用称为对象检测模型的ML算法来构建解决方案,该解决方案可以检测人员是否在自定义限制区域中。 您使用公开可用的 行人检测数据集 在Kaggle上可用,其中有2,000多个图像。 该数据集具有用于人类和类似人类的物体(如人体模型)的标签,因此经过训练的模型可以更准确地区分真实人类与纸板道具或雕像。

例如,以下图像是检测到建筑工人的示例,以及它们是否位于自定义限制区域(红色轮廓)中。

要开始训练您的模型, 首先创建一个S3存储桶 存储您的训练数据和模型输出。 对于AWS DeepLens项目,S3存储桶名称必须以前缀开头 deeplens-。 您可以使用这些数据来通过SageMaker训练模型,SageMaker是一种完全托管的服务,可以快速构建,训练和部署ML模型。

使用Amazon SageMaker训练模型

您可以使用SageMaker Jupyter笔记本作为开发环境来训练模型。 Jupyter Notebook是一个开源Web应用程序,它使您可以创建和共享包含实时代码,方程式,可视化效果和叙述文本的文档。 对于此帖子,我们提供 Train_Object_Detection_People_DeepLens.ipynb,一个完整的笔记本供您遵循。

要创建自定义对象检测模型,您需要使用启用了图形处理单元(GPU)的训练作业实例。 GPU擅长并行化训练神经网络所需的计算。 尽管笔记本本身是单个ml.t2.medium实例,但是培训工作专门使用ml.p2.xlarge实例。 要访问支持GPU的训练作业实例,您必须 提交增加服务限额的请求 到AWS支持中心。

收到限额增加后,请完成以下步骤来创建SageMaker笔记本实例:

  1. 在SageMaker控制台上,选择 笔记本实例.
  2. 创建笔记本实例.
  3. 针对 笔记本实例名称,输入笔记本实例的名称。
  4. 针对 实例类型,选择 t2.medium。

这是笔记本实例支持的最便宜的实例类型,并且足以满足本教程的要求。

  1. 针对 IAM角色,选择 创建一个新角色.

确保这个 AWS身份和访问管理 (IAM)角色有权访问您之前创建的S3存储桶(前缀 deeplens-).

  1. 创建笔记本实例。 您的笔记本实例可能需要几分钟才能启动。
  1. 当笔记本实例页面上的状态更改为InService时,请选择 打开Jupyter 启动新创建的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。

既然您已经完成了所有数据准备工作,那么就可以训练对象检测器了。

有许多不同类型的对象检测算法。 对于这篇文章,您可以使用 单发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个时期。 使用一个ml.p2.xlarge实例,此训练步骤大约需要2个小时。 您可以尝试使用超参数的不同组合,或者训练更多的时间来提高性能。 有关最新定价的信息,请参见 Amazon SageMaker定价.

  1. 您可以使用一行代码来开始培训工作,并在SageMaker控制台上随时间监视准确性:
    od_model.fit(inputs=data_channels, logs=True) 

有关培训如何工作的更多信息,请参见 创建训练作业。 设置和数据下载需要时间,具体取决于数据的大小。 因此,可能要过几分钟才能开始获取训练作业的数据日志。

您可以通过度量平均平均精度(mAP)来监视培训工作的进度,这可以监视模型对对象进行分类并检测正确的边界框的能力的质量。 对于数据集的每次运行,数据日志还会在验证数据上打印出mAP,以及其他损失(一次丢失一次)。 该度量标准可代替算法在准确检测类和围绕其的准确边界框方面​​的性能。

作业完成后,您可以在前面指定的S3存储桶和文件夹中找到训练有素的模型文件 s3_output_location:

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

对于此帖子,我们将在第10个和第100个纪元完成时显示验证集的结果。 在第10个周期结束时,我们看到的验证mAP约为0.027,而第100个周期大约为0.42。

为了获得更好的检测结果,您可以尝试使用SageMaker内置的功能来调整超参数。 自动模型调整 并为更多的时代训练模型。 当您发现准确性下降时,通常会停止训练。

具有自定义限制区的测试模型

在将训练好的模型部署到AWS DeepLens之前,您可以使用SageMaker托管终端在云中对其进行测试。 SageMaker端点是一项完全托管的服务,可让您通过REST API进行实时推断。 SageMaker允许您快速部署新的端点来测试模型,因此您不必将模型托管在用于训练模型的本地实例上。 这使您可以根据模型在算法在训练过程中未看到的图像上进行预测(或推断)。

您不必托管用于训练的同一实例类型。 培训是一项长期且需要大量计算的工作,需要主机通常不需要的另一组不同的计算和内存要求。 您可以选择要托管模型的任何类型的实例。 在这种情况下,我们选择了ml.p3.2xlarge实例进行训练,但是我们选择将模型托管在价格较便宜的CPU实例ml.m4.xlarge上。 以下代码片段显示了我们的端点部署。

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

在自定义限制区(感兴趣的区域)中检测

输出的格式可以表示为[class_index,confidence_score,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

将受SageMaker训练的SSD模型部署到AWS DeepLens时,必须首先运行 部署文件 将模型工件转换为可部署模型:

!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. 针对 模型框架,选择 MX网.
  4. 导入模型.

创建推理功能

推理功能将每个摄像机帧馈入模型以获取预测,并使用推理结果运行任何自定义业务逻辑。 你用 AWS Lambda 创建要部署到AWS DeepLens的功能。 该功能在AWS DeepLens设备上本地运行推理。

首先,我们需要创建一个Lambda函数以部署到AWS DeepLens。

  1. 下载 推断Lambda函数.
  2. 在Lambda控制台上,选择 主要工作内容.
  3. 创建功能.
  4. 选择 从头开始.
  5. 针对 功能名称,输入名称。
  6. 针对 运行时,选择 Python的3.7.
  7. 针对 选择或创建执行角色,选择 使用现有角色.
  8. 服务角色/ AWSDeepLensLambdaRole.
  9. 创建功能.

  1. 在功能的详细信息页面上, 行动 菜单中选择 上载.zip文件.

  1. 上载 推断Lambda 您先前下载的文件。
  2. 保存 保存您输入的代码。
  3. 点击 行动 菜单中选择 发布新版本.

发布该功能使其在AWS DeepLens控制台上可用,以便您可以将其添加到自定义项目中。

  1. 输入版本号,然后选择 发布.

了解推理功能

本节将向您介绍推理功能的一些重要部分。 首先,您应注意两个特定文件:

  • 标签.txt –包含神经网络(整数)的输出到人类可读标签(字符串)的映射
  • lambda_函数.py –包含用于在每个摄像机帧上生成预测并发送回结果的函数的代码

在lambda_function.py中,您首先加载并优化模型。 与具有GPU的云虚拟机相比,AWS DeepLens具有更少的计算能力。 AWS DeepLens使用英特尔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. 按名称搜索您先前创建的Lambda函数。
  6. 创建项目.
  7. 点击 项目 页面上,选择要部署的项目。
  8. 选择 部署到设备.
  9. 针对 目标设备,选择您的设备。
  10. 评论.
  11. 查看您的设置并选择 部署.

根据您的AWS DeepLens连接到的网络速度,部署最多可能需要10分钟才能完成。 部署完成后,您应该在页面上看到绿色的横幅,并显示消息:“恭喜,您的模型现在正在AWS DeepLens上本地运行!”

要查看文本输出,请在设备详细信息页面上向下滚动到 项目成果 部分。 请按照本节中的说明复制主题,然后转到 AWS IoT核心 控制台订阅该主题。 您应该在以下屏幕截图中看到结果。

有关查看视频流或文本输出的分步说明,请参阅 查看来自AWS DeepLens的结果.

实际用例

现在,您已经从运行在AWS DeepLens上的模型中获得了预测,现在让我们将这些预测转换为警报和见解。 这样的项目最常见的用途包括:

结论

在本文中,您学习了如何训练对象检测模型并将其部署到AWS DeepLens,以检测进入限制区域的人员。 您可以将本教程用作参考,以在AWS DeepLens上训练和部署自己的自定义对象检测项目。

有关本教程以及AWS DeepLens的其他教程,示例和项目想法的更详细的演练,请参阅 AWS DeepLens食谱.


作者简介

亚什沙 是Amazon ML解决方案实验室的数据科学家,他在这里研究从医疗保健到制造和零售的一系列机器学习用例。 他具有人为因素和统计方面的正式背景,并且以前是Amazon SCOT团队的成员,负责设计产品以指导3P卖家进行有效的库存管理。

富阮 是AWS Panorama的产品经理。 他开发的产品可为任何技能水平的开发人员提供简单,动手的机器学习入门。

资料来源:https://aws.amazon.com/blogs/machine-learning/protecting-people-through-virtual-boundaries-computer-vision/

时间戳记:

更多来自 AWS机器学习博客