随着人工智能和云计算技术的不断发展,Serverless 架构应用越来越受到开发者们的青睐。在传统的应用架构中,常常需要维护服务器和应用程序的部署和管理,而这些工作往往是耗费时间和成本的。而 Serverless 架构则摆脱了这些繁琐的工作,使开发者能够更专注于业务逻辑的开发。
本文将介绍一种在 Serverless 架构下实现图像识别红绿繁忙路口交通灯检测的方法。该方法基于云计算服务提供商 AWS 的 Lambda 和 Rekognition,实现了对路口交通灯状态的实时检测和推送。本文将详细讲解该方法的实现过程,并提供示例代码和指导意义。
实现方法
1. 上传图片到 S3 Bucket
首先,我们需要将待检测的图片上传到 AWS 的 S3 存储桶中,以供后续处理。使用 AWS 的 S3 服务有多种方式,可以通过 AWS 的控制台、CLI 或 SDK 进行。在这里,我们使用 AWS 的 Node.js SDK 进行操作:
// www.javascriptcn.com code example
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event) => {
const bucketName = "my-bucket";
const { fileName, fileContent } = event;
const params = {
Bucket: bucketName,
Key: fileName,
Body: Buffer.from(fileContent, 'base64')
}
await s3.putObject(params).promise();
return {
statusCode: 200,
body: 'Upload successfully'
};
};其中,fileName 和 fileContent 是事件传入的参数,分别表示上传到 S3 的文件名和文件内容的 base64 编码格式。putObject 方法将文件的内容和元数据存储到指定的 S3 存储桶中。
2. 更改交通灯状态
接下来,我们使用 AWS 的 Rekognition 服务进行图像识别,检测交通灯的状态。Rekognition 服务提供了丰富的图像和视频分析功能,包括对象和场景识别、面部分析和情感分析等。
我们以交通灯检测为例,使用 detectLabels 方法检测图片中是否包含交通灯,以及交通灯的状态。如果检测到红灯,则向指定的 SNS 主题发送通知,以及更改交通灯的状态。同样,使用 AWS 的 Node.js SDK 来实现:
// www.javascriptcn.com code example
const rekognition = new AWS.Rekognition();
const sns = new AWS.SNS();
const dynamoDb = new AWS.DynamoDB.DocumentClient();
exports.handler = async (event) => {
const { bucketName, fileName } = event;
const params = {
Image: {
S3Object: {
Bucket: bucketName,
Name: fileName,
},
},
MaxLabels: 10,
MinConfidence: 90,
};
const result = await rekognition.detectLabels(params).promise();
const labels = result.Labels.map(label => label.Name);
if (labels.includes('Traffic Light')) {
const trafficLight = result.Labels.find(label => label.Name === 'Traffic Light');
const color = trafficLight.Instances[0].Attributes.find(attr => attr.Type === 'CLASS').Value;
// 发送 SNS 通知
await sns.publish({
TopicArn: 'ARN of SNS topic',
Message: `Traffic Light Detected: ${color}`,
}).promise();
// 更改交通灯状态
await dynamoDb.update({
TableName: 'tableName',
Key: { id: 'traffic-light-status' },
UpdateExpression: "set #s = :status",
ExpressionAttributeNames: { "#s": "status" },
ExpressionAttributeValues: { ":status": color }
}).promise();
}
return {
statusCode: 200,
body: 'Detect label successfully'
};
};在上述代码中,detectLabels 方法将传入的图片进行分析、识别,并返回包含图像中物体或场景的标签数组。如果发现图片中包含交通灯,则通过结果中的 Traffic Light 标签找到交通灯实例,进而确定交通灯的颜色。接着,向指定的 SNS 主题发送通知,以及将相应的交通灯状态存储在 DynamoDB 数据库中进行更改。
需要注意的是,上述代码中的 TopicArn 和 TableName 都需要进行替换,分别表示 SNS 主题的 ARN 和 DynamoDB 表的名称。在使用前,需要先创建对应的 SNS 主题和 DynamoDB 表。
3. 触发函数执行
最后,我们使用 AWS 的 API Gateway 和 Lambda,将上述两个 Lambda 函数连接起来,形成完整的应用。API Gateway 是一种完全托管的服务,可以使开发者能够轻松地创建、部署、维护和监控 RESTful API。而 Lambda 是一种完全托管的服务,可以让开发者在云端运行代码,无需关注服务器的配置和管理。
我们创建一个 POST API,将上传的图片和交通灯状态变更请求传递给对应的 Lambda 函数进行处理。以下是 API Gateway 的配置和示例代码:

// www.javascriptcn.com code example
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();
exports.handler = async (event) => {
const { fileName, fileContent } = event;
const payload = {
fileName: fileName,
fileContent: fileContent,
};
await lambda.invoke({
FunctionName: 'uploadToS3',
Payload: JSON.stringify(payload),
}).promise();
await lambda.invoke({
FunctionName: 'detectTrafficLight',
Payload: JSON.stringify(payload),
}).promise();
return {
statusCode: 200,
body: 'Function execute successfully'
};
};在上述代码中,我们使用 AWS 的 Node.js SDK 调用了另外两个 Lambda 函数:uploadToS3 和 detectTrafficLight。其中,payload 是上传至 S3 存储桶的文件名和内容。调用 Lambda 函数时,需要指定函数名称和参数。invoke 方法可以对 Lambda 函数进行同步调用,返回结果,也可以进行异步调用,无需等待结果。
到这里,我们已经完成了整个应用的构建。当上传一张包含交通灯的图片时,会自动触发两个 Lambda 函数的执行,对图片进行上传、图像识别,并通过 SNS 通知和 DynamoDB 更改交通灯的状态。
示例代码
完整的示例代码可以在 GitHub 上找到。
指导意义
通过以上示例,我们可以看到 Serverless 架构的优点:开发者只需要关注业务逻辑的开发,无需关注服务器的配置和管理。特别是在大量的数据存储和处理的场景下,Serverless 架构可以提供更高效、更灵活和更经济的方式来应对不断增长的业务需求。
除了 AWS,还有其他云计算服务提供商如阿里云、华为云、腾讯云和 Google Cloud Platform 等也提供类似的 Serverless 架构服务,开发者可以根据具体需求进行选择。
深入学习 Serverless 技术,可以参考 AWS Serverless Workshop 等资料。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d6c365a941bf7134ca27af