برنامه نویسی

یک برنامه بدون سرور برای تشخیص برچسب تصویر بسازید

در این پست وبلاگ، نحوه ساخت یک راه حل بدون سرور برای پردازش تصاویر با استفاده از آمازون Rekognition، AWS Lambda و زبان برنامه نویسی Go را یاد خواهید گرفت. تصاویر آپلود شده در سرویس ذخیره سازی ساده آمازون (S3) یک تابع Lambda را راه اندازی می کند که برچسب ها را شناسایی می کند (با استفاده از AWS Go SDK) و داده های برچسب تصویر را در جدول DynamoDB آمازون نگه می دارد.

شما از زبان برنامه نویسی Go برای منطق تجاری (به لطف کتابخانه aws-lambda-go) و همچنین مؤلفه زیرساخت (Go bindings برای AWS CDK) برای استقرار راه حل استفاده خواهید کرد.

کد در GitHub موجود است

توضیحات تصویر

چه چیزی پوشیده شده است؟

معرفی

آمازون Rekognition سرویسی است که به شما امکان تجزیه و تحلیل تصاویر و ویدیوها را در برنامه های خود می دهد. می توانید اشیا، افراد، متن، صحنه ها و فعالیت ها را شناسایی کرده و محتوای نامناسب را تشخیص دهید. همچنین می توانید برای موارد استفاده مختلف مانند تأیید کاربر و امنیت عمومی، تجزیه و تحلیل چهره، مقایسه چهره و جستجوی چهره انجام دهید. آمازون Rekognition مبتنی بر فناوری یادگیری عمیق است که برای استفاده از آن به تخصص یادگیری ماشین نیاز ندارد. دارای یک API با کاربری آسان است که می تواند هر تصویر یا فایل ویدیویی را در Amazon S3 تجزیه و تحلیل کند.

موارد استفاده رایج برای استفاده از آمازون Rekognition عبارتند از:

  • جستجوی تصاویر و ویدیوها – اشیاء و صحنه هایی را که در آنها ظاهر می شود کشف کنید.
  • تأیید کاربر مبتنی بر چهره – هویت کاربر را با مقایسه تصویر زنده آنها با یک تصویر مرجع تأیید کنید.
  • احساسات و تجزیه و تحلیل جمعیت شناختی – عبارات احساسی مانند خوشحالی، غمگینی یا شگفتی و اطلاعات جمعیت شناختی را تفسیر کنید.
  • جستجوی چهره – جستجوی تصاویر، ویدیوهای ذخیره شده، و پخش ویدیوها برای چهره هایی که با چهره های ذخیره شده در ظرفی به نام مجموعه چهره مطابقت دارند.
  • تشخیص محتوای ناامن – محتوای خشونت آمیز و بزرگسالان را در تصاویر و ویدیوهای ذخیره شده شناسایی کنید و از ابرداده های برگشتی برای فیلتر کردن محتوای نامناسب بر اساس نیازهای تجاری استفاده کنید. تشخیص متن – برای جستجوی بصری، فهرست نویسی و شناسایی وسایل نقلیه بر اساس شماره پلاک استفاده می شود

بیایید آمازون Rekognition را با یک آموزش عملی یاد بگیریم.

پیش نیازها

قبل از ادامه، مطمئن شوید که موارد زیر را نصب کرده اید:

پروژه را کلون کنید و به دایرکتوری سمت راست تغییر دهید:

git clone https://github.com/abhirockzz/ai-ml-golang-rekognition-label-detection

cd ai-ml-golang-rekognition-label-detection
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از AWS CDK برای استقرار راه حل استفاده کنید

کیت توسعه ابری AWS (AWS CDK) چارچوبی است که به شما امکان می‌دهد زیرساخت ابری خود را به عنوان کد در یکی از برنامه‌نویسی‌های پشتیبانی‌شده آن تعریف کنید و آن را از طریق AWS CloudFormation ارائه کنید.

برای شروع استقرار، به سادگی فراخوانی کنید cdk deploy و کمی صبر کنید فهرستی از منابعی را مشاهده خواهید کرد که ایجاد خواهند شد و برای ادامه باید تأییدیه خود را ارائه دهید.

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
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

وارد y برای شروع ایجاد منابع AWS مورد نیاز برای برنامه.

اگر می خواهید الگوی AWS CloudFormation را که در پشت صحنه استفاده می شود ببینید، اجرا کنید cdk synth و بررسی کنید cdk.out پوشه

می توانید پیشرفت ایجاد پشته را در ترمینال پیگیری کنید یا به کنسول AWS بروید: CloudFormation > Stacks > RekognitionLabelDetectionGolangStack.

هنگامی که ایجاد پشته کامل شد، باید داشته باشید:

  • سطل S3 – سطل منبع برای آپلود تصاویر.
  • یک تابع Lambda برای استخراج برچسب های تصویر با استفاده از آمازون Rekognition.
  • آ DyanmoDB جدول برای ذخیره داده های برچسب برای هر تصویر.
  • …. همراه با چند جزء دیگر (مانند نقش های IAM و غیره)

همچنین خروجی زیر را در ترمینال خواهید دید (نام منابع در مورد شما متفاوت خواهد بود). در این مورد، این نام سطل های S3 ایجاد شده توسط CDK است:

 ✅  RekognitionLabelDetectionGolangStack

✨  Deployment time: 119.56s

Outputs:
RekognitionLabelDetectionGolangStack.abeldetectionoutputtablename = rekognitionlabeldetectio-labeldetectioninputbucke-v3vn9o06q3kb_labels_output
RekognitionLabelDetectionGolangStack.labeldetectioninputbucketname = rekognitionlabeldetectio-labeldetectioninputbucke-v3vn9o06q3kb
.....
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون می توانید راه حل پایان به انتها را امتحان کنید!

استخراج برچسب از تصویر

برای امتحان کردن راه حل، می توانید از یک تصویر خود استفاده کنید یا از فایل های نمونه ارائه شده در مخزن GitHub استفاده کنید. من از S3 CLI برای آپلود فایل استفاده خواهم کرد، اما شما می توانید از کنسول AWS نیز استفاده کنید.

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
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این تابع Lambda برچسب ها را از تصویر استخراج می کند و آنها را در جدول DynamoDB ذخیره می کند.

فایل دیگری را آپلود کنید:

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

aws s3 cp ./skate.png s3://$SOURCE_BUCKET
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

جدول DynamoDB را در کنسول AWS بررسی کنید – باید نتایج تشخیص برچسب را برای هر دو تصویر مشاهده کنید.

توضیحات تصویر

DynamoDB جدول با نام فایل منبع به عنوان کلید پارتیشن و نام برچسب (تشخیص شده) به عنوان کلید مرتب سازی طراحی شده است. این امکان را برای چند الگوی پرس و جو فراهم می کند:

  • شما می توانید تمام برچسب ها را برای یک تصویر مشخص دریافت کنید.
  • می‌توانید متادیتا (دسته و اطمینان) را برای یک تصویر منبع خاص و برچسب آن جستجو کنید.

همچنین می توانید از CLI برای اسکن جدول استفاده کنید:

aws dynamodb scan --table-name <enter table name - check the CDK output>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پاکسازی را فراموش نکنید

پس از اتمام کار، برای حذف همه سرویس‌ها، به سادگی استفاده کنید:

cdk destroy

#output prompt (choose 'y' to continue)

Are you sure you want to delete: RekognitionLabelDetectionGolangStack (y/n)?
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما توانستید راه حل کامل را راه اندازی و امتحان کنید. قبل از پایان، اجازه دهید به سرعت برخی از بخش‌های مهم کد را مرور کنیم تا درک بهتری از آنچه در پشت صحنه می‌گذرد داشته باشیم.

عبور از کد

ما فقط روی بخش های مهم تمرکز می کنیم – برخی از کدها برای اختصار حذف شده اند.

CDK

در اینجا می توانید به کد CDK کامل مراجعه کنید

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),
    })
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما با ایجاد سطل منبع 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"),
        })
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس، یک جدول DynamoDB برای ذخیره داده های برچسب برای هر تصویر ایجاد می کنیم.

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, "*")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در مرحله بعد، تابع Lambda را ایجاد می کنیم و از آن عبور می کنیم DynamoDB نام جدول به عنوان یک متغیر محیطی برای تابع. ما همچنین به تابع اجازه دسترسی به DynamoDB میز و سطل S3. ما همچنین به تابع اجازه دسترسی به AmazonRekognitionReadOnlyAccess سیاست مدیریت شده

function.AddEventSource(awslambdaeventsources.NewS3EventSource(sourceBucket, &awslambdaeventsources.S3EventSourceProps{
        Events: &[]awss3.EventType{awss3.EventType_OBJECT_CREATED},
    }))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما یک منبع رویداد را به تابع Lambda اضافه می کنیم تا زمانی که یک فایل جدید در سطل منبع آپلود می شود، آن را فعال کند.

    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()})
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در نهایت، نام سطل و جدول DynamoDB را به عنوان خروجی CloudFormation صادر می کنیم.

تابع لامبدا

در اینجا می توانید به کد عملکرد کامل لامبدا مراجعه کنید

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)
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

عملکرد Lambda زمانی فعال می شود که یک تصویر جدید در سطل منبع آپلود شود. تابع در لیست فایل ها تکرار می شود و آن را فراخوانی می کند labelDetection عملکرد برای هر تصویر

از آن بگذریم.

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
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • این labelDetection تابع از DetectLabels API برای شناسایی برچسب ها در تصویر.
  • API لیستی از برچسب ها را برمی گرداند که هر کدام دارای امتیاز اطمینان هستند.
  • این تابع از طریق لیست برچسب ها تکرار می شود و نام برچسب، دسته بندی و امتیاز اطمینان را در جدول DynamoDB ذخیره می کند.

نتیجه گیری و مراحل بعدی

در این پست نحوه ایجاد یک راه حل بدون سرور که برچسب های تصویر را با استفاده از آمازون Rekognition شناسایی می کند را مشاهده کردید. کل چرخه عمر زیرساخت با استفاده از AWS CDK خودکار شد. همه اینها با استفاده از زبان برنامه نویسی Go انجام شد که به خوبی در AWS Lambda و AWS CDK پشتیبانی می شود.

در اینجا چند چیز وجود دارد که می توانید برای گسترش این راه حل امتحان کنید:

ساختمان مبارک!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا