API de Machine Learning para previsão de crescimento de biomassa em tanques de cultivo, com integração ao Oracle Database.
- Visão Geral
- Arquitetura
- Pré-requisitos
- Instalação
- Configuração
- Executando a API
- Endpoints
- Treinamento do Modelo
- Banco de Dados Oracle
- Testes
- Deploy na OCI
- Estrutura do Projeto
Este serviço expõe uma API REST que recebe dados de sensores IoT (pH, temperatura, turbidez, luminosidade, radiação PAR) e retorna a previsão de biomassa (g/L) para as próximas 48h, a data estimada de colheita e a confiança do modelo.
O modelo é um Random Forest Regressor (scikit-learn) treinado com histórico de medições e colheitas armazenados no Oracle.
Stack:
- Python 3.11+
- FastAPI + Uvicorn
- scikit-learn (Random Forest)
- Oracle Database (via
python-oracledb)
Sensores IoT / API Java
│
▼ POST /api/v1/predict
┌───────────────────┐
│ FastAPI (8000) │
│ ┌─────────────┐ │
│ │ predictor │◄─┼── model.pkl + scaler.pkl (carregados na memória)
│ └─────────────┘ │
└───────────────────┘
│
▼ INSERT
┌─────────────────────┐
│ Oracle Database │
│ TB_METRICAS_TANQUE │
│ TB_PREVISOES_IA │
│ TB_ALERTA_CRITICO │
└─────────────────────┘
- Python 3.11 ou superior
- Oracle Database acessível (local ou na nuvem)
- Oracle Instant Client não é necessário com
python-oracledbno modo Thin (padrão)
python3 --version# Clone o repositório
git clone https://github.com/GS1-2TDSPG-2026/gs1-python-LSTM.git
cd gs1-python-LSTM
# Crie e ative o ambiente virtual
python3 -m venv .venv
source .venv/bin/activate
# Instale as dependências
pip install -r requirements.txtcp .env.example .env
nano .envORACLE_USER=system
ORACLE_PASSWORD=sua_senha_aqui
ORACLE_DSN=localhost:1521/XEPDB1Nunca commite o arquivo
.env. Ele já está no.gitignore.
uvicorn app.main:app --reload --port 8000uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 1Acesse a documentação interativa em: http://localhost:8000/docs
Request body:
{
"tanqueId": 1,
"ph": 7.2,
"temperatura": 26.5,
"turbidez": 38.0,
"luminosidade": 820,
"radiacaoPar": 5.7
}Response 200 OK:
{
"tanqueId": 1,
"biomassaEstimada": 14.87,
"dataPrevistaColheita": "2026-06-15",
"confianca": 91.3,
"status": "CRESCIMENTO_IDEAL"
}Status possíveis:
| Status | Biomassa (g/L) |
|---|---|
CRESCIMENTO_IDEAL |
≥ 15.0 |
CRESCIMENTO_MODERADO |
≥ 10.0 |
CRESCIMENTO_LENTO |
≥ 5.0 |
ALERTA_BAIXA_BIOMASSA |
< 5.0 |
{
"status": "ok",
"servico": "biomassa-ia",
"versao": "1.0.0"
}python -m training.trainGera artifacts/model.pkl e artifacts/scaler.pkl com 500 amostras sintéticas.
Edite o bloco __main__ em training/train.py:
if __name__ == "__main__":
df = carregar_dados_oracle()
treinar(df)Execute no SQL Developer ou SQL*Plus:
CREATE TABLE TB_PREVISOES_IA (
id_previsao NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
id_tanque NUMBER NOT NULL,
id_dado_orbital NUMBER,
dt_previsao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
biomassa_g_l NUMBER(10, 2),
dt_pico_previsto DATE,
confianca_pct NUMBER(5, 2),
modelo_utilizado VARCHAR2(50)
);
CREATE TABLE TB_ALERTA_CRITICO (
id_alerta NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
id_tanque NUMBER NOT NULL,
id_metrica NUMBER,
tipo_alerta VARCHAR2(50),
severidade VARCHAR2(20),
mensagem VARCHAR2(255),
status VARCHAR2(20) DEFAULT 'ABERTO',
dt_alerta TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);python -c "from app.db.oracle import get_conexao; c = get_conexao(); print('✅ Conectado:', c.version)"pytest tests/ -v| Teste | O que verifica |
|---|---|
test_status_crescimento_ideal |
Classificação ≥ 15 g/L |
test_status_crescimento_moderado |
Classificação ≥ 10 g/L |
test_status_crescimento_lento |
Classificação ≥ 5 g/L |
test_status_alerta |
Classificação < 5 g/L |
test_previsao_retorna_saida_valida |
Estrutura completa da resposta |
test_condicoes_ruins_geram_baixa_biomassa |
Sanity check do modelo |
test_schemas_valida_ph_invalido |
Validação Pydantic (pH > 14 rejeitado) |
A API consome ~150–300 MB de RAM. Uma VM VM.Standard.E2.1.Micro (Always Free) é suficiente para testes.
No Console da OCI, crie uma instância:
- Shape:
VM.Standard.E2.1.Micro(Always Free) ou superior - Imagem: Ubuntu 22.04
- Abra a porta
8000no Security List da subnet
# Conecte via SSH
ssh ubuntu@<IP_DA_SUA_VM>
# Instale dependências
sudo apt update
sudo apt install python3.11 python3.11-venv python3-pip git -y
# Clone o projeto
git clone https://github.com/GS1-2TDSPG-2026/gs1-python-LSTM.git
cd gs1-python-LSTM
# Ambiente virtual e dependências
python3.11 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# Configure o .env
cp .env.example .env
nano .env
# Treine o modelo inicial
python -m training.trainsudo nano /etc/systemd/system/biomassa-ia.service[Unit]
Description=Biomassa IA — Motor Preditivo
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/gs1-python-LSTM
EnvironmentFile=/home/ubuntu/gs1-python-LSTM/.env
ExecStart=/home/ubuntu/gs1-python-LSTM/.venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 1
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable biomassa-ia
sudo systemctl start biomassa-ia
# Verificar status
sudo systemctl status biomassa-ia
# Logs em tempo real
sudo journalctl -u biomassa-ia -f# Ubuntu
sudo ufw allow 8000/tcpLembre-se também de liberar a porta 8000 no Security List da subnet no Console da OCI.
gs1-python-LSTM/
├── app/
│ ├── api/
│ │ └── routes.py
│ ├── data/
│ │ └── preprocessor.py
│ ├── db/
│ │ └── oracle.py
│ ├── models/
│ │ ├── predictor.py
│ │ └── schemas.py
│ └── main.py
├── artifacts/
│ ├── model.pkl
│ └── scaler.pkl
├── tests/
│ └── test_predictor.py
├── training/
│ └── train.py
├── .env.example
├── .gitignore
├── requirements.txt
└── README.md
MIT — veja o arquivo LICENSE para detalhes.