使用 Amazon SageMaker 和 Amazon Rekognition 构建和训练计算机视觉模型以检测图像中的汽车位置 | 亚马逊网络服务

使用 Amazon SageMaker 和 Amazon Rekognition 构建和训练计算机视觉模型以检测图像中的汽车位置 | 亚马逊网络服务

计算机视觉(CV)是机器学习(ML)和深度学习最常见的应用之一。 使用案例包括自动驾驶汽车、社交媒体平台上的内容审核、癌症检测和自动缺陷检测。 亚马逊重新认识 是一项完全托管的服务,可以执行对象检测、视频片段检测、内容审核等 CV 任务,以便从数据中提取见解,而无需任何先前的 ML 经验。 在某些情况下,可能需要更定制的解决方案以及服务来解决非常具体的问题。

在这篇文章中,我们将讨论 CV 可以应用于对象姿势、位置和方向很重要的用例的领域。 其中一种用例是需要上传图像的面向客户的移动应用程序。 这可能是出于合规性原因,也可能是为了提供一致的用户体验并提高参与度。 例如,在网络购物平台上,产品在图像中展示的角度会影响该产品的购买率。 其中一个例子是检测汽车的位置。 我们演示了如何将众所周知的 ML 解决方案与后处理相结合,以在 AWS 云上解决此问题。

我们使用深度学习模型来解决这个问题。 训练用于姿态估计的 ML 算法需要大量专业知识和自定义训练数据。 满足这两个要求都很困难且成本高昂。 因此,我们提供两种选择:一种不需要任何 ML 专业知识并使用 Amazon Rekognition,另一种则使用 亚马逊SageMaker 训练和部署自定义 ML 模型。 在第一个选项中,我们使用 Amazon Rekognition 来检测汽车的车轮。 然后,我们使用基于规则的系统从车轮位置推断汽车方向。 在第二个选项中,我们使用以下方法检测车轮和其他汽车部件 侦探 模型。 这些再次用于通过基于规则的代码推断汽车位置。 第二种选择需要机器学习经验,但也更具可定制性。 它可用于对图像进行进一步的后处理,例如裁剪整个汽车。 这两个选项都可以在公开可用的数据集上进行训练。 最后,我们向您展示如何使用以下服务将此汽车姿态检测解决方案集成到您现有的 Web 应用程序中: Amazon API网关AWS放大.

解决方案概述

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

使用 Amazon SageMaker 和 Amazon Rekognition 构建和训练计算机视觉模型以检测图像中的汽车位置 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

该解决方案由 Amplify 中的模拟 Web 应用程序组成,用户可以在其中上传图像并调用 Amazon Rekognition 模型或自定义 Detectron 模型来检测汽车的位置。 对于每个选项,我们都会举办 AWS Lambda 暴露给我们的模拟应用程序的 API 网关后面的函数。 我们将 Lambda 函数配置为与在 SageMaker 或 Amazon Rekognition 中训练的 Detectron 模型一起运行。

先决条件

对于本演练,您应该具有以下先决条件:

使用 Amazon Rekognition 创建无服务器应用程序

我们的第一个选项演示了如何使用 Amazon Rekognition 检测图像中的汽车方向。 这个想法是使用 Amazon Rekognition 检测汽车及其车轮的位置,然后进行后处理以根据此信息得出汽车的方向。 整个解决方案使用 Lambda 进行部署,如下所示 Github存储库。 该文件夹包含两个主要文件:一个 Dockerfile,它定义将在我们的 Lambda 函数中运行的 Docker 映像,以及 app.py 文件,这将是 Lambda 函数的主要入口点:

def lambda_handler(event, context): body_bytes = json.loads(event["body"])["image"].split(",")[-1] body_bytes = base64.b64decode(body_bytes) rek = boto3.client('rekognition') response = rek.detect_labels(Image={'Bytes': body_bytes}, MinConfidence=80) angle, img = label_image(img_string=body_bytes, response=response) buffered = BytesIO() img.save(buffered, format="JPEG") img_str = "data:image/jpeg;base64," + base64.b64encode(buffered.getvalue()).decode('utf-8')

Lambda 函数需要一个包含标头和正文的事件,其中正文应该是需要标记为 Base64 解码对象的图像。 给定图像,Amazon Rekognition detect_labels 函数是从 Lambda 函数调用的 博托3。 该函数返回图像中每个对象的一个​​或多个标签,以及所有检测到的对象标签的边界框详细信息作为响应的一部分,以及其他信息,例如指定标签的置信度、检测到的标签的祖先标签等标签的别名以及检测到的标签所属的类别。 根据 Amazon Rekognition 返回的标签,我们运行该函数 label_image,它根据检测到的车轮计算汽车角度,如下所示:

n_wheels = len(wheel_instances) wheel_centers = [np.array(_extract_bb_coords(wheel, img)).mean(axis=0)
for wheel in wheel_instances] wheel_center_comb = list(combinations(wheel_centers, 2))
vecs = [(k, pair[0] - pair[1]) for k,pair in enumerate(wheel_center_comb)]
vecs = sorted(vecs, key = lambda vec: np.linalg.norm(vec[1])) vec_rel = vecs[1] if n_wheels == 3 else vecs[0]
angle = math.degrees(math.atan(vec_rel[1][1]/vec_rel[1][0])) wheel_centers_rel = [tuple(wheel.tolist()) for wheel in
wheel_center_comb[vec_rel[0]]]

请注意,该应用程序要求图像中仅存在一辆车,如果不是这种情况,则返回错误。 然而,后处理可以适应提供更细粒度的方向描述、覆盖多辆汽车或计算更复杂对象的方向。

改进车轮检测

为了进一步提高车轮检测的准确性,可以使用 Amazon Rekognition自定义标签。 与使用 SageMaker 进行微调来训练和部署自定义 ML 模型类似,您可以自带标记数据,以便 Amazon Rekognition 可以在短短几个小时内为您生成自定义图像分析模型。 借助 Rekognition 自定义标签,您只需要一小组特定于您的使用案例的训练图像(在本例中为具有特定角度的汽车图像),因为它使用 Amazon Rekognition 中的现有功能,可以对跨区域的数千万张图像进行训练。许多类别。 只需点击几下鼠标,并对我们用于标准 Amazon Rekognition 解决方案的 Lambda 函数进行一些小调整,即可集成 Rekognition 自定义标签。

使用 SageMaker 训练作业训练模型

在第二个选项中,我们在 SageMaker 上训练自定义深度学习模型。 我们使用 Detectron2框架 用于汽车零部件的细分。 然后使用这些片段来推断汽车的位置。

Detectron2 框架是一个提供最先进的检测和分割算法的库。 Detectron 提供了多种 Mask R-CNN 模型,这些模型是在著名的 COCO(上下文中的常见对象)数据集上进行训练的。 为了构建我们的汽车物体检测模型,我们使用迁移学习来微调预训练的 Mask R-CNN 模型 汽车零部件细分 数据集。 该数据集使我们能够训练一个可以检测车轮以及其他汽车零件的模型。 该附加信息可以进一步用于相对于图像的汽车角度计算。

该数据集包含用于对象检测和语义分割任务的汽车零件的注释数据:大约 500 张轿车、皮卡和运动型多功能车 (SUV) 的图像,以多个视图(前视图、后视图和侧视图)拍摄。 每个图像都由 18 个实例蒙版和边界框进行注释,代表汽车的不同部分,如车轮、后视镜、灯光以及前后玻璃。 我们修改了车轮的基本注释,使每个车轮被视为一个单独的对象,而不是将图像中所有可用的车轮视为一个对象。

我们使用 亚马逊简单存储服务 (Amazon S3) 用于存储用于训练 Detectron 模型的数据集以及经过训练的模型工件。 而且,Lambda函数中运行的Docker容器存储在 Amazon Elastic Container注册 (亚马逊 ECR)。 Lambda 函数中的 Docker 容器需要包含运行代码所需的库和依赖项。 我们也可以使用 Lambda 层,但解压后的部署打包大小配额限制为 250 MB,并且 Lambda 函数最多可以添加 XNUMX 层。

我们的解决方案基于 SageMaker:我们扩展了预构建 SageMaker Docker 容器 让 PyTorch 运行我们的自定义 PyTorch 训练代码。 接下来,我们使用 SageMaker Python SDK 将训练图像包装到 SageMaker PyTorch 估计器中,如以下代码片段所示:

d2_estimator = Estimator( image_uri=training_image_uri, role=role, sagemaker_session=sm_session, instance_count=1, instance_type=training_instance, output_path=f"s3://{session_bucket}/{prefix_model}", base_job_name=f"detectron2") d2_estimator.fit({ "training": training_channel, "validation": validation_channel, }, wait=True)

最后,我们通过调用 fit() 在创建的 PyTorch 估计器上运行函数。 训练完成后,训练后的模型工件将存储在 Amazon S3 中的会话存储桶中,以用于推理管道。

使用 SageMaker 和推理管道部署模型

我们还使用 SageMaker 托管运行自定义 Detectron 模型的推理端点。 用于部署我们的解决方案的完整基础设施是使用 AWS CDK 进行配置的。 我们可以通过托管我们的自定义模型 SageMaker 实时端点 通过打电话 deploy 在 PyTorch 估计器上。 这是我们第二次扩展预构建的 SageMaker PyTorch 容器以包含 PyTorch Detectron。 我们使用它来运行推理脚本并托管经过训练的 PyTorch 模型,如下所示:

model = PyTorchModel( name="d2-sku110k-model", model_data=d2_estimator.model_data, role=role, sagemaker_session=sm_session, entry_point="predict.py", source_dir="src", image_uri=serve_image_uri, framework_version="1.6.0") predictor = model.deploy( initial_instance_count=1, instance_type="ml.g4dn.xlarge", endpoint_name="detectron-endpoint", serializer=sagemaker.serializers.JSONSerializer(), deserializer=sagemaker.deserializers.JSONDeserializer(), wait=True)

请注意,我们使用 ml.g4dn.xlarge GPU 进行部署,因为它是可用的最小 GPU,足以满足此演示。 我们需要配置两个组件 推理脚本:模型加载和模型服务。 功能 model_fn() 用于加载经过训练的模型,该模型是托管 Docker 容器的一部分,也可以在 Amazon S3 中找到,并返回可用于模型服务的模型对象,如下所示:

def model_fn(model_dir: str) -> DefaultPredictor: for p_file in Path(model_dir).iterdir(): if p_file.suffix == ".pth": path_model = p_file cfg = get_cfg() cfg.MODEL.WEIGHTS = str(path_model) return DefaultPredictor(cfg)

该功能 predict_fn() 执行预测并返回结果。 除了使用我们训练的模型之外,我们还使用在 COCO 数据集上训练的 Mask R-CNN 模型的预训练版本来提取图像中的主要汽车。 这是一个额外的后处理步骤,用于处理存在不止一辆汽车的图像。 请看下面的代码:

def predict_fn(input_img: np.ndarray, predictor: DefaultPredictor) -> Mapping: pretrained_predictor = _get_pretraind_model() car_mask = get_main_car_mask(pretrained_predictor, input_img) outputs = predictor(input_img) fmt_out = { "image_height": input_object.shape[0], "image_width": input_object.shape[1], "pred_boxes": outputs["instances"].pred_boxes.tensor.tolist(), "scores": outputs["instances"].scores.tolist(), "pred_classes": outputs["instances"].pred_classes.tolist(), "car_mask": car_mask.tolist() } return fmt_out

与 Amazon Rekognition 解决方案类似,预测的边界框 wheel 类从检测输出中过滤出来并提供给后处理模块以评估汽车相对于输出的位置。

最后,我们还改进了 Detectron 解决方案的后处理。 它还使用不同汽车零件的片段来推断解决方案。 例如,每当检测到前保险杠但没有检测到后保险杠时,就假设我们有汽车的前视图并计算相应的角度。

将您的解决方案连接到 Web 应用程序

将模型端点连接到 Amplify 的步骤如下:

  • 克隆 AWS CDK 堆栈创建的应用程序存储库,名为 car-angle-detection-website-repo。 确保您在用于部署的区域中查找它。
  • 将每个已部署的 Lambda 函数的 API Gateway 端点复制到 index.html 前面的存储库中的文件(有需要放置端点的占位符)。 以下代码是 .html 文件的此部分的示例:
<td align="center" colspan="2">
<select id="endpoint">
<option value="https://ey82aaj8ch.execute-api.eu-central-1.amazonaws.com/prod/"> Amazon Rekognition</option>
<option value="https://nhq6q88xjg.execute-api.eu-central-1.amazonaws.com/prod/"> Amazon SageMaker Detectron</option>
</select>
<input class="btn" type="file" id="ImageBrowse" />
<input class="btn btn-primary" type="submit" value="Upload">
</td>

  • 保存 HTML 文件并将代码更改推送到远程主分支。

这将更新部署中的 HTML 文件。 该应用程序现在可以使用了。

  • 导航到 Amplify 控制台并找到您创建的项目。

部署完成后,应用程序 URL 将可见。

  • 导航到 URL 并享受 UI 带来的乐趣。

使用 Amazon SageMaker 和 Amazon Rekognition 构建和训练计算机视觉模型以检测图像中的汽车位置 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。

结论

恭喜! 我们部署了一个完整的无服务器架构,其中使用了 Amazon Rekognition,但也为您自己的自定义模型提供了一个选项,此示例可在 GitHub上。 如果您的团队没有 ML 专业知识,也没有足够的自定义数据来训练模型,您可以选择使用 Amazon Rekognition 的选项。 如果您希望更好地控制模型、进一步自定义模型并拥有足够的数据,则可以选择 SageMaker 解决方案。 如果您有一个数据科学家团队,他们可能还想进一步增强模型并选择更加定制和灵活的选项。 您可以使用这两个选项之一将 Lambda 函数和 API 网关置于 Web 应用程序后面。 您还可以将此方法用于您可能想要调整代码的不同用例。

这种无服务器架构的优点是构建块是完全可互换的。 机会几乎是无限的。 那么,今天就开始吧!

与往常一样,AWS欢迎反馈。 请提交任何意见或问题。


作者简介

使用 Amazon SageMaker 和 Amazon Rekognition 构建和训练计算机视觉模型以检测图像中的汽车位置 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。迈克尔·沃尔纳 是 AWS 专业服务的数据和人工智能高级顾问,热衷于帮助客户在 AWS 云中实现数据驱动和 AWSome。 最重要的是,他喜欢与客户一起思考,为他们创新和发明新想法。

使用 Amazon SageMaker 和 Amazon Rekognition 构建和训练计算机视觉模型以检测图像中的汽车位置 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。阿姆纳·纳吉米 是 AWS 专业服务的数据科学家。 她热衷于帮助客户利用大数据和人工智能技术进行创新,从数据中挖掘商业价值和见解。 她在医疗保健和生命科学垂直领域的数据平台和 AI/ML 项目方面拥有丰富的工作经验。 业余时间,她喜欢园艺和去新地方旅行。

使用 Amazon SageMaker 和 Amazon Rekognition 构建和训练计算机视觉模型以检测图像中的汽车位置 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。大卫·索尔温 是 AWS Professional Services 的高级数据科学家,他帮助客户在 AWS 云上进行 AI/ML 之旅。 David 专注于数字孪生、预测和量子计算。 他拥有奥地利因斯布鲁克大学理论物理学博士学位。 他还是德国马克斯普朗克量子光学研究所的博士和博士后研究员。 在空闲时间,他喜欢阅读、滑雪以及与家人共度时光。

使用 Amazon SageMaker 和 Amazon Rekognition 构建和训练计算机视觉模型以检测图像中的汽车位置 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。斯里克里希纳·柴坦尼亚·孔杜鲁 是一位拥有 AWS 专业服务的高级数据科学家。 他支持客户在 AWS 上对其 ML 应用程序进行原型设计和操作。 Srikrishna 专注于计算机视觉和 NLP。 他还为不同垂直行业的客户领导机器学习平台设计和用例识别计划。 Srikrishna 拥有德国亚琛工业大学生物医学工程硕士学位,主攻医学成像。

使用 Amazon SageMaker 和 Amazon Rekognition 构建和训练计算机视觉模型以检测图像中的汽车位置 |亚马逊网络服务柏拉图区块链数据智能。垂直搜索。人工智能。艾哈迈德·曼苏尔 是 AWS 专业服务的数据科学家。 他通过 AWS 云上的 AI/ML 之旅为客户提供技术支持。 Ahmed 专注于 NLP 和 RL 在蛋白质领域的应用。 他拥有德国慕尼黑工业大学工程博士学位。 在空闲时间,他喜欢去健身房和孩子们一起玩耍。

时间戳记:

更多来自 AWS机器学习