Mengembangkan aplikasi AWS Panorama - AWS Panorama

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.

Arsitektur aplikasi aplikasi sampel aplikasi AWS Panorama.

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.

Manifes aplikasi manifes

Manifes aplikasi adalah file bernamagraph.jsondi dalamgraphsfolder. 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, dipackagesdirektori. 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_sourcepaket adalah placeholder untuk kamera yang Anda menimpa selama penyebaran. Parameterhdmi_data_sinkpaket 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.jsonfile yang menentukan input dan output, yang dapat berupa aliran video atau tipe data dasar seperti float, boolean, atau string.

Misalnya,code_nodenode mengacu pada antarmuka dariSAMPLE_CODEpaket.

"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_indan nomor floating point bernamathresholdsebagai input. Antarmuka juga menentukan bahwa kode memerlukan buffer aliran video bernamavideo_outuntuk 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_nodenode 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 seperticodeataumodel, 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
  1. Ganti nama folder paket:packages/123456789012-SAMPLE_CODE-1.0/.

  2. Perbarui nama paket di lokasi berikut.

    • Manifes aplikasi aplikasigraphs/aws-panorama-sample/graph.json

    • Konfigurasi Packagepackages/123456789012-SAMPLE_CODE-1.0/package.json

    • Bangunan skrip skrip3-build-container.sh

Untuk memperbarui kode aplikasi
  1. Memodifikasi kode aplikasi dipackages/123456789012-SAMPLE_CODE-1.0/src/application.py.

  2. Untuk membangun wadah, jalankan3-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.gz

    CLI secara otomatis menghapus aset kontainer lama dariassetsfolder dan memperbarui konfigurasi paket.

  3. Untuk mengunggah paket, jalankan4-package-application.py.

  4. Buka konsol AWS PanoramaHalaman aplikasi yang di-deploy aplikasi diterapkan.

  5. Pilih aplikasi.

  6. Pilih Ganti.

  7. 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
  1. Ubah nama folder paket agar sesuai dengan model Anda. Misalnya, untukpackages/123456789012-SSD_512_RESNET50_V1_VOC-1.0/.

  2. Perbarui nama paket di lokasi berikut.

    • Manifes aplikasi aplikasigraphs/aws-panorama-sample/graph.json

    • Konfigurasi Packagepackages/123456789012-SSD_512_RESNET50_V1_VOC-1.0/package.json

  3. Dalam file konfigurasi paket (package.json). Mengubahassetsnilai ke array kosong.

    { "nodePackage": { "envelopeVersion": "2021-01-01", "name": "SSD_512_RESNET50_V1_VOC", "version": "1.0", "description": "Compact classification model", "assets": [],
  4. Buka file deskriptor paket (descriptor.json). Perbaruiframeworkdanshapenilai 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.

  5. Impor model dengan AWS Panorama Application CLI. AWS Panorama Application CLI menyalin file model dan deskriptor keassetsfolder dengan nama unik, dan memperbarui konfigurasi paket.

    aws-panorama-sample$ panorama-cli add-raw-model --model-asset-name model-asset \ --model-local-path 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 { "name": "model-asset", "implementations": [ { "type": "model", "assetUri": "b1a1589afe449b346ff47375c284a1998c3e1522b418a7be8910414911784ce1.tar.gz", "descriptorUri": "a6a9508953f393f182f05f8beaa86b83325f4a535a5928580273e7fe26f79e78.json" } ] }
  6. Untuk mengunggah model, jalankanpanorama-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
  7. Perbarui kode aplikasi. Sebagian besar kode dapat digunakan kembali. Kode khusus untuk respons model ada diprocess_resultsmetode.

    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 memperbaruipreprocessmetode.

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,Dockerfilemenjalankan 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.shsetiap 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 targetResourcedalam 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.