Pular para o conteúdo

Redes Neurais Multicamadas na Ponta: TensorFlow para Robôs e Drones

​ Há alguns anos venho explorando robótica e drones como hobby, sempre buscando integrar inteligência artificial de forma eficiente em hardware limitado. Ja abordavamos Machine Learning e Visão Computacional, antes mesmo desse hype todo de ChatGPT e outras Redes Neurais. (Que modeste a parte acredito que facilita muito nosso trabalho agora.) La por 2011 ja brincavamos com OpenCV (Chegamos aqui quando tudo era mato kkk) e integravamos alguns sistemas para empresas. ​ ​Neste artigo, compartilho minha experiência construindo uma rede neural multicamada (MLP) em Python com TensorFlow/Keras, rodando em sistemas embarcados (Raspberry Pi, Jetson Nano, TPU) e aplicada tanto em robôs UGVs quanto em UAVs de vigilância de longo alcance.

Neste artigo, descrevo a evolução do projeto de:

  1. Rede Neural Multicamadas (MLP) em Python/TensorFlow/Keras;
  2. Deploy em hardware de borda (Raspberry Pi 4, Jetson Nano, Coral Edge TPU);
  3. Uso de Pixhawk CubeOrange para acionamento de câmeras e sincronização de telemetria.

    Algumas imagens do processamento não poderei publicar por questões contratuais.

Desenho Técnico inicial.

1. Motivação & Cenário de Aplicação

​Em projetos de monitoramento ambiental aqui no Amazonas (regiões de Apuí e Humaitá), precisei de drones VTOL capazes de detectar focos de calor e desmatamento diariamente, durante dois anos seguidos. Os problemas começaram ao procurar alguma plataforma aérea com capacidade de voo para tais missões, mas como não existia, inicialmente criamos isso tambem do zero (desde o projeto, até a laminação em fibra de vidro e carbono e testes, mas contarei isso em outro artigo). Cada missão gerava milhares de imagens que alimentaram nosso dataset de treino. Para manter autonomia de processamento e reduzir latência, optei por:

  • MLP simples antes de migrar a CNNs mais pesadas
  • TensorFlow Lite para inferência em borda
  • Autopilot Pixhawk CubeOrange para acionar câmeras e registrar metadados
  • Plataforma aérea: desenvolvemos do zero um VTOL laminado em fibra de vidro e carbono. (Detalhes de moldagem e cura em epóxi ficam para outro artigo.)
  • Objetivo: detectar rapidamente sinais de queimada, vegetação saudável ou solo exposto (desmatamento), com inferência local para reduzir latência e falhas de link.

 Foto do nosso VTOL 

2. Coleta & Pré‑processamento

  1. Dados de voo:
    • Resolução: 640×480 px a 10 fps;
    • Duração típica: 60 min de gravação de imagens;
    • Total aproximado: 30 milhões de frames.
  2. Filtragem:
    # normaliza para [0,1]
    imgs = imgs.astype("float32") / 255.0
    # calibração radiométrica para converter DN em temperatura (°C)
    # usando constantes K1, K2 do datasheet FLIR Vue Pro R
    temperature = K2 / (np.log((K1 / imgs) + 1)) - 273.15
    # achata canais RGB + temperatura para vetor de features
    imgs_flat = np.stack([imgs, temperature], axis=-1).reshape((len(imgs), -1))  # 640×480×2 → 614400 features
    ```python
       imgs = imgs.astype("float32") / 255.0     # normaliza para [0,1]
       imgs_flat = imgs.reshape((len(imgs), -1))  # 640×480 → 307200 features
  3. Rotulagem:
    • Classes: queimada, vegetacao, solo;
    • One‑hot via sklearn.preprocessing.LabelBinarizer();
    • Balanceamento com oversampling para evitar viés em solo exposto.
  4. Split:
    from sklearn.model_selection import train_test_split
    X_train, X_val, y_train, y_val = train_test_split(
        imgs_flat, labels_onehot,
        test_size=0.2, shuffle=True, random_state=42
    )

3. Arquitetura MLP (TensorFlow/Keras)

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.regularizers import l2
from tensorflow.keras.optimizers import SGD

model = Sequential([
    Dense(256, input_shape=(307200,), activation='relu',
          kernel_regularizer=l2(1e-4)),
    Dropout(0.3),
    Dense(128, activation='relu', kernel_regularizer=l2(1e-4)),
    Dropout(0.3),
    Dense(3, activation='softmax')
])

model.compile(
    optimizer=SGD(learning_rate=0.005, momentum=0.9),
    loss='categorical_crossentropy',
    metrics=['accuracy']
)
  • Regularização L2 e Dropout (0.3) para controlar overfitting;
  • ReLU para aceleração de convergência;
  • Softmax para saída probabilística.

Placeholder: Diagrama das camadas e parâmetros

4. Treinamento & Avaliação

history = model.fit(
    X_train, y_train,
    validation_data=(X_val, y_val),
    epochs=25, batch_size=64, verbose=2
)
  • Hardware: CPU Raspberry Pi 4 (quad‑core ARM Cortex‑A72, 4 GB RAM); GPU Jetson Nano acelera ~2×;
  • Resultados: ~92 % de acurácia no conjunto de validação;
  • Usei history.history['loss'] / ['val_loss'] para ajustar Dropout e l2.

5. Deploy em Borda (TensorFlow Lite)

Conversão:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
with open('model.tflite', 'wb') as f:
    f.write(tflite_model)

Inferência:

import tflite_runtime.interpreter as tflite
interpreter = tflite.Interpreter(model_path='model.tflite')
interpreter.allocate_tensors()
# ... leitura de tensor de entrada e execução
  • Edge TPU: compilação com edgetpu_compiler para execução em ~20 ms por inferência.

 
 

6. Integração Pixhawk CubeOrange

Para acionar a câmera nos waypoints ou ao detectar temperatura acima do threshold:

  1. Saída PWM (CAM_TRIG) do Pixhawk → módulo relaydisparo da câmera;
  2. TELEM2 recebe GPS e barômetro;
  3. Companion (Raspberry Pi) roda código em MAVSDK-Python:
from mavsdk import System

async def monitor_and_capture():
    drone = System()
    await drone.connect()
    async for telem in drone.telemetry.imu():
        # exemplo: usar IMU para detectar vibração alta
        if telem.acceleration_m_s2 > 15:
            await drone.action.trigger_control_camera(
                trigger=True, duration_s=0.1
            )
  • Ajustei câmeras Sony RX0 II para alta sensibilidade;
  • Ajustei a câmera FLIR Vue Pro R radiométrica para captura de imagens térmicas e metadados de temperatura;

7. Resultados em Campo

  • Detecção de focos de calor: 90–94 % de precisão real-time;
  • Missões: >700 voos sem interrupções de software;
  • Autonomia: até 2 h por voo, incluindo inferência e telemetria.

8. Próximos Passos

  • Migrar modelagem para TinyML (MobileNet V2 embarcado);
  • Pesquisar SLAM visual + LIDAR para mapeamento 3D em tempo real;
  • Documentar processo de laminação e ensaio de voo VTOL.

Redes Neurais Multicamadas na Ponta: TensorFlow para Robôs e Drones
BETABITS Tecnologia, Dhiego Pagotto 12 de maio de 2025
Compartilhar esta publicação
Desvendando o Poder das Transformações Matriciais e Sistemas de Coordenadas com Python
Mergulhando no Universo das Transformações Matriciais: Da Visão Computacional à Conquista de Alvos Virtuais