在制造业中,快速检测产品缺陷是一个常见的挑战。通常情况下,工人需要通过聊天工具或电话的方式,将现场的图片和现象告知专家,由专家进行判断并提供改进建议。这种方式存在几个主要的问题:
- 工人和专家之间的沟通效率较低,需要耗费大量的人力成本。工人需要花费大量时间与专家进行沟通,这无疑增加了企业的运营成本。
- 改进建议和方案无法得到全面考量和实施。专家提供的建议可能无法完全满足实际生产需求,导致企业在管理和工艺流程方面投入大量资金,却无法取得理想的效果,造成资源的浪费。
在 AI 快速发展的今天,特别是生成式 AI 越来越多的落地实践,给解决上述挑战带来了机遇。我们可以利用 AI 技术赋能制造业,实现缺陷图片的自动识别和缺陷问题及处理方案的智能建议。具体来说,可以通过以下技术方案实现:
- 利用 Amazon Rekognition Custom Labels,基于客户现有图片数据进行训练,实现缺陷分类场景的识别。
- 利用 Amazon Bedrock Claude,建立缺陷知识库,实现对缺陷问题的知识搜索和总结。
- 将缺陷识别和知识搜索功能集成到 ChatBot 中,为工人提供一站式的缺陷问题解决方案。
通过这种 AI 赋能的方式,我们可以实现以下目标:
- 缺陷识别分类模型部署到 Rekognition,缺陷识别准确率可以达到 90% 以上。
- 缺陷知识库搜索和总结模型通过 Bedrock 可以成功搜索和总结。
- 通过 ChatBot 实现全流程的交互,大幅提升缺陷问题处理的效率和质量。
AI 技术正在深入制造业各个环节,为企业带来全新的发展机遇。我们希望通过这种 AI 赋能的方式,帮助制造企业提升管理和生产效率,降低成本,实现可持续发展。
解决方案架构
- 用户通过客户端(企业微信/飞书/自建的 Chat)发送缺陷图片给 AI 机器人,当发送图片给后台后。后台会根据请求的路径,通过 API 网关触发上传图片接口,通过 Lambda upload_image 函数将上传的 Base64 编码的图片上传到 S3,上传成功后接口返回图片的名称。
- Aibot 通过返回的图片名称,调用缺陷检测服务触发 Lambda 函数 defect_detect,服务会调用 Rekognition 已经训练好的缺陷检测推理服务,推理成功后将返回缺陷编码。
- 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 按钮创建项目
导入数据集
- 这里我们选择 Start with a single dataset。数据导入成功后,系统会自动将 20% 的数据作为测试数据集。
- 这里我们选择 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 赋能,助力制造业实现数字化转型,提升企业的核心竞争力,为行业注入新的活力。
本篇作者