Saltar al contenido principal

reComputer Rugged J401 para Visión Industrial

Introducción​

Los montacargas industriales trabajan en muelles de carga, almacenes, patios exteriores, cámaras frigoríficas y zonas de lavado. El polvo, el agua, la vibración, los cambios de temperatura y la cobertura de red poco fiable hacen que estos sean lugares difíciles para un ordenador convencional. Un sistema de visión montado en el vehículo necesita hardware sellado, conectores seguros, alimentación de cámara estable y suficiente capacidad de cómputo local para procesar vídeo en el propio vehículo.

Este wiki presenta varias formas en que la visión por computadora puede utilizarse en montacargas industriales. El ejemplo usa reComputer Rugged J401 como controlador de borde. Su carcasa IP66, conectores M12, resistencia a la vibración, cuatro puertos PoE y Jetson Orin NX le permiten situarse cerca de las cámaras y ejecutar las cargas de trabajo de visión localmente.

El ejemplo cubre cuatro tareas prácticas: seguir un objeto seleccionado frente al montacargas, vigilar el área ciega trasera, comprobar la fatiga del conductor y el uso del casco, y grabar imágenes para su revisión posterior. Las cuatro se gestionan desde una única consola web.

application banner
aviso

Este proyecto es un prototipo de asistencia, no un sistema de seguridad funcional. No tiene certificación de seguridad y no debe sustituir las comprobaciones del propio operador. La vista de advertencia trasera informa SYSTEM ERROR si la cámara o la canalización de inferencia falla.

Requisitos previos​

  • reComputer Rugged J4012 / J3011
  • JetPack 5.1.3 ya instalado
  • Cámara POE / Cámara USB
  • Conexión a Internet para descargar paquetes y modelos
  • Se recomiendan al menos 30 GB de almacenamiento libre

Aplicaciones de Visión para Montacargas Industriales​

Este caso utiliza dos cámaras POE de 48 V y una cámara USB. Dependiendo de los diferentes escenarios, estas cámaras se pueden sustituir libremente.

Conexión de hardware​

application banner

Seguimiento de objetivos en vista frontal​

Durante la manipulación de palés, el operador puede necesitar mantener a la vista una carga o zona de trabajo concreta mientras el montacargas se mueve. La aplicación frontal utiliza EfficientTAM para seguimiento por segmentación mediante clic. El operador selecciona un objetivo en el vídeo y el sistema sigue su contorno a lo largo de los fotogramas posteriores.

Se trata de un seguimiento interactivo, no de un reconocimiento automático de objetos. Es útil cuando el objetivo cambia de una tarea a otra y el operador puede seleccionarlo directamente.

Advertencia de área trasera​

El contrapeso y el mástil dejan grandes zonas ciegas alrededor de un montacargas. Una cámara PoE orientada hacia atrás utiliza Depth Anything V2 para estimar la profundidad de la escena y un detector de personas para vigilar el área de trabajo detrás del vehículo. La interfaz informa SAFE, WARNING o DANGER según los umbrales de distancia configurados.

nota

La estimación de profundidad monocular tiene limitaciones. La distancia real no es fiable. ¡Es necesario ajustar el umbral de alarma según las condiciones y requisitos in situ!

Monitoreo del conductor y EPP​

Una cámara en la cabina puede comprobar condiciones que no son visibles desde el exterior. Los puntos de referencia faciales de MediaPipe proporcionan señales relacionadas con la fatiga, mientras que un modelo independiente comprueba el estado del casco. Cuando el algoritmo del modelo detecta fatiga del conductor durante la operación, activa una luz de advertencia para alertar al conductor y evitar accidentes de seguridad graves causados por la conducción fatigada.

Grabación multicámara​

Podemos mostrar imágenes de monitoreo desde diferentes perspectivas en un solo panel, lo que facilita supervisar la situación en tiempo real.

Industrial forklift vision dashboard

Descripción general del sistema​

AplicaciónCámaraMétodo de visión
FrontalPoE RTSPSeguimiento por segmentación con clic EfficientTAM
TraseraPoE RTSPAdvertencia de profundidad métrica Depth Anything V2 con estados SAFE, WARNING, DANGER y SYSTEM ERROR
CabinaUSB UVCDetección de fatiga con MediaPipe y estado del casco
GrabaciónCualquier cámara configuradaGrabación MP4 H.264 1080p sin inferencia de IA

El servidor FastAPI inicia y detiene cada aplicación, evita que dos aplicaciones abran la misma cámara y envía los flujos de vídeo al navegador. Los modelos y cámaras permanecen inactivos hasta que se solicitan, por lo que una aplicación no utilizada no ocupa memoria de la GPU.

Desplegar la aplicación de ejemplo​

Paso 1. Instalar paquetes del sistema​

sudo apt-get update
sudo apt-get install -y python3.8-venv python3-opencv libopenblas-base logrotate nodejs npm

python3 -c "import cv2; print([line.strip() for line in cv2.getBuildInformation().splitlines() if 'GStreamer' in line])"

La salida debe mostrar GStreamer: YES. No reemplaces el OpenCV del sistema con la rueda de PyPI opencv-python; esa rueda no proporciona la compatibilidad con GStreamer utilizada para la captura RTSP en esta configuración.

Paso 2. Clonar el proyecto y crear el entorno​

git clone https://github.com/zibochen6/rugged_cv_demo.git /home/seeed/workspace/seg_demo
cd /home/seeed/workspace/seg_demo

python3 -m venv .venv
.venv/bin/python -m pip install --upgrade pip setuptools wheel
.venv/bin/pip install "numpy==1.24.4"

curl -fL --retry 3 -o /tmp/torch-2.1.0a0+41361538.nv23.06-cp38-cp38-linux_aarch64.whl \
https://developer.download.nvidia.com/compute/redist/jp/v512/pytorch/torch-2.1.0a0+41361538.nv23.06-cp38-cp38-linux_aarch64.whl
.venv/bin/pip install /tmp/torch-2.1.0a0+41361538.nv23.06-cp38-cp38-linux_aarch64.whl

git clone --branch v0.16.2 --depth 1 https://github.com/pytorch/vision.git /tmp/vision
cd /tmp/vision
MAX_JOBS=4 /home/seeed/workspace/seg_demo/.venv/bin/python setup.py install
cd /home/seeed/workspace/seg_demo

Apunta el entorno virtual a los paquetes JetPack OpenCV y TensorRT, luego instala las dependencias del proyecto:

SP="$(.venv/bin/python -c 'import site; print(site.getsitepackages()[0])')"
printf "import sys; sys.path.insert(0, '/usr/lib/python3.8/dist-packages')\n" \
> "$SP/_system_opencv_prepend.pth"

.venv/bin/pip install -r requirements-jetson.txt
.venv/bin/pip install -r backend/requirements.txt

cd frontend
npm ci
npm run build
cd ..

Paso 3. Instalar EfficientTAM y descargar los modelos​

mkdir -p third_party checkpoints models/onnx models/tensorrt models/mediapipe
git clone --depth 1 https://github.com/yformer/EfficientTAM.git third_party/EfficientTAM

Efficient_Track_Anything_BUILD_CUDA=0 .venv/bin/pip install \
-e third_party/EfficientTAM --no-build-isolation --no-deps --ignore-requires-python

.venv/bin/pip install --no-deps "ultralytics==8.3.40" "ultralytics-thop==2.0.14"
.venv/bin/pip install "onnx==1.14.1" "matplotlib==3.7.5" "pandas==2.0.3" \
"seaborn==0.13.2" "psutil==6.1.1" "py-cpuinfo==9.0.0" "scipy==1.10.1"

curl -fL --retry 3 -o checkpoints/efficienttam_ti_512x512.pt \
https://huggingface.co/yunyangx/efficient-track-anything/resolve/main/efficienttam_ti_512x512.pt

.venv/bin/huggingface-cli download depth-anything/Depth-Anything-V2-Metric-Indoor-Small-hf \
--local-dir checkpoints/depth_anything_v2_metric_indoor_small

curl -fL --retry 3 -o models/mediapipe/face_landmarker.task \
https://storage.googleapis.com/mediapipe-models/face_landmarker/face_landmarker/float16/latest/face_landmarker.task

curl -fL --retry 3 -o checkpoints/yolov8n.pt \
https://github.com/ultralytics/assets/releases/download/v8.3.0/yolov8n.pt
Export the ONNX models and build the TensorRT engines

Crea export_depth_onnx.py en la raíz del proyecto:

import os
import torch
from transformers import DepthAnythingForDepthEstimation

cam_w, cam_h = 2304, 1296
longest, multiple = 518, 14
scale = longest / float(max(cam_h, cam_w))
in_h = max(multiple, (int(round(cam_h * scale)) // multiple) * multiple)
in_w = max(multiple, (int(round(cam_w * scale)) // multiple) * multiple)
output = "models/onnx/depth_metric_small_518.onnx"

model = DepthAnythingForDepthEstimation.from_pretrained(
"checkpoints/depth_anything_v2_metric_indoor_small"
).eval()


class Wrapped(torch.nn.Module):
def __init__(self, depth_model):
super().__init__()
self.depth_model = depth_model

def forward(self, pixel_values):
return self.depth_model(pixel_values=pixel_values).predicted_depth


os.makedirs(os.path.dirname(output), exist_ok=True)
torch.onnx.export(
Wrapped(model),
(torch.zeros((1, 3, in_h, in_w), dtype=torch.float32),),
output,
input_names=["pixel_values"],
output_names=["predicted_depth"],
opset_version=16,
do_constant_folding=True,
)
print("ONNX written:", output)

Exporta los modelos de profundidad y de persona, luego descarga el modelo experimental de casco:

.venv/bin/python export_depth_onnx.py

.venv/bin/python - <<'PY'
from pathlib import Path
from ultralytics import YOLO

result = Path(YOLO("checkpoints/yolov8n.pt").export(
format="onnx", imgsz=640, opset=12, simplify=False, dynamic=False
))
Path("models/onnx/yolov8n_person.onnx").write_bytes(result.read_bytes())
PY

curl -fL --retry 3 -o models/onnx/ppe_hard_hat.experimental.onnx \
https://raw.githubusercontent.com/Sanaurrehmanarain/object-detection-yolov8/main/best.onnx

Compila los tres motores en el J401. Los motores de TensorRT están vinculados a la arquitectura de la GPU y a la versión de TensorRT, así que no copies motores compilados en otro ordenador.

TRTEXEC=/usr/src/tensorrt/bin/trtexec
[ -x "$TRTEXEC" ] || TRTEXEC="$(command -v trtexec)"

"$TRTEXEC" --onnx=models/onnx/depth_metric_small_518.onnx \
--saveEngine=models/tensorrt/depth_metric_small_518_fp16.engine \
--fp16 --workspace=1024

"$TRTEXEC" --onnx=models/onnx/yolov8n_person.onnx \
--saveEngine=models/tensorrt/yolov8n_person_fp16.engine \
--fp16 --workspace=2048

"$TRTEXEC" --onnx=models/onnx/ppe_hard_hat.experimental.onnx \
--saveEngine=models/tensorrt/ppe_hard_hat_fp16.engine \
--fp16 --workspace=1024

Paso 4. Instalar el servicio y configurar las cámaras​

Previsualiza los cambios del sistema antes de instalar el servicio:

sudo ./deploy/install.sh --dry-run
sudo ./deploy/install.sh

Almacena las credenciales RTSP en el archivo de entorno protegido:

sudo tee /etc/seg-demo/visual-hub.env >/dev/null <<'EOF'
FRONT_CAMERA_URL=rtsp://<user>:<password>@192.168.10.20:554/
REAR_CAMERA_URL=rtsp://<user>:<password>@192.168.10.21:554/
DMS_CAMERA=usb:0
EOF
sudo chmod 600 /etc/seg-demo/visual-hub.env

sudo systemctl start visual-hub
curl -s http://127.0.0.1:8000/api/health

Prueba las aplicaciones​

Abre la siguiente dirección desde un navegador en la misma LAN:

http://<Jetson-LAN-IP>:8000/

Usa el selector de cámara en cada tarjeta para confirmar las fuentes frontal, trasera y de cabina. Una cámara que ya está en uso no está disponible para las otras aplicaciones hasta que se detenga. Prueba cada aplicación por separado antes de usar Start All.

Sigue un objeto delante de la carretilla elevadora​

  1. Selecciona la cámara PoE orientada hacia delante y arranca la aplicación frontal.
  2. Haz clic en el objeto o carga que se debe seguir.
  3. Añade puntos negativos si la máscara incluye parte del fondo.
  4. Borra la selección antes de elegir otro objetivo.

La primera carga del modelo tarda varios segundos. Una vez que se selecciona un objetivo, la máscara lo sigue a través de los fotogramas posteriores e intenta volver a fijarlo si sale brevemente del campo de visión.

Comprueba la zona de trabajo trasera​

Selecciona la cámara PoE orientada hacia atrás y arranca la aplicación trasera. El panel de estado cambia entre SAFE, WARNING y DANGER a medida que la distancia estimada cruza los umbrales configurados.

Antes de usar la distancia mostrada, ajusta los parámetros intrínsecos de la cámara, la altura de montaje, el ángulo de inclinación y la corrección de distancia en configs/warning.yaml. Una cámara o posición de montaje diferente requiere una nueva calibración.

Activa la monitorización de la cabina​

Selecciona la cámara USB de cabina y arranca la aplicación de cabina. Las comprobaciones de fatiga y casco tienen interruptores separados. Apaga la ruta que no sea necesaria; su modelo no se cargará.

Coloca la cámara donde la cara del conductor sea visible sin bloquear la vista del operador. Pruébala bajo las mismas condiciones de iluminación que se usan durante los turnos normales.

Comandos de servicio útiles:

sudo systemctl restart visual-hub
./scripts/run_visual_hub.sh status
./scripts/run_visual_hub.sh stop
journalctl -u visual-hub -f

Rendimiento medido​

Estas cifras se midieron con las cuatro aplicaciones ejecutándose en un reComputer Rugged J401 con Jetson Orin NX 16GB. Ejecuta sudo nvpmodel -m 0 && sudo jetson_clocks antes de comparar resultados.

AplicaciónConfiguraciónResultado medido
Segmentación frontalEfficientTAM-Ti, 512, PyTorch bf16Alrededor de 13,2 FPS; la primera carga tarda de 7 a 8 segundos
Aviso traseroDepth Anything V2 Metric Small, TensorRT FP16Alrededor de 21 FPS de procesamiento de profundidad
Monitorización de cabinaCámara USB 1280x720Alrededor de 5,4 FPS con comprobaciones de fatiga y casco
GrabaciónTres flujos, nvv4l2h264enc3 x 1920x1080 a 15 FPS H.264

El rendimiento real depende de la resolución de la cámara, el modo de energía, la temperatura y el número de aplicaciones activas.

Solución de problemas​

SíntomaComprobarSolución
El puerto 8000 no está disponiblesystemctl status visual-hubReinicia el servicio e inspecciona journalctl -u visual-hub
Una aplicación informa CAMERA_BUSYcurl -s http://127.0.0.1:8000/api/hub/statusDetén la aplicación o la tarea de grabación que mantiene la cámara
Una cámara USB no se abresudo dmesg | grep -i "not enough bandwidth"Muévela a USB 3 o detén el otro flujo USB
Un flujo RTSP se congelaComprueba frame_age_s en el estado de la aplicaciónConfirma la alimentación de la cámara, el presupuesto PoE, la ruta de red y las credenciales RTSP
La vista frontal tarda varios segundos en aparecerjournalctl -u visual-hubLa primera carga del modelo EfficientTAM normalmente tarda de 7 a 8 segundos

Para una cámara que falta en el selector, comprueba primero el inventario:

curl -s http://127.0.0.1:8000/api/hub/cameras

Añade fuentes RTSP adicionales a HUB_EXTRA_CAMERAS en /etc/seg-demo/visual-hub.env, o introduce la URL mediante la fila manual en el selector.

Seguridad y límites de la aplicación​

  • La advertencia de zona trasera usa profundidad monocular, no un sensor de distancia física. Poca luz, reflejos, objetos transparentes, una lente sucia o una fuerte vibración pueden producir estimaciones erróneas.
  • La monitorización de cabina usa imágenes RGB y reglas de temporización fijas. No tiene calibración por conductor ni soporte de visión nocturna.
  • El seguimiento frontal sigue un objetivo seleccionado por el usuario. No identifica el objeto ni decide si es seguro moverlo.
  • El modelo de casco es experimental. Revisa su precisión, datos de entrenamiento y licencia antes de usarlo de forma operativa.

Vídeo de demostración​

Recursos​

Soporte técnico y debate sobre el producto​

Gracias por elegir nuestros productos. Estamos aquí para ofrecerte distintos tipos de soporte y garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a diferentes preferencias y necesidades.

Loading Comments...