程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在 Swift SOTO 中使用 AWS Rekognition大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在 Swift SOTO 中使用 AWS Rekognition?

开发过程中遇到在 Swift SOTO 中使用 AWS Rekognition的问题如何解决?下面主要结合日常开发的经验,给出你关于在 Swift SOTO 中使用 AWS Rekognition的解决方法建议,希望对你解决在 Swift SOTO 中使用 AWS Rekognition有所启发或帮助;

我使用 devhr python lambda function 作为使用 Soto for AWS 的 Swift Lambda 函数的模型。当图像上传到 S3 并使用 AWS Rekognition 服务将标签(图像中对象的描述)添加到 DynamoDB 数据库时,Lambda 函数将由 S3 事件触发。我在使 rekFunction 功能正确时遇到问题,我希望有人可以建议如何使其正常工作。

到目前为止我编写的 Swift 代码:

import AWSLambdaRuntime
import AWSLambdaEvents
import NIO
import Foundation
import sotoS3
import sotoRekognition
import sotoDynamoDB

struct Bucket: Decodable {
    let name: String
}

struct Object: Decodable {
    let key: String
}

struct MyS3: Decodable {
    let bucket: Bucket
    let object: Object
}

struct Record: Decodable {
    let s3: MyS3
}

struct input: Decodable {
    let records: [Record]
}

struct Output: encodable {
    let result: String
}

struct MyHandler: EventLoopLambdaHandler {
    typealias In = APIGateway.V2.Request
    typealias Out = APIGateway.V2.Response
    
    let minConfIDence: float = 50

    let awsClIEnt: AWSClIEnt
    
    init(context: Lambda.InitializationContext) {
        self.awsClIEnt = AWSClIEnt(httpClIEntProvIDer: .createNewWithEventLoopGroup(context.eventLoop))
    }
    
    func shutdown(context: Lambda.ShutdownContext) -> EventLoopFuture<VoID> {
        let promise = context.eventLoop.makePromise(of: VoID.self)
        awsClIEnt.shutdown { error in
            if let error = error {
                promise.fail(error)
            } else {
                promise.succeed(())
            }
        }
        return context.eventLoop.makeSucceededFuture(())
    }

    func handle(context: Lambda.Context,event: In) -> EventLoopFuture<Out> {
        guard let input: input = try? event.bodyObject() else {
            return context.eventLoop.makeSucceededFuture(APIGateway.V2.Response(with: APIError.requestError,statusCode: .badRequest))
        }

        for record in input.records {
            let ourBucket = record.s3.bucket.name
            let ourKey = record.s3.object.key
            
            // For each message (photo) get the bucket name and key
            rekFunction(bucket: ourBucket,key: ourKey)
        }
        let output = Output(result: "Finished!")
        let APIgatewayOutput = APIGateway.V2.Response(with: output,statusCode: .ok)
        return context.eventLoop.makeSucceededFuture(APIgatewayOutput)
    }
        
    func rekFunction(bucket: String,key: String) {
        let safeKey = key.replacingOccurrences(of: "%3A",with: ":")
        print("Currently processing the following image")
        print("Bucket:",bucket," key name:",safeKey)
        var objectsDetected: [String] = []
        var imageLabels = [ "image": safeKey ]
        let s3ClIEnt = S3(clIEnt: awsClIEnt,region: .euwest1)

        let s3Object = Rekognition.S3Object(bucket: bucket,name: safeKey)
        let image = Rekognition.Image(s3Object: s3Object)
        let rekognitionClIEnt = Rekognition(clIEnt: awsClIEnt)
        let detectLabelsRequest = Rekognition.DetectLabelsRequest(image: image,maxLabels: 10,minConfIDence: minConfIDence)
        rekognitionClIEnt.detectLabels(detectLabelsRequest)
            .flatMap { detectLabelsResponse -> EventLoopFuture<VoID> in
                if let labels = detectLabelsResponse.labels {
                    // Add all of our labels into imageLabels by iterating over response['Labels']
                    for label in labels {
                        if let name = label.name {
                            objectsDetected.append(name)
                            let itemAtt = "object\(objectsDetected.count)"
                            
                            // We Now have our shiny new item ready to put into DynamoDB
                            imageLabels[itemAtt] = name
                            
                            // Instantiate a table resource object of our environment variable
                            let imageLabelstable = // Environment("table") How can I read env vars?
                            let table = sotoDynamoDB.gettable(imageLabelstable) // python: table = dynamodb.table(imageLabelstable)
                            // python: table.put_item(Item=imageLabels)
                        }
                    }
                }
                return ???
            }
        
    }
    
}
Lambda.run { MyHandler(context: $0) }

解决方法

这里有很多问题需要讨论。

  1. 当您从 S3 事件触发此操作时。 MyLambda.In 类型别名应为 S3.Event 并且鉴于没有任何等待结果 MyLambda.Out 应为 Void
  2. 您可以使用 Lambda.env("TABLE") 提取环境变量。
  3. 至于写入您的 DynamoDB 表,最好的方法可能是使用 Soto DynamoDB Codable 支持。在下面的示例中,我将假设您使用 s3 存储桶和密钥的组合作为密钥。
struct RekEntry: Codable {
    let key: String
    let labels: [String]
}
let entry = RekEntry(
    key: "\(bucket)/\(key)"
    labels: labels
)
let putRequest = DynamoDB.PutItemCodableInput(
    item: entry,tableName: Lambda.env("TABLE")
)
return dynamoDB.putItem(putRequest)
  1. 最后从 flatMap 返回什么。首先,您的函数 rekFunction 需要返回一个 EventLoopFuture<Void>,因为这是您从 Lambda 处理程序返回的内容。因此,您可以将前一点中 dynamoDB.putItem 的结果映射到 Void。
func rekFunction(bucket: String,key: String) -> EventLoopFuture<Void> {
    ...
    return rekognitionClient.detectLabels(detectLabelsRequest)
        .flatMap {
            ...
            return dynamoDB.putItem(putRequest)
        }
        .map { _ in }
}

我希望涵盖一切

大佬总结

以上是大佬教程为你收集整理的在 Swift SOTO 中使用 AWS Rekognition全部内容,希望文章能够帮你解决在 Swift SOTO 中使用 AWS Rekognition所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: