Spaces:
Runtime error
Runtime error
Marcus Vinicius Zerbini Canhaço
commited on
Commit
·
f84a89d
1
Parent(s):
1429e38
Documentação e melhorias no Examples
Browse files- README.md +58 -50
- docs/api/interface.md +2 -2
- docs/architecture/overview.md +26 -13
- docs/development/development.md +202 -0
- docs/faq.md +145 -0
- src/domain/detectors/base.py +1 -0
- src/presentation/web/gradio_interface.py +11 -27
README.md
CHANGED
|
@@ -14,14 +14,18 @@ resources:
|
|
| 14 |
gpu: true
|
| 15 |
---
|
| 16 |
|
| 17 |
-
|
|
|
|
| 18 |
|
| 19 |
-
|
|
|
|
| 20 |
|
| 21 |
-
[
|
| 22 |
-
[
|
|
|
|
|
|
|
| 23 |
|
| 24 |
-
##
|
| 25 |
|
| 26 |
- Detecção de objetos de risco em vídeos
|
| 27 |
- Processamento otimizado em GPU (NVIDIA T4) e CPU
|
|
@@ -30,58 +34,63 @@ Sistema de detecção de objetos de risco em vídeos usando OWL-ViT e processame
|
|
| 30 |
- Suporte a webhooks para notificações
|
| 31 |
- Métricas detalhadas de processamento
|
| 32 |
|
| 33 |
-
##
|
| 34 |
|
| 35 |
- Python 3.10+
|
| 36 |
- CUDA 11.8+ (para GPU)
|
| 37 |
- NVIDIA T4 16GB ou superior (recomendado)
|
| 38 |
- 16GB RAM mínimo
|
| 39 |
|
| 40 |
-
##
|
| 41 |
|
| 42 |
1. Clone o repositório:
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
|
|
|
| 47 |
|
| 48 |
2. Instale as dependências:
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
|
|
|
| 52 |
|
| 53 |
3. Configure o ambiente:
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
|
|
|
| 57 |
|
| 58 |
[Documentação completa de instalação](docs/setup/installation.md)
|
| 59 |
|
| 60 |
-
##
|
| 61 |
|
| 62 |
1. Inicie a aplicação:
|
| 63 |
-
```bash
|
| 64 |
-
python app.py
|
| 65 |
-
```
|
| 66 |
|
| 67 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 68 |
|
| 69 |
3. Upload de vídeo:
|
| 70 |
-
- Arraste ou selecione um vídeo
|
| 71 |
-
- Ajuste as configurações
|
| 72 |
-
- Clique em "Detectar"
|
| 73 |
|
| 74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
|
| 76 |
- [Arquitetura do Sistema](docs/architecture/overview.md)
|
| 77 |
- [Instalação e Configuração](docs/setup/installation.md)
|
| 78 |
- [API e Interface](docs/api/interface.md)
|
| 79 |
|
| 80 |
-
##
|
| 81 |
|
| 82 |
O projeto segue os princípios da Clean Architecture:
|
| 83 |
|
| 84 |
-
```
|
| 85 |
src/
|
| 86 |
├── domain/ # Regras de negócio
|
| 87 |
├── application/ # Casos de uso
|
|
@@ -91,54 +100,56 @@ src/
|
|
| 91 |
|
| 92 |
[Detalhes da arquitetura](docs/architecture/overview.md)
|
| 93 |
|
| 94 |
-
##
|
| 95 |
|
| 96 |
1. Configure as credenciais:
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
|
|
|
| 100 |
|
| 101 |
2. Execute o deploy:
|
| 102 |
-
```bash
|
| 103 |
-
./deploy.sh
|
| 104 |
-
```
|
| 105 |
|
| 106 |
-
|
|
|
|
|
|
|
| 107 |
|
| 108 |
-
##
|
| 109 |
|
| 110 |
### GPU
|
|
|
|
| 111 |
- NVIDIA T4 16GB (Hugging Face Pro)
|
| 112 |
- NVIDIA A100 (Performance máxima)
|
| 113 |
- NVIDIA V100 (Alternativa)
|
| 114 |
|
| 115 |
### CPU
|
|
|
|
| 116 |
- 8+ cores
|
| 117 |
- 32GB+ RAM
|
| 118 |
- SSD para armazenamento
|
| 119 |
|
| 120 |
-
##
|
| 121 |
|
| 122 |
### Componentes
|
|
|
|
| 123 |
- Upload de vídeo (MP4, AVI, MOV)
|
| 124 |
- Configurações de detecção
|
| 125 |
- Visualização de resultados
|
| 126 |
- Métricas em tempo real
|
| 127 |
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
## 🔗 Links
|
| 131 |
|
| 132 |
-
- [Hugging Face Space]
|
| 133 |
-
- [GitHub Repository]
|
| 134 |
- [Documentação](docs/)
|
| 135 |
- [Issues](https://github.com/seu-usuario/hackatoon-1iadt/issues)
|
| 136 |
|
| 137 |
-
##
|
| 138 |
|
| 139 |
-
Este projeto está licenciado sob a MIT License - veja o arquivo [LICENSE](LICENSE)
|
|
|
|
| 140 |
|
| 141 |
-
##
|
| 142 |
|
| 143 |
1. Fork o projeto
|
| 144 |
2. Crie sua feature branch (`git checkout -b feature/AmazingFeature`)
|
|
@@ -146,11 +157,8 @@ Este projeto está licenciado sob a MIT License - veja o arquivo [LICENSE](LICEN
|
|
| 146 |
4. Push para a branch (`git push origin feature/AmazingFeature`)
|
| 147 |
5. Abra um Pull Request
|
| 148 |
|
| 149 |
-
##
|
| 150 |
|
| 151 |
- Abra uma [issue](https://github.com/seu-usuario/hackatoon-1iadt/issues)
|
| 152 |
- Consulte a [documentação](docs/)
|
| 153 |
- Entre em contato com a equipe
|
| 154 |
-
|
| 155 |
-
---
|
| 156 |
-
Desenvolvido com ❤️ para o Hackathon FIAP
|
|
|
|
| 14 |
gpu: true
|
| 15 |
---
|
| 16 |
|
| 17 |
+
Sistema de detecção de objetos de risco em vídeos usando OWL-ViT e processamento
|
| 18 |
+
GPU/CPU otimizado.
|
| 19 |
|
| 20 |
+
[![Open in Hugging Face][hf-badge]][hf-space]
|
| 21 |
+
[![GitHub][gh-badge]][gh-repo]
|
| 22 |
|
| 23 |
+
[hf-badge]: https://img.shields.io/badge/Hugging%20Face-Spaces-yellow
|
| 24 |
+
[hf-space]: https://huggingface.co/spaces/seu-usuario/seu-espaco
|
| 25 |
+
[gh-badge]: https://img.shields.io/badge/GitHub-Repo-blue
|
| 26 |
+
[gh-repo]: https://github.com/seu-usuario/hackatoon-1iadt
|
| 27 |
|
| 28 |
+
## Funcionalidades
|
| 29 |
|
| 30 |
- Detecção de objetos de risco em vídeos
|
| 31 |
- Processamento otimizado em GPU (NVIDIA T4) e CPU
|
|
|
|
| 34 |
- Suporte a webhooks para notificações
|
| 35 |
- Métricas detalhadas de processamento
|
| 36 |
|
| 37 |
+
## Requisitos
|
| 38 |
|
| 39 |
- Python 3.10+
|
| 40 |
- CUDA 11.8+ (para GPU)
|
| 41 |
- NVIDIA T4 16GB ou superior (recomendado)
|
| 42 |
- 16GB RAM mínimo
|
| 43 |
|
| 44 |
+
## Instalação
|
| 45 |
|
| 46 |
1. Clone o repositório:
|
| 47 |
+
|
| 48 |
+
```bash
|
| 49 |
+
git clone https://github.com/seu-usuario/hackatoon-1iadt.git
|
| 50 |
+
cd hackatoon-1iadt
|
| 51 |
+
```
|
| 52 |
|
| 53 |
2. Instale as dependências:
|
| 54 |
+
|
| 55 |
+
```bash
|
| 56 |
+
pip install -r requirements.txt
|
| 57 |
+
```
|
| 58 |
|
| 59 |
3. Configure o ambiente:
|
| 60 |
+
|
| 61 |
+
```bash
|
| 62 |
+
cp .env.example .env
|
| 63 |
+
```
|
| 64 |
|
| 65 |
[Documentação completa de instalação](docs/setup/installation.md)
|
| 66 |
|
| 67 |
+
## Uso
|
| 68 |
|
| 69 |
1. Inicie a aplicação:
|
|
|
|
|
|
|
|
|
|
| 70 |
|
| 71 |
+
```bash
|
| 72 |
+
python app.py
|
| 73 |
+
```
|
| 74 |
+
|
| 75 |
+
2. Acesse: `http://localhost:7860`
|
| 76 |
|
| 77 |
3. Upload de vídeo:
|
|
|
|
|
|
|
|
|
|
| 78 |
|
| 79 |
+
- Arraste ou selecione um vídeo
|
| 80 |
+
- Ajuste as configurações
|
| 81 |
+
- Clique em "Detectar"
|
| 82 |
+
|
| 83 |
+
## Documentação
|
| 84 |
|
| 85 |
- [Arquitetura do Sistema](docs/architecture/overview.md)
|
| 86 |
- [Instalação e Configuração](docs/setup/installation.md)
|
| 87 |
- [API e Interface](docs/api/interface.md)
|
| 88 |
|
| 89 |
+
## Arquitetura
|
| 90 |
|
| 91 |
O projeto segue os princípios da Clean Architecture:
|
| 92 |
|
| 93 |
+
```plaintext
|
| 94 |
src/
|
| 95 |
├── domain/ # Regras de negócio
|
| 96 |
├── application/ # Casos de uso
|
|
|
|
| 100 |
|
| 101 |
[Detalhes da arquitetura](docs/architecture/overview.md)
|
| 102 |
|
| 103 |
+
## Deploy no Hugging Face
|
| 104 |
|
| 105 |
1. Configure as credenciais:
|
| 106 |
+
|
| 107 |
+
```bash
|
| 108 |
+
cp .env.example .env.huggingface
|
| 109 |
+
```
|
| 110 |
|
| 111 |
2. Execute o deploy:
|
|
|
|
|
|
|
|
|
|
| 112 |
|
| 113 |
+
```bash
|
| 114 |
+
./deploy.sh
|
| 115 |
+
```
|
| 116 |
|
| 117 |
+
## Máquinas Recomendadas
|
| 118 |
|
| 119 |
### GPU
|
| 120 |
+
|
| 121 |
- NVIDIA T4 16GB (Hugging Face Pro)
|
| 122 |
- NVIDIA A100 (Performance máxima)
|
| 123 |
- NVIDIA V100 (Alternativa)
|
| 124 |
|
| 125 |
### CPU
|
| 126 |
+
|
| 127 |
- 8+ cores
|
| 128 |
- 32GB+ RAM
|
| 129 |
- SSD para armazenamento
|
| 130 |
|
| 131 |
+
## Interface
|
| 132 |
|
| 133 |
### Componentes
|
| 134 |
+
|
| 135 |
- Upload de vídeo (MP4, AVI, MOV)
|
| 136 |
- Configurações de detecção
|
| 137 |
- Visualização de resultados
|
| 138 |
- Métricas em tempo real
|
| 139 |
|
| 140 |
+
## Links
|
|
|
|
|
|
|
| 141 |
|
| 142 |
+
- [Hugging Face Space][hf-space]
|
| 143 |
+
- [GitHub Repository][gh-repo]
|
| 144 |
- [Documentação](docs/)
|
| 145 |
- [Issues](https://github.com/seu-usuario/hackatoon-1iadt/issues)
|
| 146 |
|
| 147 |
+
## Licença
|
| 148 |
|
| 149 |
+
Este projeto está licenciado sob a MIT License - veja o arquivo [LICENSE](LICENSE)
|
| 150 |
+
para detalhes.
|
| 151 |
|
| 152 |
+
## Contribuição
|
| 153 |
|
| 154 |
1. Fork o projeto
|
| 155 |
2. Crie sua feature branch (`git checkout -b feature/AmazingFeature`)
|
|
|
|
| 157 |
4. Push para a branch (`git push origin feature/AmazingFeature`)
|
| 158 |
5. Abra um Pull Request
|
| 159 |
|
| 160 |
+
## Suporte
|
| 161 |
|
| 162 |
- Abra uma [issue](https://github.com/seu-usuario/hackatoon-1iadt/issues)
|
| 163 |
- Consulte a [documentação](docs/)
|
| 164 |
- Entre em contato com a equipe
|
|
|
|
|
|
|
|
|
docs/api/interface.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
# Interface e API
|
| 2 |
|
| 3 |
-
## Interface Web
|
| 4 |
|
| 5 |
### Componentes Principais
|
| 6 |
|
|
@@ -64,7 +64,7 @@ Content-Type: multipart/form-data
|
|
| 64 |
{
|
| 65 |
"label": "arma",
|
| 66 |
"confidence": 95.5,
|
| 67 |
-
"bbox": [
|
| 68 |
}
|
| 69 |
]
|
| 70 |
}
|
|
|
|
| 1 |
# Interface e API
|
| 2 |
|
| 3 |
+
## Interface Web
|
| 4 |
|
| 5 |
### Componentes Principais
|
| 6 |
|
|
|
|
| 64 |
{
|
| 65 |
"label": "arma",
|
| 66 |
"confidence": 95.5,
|
| 67 |
+
"bbox": [0, 0, 100, 100]
|
| 68 |
}
|
| 69 |
]
|
| 70 |
}
|
docs/architecture/overview.md
CHANGED
|
@@ -7,41 +7,49 @@ O sistema de detecção de riscos em vídeo é construído seguindo os princípi
|
|
| 7 |
## Camadas da Arquitetura
|
| 8 |
|
| 9 |
### 1. Domain (Núcleo)
|
|
|
|
| 10 |
- Contém as regras de negócio e entidades fundamentais
|
| 11 |
- Independente de frameworks e bibliotecas externas
|
| 12 |
- Localização: `src/domain/`
|
| 13 |
|
| 14 |
-
#### Componentes Principais
|
|
|
|
| 15 |
- `detectors/`: Implementações dos detectores (GPU/CPU)
|
| 16 |
- `entities/`: Objetos de domínio
|
| 17 |
- `factories/`: Fábricas para criação de objetos
|
| 18 |
- `interfaces/`: Contratos e interfaces
|
| 19 |
|
| 20 |
### 2. Application
|
|
|
|
| 21 |
- Implementa os casos de uso da aplicação
|
| 22 |
- Orquestra o fluxo de dados entre as camadas
|
| 23 |
- Localização: `src/application/`
|
| 24 |
|
| 25 |
-
#### Casos de Uso
|
|
|
|
| 26 |
- `process_video`: Processamento e análise de vídeos
|
| 27 |
- Notificações de detecções
|
| 28 |
- Gerenciamento de cache
|
| 29 |
|
| 30 |
### 3. Infrastructure
|
|
|
|
| 31 |
- Implementações concretas de interfaces
|
| 32 |
- Integrações com serviços externos
|
| 33 |
- Localização: `src/infrastructure/`
|
| 34 |
|
| 35 |
-
#### Serviços
|
|
|
|
| 36 |
- `WeaponDetectorService`: Serviço principal de detecção
|
| 37 |
- `NotificationService`: Serviço de notificações
|
| 38 |
- Gerenciamento de GPU/CPU
|
| 39 |
|
| 40 |
### 4. Presentation
|
|
|
|
| 41 |
- Interface com usuário via Gradio
|
| 42 |
- Localização: `src/presentation/`
|
| 43 |
|
| 44 |
-
#### Componentes
|
|
|
|
| 45 |
- Interface web responsiva
|
| 46 |
- Configurações de processamento
|
| 47 |
- Visualização de resultados
|
|
@@ -57,11 +65,13 @@ O sistema de detecção de riscos em vídeo é construído seguindo os princípi
|
|
| 57 |
## Otimizações
|
| 58 |
|
| 59 |
### GPU
|
|
|
|
| 60 |
- Detecção automática de hardware
|
| 61 |
- Configurações específicas para T4 e Zero-GPU
|
| 62 |
- Gerenciamento de memória otimizado
|
| 63 |
|
| 64 |
### CPU
|
|
|
|
| 65 |
- Fallback automático
|
| 66 |
- Otimizações para processamento em CPU
|
| 67 |
- Cache de resultados
|
|
@@ -81,14 +91,17 @@ graph TD
|
|
| 81 |
|
| 82 |
## Considerações de Design
|
| 83 |
|
| 84 |
-
1.
|
| 85 |
-
|
| 86 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
|
| 88 |
-
|
| 89 |
-
- Cada componente com responsabilidade única
|
| 90 |
-
- Separação clara de concerns
|
| 91 |
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
- Fácil adição de novos serviços
|
|
|
|
| 7 |
## Camadas da Arquitetura
|
| 8 |
|
| 9 |
### 1. Domain (Núcleo)
|
| 10 |
+
|
| 11 |
- Contém as regras de negócio e entidades fundamentais
|
| 12 |
- Independente de frameworks e bibliotecas externas
|
| 13 |
- Localização: `src/domain/`
|
| 14 |
|
| 15 |
+
#### Componentes Principais
|
| 16 |
+
|
| 17 |
- `detectors/`: Implementações dos detectores (GPU/CPU)
|
| 18 |
- `entities/`: Objetos de domínio
|
| 19 |
- `factories/`: Fábricas para criação de objetos
|
| 20 |
- `interfaces/`: Contratos e interfaces
|
| 21 |
|
| 22 |
### 2. Application
|
| 23 |
+
|
| 24 |
- Implementa os casos de uso da aplicação
|
| 25 |
- Orquestra o fluxo de dados entre as camadas
|
| 26 |
- Localização: `src/application/`
|
| 27 |
|
| 28 |
+
#### Casos de Uso
|
| 29 |
+
|
| 30 |
- `process_video`: Processamento e análise de vídeos
|
| 31 |
- Notificações de detecções
|
| 32 |
- Gerenciamento de cache
|
| 33 |
|
| 34 |
### 3. Infrastructure
|
| 35 |
+
|
| 36 |
- Implementações concretas de interfaces
|
| 37 |
- Integrações com serviços externos
|
| 38 |
- Localização: `src/infrastructure/`
|
| 39 |
|
| 40 |
+
#### Serviços
|
| 41 |
+
|
| 42 |
- `WeaponDetectorService`: Serviço principal de detecção
|
| 43 |
- `NotificationService`: Serviço de notificações
|
| 44 |
- Gerenciamento de GPU/CPU
|
| 45 |
|
| 46 |
### 4. Presentation
|
| 47 |
+
|
| 48 |
- Interface com usuário via Gradio
|
| 49 |
- Localização: `src/presentation/`
|
| 50 |
|
| 51 |
+
#### Componentes
|
| 52 |
+
|
| 53 |
- Interface web responsiva
|
| 54 |
- Configurações de processamento
|
| 55 |
- Visualização de resultados
|
|
|
|
| 65 |
## Otimizações
|
| 66 |
|
| 67 |
### GPU
|
| 68 |
+
|
| 69 |
- Detecção automática de hardware
|
| 70 |
- Configurações específicas para T4 e Zero-GPU
|
| 71 |
- Gerenciamento de memória otimizado
|
| 72 |
|
| 73 |
### CPU
|
| 74 |
+
|
| 75 |
- Fallback automático
|
| 76 |
- Otimizações para processamento em CPU
|
| 77 |
- Cache de resultados
|
|
|
|
| 91 |
|
| 92 |
## Considerações de Design
|
| 93 |
|
| 94 |
+
### 1. Inversão de Dependência
|
| 95 |
+
|
| 96 |
+
- Interfaces abstratas no domínio
|
| 97 |
+
- Implementações concretas na infraestrutura
|
| 98 |
+
|
| 99 |
+
### 2. Single Responsibility
|
| 100 |
+
|
| 101 |
+
- Cada componente com responsabilidade única
|
| 102 |
+
- Separação clara de concerns
|
| 103 |
|
| 104 |
+
### 3. Open/Closed
|
|
|
|
|
|
|
| 105 |
|
| 106 |
+
- Extensível para novos detectores
|
| 107 |
+
- Fácil adição de novos serviços
|
|
|
docs/development/development.md
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Guia de Desenvolvimento
|
| 2 |
+
|
| 3 |
+
## Ambiente de Desenvolvimento
|
| 4 |
+
|
| 5 |
+
### Configuração do Ambiente
|
| 6 |
+
|
| 7 |
+
1. **Preparação do Sistema**
|
| 8 |
+
|
| 9 |
+
- Instale Python 3.10+
|
| 10 |
+
- Configure CUDA 11.8+ (para GPU)
|
| 11 |
+
- Instale Git
|
| 12 |
+
|
| 13 |
+
2. **Configuração do Projeto**
|
| 14 |
+
|
| 15 |
+
```bash
|
| 16 |
+
# Clone o repositório
|
| 17 |
+
git clone https://github.com/seu-usuario/hackatoon-1iadt.git
|
| 18 |
+
cd hackatoon-1iadt
|
| 19 |
+
|
| 20 |
+
# Crie e ative o ambiente virtual
|
| 21 |
+
python -m venv venv
|
| 22 |
+
source venv/bin/activate # Linux/Mac
|
| 23 |
+
.\venv\Scripts\activate # Windows
|
| 24 |
+
|
| 25 |
+
# Instale as dependências
|
| 26 |
+
pip install -r requirements.txt
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
### Ferramentas Recomendadas
|
| 30 |
+
|
| 31 |
+
- **IDE**: VSCode com extensões:
|
| 32 |
+
- Python
|
| 33 |
+
- Pylance
|
| 34 |
+
- GitLens
|
| 35 |
+
- Python Test Explorer
|
| 36 |
+
|
| 37 |
+
- **Linters e Formatadores**:
|
| 38 |
+
- Ruff
|
| 39 |
+
- Black
|
| 40 |
+
- isort
|
| 41 |
+
- mypy
|
| 42 |
+
|
| 43 |
+
## Padrões de Código
|
| 44 |
+
|
| 45 |
+
### Estilo de Código
|
| 46 |
+
|
| 47 |
+
1. **PEP 8**
|
| 48 |
+
|
| 49 |
+
- Máximo 88 caracteres por linha
|
| 50 |
+
- 4 espaços para indentação
|
| 51 |
+
- Sem tabs, apenas espaços
|
| 52 |
+
|
| 53 |
+
2. **Docstrings**
|
| 54 |
+
|
| 55 |
+
```python
|
| 56 |
+
def process_video(video_path: str, fps: int = 2) -> dict:
|
| 57 |
+
"""Processa um vídeo para detecção de objetos.
|
| 58 |
+
|
| 59 |
+
Args:
|
| 60 |
+
video_path: Caminho do arquivo de vídeo
|
| 61 |
+
fps: Frames por segundo para processamento
|
| 62 |
+
|
| 63 |
+
Returns:
|
| 64 |
+
Dicionário com resultados da detecção
|
| 65 |
+
|
| 66 |
+
Raises:
|
| 67 |
+
FileNotFoundError: Se o vídeo não for encontrado
|
| 68 |
+
"""
|
| 69 |
+
pass
|
| 70 |
+
```
|
| 71 |
+
|
| 72 |
+
3. **Type Hints**
|
| 73 |
+
|
| 74 |
+
```python
|
| 75 |
+
from typing import List, Dict, Optional
|
| 76 |
+
|
| 77 |
+
def detect_objects(
|
| 78 |
+
frame: np.ndarray,
|
| 79 |
+
confidence: float = 0.5
|
| 80 |
+
) -> List[Dict[str, Any]]:
|
| 81 |
+
pass
|
| 82 |
+
```
|
| 83 |
+
|
| 84 |
+
## Testes
|
| 85 |
+
|
| 86 |
+
### Estrutura de Testes
|
| 87 |
+
|
| 88 |
+
```plaintext
|
| 89 |
+
tests/
|
| 90 |
+
├── unit/
|
| 91 |
+
│ ├── test_detector.py
|
| 92 |
+
│ └── test_video_processor.py
|
| 93 |
+
├── integration/
|
| 94 |
+
│ └── test_api.py
|
| 95 |
+
└── conftest.py
|
| 96 |
+
```
|
| 97 |
+
|
| 98 |
+
### Exemplos de Testes
|
| 99 |
+
|
| 100 |
+
```python
|
| 101 |
+
def test_detector_initialization():
|
| 102 |
+
"""Testa a inicialização do detector."""
|
| 103 |
+
detector = WeaponDetector()
|
| 104 |
+
assert detector.is_initialized()
|
| 105 |
+
assert detector.device == "cuda" if torch.cuda.is_available() else "cpu"
|
| 106 |
+
|
| 107 |
+
@pytest.mark.parametrize("threshold", [0.3, 0.5, 0.7])
|
| 108 |
+
def test_detection_threshold(threshold):
|
| 109 |
+
"""Testa diferentes limiares de detecção."""
|
| 110 |
+
detector = WeaponDetector()
|
| 111 |
+
result = detector.detect(sample_image, threshold=threshold)
|
| 112 |
+
assert all(d["confidence"] >= threshold for d in result)
|
| 113 |
+
```
|
| 114 |
+
|
| 115 |
+
## Fluxo de Trabalho
|
| 116 |
+
|
| 117 |
+
### Git Flow
|
| 118 |
+
|
| 119 |
+
1. **Branches Principais**
|
| 120 |
+
|
| 121 |
+
- `main`: Produção
|
| 122 |
+
- `develop`: Desenvolvimento
|
| 123 |
+
- `feature/*`: Novas funcionalidades
|
| 124 |
+
- `fix/*`: Correções
|
| 125 |
+
- `release/*`: Preparação de release
|
| 126 |
+
|
| 127 |
+
2. **Commits**
|
| 128 |
+
|
| 129 |
+
```plaintext
|
| 130 |
+
feat: Adiciona detecção em tempo real
|
| 131 |
+
^--^ ^------------------------^
|
| 132 |
+
| |
|
| 133 |
+
| +-> Descrição no presente
|
| 134 |
+
|
|
| 135 |
+
+-------> Tipo: feat, fix, docs, style, refactor
|
| 136 |
+
```
|
| 137 |
+
|
| 138 |
+
### CI/CD
|
| 139 |
+
|
| 140 |
+
1. **GitHub Actions**
|
| 141 |
+
|
| 142 |
+
```yaml
|
| 143 |
+
name: CI
|
| 144 |
+
on: [push, pull_request]
|
| 145 |
+
jobs:
|
| 146 |
+
test:
|
| 147 |
+
runs-on: ubuntu-latest
|
| 148 |
+
steps:
|
| 149 |
+
- uses: actions/checkout@v2
|
| 150 |
+
- name: Test
|
| 151 |
+
run: pytest
|
| 152 |
+
```
|
| 153 |
+
|
| 154 |
+
2. **Deploy**
|
| 155 |
+
|
| 156 |
+
```bash
|
| 157 |
+
# Deploy para staging
|
| 158 |
+
./deploy.sh staging
|
| 159 |
+
|
| 160 |
+
# Deploy para produção
|
| 161 |
+
./deploy.sh production
|
| 162 |
+
```
|
| 163 |
+
|
| 164 |
+
## Debugging
|
| 165 |
+
|
| 166 |
+
### Logs
|
| 167 |
+
|
| 168 |
+
```python
|
| 169 |
+
import logging
|
| 170 |
+
|
| 171 |
+
logger = logging.getLogger(__name__)
|
| 172 |
+
logger.info("Processando frame %d", frame_number)
|
| 173 |
+
```
|
| 174 |
+
|
| 175 |
+
### Profiling
|
| 176 |
+
|
| 177 |
+
```python
|
| 178 |
+
import cProfile
|
| 179 |
+
|
| 180 |
+
def profile_detection():
|
| 181 |
+
profiler = cProfile.Profile()
|
| 182 |
+
profiler.enable()
|
| 183 |
+
# código
|
| 184 |
+
profiler.disable()
|
| 185 |
+
profiler.print_stats()
|
| 186 |
+
```
|
| 187 |
+
|
| 188 |
+
## Otimizações
|
| 189 |
+
|
| 190 |
+
### GPU
|
| 191 |
+
|
| 192 |
+
- Batch processing
|
| 193 |
+
- Memória pinned
|
| 194 |
+
- Async data loading
|
| 195 |
+
- Cache de modelos
|
| 196 |
+
|
| 197 |
+
### CPU
|
| 198 |
+
|
| 199 |
+
- Multiprocessing
|
| 200 |
+
- NumPy vectorization
|
| 201 |
+
- Cache de resultados
|
| 202 |
+
- Otimização de memória
|
docs/faq.md
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# FAQ
|
| 2 |
+
|
| 3 |
+
## Geral
|
| 4 |
+
|
| 5 |
+
### Como o sistema funciona?
|
| 6 |
+
|
| 7 |
+
O sistema utiliza um modelo de IA (OWL-ViT) para detectar objetos de risco em vídeos.
|
| 8 |
+
O processamento pode ser feito em GPU ou CPU, com otimizações específicas para cada caso.
|
| 9 |
+
|
| 10 |
+
### Quais objetos são detectados?
|
| 11 |
+
|
| 12 |
+
#### Armas de Fogo
|
| 13 |
+
|
| 14 |
+
- Pistolas
|
| 15 |
+
- Rifles
|
| 16 |
+
- Espingardas
|
| 17 |
+
|
| 18 |
+
#### Armas Brancas
|
| 19 |
+
|
| 20 |
+
- Facas
|
| 21 |
+
- Canivetes
|
| 22 |
+
- Objetos pontiagudos
|
| 23 |
+
|
| 24 |
+
#### Outros Objetos
|
| 25 |
+
|
| 26 |
+
- Bastões
|
| 27 |
+
- Objetos contundentes
|
| 28 |
+
- Materiais explosivos
|
| 29 |
+
|
| 30 |
+
## Técnico
|
| 31 |
+
|
| 32 |
+
### Requisitos de Hardware
|
| 33 |
+
|
| 34 |
+
#### GPU
|
| 35 |
+
|
| 36 |
+
- NVIDIA T4 16GB (recomendado)
|
| 37 |
+
- CUDA 11.8+
|
| 38 |
+
- 16GB RAM
|
| 39 |
+
|
| 40 |
+
#### CPU
|
| 41 |
+
|
| 42 |
+
- 8+ cores
|
| 43 |
+
- 32GB RAM
|
| 44 |
+
- SSD para cache
|
| 45 |
+
|
| 46 |
+
### Problemas Comuns
|
| 47 |
+
|
| 48 |
+
#### Erro CUDA
|
| 49 |
+
|
| 50 |
+
**Problema**: `CUDA not available`
|
| 51 |
+
|
| 52 |
+
**Solução**:
|
| 53 |
+
|
| 54 |
+
```bash
|
| 55 |
+
nvidia-smi
|
| 56 |
+
pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/cu118
|
| 57 |
+
```
|
| 58 |
+
|
| 59 |
+
#### Memória Insuficiente
|
| 60 |
+
|
| 61 |
+
**Problema**: `CUDA out of memory`
|
| 62 |
+
|
| 63 |
+
**Solução**:
|
| 64 |
+
|
| 65 |
+
- Reduza o tamanho do batch
|
| 66 |
+
- Diminua a resolução
|
| 67 |
+
- Ajuste `GPU_MEMORY_FRACTION` no `.env`
|
| 68 |
+
|
| 69 |
+
## Performance
|
| 70 |
+
|
| 71 |
+
### Como melhorar a performance?
|
| 72 |
+
|
| 73 |
+
#### GPU
|
| 74 |
+
|
| 75 |
+
- Use batch processing
|
| 76 |
+
- Ative half precision
|
| 77 |
+
- Otimize o cache de modelos
|
| 78 |
+
|
| 79 |
+
#### CPU
|
| 80 |
+
|
| 81 |
+
- Ative multiprocessing
|
| 82 |
+
- Use vetorização NumPy
|
| 83 |
+
- Implemente cache de resultados
|
| 84 |
+
|
| 85 |
+
### Configurações Recomendadas
|
| 86 |
+
|
| 87 |
+
```plaintext
|
| 88 |
+
# GPU T4
|
| 89 |
+
GPU_MEMORY_FRACTION=0.9
|
| 90 |
+
BATCH_SIZE=16
|
| 91 |
+
USE_HALF_PRECISION=true
|
| 92 |
+
|
| 93 |
+
# CPU
|
| 94 |
+
MAX_WORKERS=8
|
| 95 |
+
CACHE_SIZE=1000
|
| 96 |
+
USE_MULTIPROCESSING=true
|
| 97 |
+
```
|
| 98 |
+
|
| 99 |
+
## Deployment
|
| 100 |
+
|
| 101 |
+
### Como fazer deploy no Hugging Face?
|
| 102 |
+
|
| 103 |
+
1. Configure as credenciais:
|
| 104 |
+
|
| 105 |
+
```bash
|
| 106 |
+
cp .env.example .env.huggingface
|
| 107 |
+
```
|
| 108 |
+
|
| 109 |
+
2. Edite as variáveis:
|
| 110 |
+
|
| 111 |
+
```plaintext
|
| 112 |
+
HF_SPACE_ID=seu-espaco
|
| 113 |
+
HF_TOKEN=seu_token
|
| 114 |
+
```
|
| 115 |
+
|
| 116 |
+
3. Execute o deploy:
|
| 117 |
+
|
| 118 |
+
```bash
|
| 119 |
+
./deploy.sh
|
| 120 |
+
```
|
| 121 |
+
|
| 122 |
+
### Monitoramento
|
| 123 |
+
|
| 124 |
+
- Use os logs em `logs/app.log`
|
| 125 |
+
- Monitore GPU com `nvidia-smi`
|
| 126 |
+
- Verifique métricas no Hugging Face
|
| 127 |
+
|
| 128 |
+
## Segurança
|
| 129 |
+
|
| 130 |
+
### Como proteger as credenciais?
|
| 131 |
+
|
| 132 |
+
1. Use variáveis de ambiente:
|
| 133 |
+
|
| 134 |
+
```bash
|
| 135 |
+
cp .env.example .env
|
| 136 |
+
```
|
| 137 |
+
|
| 138 |
+
2. Nunca comite arquivos `.env`
|
| 139 |
+
3. Use secrets no Hugging Face
|
| 140 |
+
|
| 141 |
+
### Validação de Entrada
|
| 142 |
+
|
| 143 |
+
- Limite o tamanho dos vídeos
|
| 144 |
+
- Verifique formatos permitidos
|
| 145 |
+
- Sanitize inputs
|
src/domain/detectors/base.py
CHANGED
|
@@ -7,6 +7,7 @@ import os
|
|
| 7 |
import cv2
|
| 8 |
from PIL import Image
|
| 9 |
import time
|
|
|
|
| 10 |
|
| 11 |
logger = logging.getLogger(__name__)
|
| 12 |
|
|
|
|
| 7 |
import cv2
|
| 8 |
from PIL import Image
|
| 9 |
import time
|
| 10 |
+
import sys
|
| 11 |
|
| 12 |
logger = logging.getLogger(__name__)
|
| 13 |
|
src/presentation/web/gradio_interface.py
CHANGED
|
@@ -223,33 +223,17 @@ class GradioInterface:
|
|
| 223 |
""")
|
| 224 |
# Vídeos de exemplo
|
| 225 |
if sample_videos:
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
| 231 |
-
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
| 235 |
-
|
| 236 |
-
|
| 237 |
-
gr.PlayableVideo(
|
| 238 |
-
value=video['path'],
|
| 239 |
-
format="mp4",
|
| 240 |
-
height=150,
|
| 241 |
-
interactive=True,
|
| 242 |
-
show_label=True)
|
| 243 |
-
|
| 244 |
-
with gr.Column(scale=1, min_width=100):
|
| 245 |
-
gr.Button(
|
| 246 |
-
"📥 Carregar",
|
| 247 |
-
size="md"
|
| 248 |
-
).click(
|
| 249 |
-
fn=self.load_sample_video,
|
| 250 |
-
inputs=[gr.State(video['path'])],
|
| 251 |
-
outputs=[input_video]
|
| 252 |
-
)
|
| 253 |
|
| 254 |
# Configurar callback do botão
|
| 255 |
submit_btn.click(
|
|
|
|
| 223 |
""")
|
| 224 |
# Vídeos de exemplo
|
| 225 |
if sample_videos:
|
| 226 |
+
gr.Markdown("### Vídeos de Exemplo")
|
| 227 |
+
examples = [
|
| 228 |
+
[video['path']] for video in sample_videos
|
| 229 |
+
]
|
| 230 |
+
gr.Examples(
|
| 231 |
+
examples=examples,
|
| 232 |
+
inputs=input_video,
|
| 233 |
+
outputs=input_video,
|
| 234 |
+
fn=self.load_sample_video,
|
| 235 |
+
label="Clique em um vídeo para carregá-lo"
|
| 236 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 237 |
|
| 238 |
# Configurar callback do botão
|
| 239 |
submit_btn.click(
|