یک برنامه بدون سرور برای تشخیص برچسب تصویر بسازید
در این پست وبلاگ، نحوه ساخت یک راه حل بدون سرور برای پردازش تصاویر با استفاده از آمازون 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 پشتیبانی می شود.
در اینجا چند چیز وجود دارد که می توانید برای گسترش این راه حل امتحان کنید:
ساختمان مبارک!