Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menyimpan Data Rekognition Amazon dengan Amazon RDS dan DynamoDB
Saat menggunakan Amazon Rekognition APIs, penting untuk diingat bahwa operasi API tidak menyimpan label yang dihasilkan. Anda dapat menyimpan label ini dengan menempatkannya di database, bersama dengan pengidentifikasi untuk masing-masing gambar.
Tutorial ini menunjukkan mendeteksi label dan menyimpan label yang terdeteksi ke database. Aplikasi sampel yang dikembangkan dalam tutorial ini akan membaca gambar dari bucket Amazon S3 memanggil DetectLabelsoperasi pada gambar-gambar ini, dan menyimpan label yang dihasilkan dalam database. Aplikasi akan menyimpan data baik dalam instance database Amazon RDS atau database DynamoDB, tergantung pada jenis database yang ingin Anda gunakan.
Anda akan menggunakan AWS SDK untuk Python
Topik
Prasyarat
Sebelum Anda memulai tutorial ini, Anda perlu menginstal Python dan menyelesaikan langkah-langkah yang diperlukan untuk mengatur SDK Python
Membuat akun AWS dan peran IAM
Mengkonfigurasi kredenal AWS akses Anda dengan benar
Bucket Amazon S3 yang dibuat mengisinya dengan gambar
Membuat contoh database RDS, jika menggunakan RDS untuk menyimpan data
Mendapatkan Label untuk Gambar di Bucket Amazon S3
Mulailah dengan menulis fungsi yang akan mengambil nama gambar di bucket Amazon S3 Anda dan ambil gambar itu. Gambar ini akan ditampilkan untuk mengonfirmasi bahwa gambar yang benar sedang diteruskan ke panggilan DetectLabelsyang juga ada dalam fungsi.
-
Temukan ember Amazon S3 yang ingin Anda gunakan dan tuliskan namanya. Anda akan melakukan panggilan ke ember Amazon S3 ini dan membaca gambar di dalamnya. Pastikan bucket Anda berisi beberapa gambar untuk diteruskan ke DetectLabelsoperasi.
-
Tulis kode untuk terhubung ke bucket Amazon S3 Anda. Anda dapat terhubung ke sumber daya Amazon S3 dengan Boto3 untuk mengambil gambar dari bucket Amazon S3. Setelah terhubung ke sumber daya Amazon S3, Anda dapat mengakses bucket dengan menyediakan metode Bucket dengan nama bucket Amazon S3 Anda. Setelah tersambung ke bucket Amazon S3, Anda mengambil gambar dari bucket dengan menggunakan metode Object. Dengan memanfaatkan Matplotlib, Anda dapat menggunakan koneksi ini untuk memvisualisasikan gambar Anda saat diproses. Boto3 juga digunakan untuk terhubung ke klien Rekognition.
Dalam kode berikut, berikan wilayah Anda ke parameter region_name. Anda akan meneruskan nama bucket Amazon S3 dan nama gambar ke DetectLabels, yang mengembalikan label untuk gambar yang sesuai. Setelah memilih hanya label dari respons, nama gambar dan label dikembalikan.
import boto3 from io import BytesIO from matplotlib import pyplot as plt from matplotlib import image as mp_img boto3 = boto3.Session() def read_image_from_s3(bucket_name, image_name): # Connect to the S3 resource with Boto 3 # get bucket and find object matching image name s3 = boto3.resource('s3') bucket = s3.Bucket(name=bucket_name) Object = bucket.Object(image_name) # Downloading the image for display purposes, not necessary for detection of labels # You can comment this code out if you don't want to visualize the images file_name = Object.key file_stream = BytesIO() Object.download_fileobj(file_stream) img = mp_img.imread(file_stream, format="jpeg") plt.imshow(img) plt.show() # get the labels for the image by calling DetectLabels from Rekognition client = boto3.client('rekognition', region_name="region-name") response = client.detect_labels(Image={'S3Object': {'Bucket': bucket_name, 'Name': image_name}}, MaxLabels=10) print('Detected labels for ' + image_name) full_labels = response['Labels'] return file_name, full_labels
-
Simpan kode ini dalam file bernama get_images.py.
Membuat Tabel Amazon DynamoDB
Kode berikut menggunakan Boto3 untuk terhubung ke DynamoDB dan menggunakan metode DynamoDB untuk membuat tabel bernama ImagesCreateTable
. Tabel memiliki kunci primer komposit yang terdiri dari kunci partisi yang disebut Image dan kunci sortir yang disebut Label. Kunci Image berisi nama gambar, sedangkan kunci Labels menyimpan label yang ditetapkan untuk Gambar tersebut.
import boto3 def create_new_table(dynamodb=None): dynamodb = boto3.resource( 'dynamodb',) # Table defination table = dynamodb.create_table( TableName='Images', KeySchema=[ { 'AttributeName': 'Image', 'KeyType': 'HASH' # Partition key }, { 'AttributeName': 'Labels', 'KeyType': 'RANGE' # Sort key } ], AttributeDefinitions=[ { 'AttributeName': 'Image', 'AttributeType': 'S' }, { 'AttributeName': 'Labels', 'AttributeType': 'S' }, ], ProvisionedThroughput={ 'ReadCapacityUnits': 10, 'WriteCapacityUnits': 10 } ) return table if __name__ == '__main__': device_table = create_new_table() print("Status:", device_table.table_status)
Simpan kode ini di editor dan jalankan sekali untuk membuat tabel DynamoDB.
Mengunggah Data ke DynamoDB
Sekarang database DynamoDB telah dibuat dan Anda memiliki fungsi untuk mendapatkan label untuk gambar, Anda dapat menyimpan label di DynamoDB Kode berikut mengambil semua gambar dalam ember S3, mendapatkan label untuk mereka, dan menyimpan data di DynamoDB.
-
Anda harus menulis kode untuk mengunggah data ke DynamoDB. Fungsi yang
get_image_names
disebut digunakan untuk terhubung ke bucket Amazon S3 Anda dan mengembalikan nama semua gambar dalam ember sebagai daftar. Anda akan meneruskan daftar ini ke dalamread_image_from_S3
fungsi, yang diimpor dariget_images.py
file yang Anda buat.import boto3 import json from get_images import read_image_from_s3 boto3 = boto3.Session() def get_image_names(name_of_bucket): s3_resource = boto3.resource('s3') my_bucket = s3_resource.Bucket(name_of_bucket) file_list = [] for file in my_bucket.objects.all(): file_list.append(file.key) return file_list
-
read_image_from_S3
Fungsi yang kita buat sebelumnya akan mengembalikan nama gambar yang sedang diproses dan kamus label yang terkait dengan gambar itu. Sebuah fungsi yangfind_values
disebut digunakan untuk mendapatkan hanya label dari respon. Nama gambar dan labelnya kemudian siap untuk diunggah ke tabel DynamoDB Anda.def find_values(id, json_repr): results = [] def _decode_dict(a_dict): try: results.append(a_dict[id]) except KeyError: pass return a_dict json.loads(json_repr, object_hook=_decode_dict) # Return value ignored. return results
-
Anda akan menggunakan fungsi ketiga, dipanggil
load_data
, untuk benar-benar memuat gambar dan label ke dalam tabel DynamoDB yang Anda buat.def load_data(image_labels, dynamodb=None): if not dynamodb: dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('Images') print("Adding image details:", image_labels) table.put_item(Item=image_labels) print("Success!!")
-
Di sinilah tiga fungsi yang kita definisikan sebelumnya dipanggil, dan operasi dilakukan. Tambahkan tiga fungsi yang didefinisikan di atas, bersama dengan kode di bawah ini, ke file Python. Jalankan kode tersebut.
bucket = "bucket_name" file_list = get_image_names(bucket) for file in file_list: file_name = file print("Getting labels for " + file_name) image_name, image_labels = read_image_from_s3(bucket, file_name) image_json_string = json.dumps(image_labels, indent=4) labels=set(find_values("Name", image_json_string)) print("Labels found: " + str(labels)) labels_dict = {} print("Saving label data to database") labels_dict["Image"] = str(image_name) labels_dict["Labels"] = str(labels) print(labels_dict) load_data(labels_dict) print("Success!")
Anda baru saja menggunakan label DetectLabelsuntuk gambar Anda dan menyimpan label tersebut dalam instance DynamoDB. Pastikan Anda meruntuhkan semua sumber daya yang Anda buat saat mengikuti tutorial ini. Itu akan mencegah Anda ditagih untuk sumber daya yang tidak Anda gunakan.
Membuat Database MySQL di Amazon RDS
Sebelum melangkah lebih jauh, pastikan Anda telah menyelesaikan prosedur penyiapan untuk Amazon RDS dan membuat instance MySQL DB menggunakan Amazon RDS.
Kode berikut menggunakan perpustakaan PyMySQLconnect
fungsi PyMy SQL dan membuat instance kursor.
-
Dalam kode berikut, ganti nilai host dengan titik akhir host Amazon RDS Anda dan ganti nilai pengguna dengan nama pengguna utama yang terkait dengan instans Amazon RDS Anda. Anda juga perlu mengganti kata sandi dengan kata sandi utama untuk pengguna utama Anda.
import pymysql host = "host-endpoint" user = "username" password = "master-password"
-
Buat database dan tabel untuk menyisipkan data gambar dan label Anda ke dalam. Lakukan ini dengan menjalankan dan melakukan kueri pembuatan. Kode berikut membuat database. Jalankan kode ini hanya sekali.
conn = pymysql.connect(host=host, user=user, passwd=password) print(conn) cursor = conn.cursor() print("Connection successful") # run once create_query = "create database rekogDB1" print("Creation successful!") cursor.execute(create_query) cursor.connection.commit()
-
Setelah database dibuat, Anda harus membuat tabel untuk menyisipkan nama dan label gambar Anda ke dalam. Untuk membuat tabel, pertama-tama Anda akan meneruskan perintah use SQL, bersama dengan nama database Anda, ke
execute
fungsi. Setelah koneksi dibuat, kueri untuk membuat tabel dijalankan. Kode berikut menghubungkan ke database dan kemudian membuat tabel dengan kedua kunci utama, dipanggilimage_id
, dan atribut teks menyimpan label. Gunakan impor dan variabel yang Anda tentukan sebelumnya, dan jalankan kode ini untuk membuat tabel di database Anda.# connect to existing DB cursor.execute("use rekogDB1") cursor.execute("CREATE TABLE IF NOT EXISTS test_table(image_id VARCHAR (255) PRIMARY KEY, image_labels TEXT)") conn.commit() print("Table creation - Successful creation!")
Mengunggah Data ke Tabel MySQL Amazon RDS
Setelah membuat database Amazon RDS dan tabel di database, Anda bisa mendapatkan label untuk gambar Anda dan menyimpan label tersebut di database Amazon RDS.
-
Hubungkan ke bucket Amazon S3 Anda dan ambil nama semua gambar di bucket. Nama-nama gambar ini akan diteruskan ke
read_image_from_s3
fungsi yang Anda buat sebelumnya untuk mendapatkan label untuk semua gambar Anda. Kode berikut terhubung ke bucket Amazon S3 Anda dan menampilkan daftar semua gambar di bucket Anda.import pymysql from get_images import read_image_from_s3 import json import boto3 host = "host-endpoint" user = "username" password = "master-password" conn = pymysql.connect(host=host, user=user, passwd=password) print(conn) cursor = conn.cursor() print("Connection successful") def get_image_names(name_of_bucket): s3_resource = boto3.resource('s3') my_bucket = s3_resource.Bucket(name_of_bucket) file_list = [] for file in my_bucket.objects.all(): file_list.append(file.key) return file_list
-
Respons dari DetectLabelsAPI berisi lebih dari sekedar label, jadi tulis fungsi untuk mengekstrak hanya nilai label. Fungsi berikut mengembalikan daftar penuh hanya label.
def find_values(id, json_repr): results = [] def _decode_dict(a_dict): try: results.append(a_dict[id]) except KeyError: pass return a_dict json.loads(json_repr, object_hook=_decode_dict) # Return value ignored. return results
-
Anda akan memerlukan fungsi untuk memasukkan nama gambar dan label ke dalam tabel Anda. Fungsi berikut menjalankan query penyisipan dan menyisipkan pasangan nama gambar dan label tertentu.
def upload_data(image_id, image_labels): # insert into db cursor.execute("use rekogDB1") query = "INSERT IGNORE INTO test_table(image_id, image_labels) VALUES (%s, %s)" values = (image_id, image_labels) cursor.execute(query, values) conn.commit() print("Insert successful!")
-
Terakhir, Anda harus menjalankan fungsi yang Anda tentukan di atas. Dalam kode berikut, nama semua gambar di bucket Anda dikumpulkan dan diberikan ke fungsi yang memanggil DetectLabels. Setelah itu, label dan nama gambar yang mereka terapkan diunggah ke database Amazon RDS Anda. Salin tiga fungsi yang didefinisikan di atas, bersama dengan kode di bawah ini, ke dalam file Python. Jalankan file Python.
bucket = "bucket-name" file_list = get_image_names(bucket) for file in file_list: file_name = file print("Getting labels for " + file_name) image_name, image_labels = read_image_from_s3(bucket, file_name) image_json = json.dumps(image_labels, indent=4) labels=set(find_values("Name", image_json)) print("Labels found: " + str(labels)) unique_labels=set(find_values("Name", image_json)) print(unique_labels) image_name_string = str(image_name) labels_string = str(unique_labels) upload_data(image_name_string, labels_string) print("Success!")
Anda telah berhasil digunakan DetectLabels untuk menghasilkan label untuk gambar Anda dan menyimpan label tersebut dalam database MySQL menggunakan Amazon RDS. Pastikan Anda meruntuhkan semua sumber daya yang Anda buat saat mengikuti tutorial ini. Ini akan mencegah Anda dikenakan biaya untuk sumber daya yang tidak Anda gunakan.
Untuk contoh AWS multiservice lainnya, lihat repositori contoh SDK AWS Dokumentasi. GitHub