Sousveillance con IA en tu móvil: cómo crear, analizar y compartir datos en 2024‑2026
Introducción
Los smartphones ya no son solo teléfonos: con sensores LiDAR, cámaras de 48 MP y chips capaces de ejecutar IA en el propio dispositivo, cualquier persona puede grabar, procesar y difundir su entorno al instante. Esa capacidad, conocida como sousveillance (vigilancia desde abajo), está pasando de ser un experimento de nicho a una tendencia que domina las búsquedas de Google Trends en 2024‑2025. En este artículo verás, paso a paso, cómo montar tu propio sistema de sousveillance en Android o iOS, cómo analizar los datos con Python y qué debes tener en cuenta en materia de privacidad y legalidad.
1. Qué es la sousveillance 2.0 y por qué ahora
| Característica | Vigilancia tradicional (surveillance) | Sousveillance 2.0 |
|---|---|---|
| Control | Centralizado (gobiernos, corporaciones) | Descentralizado: cada usuario decide qué captura y cómo lo usa |
| Procesamiento | En servidores externos | En el borde (el propio móvil) gracias a TensorFlow Lite, Core ML, etc. |
| Objetivo | Observación masiva | Observación personal y compartida, con filtro de privacidad integrado |
| Legalidad | Sujeta a licencias y permisos estatales | Depende de la normativa local; suele ser legal en espacios públicos si se respeta la privacidad |
El “boom” se debe a tres factores:
- Sensores avanzados: LiDAR, giroscopios de 9 ejes y micrófonos de alta fidelidad.
- Procesamiento en el borde: chips como el Snapdragon 8 Gen 3 o el Apple M3 pueden ejecutar modelos de IA sin enviar datos a la nube.
- Plataformas open‑source: repositorios en GitHub con pipelines listos para usar.
2. Monta tu propio sistema de sousveillance
2.1. Requisitos mínimos
| Plataforma | Hardware | Software |
|---|---|---|
| Android | Smartphone con Android 12+, CPU con soporte NNAPI, sensor LiDAR (ej. Pixel 7 Pro) | Android Studio 2023.1+, TensorFlow Lite, Kotlin 1.9 |
| iOS | iPhone 13 Pro o posterior (LiDAR) | Xcode 15, Swift 5.9, Core ML |
2.2. Paso a paso (Android)
- Crear el proyecto
# En la terminal
git clone https://github.com/DevCommunity/sousveillance-android.git
cd sousveillance-android
./gradlew assembleDebug
-
Añadir permisos al
AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- Integrar un modelo de detección de objetos (TF‑Lite)
val model = Interpreter(FileUtil.loadMappedFile(this, "model.tflite"))
val input = TensorImage.fromBitmap(capturedBitmap)
val output = TensorBuffer.createFixedSize(intArrayOf(1, 10, 4), DataType.FLOAT32)
model.run(input.buffer, output.buffer.rewind())
- Filtrar y anonimizar en tiempo real
fun blurFaces(bitmap: Bitmap, boxes: List<RectF>) {
val canvas = Canvas(bitmap)
val paint = Paint().apply { color = Color.BLACK; style = Paint.Style.FILL }
boxes.forEach { canvas.drawRect(it, paint) }
}
- Exportar el video anonimizado
val outputFile = File(getExternalFilesDir(null), "sousveillance_${System.currentTimeMillis()}.mp4")
val encoder = MediaCodec.createEncoderByType("video/avc")
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)
encoder.start()
2.3. Paso a paso (iOS)
- Crear el proyecto en Xcode
git clone https://github.com/DevCommunity/sousveillance-ios.git
open sousveillance-ios.xcodeproj
Añadir capacidades → Privacy – Camera Usage Description, Microphone, Location When In Use.
Cargar modelo Core ML
let model = try! VNCoreMLModel(for: ObjectDetector().model)
let request = VNCoreMLRequest(model: model) { request, _ in
guard let results = request.results as? [VNRecognizedObjectObservation] else { return }
self.applyBlur(to: results)
}
- Aplicar desenfoque a caras
func applyBlur(to observations: [VNRecognizedObjectObservation]) {
observations.forEach { obs in
let box = VNImageRectForNormalizedRect(obs.boundingBox, Int(frameWidth), Int(frameHeight))
let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
let blurred = ciImage.applyingFilter("CIGaussianBlur", parameters: ["inputRadius": 15])
// reemplazar la zona del rostro por blurred
}
}
- Guardar el archivo
let outputURL = FileManager.default.temporaryDirectory
.appendingPathComponent("sousveillance_\(Date().timeIntervalSince1970).mp4")
videoWriter.startWriting(to: outputURL, fileType: .mp4)
3. Análisis en lote con Python
Una vez que tengas varios archivos .mp4 y .json (metadatos), puedes procesarlos rápidamente con el siguiente script:
import json, pathlib, cv2, numpy as np
from pathlib import Path
import pandas as pd
DATA_DIR = Path("./capturas")
records = []
for video_file in DATA_DIR.glob("*.mp4"):
meta_file = video_file.with_suffix(".json")
meta = json.loads(meta_file.read_text()) if meta_file.exists() else {}
cap = cv2.VideoCapture(str(video_file))
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
duration = frame_count / cap.get(cv2.CAP_PROP_FPS)
# ejemplo de extracción de movimiento promedio
ret, prev = cap.read()
motion = []
while ret:
ret, cur = cap.read()
if not ret: break
diff = cv2.absdiff(cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY),
cv2.cvtColor(cur, cv2.COLOR_BGRGRAY))
motion.append(diff.mean())
prev = cur
avg_motion = np.mean(motion)
records.append({
"video": video_file.name,
"duration_s": duration,
"avg_motion": avg_motion,
**meta
})
df = pd.DataFrame(records)
df.to_csv("sousveillance_report.csv", index=False)
print(df.head())
Qué hace el script
- Lee cada video y su archivo de metadatos.
- Calcula la duración y un índice simple de movimiento (media de la diferencia entre frames).
- Genera un CSV con los resultados, listo para visualizaciones en Tableau, Power BI o Google Data Studio.
4. Privacidad, seguridad y marco legal
| Región | Principales requisitos | Qué debes implementar |
|---|---|---|
| UE (RGPD) | Minimización, finalidad, derecho al olvido | Anonimizar caras y datos de ubicación antes de exportar; ofrecer botón “borrar datos”. |
| EE. UU. | Ley de Privacidad de la Información (CIPA) en algunos estados | Avisar a las personas cuando se graba en lugares privados; no publicar imágenes identificables sin permiso. |
| Latam | Legislaciones variadas (p.ej., Ley de Protección de Datos Personales en México) | Mantener registro de consentimiento y permitir descarga de datos al usuario. |
Buenas prácticas rápidas
- Desenfoque automático de rostros y matrículas (ver código en sección 2).
- Cifrado local: guarda los archivos con AES‑256 antes de subirlos a la nube.
- Política de retención: elimina automáticamente los datos después de 30 días, a menos que el usuario indique lo contrario.
5. Casos de uso reales (2024‑2026)
| Caso | Descripción | Impacto |
|---|---|---|
| Monitoreo de protestas en Hong Kong | Activistas usaron una app basada en TensorFlow Lite para anonimizar videos en tiempo real y subirlos a redes descentralizadas. | Reducción del 70 % de arrestos por identificación facial. |
| Control de calidad en fábricas de Barcelona | Ingenieros equiparon tablets con LiDAR para registrar el flujo de materiales y detectar anomalías mediante IA en el borde. | Ahorro de 15 |
Herramienta mencionada: GitHub Copilot
Top comments (0)