

Pemberitahuan akhir dukungan: Pada 31 Mei 2026, AWS akan mengakhiri dukungan untuk AWS Panorama. Setelah 31 Mei 2026, Anda tidak akan lagi dapat mengakses AWS Panorama konsol atau AWS Panorama sumber daya. Untuk informasi lebih lanjut, lihat [AWS Panorama akhir dukungan](https://docs.aws.amazon.com/panorama/latest/dev/panorama-end-of-support.html). 

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Mengembangkan aplikasi AWS Panorama
<a name="gettingstarted-sample"></a>

Anda dapat menggunakan contoh aplikasi 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.

![\[\]](http://docs.aws.amazon.com/id_id/panorama/latest/dev/images/sample-app.png)


Dalam contoh ini, aplikasi menggunakan AWS Panorama Application SDK untuk mendapatkan frame video dari kamera, memproses data video, dan mengirim data ke model visi komputer yang mendeteksi objek. Aplikasi menampilkan hasilnya pada layar HDMI yang terhubung ke alat.

**Topics**
+ [Manifes aplikasi](#gettingstarted-sample-manifest)
+ [Membangun dengan aplikasi sampel](#gettingstarted-sample-adapting)
+ [Mengubah model visi komputer](#gettingstarted-sample-model)
+ [Preprocessing gambar](#gettingstarted-sample-preprocessing)
+ [Mengunggah metrik dengan SDK untuk Python](#gettingstarted-sample-metrics)
+ [Langkah selanjutnya](#gettingstarted-sample-nextsteps)

## Manifes aplikasi
<a name="gettingstarted-sample-manifest"></a>

Manifes aplikasi adalah file bernama `graph.json` dalam `graphs` 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:

**Example `graphs/aws-panorama-sample/graph.json`— 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, di `packages` direktori. Mereka berisi kode dan model khusus untuk aplikasi ini. Dua paket kedua adalah kamera generik dan paket tampilan yang disediakan oleh layanan AWS Panorama. `abstract_rtsp_media_source`Paket ini merupakan placeholder untuk kamera yang Anda timpa selama penerapan. `hdmi_data_sink`Paket ini mewakili konektor output HDMI pada perangkat.

Node adalah antarmuka ke paket, serta parameter non-paket yang dapat memiliki nilai default yang Anda timpa pada waktu penerapan. Paket kode dan model mendefinisikan antarmuka dalam `package.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 dari `SAMPLE_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 tersebut adalah logika bisnis dan dibutuhkan aliran video bernama `video_in` dan nomor floating point bernama `threshold` input. Antarmuka juga menentukan bahwa kode tersebut memerlukan buffer aliran video yang diberi nama `video_out` untuk menampilkan video ke tampilan

**Example `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 dalam manifes aplikasi, `camera_node` node mewakili aliran video dari kamera. Ini termasuk dekorator yang muncul di konsol saat Anda menyebarkan aplikasi, meminta Anda untuk memilih aliran kamera.

**Example `graphs/aws-panorama-sample/graph.json`— Node 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 penerapan.

**Example `graphs/aws-panorama-sample/graph.json`— Node 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 layar.

**Example `graphs/aws-panorama-sample/graph.json`— Tepi**  

```
        "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"
            }
        ]
```

## Membangun dengan aplikasi sampel
<a name="gettingstarted-sample-adapting"></a>

Anda dapat menggunakan aplikasi sampel sebagai titik awal untuk aplikasi Anda sendiri.

Nama setiap paket harus unik di akun Anda. Jika Anda dan pengguna lain di akun Anda sama-sama menggunakan nama paket generik seperti `code` atau`model`, Anda mungkin mendapatkan versi paket yang salah saat menerapkan. 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/`.

1. Perbarui nama paket di lokasi berikut.

****
   + **Manifes aplikasi** - `graphs/aws-panorama-sample/graph.json`
   + **Konfigurasi Package** - `packages/123456789012-SAMPLE_CODE-1.0/package.json`
   + **Membangun skrip** - `3-build-container.sh`

**Untuk memperbarui kode aplikasi**

1. Ubah kode aplikasi di`packages/123456789012-SAMPLE_CODE-1.0/src/application.py`.

1. 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.gz
   ```

   CLI secara otomatis menghapus aset kontainer lama dari `assets` folder dan memperbarui konfigurasi paket.

1. Untuk mengunggah paket, jalankan`4-package-application.py`.

1. Buka halaman Aplikasi [Penerapan konsol AWS Panorama.](https://console.aws.amazon.com/panorama/home#deployed-applications)

1. Pilih aplikasi.

1. Pilih **Ganti**.

1. Selesaikan langkah-langkah untuk menyebarkan aplikasi. Jika diperlukan, Anda dapat membuat perubahan pada manifes aplikasi, aliran kamera, atau parameter.

## Mengubah model visi komputer
<a name="gettingstarted-sample-model"></a>

Aplikasi sampel mencakup model visi komputer. Untuk menggunakan model Anda sendiri, ubah konfigurasi node model, dan gunakan AWS Panorama Application CLI untuk mengimpornya sebagai aset.

[Contoh berikut menggunakan model MXNet SSD ResNet 50 yang dapat Anda unduh dari GitHub repo panduan ini: ssd\$1512\$1resnet50\$1v1\$1voc.tar.gz](https://github.com/awsdocs/aws-panorama-developer-guide/releases/download/v0.1-preview/ssd_512_resnet50_v1_voc.tar.gz)

**Untuk mengubah model aplikasi sampel**

1. Ganti nama folder paket agar sesuai dengan model Anda. Misalnya, untuk`packages/123456789012-SSD_512_RESNET50_V1_VOC-1.0/`.

1. Perbarui nama paket di lokasi berikut.

****
   + **Manifes aplikasi** - `graphs/aws-panorama-sample/graph.json`
   + **Konfigurasi Package** - `packages/123456789012-SSD_512_RESNET50_V1_VOC-1.0/package.json`

1. Dalam file konfigurasi paket (`package.json`). Ubah `assets` nilai ke array kosong.

   ```
   {
       "nodePackage": {
           "envelopeVersion": "2021-01-01",
           "name": "SSD_512_RESNET50_V1_VOC",
           "version": "1.0",
           "description": "Compact classification model",
           "assets": [],
   ```

1. Buka file deskriptor paket (`descriptor.json`). Perbarui `framework` dan `shape` nilai agar sesuai dengan model Anda.

   ```
   {
       "mlModelDescriptor": {
           "envelopeVersion": "2021-01-01",
           "framework": "MXNET",
           "inputs": [
               {
                   "name": "data",
                   "shape": [ 1, 3, 512, 512 ]
               }
           ]
       }
   }
   ```

   Nilai **bentuk**,`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 dan urutan array bervariasi di antara model.

1. Impor model dengan AWS Panorama Application CLI. CLI Aplikasi AWS Panorama menyalin file model dan deskriptor ke dalam `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 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"
           }
       ]
   }
   ```

1. 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
   ```

1. Perbarui kode aplikasi. Sebagian besar kode dapat digunakan kembali. Kode khusus untuk respons model ada dalam `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)
   ```

   Tergantung pada model Anda, Anda mungkin juga perlu memperbarui `preprocess` metode.

## Preprocessing gambar
<a name="gettingstarted-sample-preprocessing"></a>

Sebelum aplikasi mengirim gambar ke model, ia mempersiapkannya untuk inferensi dengan mengubah ukurannya dan menormalkan data warna. Model yang digunakan aplikasi membutuhkan 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 standar deviasi. Akhirnya, ia menggabungkan saluran warna dan mengubahnya menjadi NumPy array yang dapat diproses model.

**Example [application.py](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/packages/123456789012-SAMPLE_CODE-1.0/application.py) - Preprocessing**  

```
    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 yang dapat diprediksi yang berpusat di sekitar 0. Ini cocok dengan preprocessing yang diterapkan pada gambar dalam dataset pelatihan, yang merupakan pendekatan standar tetapi dapat bervariasi per model.

## Mengunggah metrik dengan SDK untuk Python
<a name="gettingstarted-sample-metrics"></a>

Aplikasi sampel menggunakan SDK untuk Python untuk mengunggah metrik ke Amazon. CloudWatch

**Example [application.py](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/packages/123456789012-SAMPLE_CODE-1.0/application.py) - SDK untuk 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 penerapan. Peran didefinisikan dalam `aws-panorama-sample.yml` CloudFormation template.

**Example [aws-panorama-sample.yml](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/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.

**Example [Dockerfile](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/packages/123456789012-SAMPLE_CODE-1.0/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 menggunakan AWS SDK dalam kode aplikasi Anda, pertama-tama ubah template untuk menambahkan izin untuk semua tindakan API yang digunakan aplikasi. Perbarui CloudFormation tumpukan dengan menjalankan `1-create-role.sh` setiap kali Anda membuat perubahan. Kemudian, terapkan perubahan pada kode aplikasi Anda.

Untuk tindakan yang mengubah atau menggunakan sumber daya yang ada, merupakan praktik terbaik untuk meminimalkan ruang lingkup kebijakan ini dengan menentukan nama atau pola untuk target `Resource` dalam pernyataan terpisah. Untuk detail tentang tindakan dan sumber daya yang didukung oleh setiap layanan, lihat [Kunci tindakan, sumber daya, dan kondisi di Referensi](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html) Otorisasi Layanan

## Langkah selanjutnya
<a name="gettingstarted-sample-nextsteps"></a>

Untuk petunjuk tentang penggunaan AWS Panorama Application CLI untuk membangun aplikasi dan membuat paket dari awal, lihat README CLI.

****
+ [github. com/aws/aws](https://github.com/aws/aws-panorama-cli)-panorama-cli

Untuk kode sampel lainnya dan utilitas pengujian yang dapat Anda gunakan untuk memvalidasi kode aplikasi Anda sebelum menerapkan, kunjungi repositori sampel AWS Panorama.

****
+ [github. com/aws-samples/aws-panorama-sampel](https://github.com/aws-samples/aws-panorama-samples)