Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Mengembangkan aplikasi AWS Panorama
Anda dapat menggunakan aplikasi sampel untuk mempelajari tentang struktur aplikasi AWS Panorama, dan sebagai titik awal untuk aplikasi Anda sendiri.
Diagram berikut menunjukkan komponen utama aplikasi yang berjalan pada AWS Panorama Appliance. Kode aplikasi menggunakan AWS Panorama Application SDK untuk mendapatkan gambar dan berinteraksi dengan model, yang tidak memiliki akses langsung ke. Aplikasi mengeluarkan video ke tampilan yang terhubung tetapi tidak mengirim data gambar di luar jaringan lokal Anda.
Dalam contoh ini, aplikasi menggunakan AWS Panorama Application SDK untuk mendapatkan bingkai video dari kamera, memproses data video terlebih dahulu, dan mengirim data ke model penglihatan komputer yang mendeteksi objek. Aplikasi menampilkan hasilnya pada layar HDMI yang terhubung ke alat.
Bagian
Manifes aplikasi manifes
Manifes aplikasi adalah file bernamagraph.json
di dalamgraphs
folder. Manifes mendefinisikan komponen aplikasi, yaitu paket, node, dan tepi.
Paket adalah kode, konfigurasi, dan file biner untuk kode aplikasi, model, kamera, dan tampilan. Aplikasi sampel menggunakan 4 paket:
contoh graphs/aws-panorama-sample/graph.json
— Paket - Paket:
"packages": [ { "name": "123456789012::SAMPLE_CODE", "version": "1.0" }, { "name": "123456789012::SQUEEZENET_PYTORCH_V1", "version": "1.0" }, { "name": "panorama::abstract_rtsp_media_source", "version": "1.0" }, { "name": "panorama::hdmi_data_sink", "version": "1.0" } ],
Dua paket pertama didefinisikan dalam aplikasi, dipackages
direktori. Mereka berisi kode dan model khusus untuk aplikasi ini. Dua paket kedua adalah paket kamera dan tampilan generik yang disediakan oleh layanan AWS Panorama. Parameterabstract_rtsp_media_source
paket adalah placeholder untuk kamera yang Anda menimpa selama penyebaran. Parameterhdmi_data_sink
paket merupakan konektor output HDMI pada perangkat.
Node adalah antarmuka ke paket, serta parameter non-paket yang dapat memiliki nilai default yang Anda ganti pada waktu penyebaran. Kode dan model paket mendefinisikan antarmuka dipackage.json
file yang menentukan input dan output, yang dapat berupa aliran video atau tipe data dasar seperti float, boolean, atau string.
Misalnya,code_node
node mengacu pada antarmuka dariSAMPLE_CODE
paket.
"nodes": [ { "name": "code_node", "interface": "123456789012::SAMPLE_CODE.interface", "overridable": false, "launch": "onAppStart" },
Antarmuka ini didefinisikan dalam file konfigurasi paket,package.json
. Antarmuka menentukan bahwa paket adalah logika bisnis dan bahwa dibutuhkan aliran video bernamavideo_in
dan nomor floating point bernamathreshold
sebagai input. Antarmuka juga menentukan bahwa kode memerlukan buffer aliran video bernamavideo_out
untuk menampilkan video ke tampilan
contoh packages/123456789012-SAMPLE_CODE-1.0/package.json
{ "nodePackage": { "envelopeVersion": "2021-01-01", "name": "SAMPLE_CODE", "version": "1.0", "description": "Computer vision application code.", "assets": [], "interfaces": [ { "name": "interface", "category": "business_logic", "asset": "code_asset", "inputs": [ { "name": "video_in", "type": "media" }, { "name": "threshold", "type": "float32" } ], "outputs": [ { "description": "Video stream output", "name": "video_out", "type": "media" } ] } ] } }
Kembali ke manifes aplikasi,camera_node
node merupakan aliran video dari kamera. Ini termasuk dekorator yang muncul di konsol saat Anda menerapkan aplikasi, meminta Anda untuk memilih aliran kamera.
contoh graphs/aws-panorama-sample/graph.json
- Simpul kamera
{ "name": "camera_node", "interface": "panorama::abstract_rtsp_media_source.rtsp_v1_interface", "overridable": true, "launch": "onAppStart", "decorator": { "title": "Camera", "description": "Choose a camera stream." } },
Sebuah node parameter,threshold_param
, mendefinisikan parameter ambang kepercayaan yang digunakan oleh kode aplikasi. Ini memiliki nilai default 60, dan dapat diganti selama penyebaran.
contoh graphs/aws-panorama-sample/graph.json
- Simpul parameter
{ "name": "threshold_param", "interface": "float32", "value": 60.0, "overridable": true, "decorator": { "title": "Confidence threshold", "description": "The minimum confidence for a classification to be recorded." } }
Bagian terakhir dari manifes aplikasi,edges
, membuat koneksi antar node. Aliran video kamera dan parameter ambang terhubung ke input node kode, dan output video dari node kode terhubung ke tampilan.
contoh graphs/aws-panorama-sample/graph.json
— Edge
"edges": [ { "producer": "camera_node.video_out", "consumer": "code_node.video_in" }, { "producer": "code_node.video_out", "consumer": "output_node.video_in" }, { "producer": "threshold_param", "consumer": "code_node.threshold" } ]
Bangunan dengan aplikasi sampel
Anda dapat menggunakan aplikasi sampel sebagai titik awal untuk aplikasi Anda sendiri.
Nama masing-masing paket harus unik di akun Anda. Jika Anda dan pengguna lain di akun Anda, keduanya menggunakan nama paket umum seperticode
ataumodel
, Anda mungkin mendapatkan versi paket yang salah saat Anda men-deploy. Ubah nama paket kode menjadi salah satu yang mewakili aplikasi Anda.
Untuk mengganti nama paket kode
-
Ganti nama folder paket:
packages/123456789012-
.SAMPLE_CODE
-1.0/ -
Perbarui nama paket di lokasi berikut.
-
Manifes aplikasi aplikasi—
graphs/aws-panorama-sample/graph.json
-
Konfigurasi Package—
packages/123456789012-SAMPLE_CODE-1.0/package.json
-
Bangunan skrip skrip—
3-build-container.sh
-
Untuk memperbarui kode aplikasi
-
Memodifikasi kode aplikasi di
packages/123456789012-SAMPLE_CODE-1.0/src/application.py
. -
Untuk membangun wadah, jalankan
3-build-container.sh
.aws-panorama-sample$
./3-build-container.sh
TMPDIR=$(pwd) docker build -t code_asset packages/123456789012-SAMPLE_CODE-1.0 Sending build context to Docker daemon 61.44kB Step 1/2 : FROM public.ecr.aws/panorama/panorama-application ---> 9b197f256b48 Step 2/2 : COPY src /panorama ---> 55c35755e9d2 Successfully built 55c35755e9d2 Successfully tagged code_asset:latest docker export --output=code_asset.tar $(docker create code_asset:latest) gzip -9 code_asset.tar Updating an existing asset with the same name { "name": "code_asset", "implementations": [ { "type": "container", "assetUri": "98aaxmpl1c1ef64cde5ac13bd3be5394e5d17064beccee963b4095d83083c343.tar.gz", "descriptorUri": "1872xmpl129481ed053c52e66d6af8b030f9eb69b1168a29012f01c7034d7a8f.json" } ] } Container asset for the package has been succesfully built at ~/aws-panorama-sample-dev/assets/98aaxmpl1c1ef64cde5ac13bd3be5394e5d17064beccee963b4095d83083c343.tar.gzCLI secara otomatis menghapus aset kontainer lama dari
assets
folder dan memperbarui konfigurasi paket. -
Untuk mengunggah paket, jalankan
4-package-application.py
. Buka konsol AWS PanoramaHalaman aplikasi yang di-deploy aplikasi diterapkan
. Pilih aplikasi.
-
Pilih Ganti.
-
Selesaikan langkah-langkah untuk menerapkan aplikasi. Jika diperlukan, Anda dapat membuat perubahan pada manifes aplikasi, aliran kamera, atau parameter.
Mengubah model visi komputer
Aplikasi sampel termasuk model penglihatan komputer. Untuk menggunakan model Anda sendiri, ubah konfigurasi node model, dan gunakan AWS Panorama Application CLI untuk mengimpornya sebagai aset.
Contoh berikut menggunakan SSD MXNet ResNet50 model yang dapat Anda unduh dari panduan ini GitHub repo:ssd_512_resnet50_v1_voc.tar.gz
Untuk mengubah model aplikasi sampel
-
Ubah nama folder paket agar sesuai dengan model Anda. Misalnya, untuk
packages/
.123456789012
-SSD_512_RESNET50_V1_VOC
-1.0/ -
Perbarui nama paket di lokasi berikut.
-
Manifes aplikasi aplikasi—
graphs/aws-panorama-sample/graph.json
-
Konfigurasi Package—
packages/
123456789012
-SSD_512_RESNET50_V1_VOC
-1.0/package.json
-
-
Dalam file konfigurasi paket (
package.json
). Mengubahassets
nilai ke array kosong.{ "nodePackage": { "envelopeVersion": "2021-01-01", "name": "SSD_512_RESNET50_V1_VOC", "version": "1.0", "description": "Compact classification model", "assets":
[]
, -
Buka file deskriptor paket (
descriptor.json
). Perbaruiframework
danshape
nilai yang sesuai dengan model Anda.{ "mlModelDescriptor": { "envelopeVersion": "2021-01-01", "framework": "
MXNET
", "inputs": [ { "name": "data", "shape": [1, 3, 512, 512
] } ] } }Nilai untukbentuk,
1,3,512,512
, menunjukkan jumlah gambar yang diambil model sebagai input (1), jumlah saluran di setiap gambar (3—merah, hijau, dan biru), dan dimensi gambar (512 x 512). Nilai-nilai dan urutan array bervariasi di antara model. -
Impor model dengan AWS Panorama Application CLI. AWS Panorama Application CLI menyalin file model dan deskriptor ke
assets
folder dengan nama unik, dan memperbarui konfigurasi paket.aws-panorama-sample$
panorama-cli add-raw-model --model-asset-name model-asset \ --model-local-path
{ "name": "model-asset", "implementations": [ { "type": "model", "assetUri": "b1a1589afe449b346ff47375c284a1998c3e1522b418a7be8910414911784ce1.tar.gz", "descriptorUri": "a6a9508953f393f182f05f8beaa86b83325f4a535a5928580273e7fe26f79e78.json" } ] }ssd_512_resnet50_v1_voc.tar.gz
\ --descriptor-path packages/123456789012-SSD_512_RESNET50_V1_VOC-1.0
/descriptor.json \ --packages-path packages/123456789012-SSD_512_RESNET50_V1_VOC-1.0
-
Untuk mengunggah model, jalankan
panorama-cli package-application
.$
panorama-cli package-application
Uploading package SAMPLE_CODE Patch Version 1844d5a59150d33f6054b04bac527a1771fd2365e05f990ccd8444a5ab775809 already registered, ignoring upload Uploading package SSD_512_RESNET50_V1_VOC Patch version for the package 244a63c74d01e082ad012ebf21e67eef5d81ce0de4d6ad1ae2b69d0bc498c8fd upload: assets/b1a1589afe449b346ff47375c284a1998c3e1522b418a7be8910414911784ce1.tar.gz to s3://arn:aws:s3:us-west-2:454554846382:accesspoint/panorama-123456789012-wc66m5eishf4si4sz5jefhx 63a/123456789012/nodePackages/SSD_512_RESNET50_V1_VOC/binaries/b1a1589afe449b346ff47375c284a1998c3e1522b418a7be8910414911784ce1.tar.gz upload: assets/a6a9508953f393f182f05f8beaa86b83325f4a535a5928580273e7fe26f79e78.json to s3://arn:aws:s3:us-west-2:454554846382:accesspoint/panorama-123456789012-wc66m5eishf4si4sz5jefhx63 a/123456789012/nodePackages/SSD_512_RESNET50_V1_VOC/binaries/a6a9508953f393f182f05f8beaa86b83325f4a535a5928580273e7fe26f79e78.json { "ETag": "\"2381dabba34f4bc0100c478e67e9ab5e\"", "ServerSideEncryption": "AES256", "VersionId": "KbY5fpESdpYamjWZ0YyGqHo3.LQQWUC2" } Registered SSD_512_RESNET50_V1_VOC with patch version 244a63c74d01e082ad012ebf21e67eef5d81ce0de4d6ad1ae2b69d0bc498c8fd Uploading package SQUEEZENET_PYTORCH_V1 Patch Version 568138c430e0345061bb36f05a04a1458ac834cd6f93bf18fdacdffb62685530 already registered, ignoring upload
-
Perbarui kode aplikasi. Sebagian besar kode dapat digunakan kembali. Kode khusus untuk respons model ada di
process_results
metode.def process_results(self, inference_results, stream): """Processes output tensors from a computer vision model and annotates a video frame.""" for class_tuple in inference_results: indexes = self.topk(class_tuple[0]) for j in range(2): label = 'Class [%s], with probability %.3f.'% (self.classes[indexes[j]], class_tuple[0][indexes[j]]) stream.add_label(label, 0.1, 0.25 + 0.1*j)
Bergantung pada model Anda, Anda mungkin juga perlu memperbarui
preprocess
metode.
Gambar prapemrosesan awal
Sebelum aplikasi mengirimkan gambar ke model, ia mempersiapkannya untuk inferensi dengan mengubah ukurannya dan menormalkan data warna. Model yang digunakan aplikasi memerlukan gambar 224 x 224 piksel dengan tiga saluran warna, agar sesuai dengan jumlah input di lapisan pertamanya. Aplikasi menyesuaikan setiap nilai warna dengan mengubahnya menjadi angka antara 0 dan 1, mengurangi nilai rata-rata untuk warna itu, dan membaginya dengan deviasi standar. Akhirnya, ini menggabungkan saluran warna dan mengubahnya menjadi a NumPy array yang model dapat memproses.
contoh application.py — Prapemrosesan awal
def preprocess(self, img, width): resized = cv2.resize(img, (width, width)) mean = [0.485, 0.456, 0.406] std = [0.229, 0.224, 0.225] img = resized.astype(np.float32) / 255. img_a = img[:, :, 0] img_b = img[:, :, 1] img_c = img[:, :, 2] # Normalize data in each channel img_a = (img_a - mean[0]) / std[0] img_b = (img_b - mean[1]) / std[1] img_c = (img_c - mean[2]) / std[2] # Put the channels back together x1 = [[[], [], []]] x1[0][0] = img_a x1[0][1] = img_b x1[0][2] = img_c return np.asarray(x1)
Proses ini memberikan nilai model dalam rentang diprediksi berpusat di sekitar 0. Ini cocok dengan preprocessing yang diterapkan pada gambar dalam kumpulan data pelatihan, yang merupakan pendekatan standar tetapi dapat bervariasi per model.
Meng-upload metrik dengan SDK for Python
Contoh aplikasi menggunakan SDK untuk Python untuk mengunggah metrik ke Amazon CloudWatch.
contoh application.py — SDK for Python
def process_streams(self): """Processes one frame of video from one or more video streams.""" ... logger.info('epoch length: {:.3f} s ({:.3f} FPS)'.format(epoch_time, epoch_fps)) logger.info('avg inference time: {:.3f} ms'.format(avg_inference_time)) logger.info('max inference time: {:.3f} ms'.format(max_inference_time)) logger.info('avg frame processing time: {:.3f} ms'.format(avg_frame_processing_time)) logger.info('max frame processing time: {:.3f} ms'.format(max_frame_processing_time)) self.inference_time_ms = 0 self.inference_time_max = 0 self.frame_time_ms = 0 self.frame_time_max = 0 self.epoch_start = time.time()
self.put_metric_data('AverageInferenceTime', avg_inference_time) self.put_metric_data('AverageFrameProcessingTime', avg_frame_processing_time)
def put_metric_data(self, metric_name, metric_value): """Sends a performance metric to CloudWatch.""" namespace = 'AWSPanoramaApplication' dimension_name = 'Application Name' dimension_value = 'aws-panorama-sample' try: metric = self.cloudwatch.Metric(namespace, metric_name) metric.put_data( Namespace=namespace, MetricData=[{ 'MetricName': metric_name, 'Value': metric_value, 'Unit': 'Milliseconds', 'Dimensions': [ { 'Name': dimension_name, 'Value': dimension_value }, { 'Name': 'Device ID', 'Value': self.device_id } ] }] ) logger.info("Put data for metric %s.%s", namespace, metric_name) except ClientError: logger.warning("Couldn't put data for metric %s.%s", namespace, metric_name) except AttributeError: logger.warning("CloudWatch client is not available.")
Ini mendapat izin dari peran runtime yang Anda tetapkan selama penyebaran. Peran didefinisikan dalamaws-panorama-sample.yml
AWS CloudFormationtemplat yang tepat.
contoh aws-panorama-sample.yml
Resources: runtimeRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - panorama.amazonaws.com Action: - sts:AssumeRole Policies: - PolicyName: cloudwatch-putmetrics PolicyDocument: Version: 2012-10-17 Statement:
- Effect: Allow Action: 'cloudwatch:PutMetricData' Resource: '*'
Path: /service-role/
Contoh aplikasi menginstal SDK untuk Python dan dependensi lainnya dengan pip. Ketika Anda membangun wadah aplikasi,Dockerfile
menjalankan perintah untuk menginstal perpustakaan di atas apa yang datang dengan gambar dasar.
contoh Dockerfile
FROM public.ecr.aws/panorama/panorama-application WORKDIR /panorama COPY . . RUN pip install --no-cache-dir --upgrade pip && \ pip install --no-cache-dir -r requirements.txt
Untuk menggunakanAWSSDK dalam kode aplikasi Anda, pertama-tama ubah template untuk menambahkan izin untuk semua tindakan API yang digunakan aplikasi. PerbaruiAWS CloudFormationstack dengan menjalankan1-create-role.sh
setiap kali Anda membuat perubahan. Kemudian, terapkan perubahan pada kode aplikasi Anda.
Untuk tindakan yang memodifikasi atau menggunakan sumber daya yang ada, adalah praktik terbaik untuk meminimalkan cakupan kebijakan ini dengan menentukan nama atau pola untuk targetResource
dalam pernyataan terpisah. Untuk detail tentang tindakan dan sumber daya yang didukung oleh setiap layanan, lihatTindakan, sumber daya, dan kunci kondisidalam Referensi Otorisasi Layanan
Langkah selanjutnya
Untuk petunjuk tentang penggunaan AWS Panorama Application CLI untuk membangun aplikasi dan membuat paket dari awal, lihat README CLI.
Untuk kode contoh lainnya dan utilitas pengujian yang dapat Anda gunakan untuk memvalidasi kode aplikasi Anda sebelum menerapkan, kunjungi repositori sampel AWS Panorama.