NVR de IA com reServer Jetson
Introdução
Com o avanço da tecnologia de inteligência artificial, os sistemas tradicionais de vigilância por vídeo estão evoluindo para se tornarem mais inteligentes. O NVR de IA (Network Video Recorder) combina inteligência artificial com tecnologia de vigilância por vídeo, permitindo não apenas gravar vídeo, mas também analisar, reconhecer e processar o conteúdo de vídeo em tempo real. Isso aumenta a eficiência e a precisão do monitoramento de segurança. Este artigo apresentará como implementar um NVR de IA usando a plataforma NVIDIA Jetson.

Neste wiki, usaremos o Nvidia VST e outros microsserviços do Jetson Platform Service para implantar rapidamente um NVR de IA local em um dispositivo Jetson. Aqui, usamos o VST para adicionar câmeras, empregamos o modelo de detecção de pedestres do DeepStream para detectar objetos e exibimos os resultados da detecção juntamente com o fluxo de vídeo original na parede de vídeo do VST.
O que é um NVR de IA?
Um NVR de IA é um dispositivo que integra funções de gravação de vídeo e análise com inteligência artificial. Diferente dos NVRs tradicionais, um NVR de IA pode identificar automaticamente eventos importantes nas imagens de vídeo, como invasões ou objetos ausentes, e até acionar alarmes com base em regras predefinidas. Esse nível de inteligência depende de capacidades de computação poderosas e de algoritmos de aprendizado profundo.
Por que escolher a plataforma reServer (NVIDIA Jetson)?
A NVIDIA Jetson é uma plataforma de computação embarcada de alto desempenho e baixo consumo de energia, sendo ideal para aplicações de IA e aprendizado profundo. A plataforma Jetson é equipada com GPUs NVIDIA, que aceleram o processo de inferência de aprendizado profundo e suportam uma ampla gama de ferramentas e frameworks de IA, como TensorFlow e PyTorch.
O reServer é um dispositivo de computação de borda baseado na plataforma Nvidia Jetson. Ele possui design compacto, resfriamento passivo, 5x RJ45 GbE com PoE, 2 compartimentos para unidades de 2,5" HDD/SSD e uma grande variedade de interfaces industriais, tornando-o uma escolha ideal para dispositivos de borda de IoT com IA.
Pré-requisitos
- Dispositivo Jetson Orin (com o sistema operacional jetpack 6.0).
- Câmera IP.
Neste wiki, concluiremos as seguintes tarefas usando o reServer Industrial J4012, mas você também pode tentar usar outros dispositivos Jetson.
Podemos seguir as instruções neste wiki para gravar o sistema JetPack 6.0 mais recente no reServer.

Primeiros Passos
Conexão de Hardware
- Conecte o dispositivo Jetson à rede, mouse, teclado e monitor.
- Conecte a câmera IP à rede.
Claro, você também pode acessar o dispositivo Jetson remotamente via SSH pela rede local.
Etapa 1. Instalar nvidia-jetson-services
Abra o terminal do dispositivo Jetson e digite:
sudo apt update
sudo apt install nvidia-jetson-services
Então podemos perceber que há muitos microsserviços em /opt/nvidia/jetson/services/.

Etapa 2. Modificar a configuração do ingress
No diretório /opt/nvidia/jetson/services/ingress/config/, crie um novo arquivo chamado ai-nvr-nginx.conf e preencha com:
# specify you service discovery config here
location /emdx/ {
rewrite ^/emdx/?(.*)$ /$1 break;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log /var/log/nginx/access.log timed_combined;
proxy_pass http://emdx_api;
}
location /ws-emdx/ {
rewrite ^/ws-emdx/?(.*)$ /$1 break;
proxy_set_header Host $host;
proxy_pass http://emdx_websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Etapa 3. Modificar o local de armazenamento de dados do NVR (opcional)
Abra o arquivo /opt/nvidia/jetson/services/vst/config/vst_storage.json e altere o diretório conforme necessário.
{
"data_path": "/home/seeed/VST/storage/data/",
"video_path": "/home/seeed/VST/storage/video/",
"total_video_storage_size_MB": 10000
}
Etapa 4. Iniciar o serviço VST
O serviço VST depende de outros serviços, portanto todos os serviços dependentes precisam ser iniciados juntos.
sudo systemctl start jetson-redis
sudo systemctl start jetson-ingress
sudo systemctl start jetson-vst
Após a inicialização dos microsserviços, os contêineres Docker correspondentes serão criados.

Agora, podemos abrir a interface web do VST no navegador.
Na rede local, abra o navegador e digite: http://<ip-of-jetson>:81/

Etapa 5. Baixar o arquivo de configuração do NVR de IA
Abra o navegador e acesse a página de download.
Download(Top right corner) --> Browser(Diect Download)

cd <path-of-download>
unzip files.zip
cd files
tar -xvf ai_nvr-1.1.0.tar.gz
cd ai_nvr
Etapa 6. Modificar o arquivo de configuração do DeepStream
Queremos conseguir ver os resultados de inferência do modelo em tempo real, então precisamos modificar o método de entrada do DeepStream. Aqui, podemos configurá-lo para saída como RTSP.
Localize este arquivo de configuração e atualize seu conteúdo.
<path-of-ai_nvr>/config/deepstream/pn26/service-maker/ds-config-0_nx16.yaml
ds-config-0_nx16.yaml
################################################################################
# SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: MIT
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
################################################################################
deepstream:
nodes:
- type: nvinfer
# name of the primary inference must be 'pgie' for test app to route streams here
name: pgie
properties:
config-file-path: "/ds-config-files/pn26/config_infer_primary_RN34_PN26_960x544_dla0_orin_unprune_nx.txt"
model-engine-file: "/pn26-files/dla0_pn26_jp6_halfmem_bs4.engine"
unique-id: 1
# be sure to rename model-engine-file whenever batch-size is changed
batch-size: 4
- type: nvtracker
name: tracker
properties:
ll-config-file: "/ds-config-files/pn26/config_tracker_NvDCF_PNv2.6_Interval_1_PVA.yml;/ds-config-files/pn26/config_tracker_NvDCF_PNv2.6_Interval_1_PVA.yml"
ll-lib-file: "/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so"
sub-batches: "2:2"
tracker-width: 960
tracker-height: 544
- type: nvmsgconv
name: msgconv
properties:
payload-type: 1
- type: nvmsgbroker
name: msgbroker
properties:
config: "/ds-config-files/pn26/cfg_redis.txt"
proto-lib: "/opt/nvidia/deepstream/deepstream/lib/libnvds_redis_proto.so"
conn-str: "localhost;6379;test"
topic: "test"
sync: false
async: false
- type: queue
name: checkpoint
- type: nvmultistreamtiler
name: tiler
properties:
width: 1280
height: 720
- type: nvdsosd
name: osd
- type: nvvideoconvert
name: converter
- type: tee
name: tee
- type: queue
name: queue_tracker
- type: queue
name: queue_tee
- type: queue
name: queue_tiler
- type: queue
name: queue_msgconv
- type: queue
name: queue_converter
- type: queue
name: queue_osd
- type: queue
name: queue_sink
- type: queue
name: queue_msgbroker
- type: nvvideoconvert
name: converter1
- type: nvrtspoutsinkbin
name: sink
properties:
rtsp-port: 8555
sync: false
- type: sample_video_probe.sample_video_probe
name: osd_counter
properties:
font-size: 15
edges:
pgie: [queue_tracker, osd_counter]
queue_tracker: tracker
tracker: queue_tee
queue_tee: tee
tee: [queue_tiler, queue_msgconv]
queue_tiler: tiler
tiler: queue_converter
queue_converter: converter
converter: queue_osd
queue_osd: osd
osd: queue_sink
queue_sink: converter1
converter1: sink
queue_msgconv: msgconv
msgconv: queue_msgbroker
queue_msgbroker: msgbroker
Observe o modelo do seu dispositivo Jetson. Neste caso, o módulo Orin Nx 16GB está sendo usado. Se você estiver usando um modelo diferente, localize o arquivo de configuração correspondente e faça as modificações necessárias.
Adicione a variável de ambiente WDM_WL_NAME_IGNORE_REGEX em SDR no arquivo compose. Aqui, meu dispositivo Jetson é o reServer J4012, alimentado pelo Orin Nx 16GB, então preciso editar este arquivo compose:
<path-of-ai_nvr>/compose_nx16.yaml
...
WDM_CONSUMER_GRP_ID: sdr-deepstream-cg
WDM_CLUSTER_CONTAINER_NAMES: '["deepstream", "vst"]'
WDM_WL_NAME_IGNORE_REGEX: ".*deepstream.*"
...
Etapa 7. Iniciar o aplicativo AI NVR
No terminal do Jetson, insira o comando apropriado para iniciar o aplicativo AI NVR.
cd <path-of-download>/files/ai_nvr
# Orin AGX:
# sudo docker compose -f compose_agx.yaml up -d --force-recreate
# Orin NX16:
sudo docker compose -f compose_nx16.yaml up -d --force-recreate
# Orin NX8:
# sudo docker compose -f compose_nx8.yaml up -d --force-recreate
# Orin Nano:
# sudo docker compose -f compose_nano.yaml up -d --force-recreate
Durante o processo de inicialização, o aplicativo criará contêineres Docker adicionais, como o DeepStream.

Etapa 8. Configurar o AI NVR local pela interface web
Neste ponto, já instalamos e iniciamos com sucesso o aplicativo AI NVR no dispositivo Jetson. A próxima etapa é configurar a câmera pela interface web.
Na rede local, abra o navegador e digite: http://<ip-of-jetson>:30080/vst/
Configure manualmente a câmera IP e o fluxo de vídeo de saída do DeepStream.
Sensor Management --> Add device manually --> Submit

Aqui, precisamos inserir um endereço de câmera válido ou o caminho do fluxo RTSP.
O fluxo de saída do DeepStream é rtsp://192.168.49.161:8555/ds-test.
Isso depende do arquivo de configuração do DeepStream, que pode ser modificado conforme suas necessidades.
Ao configurar o fluxo de saída do deepstream, precisamos adicionar o campo deepstream no nome da câmera
Quando a configuração for concluída com sucesso, você poderá visualizar todos os feeds no video wall.
Video Wall --> Select All --> Start

Fechar o aplicativo ai-nvr
No terminal do Jetson, insira o comando apropriado para fechar o aplicativo AI NVR.
cd <path-of-download>/files/ai_nvr
# Orin AGX:
# sudo docker compose -f compose_agx.yaml down --remove-orphans
# Orin NX16:
sudo docker compose -f compose_nx16.yaml down --remove-orphans
# Orin NX8:
# sudo docker compose -f compose_nx8.yaml down --remove-orphans
# Orin Nano:
# sudo docker compose -f compose_nano.yaml down --remove-orphans
Os serviços podem ser interrompidos usando os comandos:
sudo systemctl stop <service-name>
por exemplo:
sudo systemctl stop jetson-redis
sudo systemctl stop jetson-ingress
sudo systemctl stop jetson-vst
Referências
- https://developer.nvidia.com/embedded/jetpack/jetson-platform-services-get-started
- https://docs.nvidia.com/jetson/jps/moj-overview.html
Suporte Técnico & Discussão de Produto
Obrigado por escolher nossos produtos! Estamos aqui para fornecer diferentes formas de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.