亚马逊AWS官方博客

Amazon Bedrock Claude 帮助制造业实现产品缺陷识别和分析

在制造业中,快速检测产品缺陷是一个常见的挑战。通常情况下,工人需要通过聊天工具或电话的方式,将现场的图片和现象告知专家,由专家进行判断并提供改进建议。这种方式存在几个主要的问题:

  1. 工人和专家之间的沟通效率较低,需要耗费大量的人力成本。工人需要花费大量时间与专家进行沟通,这无疑增加了企业的运营成本。
  2. 改进建议和方案无法得到全面考量和实施。专家提供的建议可能无法完全满足实际生产需求,导致企业在管理和工艺流程方面投入大量资金,却无法取得理想的效果,造成资源的浪费。

在 AI 快速发展的今天,特别是生成式 AI 越来越多的落地实践,给解决上述挑战带来了机遇。我们可以利用 AI 技术赋能制造业,实现缺陷图片的自动识别和缺陷问题及处理方案的智能建议。具体来说,可以通过以下技术方案实现:

  1. 利用 Amazon Rekognition Custom Labels,基于客户现有图片数据进行训练,实现缺陷分类场景的识别。
  2. 利用 Amazon Bedrock Claude,建立缺陷知识库,实现对缺陷问题的知识搜索和总结。
  3. 将缺陷识别和知识搜索功能集成到 ChatBot 中,为工人提供一站式的缺陷问题解决方案。

通过这种 AI 赋能的方式,我们可以实现以下目标:

  1. 缺陷识别分类模型部署到 Rekognition,缺陷识别准确率可以达到 90% 以上。
  2. 缺陷知识库搜索和总结模型通过 Bedrock 可以成功搜索和总结。
  3. 通过 ChatBot 实现全流程的交互,大幅提升缺陷问题处理的效率和质量。

AI 技术正在深入制造业各个环节,为企业带来全新的发展机遇。我们希望通过这种 AI 赋能的方式,帮助制造企业提升管理和生产效率,降低成本,实现可持续发展。

解决方案架构

  1. 用户通过客户端(企业微信/飞书/自建的 Chat)发送缺陷图片给 AI 机器人,当发送图片给后台后。后台会根据请求的路径,通过 API 网关触发上传图片接口,通过 Lambda upload_image 函数将上传的 Base64 编码的图片上传到 S3,上传成功后接口返回图片的名称。
  2. Aibot 通过返回的图片名称,调用缺陷检测服务触发 Lambda 函数 defect_detect,服务会调用 Rekognition 已经训练好的缺陷检测推理服务,推理成功后将返回缺陷编码。
  3. Aibot 收到缺陷编码后,在聊天窗中显示缺陷编码,同时发送缺陷编码给 defect_nanalysis 服务进行缺陷原因和处理方案分析,defect_nanalysis 服务根据缺陷编码构建提示词发送给 Amazon Bedrock,Amazon Bedrock 推理并返回缺陷原因和处理方案并显示(为了实现 SSE,这里采用 ELB 集成 Bedrock)。

实施方案

通过 Bedrock 快速实现验证

Text 方式测试

ChatBot 方式测试

提示词

Human: 你是一个缺陷检测机器人,需要根据缺陷编码或者描述提供原因和处理方案,参考内容如下
“缺陷信息的描述和解释xxxxxxx”
Human:因为化学成分引起的问题处理措施有哪些? 

通过 Bedrock API 调用

初始化 Bedrock 客户端

import json
import os
import sys
import base64
import io


import boto3
import botocore
from PIL import Image
# module_path = "."
sys.path.append('./utils') 
from utils import bedrock
from botocore.exceptions import ClientError
import logging
logger = logging.getLogger("rewrite_news")
# import bedrock

# ---- ⚠️ Un-comment and edit the below lines as needed for your AWS setup ⚠️ ----

# os.environ["AWS_DEFAULT_REGION"] = "<REGION_NAME>"  # E.g. "us-east-1"
# os.environ["AWS_PROFILE"] = "<YOUR_PROFILE>"
# os.environ["BEDROCK_ASSUME_ROLE"] = "<YOUR_ROLE_ARN>"  # E.g. "arn:aws:..."


boto3_bedrock = bedrock.get_bedrock_client(
    assumed_role=os.environ.get("BEDROCK_ASSUME_ROLE", None),
    region=os.environ.get("AWS_DEFAULT_REGION", None)
)

boto3_bedrock = bedrock.get_bedrock_client(
    assumed_role=os.environ.get("BEDROCK_ASSUME_ROLE", None),
    region=os.environ.get("AWS_DEFAULT_REGION", None)
)

定义 Claude 3 模型调用方法

def invoke_claude_3_with_text(prompt):
    """
    Invokes Anthropic Claude 3 Sonnet to run an inference using the input
    provided in the request body.

    :param prompt: The prompt that you want Claude 3 to complete.
    :return: Inference response from the model.
    """

    # Initialize the Amazon Bedrock runtime client
    client = boto3.client(
        service_name="bedrock-runtime", region_name="us-west-2"
    )

    # Invoke Claude 3 with the text prompt
    model_id = "anthropic.claude-3-sonnet-20240229-v1:0"

    try:
        response = client.invoke_model(
            modelId=model_id,
            body=json.dumps(
                {
                    "anthropic_version": "bedrock-2023-05-31",
                    "max_tokens": 4096,
                    "messages": [
                        {
                            "role": "user",
                            "content": [{"type": "text", "text": prompt}],
                        }
                    ],
                }
            ),
        )

        # Process and print the response
        result = json.loads(response.get("body").read())
        input_tokens = result["usage"]["input_tokens"]
        output_tokens = result["usage"]["output_tokens"]
        output_list = result.get("content", [])

        print("Invocation details:")
        print(f"- The input length is {input_tokens} tokens.")
        print(f"- The output length is {output_tokens} tokens.")

        print(f"- The model returned {len(output_list)} response(s):")
        for output in output_list:
            print(output["text"])

        return result

    except ClientError as err:
        logger.error(
            "Couldn't invoke Claude 3 Sonnet. Here's why: %s: %s",
            err.response["Error"]["Code"],
            err.response["Error"]["Message"],
        )
        raise

代码推理

prompt = """ Human: 你是一个缺陷检测机器人,需要根据缺陷编码或者描述提供原因和处理方案,
参考内容如下 缺陷信息的描述和解释xxxxxx """

import time

start_time = time.time()

invoke_claude_3_with_text(prompt)
end_time = time.time()
print('Claude3 sonnet Duration: {:.3f} seconds'.format(end_time - start_time))

使用 Rekognition 自定义标签实现缺陷分类检测

创建项目

通过点击 create project 按钮创建项目

导入数据集

  1. 这里我们选择 Start with a single dataset。数据导入成功后,系统会自动将 20% 的数据作为测试数据集。
  2. 这里我们选择 Auto labeling,这个功能会自动根据数据的子文件夹名进行标注,比如:

系统会自动把 1101 文件夹下的数据标注为 1101 缺陷,1102 亦然,这样为我们标注数据生了不少事情。

训练模型

下来让我们来训练模型吧。

点击训练模型后,后台开始基于您上传的数据和文件夹命名的标注结果来进行训练,训练可能需要一段时间(具体时间取决于您的数据规模,我的例子运行需要 0.67 小时)。

使用模型

通过 start 按钮启动 inference 节点

模型评估

从上图我们可以看到,模型的平均精度达到了0.976,这个是一个不错的效果。

图片分类模型集成

#Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-custom-labels-developer-guide/blob/master/LICENSE-SAMPLECODE.)

import boto3
import io
from PIL import Image, ImageDraw, ExifTags, ImageColor, ImageFont

def show_custom_labels(model,bucket,photo, min_confidence):
    client=boto3.client('rekognition')

    #Call DetectCustomLabels
    response = client.detect_custom_labels(Image={'S3Object': {'Bucket': bucket, 'Name': photo}},
        MinConfidence=min_confidence,
        ProjectVersionArn=model)
    return response['CustomLabels']


lableeee=[]
def main():

    bucket='custom-labels-console-us-west-2-89e6059fcc'
    # photo='gongxiang/inference/1102-9 Porosity - secundary - micro detail shape - gray iron.png'
    photo='gongxiang/inference/1101-77.png'
  
    model='arn:aws:rekognition:us-west-2:517141035927:project/gongxiang-defect-detection/version/gongxiang-defect-detection.2023-12-07T14.49.13/1701931754280'
    min_confidence=85

    customLabels=show_custom_labels(model,bucket,photo, min_confidence)
    for customLabel in customLabels:
        print('当前图片缺陷分类为: ' + str(customLabel['Name']))
        print('置信度: ' + str(customLabel['Confidence']))
        lableeee.append(str(customLabel['Name']))



if __name__ == "__main__":
    main()

配置 API 网关

通过 Amazon API Gateway 实现如下接口配置。

接口定义

接口地址:https://xxxxx.us-west-2.amazonaws.com

协议格式:接口输入和输出均为 json 格式

upload_image:

  • 接口描述:上传待检测的图片
  • 输入:图片的 base64 编码
  • 输出:上传成功后的文件名
  • METHOD:POST

示例:

request: body 中存储图片 base64
response:
{
"filename": "CVoE12I5J2e9tf32mcxeVEurPVNxrCM2ouD5eTvHvnI25dsDJL.png"
}

defect_detect:

  • 接口描述:缺陷检测接口
  • 输入:上传成功后的 S3 路径
  • 输出:缺陷分类编码,当前只支持 1101 和 1102,其它值视为未检测到
  • METHOD:GET

示例:

request: https://xxxx/defect_detect?CVoE12I5J2e9tf32mcxeVEurPVNxrCM2ouD5eTvHvnI25dsDJL.png

response: [{"Name": "1101", "Confidence": 99.47200012207031}]

defect_analysis:

该接口请使用接口地址:http://defect-analysis-alb-537097827.us-west-2.elb.amazonaws.com

该接口可以被多次调用,用于进一步基于客户输入的信息分析原因

  • 接口描述:缺陷分析接口,用于检测缺陷原因和解决方案
  • 输入:缺陷分类编码 1101 或者 1102
  • 输出:具体的缺陷原因和解决方案
  • METHOD:GET

示例:

根据缺陷编码直接询问:

通过语言继续询问:

前端代码部署

安装 node,安装 vue 通过 npm create vue@latest 创建项目并安装最新 vue

npm install 安装依赖
npm run dev 本地开发运行服务
npm run build 打包项目到 dist

然后在 zip dist 文件目录 zip -r /usr/share/nginx/html/dist.zip ./dist/

解压 dist.zip 到/share/nginx/html 下 ,修改/etc/nginx/nginx.conf 文件

启动 nginx nginx -s reload

Chat 测试

监控与运维

使用 AWS Console myApplication 统一管理和监控我的应用程序,详细配置和说明参见: https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/aws-myApplications.html

使用 CloudWatch 创建 API 金丝雀测试

通过金丝雀测试可以帮助我们实时监控生产 API,及时发现问题并处理,提升系统可用性。

可以监控到接口的跟踪信息

通过 X-Ray Service Map 可以查看服务拓扑图

配置告警以及对应的 Action

这里配置如果成功率小于 90% 则创建工单,同时在 OpsCenter 创建 serv2 的事件。

OpsCenter 操作会在其首页显示告警

如上是工单的具体详情,可以进一步配置 runbook 来处理问题,比如如上接口因为服务 down 掉引起的,可以把服务启动起来,用于解决。进一步可以使用事件功能,基于事件响应计划(其中定义了事件响应的流程和事项)进行处理,也就是运维团队的事件响应流程来实施。

结语

基于以上分析,我们可以看到,利用 AI 技术对制造业的缺陷问题进行赋能,是一个可以探索的场景。通过 AI 技术的介入,我们可以实现缺陷图片的自动识别,并根据识别结果提供针对性的问题解决方案,大幅提升缺陷问题处理的效率和质量。

具体来说,我们可以利用 Amazon Rekognition Custom Labels 对缺陷图片进行分类识别,结合 Amazon Bedrock 建立的缺陷知识库和缺陷的自动分析和总结,通过 ChatBot 为工人提供一站式的缺陷问题解决方案。这种 AI 赋能的方式不仅可以提高缺陷识别的准确性,还能够智能推荐优化的改进措施,帮助企业降低管理和生产成本,提升整体的运营效率。

未来,随着 AI 技术在制造业的进一步渗透,相信会有更多创新性的应用场景涌现。我们期待通过 AI 赋能,助力制造业实现数字化转型,提升企业的核心竞争力,为行业注入新的活力。

本篇作者

刘恒涛

亚马逊云科技解决方案架构师,负责基于 AWS 的云计算方案架构咨询和设计。同时致力于 AWS 云服务在国内的应用和推广,当前重点关注机器学习以及 Serverless 领域。