Flazzo memiliki fokus utama untuk menambah nilai bisnis Anda.

Blog

Buat aplikasi tanpa server untuk deteksi label gambar

17004994-thumb.jpg
Blog

Buat aplikasi tanpa server untuk deteksi label gambar


Dalam postingan blog ini, Anda akan mempelajari cara membuat solusi tanpa server untuk memproses gambar menggunakan Pengakuan Amazon, AWS Lambda dan Pergi bahasa pemrograman. Gambar yang diunggah ke Amazon Simple Storage Service (S3) akan memicu fungsi Lambda yang akan mendeteksi label (menggunakan AWS Go SDK) dan pertahankan data tag gambar ke tabel Amazon DynamoDB.

Anda akan menggunakan Pergi bahasa pemrograman untuk logika bisnis (terima kasih kepada AWS-lambda-pergi perpustakaan) serta komponen infrastruktur (Go Bindings untuk AWS CDK) untuk menyebarkan solusi.

Kode tersedia di GitHub

Pengakuan Amazon

Perkenalan

Amazon Rekognition adalah layanan yang memungkinkan Anda menganalisis gambar dan video di aplikasi Anda. Anda dapat mengidentifikasi objek, orang, teks, adegan, dan aktivitas, serta mendeteksi konten yang tidak pantas. Anda juga dapat melakukan analisis wajah, perbandingan wajah, dan pencarian wajah untuk berbagai kasus penggunaan seperti verifikasi pengguna dan keamanan publik. Amazon Rekognition didukung oleh teknologi pembelajaran mendalam yang tidak memerlukan keahlian pembelajaran mesin. Ini memiliki API yang mudah digunakan yang dapat menganalisis file gambar atau video apa pun di Amazon S3.

Kasus penggunaan umum untuk menggunakan Amazon Rekognition meliputi:

  • Jadikan gambar dan video dapat dicari – Temukan objek dan pemandangan yang muncul di dalamnya.
  • Verifikasi pengguna berbasis wajah – Konfirmasikan identitas pengguna dengan membandingkan gambar langsung mereka dengan gambar referensi.
  • Analisis Sentimen dan Demografi – Menafsirkan ekspresi emosional seperti kegembiraan, kesedihan atau kejutan, dan informasi demografis.
  • Pencarian wajah – Cari gambar, simpan video, dan streaming video untuk wajah yang cocok dengan yang disimpan dalam wadah yang disebut koleksi wajah.
  • Deteksi konten berbahaya – Mendeteksi konten dewasa dan kekerasan dalam gambar dan video yang disimpan dan menggunakan metadata yang dikembalikan untuk memfilter konten yang tidak pantas berdasarkan kebutuhan bisnis. Deteksi Teks – Digunakan untuk pencarian visual, katalogisasi dan identifikasi kendaraan berdasarkan nomor plat

Mari belajar Amazon Rekognition dengan tutorial praktis.

Prasyarat

Sebelum melanjutkan, pastikan yang berikut ini diinstal:

Kloning proyek dan letakkan di direktori yang benar:

git clone 
cd ai-ml-golang-rekognition-label-detection

Gunakan AWS CDK untuk menerapkan solusi

AWS Cloud Development Kit (AWS CDK) adalah kerangka kerja yang memungkinkan Anda menentukan infrastruktur cloud Anda sebagai kode dalam jadwal apa pun yang didukungnya dan menyediakannya melalui AWS CloudFormation.

Untuk memulai penerapan, cukup aktifkan cdk deploy dan tunggu sebentar. Anda akan melihat daftar sumber daya yang akan dibuat dan Anda harus memberikan konfirmasi untuk melanjutkan.

cd cdk
cdk deploy
# output
Bundling asset RekognitionLabelDetectionGolangStack/rekognition-function/Code/Stage...
✨  Synthesis time: 5.44
//.... omitted
Do you wish to deploy these changes (y/n)? y

Memasuki y untuk mulai membuat sumber daya AWS yang diperlukan untuk aplikasi.

Jika Anda ingin melihat template AWS CloudFormation yang akan digunakan di latar belakang, jalankan cdk synth dan periksa cdk.out kasus

Anda dapat mengikuti kemajuan pembuatan tumpukan di terminal atau mengakses konsol AWS: CloudFormation > Stacks > RekognitionLabelDetectionGolangStack.

Setelah pembuatan tumpukan selesai, Anda harus memiliki:

  • Bucket S3 – Bucket sumber untuk mengunggah gambar.
  • Fungsi Lambda untuk mengekstrak label gambar menggunakan Amazon Rekognition.
  • A DyanmoDB tabel untuk menyimpan data tag untuk setiap gambar.
  • …. bersama dengan beberapa komponen lainnya (seperti peran IAM, dll.)

Anda juga akan melihat keluaran berikut di terminal (nama sumber daya akan berbeda dalam kasus Anda). Dalam hal ini, ini adalah nama bucket S3 yang dibuat oleh CDK:

✅  RekognitionLabelDetectionGolangStack

✨  Deployment time: 119.56s

Outputs:
RekognitionLabelDetectionGolangStack.abeldetectionoutputtablename = rekognitionlabeldetectio-labeldetectioninputbucke-v3vn9o06q3kb_labels_output
RekognitionLabelDetectionGolangStack.labeldetectioninputbucketname = rekognitionlabeldetectio-labeldetectioninputbucke-v3vn9o06q3kb
.....

Sekarang Anda dapat mencoba solusi end-to-end!

Ekstrak label dari gambar

Untuk mencoba solusinya, Anda dapat menggunakan gambar Anda sendiri atau menggunakan file sampel yang disediakan di repositori GitHub. Saya akan menggunakan S3 CLI untuk mengunggah file, tetapi Anda bisa menggunakan konsol AWS Juga.

export SOURCE_BUCKET=<enter source S3 bucket name - check the CDK output>

aws s3 cp ./car.png s3://$SOURCE_BUCKET

# verify that the file was uploaded
aws s3 ls s3://$SOURCE_BUCKET

Fungsi Lambda ini mengekstrak label dari gambar dan menyimpannya di tabel DynamoDB.

Impor file lain:

export SOURCE_BUCKET=<enter source S3 bucket name - check the CDK output>
aws s3 cp ./skate.png s3://$SOURCE_BUCKET

Periksa tabel DynamoDB di konsol AWS – Anda akan melihat hasil deteksi tag untuk kedua gambar.

DynamoDB tabel dirancang dengan nama file sumber sebagai kunci partisi dan nama tag (terdeteksi) sebagai kunci pengurutan. Ini memungkinkan beberapa pola kueri:

  • Anda bisa mendapatkan semua label untuk gambar tertentu.
  • Anda dapat menanyakan metadata (kategori dan kepercayaan) untuk gambar sumber tertentu dan tagnya.

Anda juga dapat menggunakan CLI untuk memindai tabel:

aws dynamodb scan --table-name <enter table name - check the CDK output>

item yang dikembalikan

Jangan lupa untuk membersihkan

Setelah selesai, untuk menghapus semua layanan, cukup gunakan:

cdk destroy
#output prompt (choose 'y' to continue)
Are you sure you want to delete: RekognitionLabelDetectionGolangStack (y/n)?

Anda dapat mengonfigurasi dan mencoba solusi lengkap. Sebelum kita menyelesaikannya, mari kita segera menjalankan beberapa bagian penting dari kode untuk lebih memahami apa yang terjadi di balik layar.

Prosedur langkah demi langkah

Kami hanya akan fokus pada bagian penting – beberapa kode telah dihilangkan untuk singkatnya.

CDK

Anda dapat berkonsultasi dengan file lengkap Kode CDK di sini

bucket := awss3.NewBucket(stack, jsii.String("label-detection-input-bucket"), &awss3.BucketProps{
        BlockPublicAccess: awss3.BlockPublicAccess_BLOCK_ALL(),
        RemovalPolicy:     awscdk.RemovalPolicy_DESTROY,
        AutoDeleteObjects: jsii.Bool(true),
    })

Kita mulai dengan membuat bucket sumber S3.

 table := awsdynamodb.NewTable(stack, jsii.String("label-detection-output-table"),
        &awsdynamodb.TableProps{
            PartitionKey: &awsdynamodb.Attribute{
                Name: jsii.String("source_file"),
                Type: awsdynamodb.AttributeType_STRING},
            SortKey: &awsdynamodb.Attribute{
                Name: jsii.String("label_name"),
                Type: awsdynamodb.AttributeType_STRING},
            TableName: jsii.String(*bucket.BucketName() + "_labels_output"),
        })

Selanjutnya, kami membuat tabel DynamoDB untuk menyimpan data tag untuk setiap gambar.

function := awscdklambdagoalpha.NewGoFunction(stack, jsii.String("rekognition-function"),
        &awscdklambdagoalpha.GoFunctionProps{
            Runtime:     awslambda.Runtime_GO_1_X(),
            Environment: &map[string]*string{"TABLE_NAME": table.TableName()},
            Entry:       jsii.String(functionDir),
        })

    table.GrantWriteData(function)
    function.Role().AddManagedPolicy(awsiam.ManagedPolicy_FromAwsManagedPolicyName(jsii.String("AmazonRekognitionReadOnlyAccess")))
    bucket.GrantRead(function, "*")

Selanjutnya, kami membuat fungsi Lambda, meneruskan fungsi DynamoDB nama tabel sebagai variabel lingkungan fungsi. Kami juga memberikan akses fungsi ke DynamoDB meja dan kompartemen S3. Kami juga memberikan akses fungsi ke AmazonRekognitionReadOnlyAccess kebijakan yang dikelola.

function.AddEventSource(awslambdaeventsources.NewS3EventSource(sourceBucket, &awslambdaeventsources.S3EventSourceProps{
        Events: &[]awss3.EventType{awss3.EventType_OBJECT_CREATED},
    }))

Kami menambahkan sumber peristiwa ke fungsi Lambda untuk memicunya saat file baru diunggah ke keranjang sumber.

    awscdk.NewCfnOutput(stack, jsii.String("label-detection-input-bucket-name"),
        &awscdk.CfnOutputProps{
            ExportName: jsii.String("label-detection-input-bucket-name"),
            Value:      bucket.BucketName()})

    awscdk.NewCfnOutput(stack, jsii.String("label-detection-output-table-name"),
        &awscdk.CfnOutputProps{
            ExportName: jsii.String("label-detection-output-table-name"),
            Value:      table.TableName()})

Terakhir, kami mengekspor bucket DynamoDB dan nama tabel sebagai output CloudFormation.

Fungsi lambda

Anda dapat berkonsultasi dengan file lengkap Kode fungsi Lambda di sini

func handler(ctx context.Context, s3Event events.S3Event) {
    for _, record := range s3Event.Records {

        sourceBucketName := record.S3.Bucket.Name
        fileName := record.S3.Object.Key

        err := labelDetection(sourceBucketName, fileName)
    }
}

Fungsi Lambda dipicu saat gambar baru diunggah ke keranjang sumber. Fungsi mengulang daftar file dan memanggil file labelDetection fungsi untuk setiap gambar.

Mari kita tinjau.

func labelDetection(sourceBucketName, fileName string) error {

    resp, err := rekognitionClient.DetectLabels(context.Background(), &rekognition.DetectLabelsInput{
        Image: &types.Image{
            S3Object: &types.S3Object{
                Bucket: aws.String(sourceBucketName),
                Name:   aws.String(fileName),
            },
        },
    })

    for _, label := range resp.Labels {
        item := make(map[string]ddbTypes.AttributeValue)

        item["source_file"] = &ddbTypes.AttributeValueMemberS{Value: fileName}
        item["label_name"] = &ddbTypes.AttributeValueMemberS{Value: *label.Name}
        item["label_category"] = &ddbTypes.AttributeValueMemberS{Value: *label.Categories[0].Name}
        item["label_confidence"] = &ddbTypes.AttributeValueMemberN{Value: fmt.Sprintf("%v", aws.ToFloat32(label.Confidence))}

        _, err := dynamodbClient.PutItem(context.Background(), &dynamodb.PutItemInput{
            TableName: aws.String(table),
            Item:      item,
        })
    }

    return nil
}

  • ITU labelDetection fungsinya menggunakan DetectLabels API untuk mendeteksi label pada gambar.
  • API menampilkan daftar label, masing-masing dengan skor keyakinan.
  • Fungsi mengulang daftar tag dan menyimpan nama tag, kategori, dan skor kepercayaan di tabel DynamoDB.

Kesimpulan dan langkah selanjutnya

Di artikel ini, Anda melihat cara membuat solusi tanpa server yang mendeteksi tag gambar menggunakan Amazon Rekognition. Seluruh siklus hidup infrastruktur telah diotomatisasi menggunakan AWS CDK. Ini semua dilakukan dengan menggunakan bahasa pemrograman Go, yang didukung dengan baik di AWS Lambda dan AWS CDK.

Berikut beberapa hal yang dapat Anda coba untuk memperluas solusi ini:

Selamat membangun!