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(
|