Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Rodriguez Salinas Daniel Steven 2020
Rodriguez Salinas Daniel Steven 2020
Tesis o trabajo de grado presentado como requisito parcial para optar al tı́tulo de:
Ingeniero electrónico
Director(a):
MsC. Pablo Emilio Rozo Garcia
Lı́nea de Investigación:
Sistemas embebidos, Inteligencia computacional Universidad Distrital Francisco José de Caldas
Facultad de ingenierı́a
Bogotá, Colombia
2020
Contenido
1. Planteamiento del problema 1
2. Justificación 2
3. Objetivos 3
3.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3.2. Especı́ficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
4. Marco Teórico 4
4.1. Marco Conceptual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4.1.1. Sistemas de identificación para control de acceso . . . . . . . . . . . . 4
4.1.2. Reconocimiento facial . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4.1.3. Aprendizaje automatizado . . . . . . . . . . . . . . . . . . . . . . . . 7
4.1.4. Algoritmos de clasificación . . . . . . . . . . . . . . . . . . . . . . . . 8
4.1.5. API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.1.6. Contenedores de aplicaciones . . . . . . . . . . . . . . . . . . . . . . . 10
4.1.7. Sistemas de control de versiones . . . . . . . . . . . . . . . . . . . . . 11
4.2. Elementos utilizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.2.1. Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.2.2. Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2.3. Modulo NFC NXP NP532 V3 . . . . . . . . . . . . . . . . . . . . . . 14
4.2.4. Modulo Raspberry Pi Camera . . . . . . . . . . . . . . . . . . . . . . 15
4.2.5. MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
6. Metodologı́a 21
6.1. Fase 1: Adquisición de la base de datos de imágenes . . . . . . . . . . . . . . 21
6.2. Fase 2: Algoritmo de identificación . . . . . . . . . . . . . . . . . . . . . . . 21
6.3. Fase 3: Algoritmo de extracción de caracterı́sticas . . . . . . . . . . . . . . . 21
6.4. Fase 4: Algoritmo de clasificación . . . . . . . . . . . . . . . . . . . . . . . . 21
6.5. Fase 5: Acondicionamiento del servidor remoto para el clasificador . . . . . . 22
6.6. Fase 6: Implementación de dispositivo IoT . . . . . . . . . . . . . . . . . . . 22
6.7. Fase 7: Pruebas y validación . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
7. Desarrollo 23
7.1. Adquisición de la base de datos de imágenes . . . . . . . . . . . . . . . . . . 23
7.1.1. 5 celebrity faces dataset . . . . . . . . . . . . . . . . . . . . . . . . . 23
7.1.2. The Labeled Faces in the Wild face recognition dataset . . . . . . . . 24
7.2. Algoritmo de identificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
7.3. Algoritmo de extracción de caracterı́sticas . . . . . . . . . . . . . . . . . . . 27
7.4. Algoritmo de clasificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
7.5. Acondicionamiento del servidor remoto para el clasificador . . . . . . . . . . 30
7.6. Implementación de dispositivo IoT . . . . . . . . . . . . . . . . . . . . . . . 34
7.6.1. Configuración de la Raspberry . . . . . . . . . . . . . . . . . . . . . . 37
7.6.2. Lector NFC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.6.3. Configuración de la cámara . . . . . . . . . . . . . . . . . . . . . . . 41
7.6.4. Envı́o de datos al servidor remoto . . . . . . . . . . . . . . . . . . . . 42
7.7. Pruebas y validación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
7.7.1. Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
8. Conclusiones 49
Bibliografı́a 56
Lista de Figuras
3.1. General
Diseñar e implementar un prototipo de un sistema de identificación de personas de múltiple
factor basado en reconocimiento facial para ser implementado como sistema de acceso en la
Universidad Distrital Francisco José de Caldas
3.2. Especı́ficos
Diseñar un prototipo de algoritmo para la identificación y extracción de rostros en
imágenes
Fase de registro, se captura la imagen del rostro de la persona a identificar usando una
cámara fotográfica o una cámara de video.
6 4 Marco Teórico
MTCNN
Facenet
En este artı́culo [16] se presenta un sistema unificado para la verificación de rostros, reco-
nocimiento y agrupamiento. Este método se basa en aprender una incrustación euclidiana
por imagen utilizando una red convolucional profunda. La red está entrenada de tal manera
que las distancias cuadradas de L2 en el espacio de inserción corresponden directamente a la
similitud de caras: las caras de la misma persona tienen distancias pequeñas y las caras de
personas distintas tienen distancias grandes. Una vez que se ha producido esta incrustación,
las tareas antes mencionadas se vuelven sencillas: la verificación de la cara simplemente im-
plica limitar la distancia entre las dos incrustaciones; el reconocimiento se convierte en un
problema de clasificación k-NN; y la agrupación se puede lograr utilizando técnicas fuera
de la plataforma tales como k-means o agrupación aglomerativa. Facenet fue introducida en
2015 por un equipo de Google como evolución del modelo Inception y fue entrenada usando
un esquema de tripletas (imagen base, imagen de la misma identidad, imagen de distinta
identidad) y una función de pérdida que favorecı́a distancias pequeñas entre los descriptores
generados para imágenes de la misma identidad y distancias grandes entre los descriptores
de imágenes de distinta identidad[3].
Tipos de aprendizaje
Aprendizaje supervisado
El aprendizaje supervisado es un tipo de algoritmo de aprendizaje automatizado que
emplea un conjunto de datos conocidos (el denominado conjunto de datos de entre-
namiento) para realizar predicciones. El conjunto de datos de entrenamiento incluye
datos de entrada y valores de respuesta. A partir de él, el algoritmo de aprendizaje su-
pervisado busca crear un modelo que pueda realizar predicciones acerca de los valores
8 4 Marco Teórico
Aprendizaje no supervisado
El aprendizaje no supervisado es un método de Aprendizaje Automático donde un
modelo es ajustado a las observaciones. Se distingue del Aprendizaje supervisado por
el hecho de que no hay un conocimiento a priori. En el aprendizaje no supervisado, un
conjunto de datos de objetos de entrada es tratado. Ası́, el aprendizaje no supervisado
tı́picamente trata los objetos de entrada como un conjunto de variables aleatorias,
siendo construido un modelo de densidad para el conjunto de datos.
Las redes neuronales artificiales (RNA), sus diversas variantes o trabajando en forma hibrida
con otros modelos han demostrado ser apropiadas para analizar diversos problemas relacio-
nados con el reconocimiento de patrones y el análisis de datos cuya formulación mediante
técnicas clásicas resulta difı́cil o inapropiada, más aún cuando se dispone de gran cantidad
de información y problemas de alta no linealidad en los modelos.[6]
Algoritmos Genéticos
cromosomas), son generadas aplicando los operadores genéticos repetidamente, siendo estos
los operadores de selección, cruzamiento, mutación y reemplazo.
SVM
Una máquina de vectores de soporte (SVM) es un algoritmo de aprendizaje supervisado que
se puede emplear para clasificación binaria o regresión. Las máquinas de vectores de soporte
son muy populares en aplicaciones como el procesamiento del lenguaje natural, el habla, el
reconocimiento de imágenes y la visión artificial.
Una máquina de vectores de soporte construye un hiperplano óptimo en forma de superficie
de decisión, de modo que el margen de separación entre las dos clases en los datos se amplı́a
al máximo. Los vectores de soporte hacen referencia a un pequeño subconjunto de las ob-
servaciones de entrenamiento que se utilizan como soporte para la ubicación óptima de la
superficie de decisión.
Las máquinas de vectores de soporte pertenecen a una clase de algoritmos de Machine
Learning denominados métodos kernel y también se conocen como máquinas kernel.
El entrenamiento de una máquina de vectores de soporte consta de dos fases:
Transformar los predictores (datos de entrada) en un espacio de caracterı́sticas altamente
dimensional. En esta fase es suficiente con especificar el kernel; los datos nunca se transfor-
man explı́citamente al espacio de caracterı́sticas. Este proceso se conoce comúnmente como
el truco kernel. Resolver un problema de optimización cuadrática que se ajuste a un hiper-
plano óptimo para clasificar las caracterı́sticas transformadas en dos clases. El número de
caracterı́sticas transformadas está determinado por el número de vectores de soporte. Para
construir la superficie de decisión solo se requieren los vectores de soporte seleccionados de
los datos de entrenamiento. Una vez entrenados, el resto de los datos de entrenamiento son
irrelevantes.
Tipo de SVM Kernel Mercer Descripción
Función de base radial
−x2 k2
Aprendizaje de una sola clase;
K(x1 , x2 ) = exp − kx12σ 2
(RBF) o gaussiana σ es la anchura del kernel
Lineal K(x1 , x2 ) = xT1 x2 Aprendizaje de dos clases
ρ
Polinómica K(x1 , x2 ) = xT1 x2 + 1 ρ es el orden del polinomio
Es un kernel Mercer solo para
Sigmoid K(x1 , x2 ) = tanh β0 xT1 x2 + β1
determinados valores β0 yβ1
4.1.5. API
Una API es una interfaz de programación de aplicaciones (del inglés API: Application Pro-
gramming Interface). Es un conjunto de rutinas que provee acceso a funciones de un deter-
10 4 Marco Teórico
minado software.
Son publicadas por los constructores de software para permitir acceso a caracterı́sticas de
bajo nivel o propietarias, detallando solamente la forma en que cada rutina debe ser llevada
a cabo y la funcionalidad que brinda, sin otorgar información acerca de cómo se lleva a cabo
la tarea. Son utilizadas por los programadores para construir sus aplicaciones sin necesidad
de volver a programar funciones ya hechas por otros, reutilizando código que se sabe que
está probado y que funciona correctamente.
REST
REST es cualquier interfaz entre sistemas que use HTTP para obtener datos o generar opera-
ciones sobre esos datos en todos los formatos posibles, como XML y JSON. Es una alternativa
en auge a otros protocolos estándar de intercambio de datos como SOAP (Simple Object
Access Protocol), que disponen de una gran capacidad pero también mucha complejidad. A
veces es preferible una solución más sencilla de manipulación de datos como REST.
Docker
GIT
Al principio, Git se pensó como un motor de bajo nivel sobre el cual otros pudieran escribir
la interfaz de usuario o front end como Cogito o StGIT. Sin embargo, Git se ha convertido
desde entonces en un sistema de control de versiones con funcionalidad plena. Hay algunos
proyectos de mucha relevancia que ya usan Git, en particular, el grupo de programación del
núcleo Linux.
El mantenimiento del software Git está actualmente (2009) supervisado por Junio Hamano,
quien recibe contribuciones al código de alrededor de 280 programadores. En cuanto a de-
rechos de autor Git es un software libre distribuible bajo los términos de la versión 2 de la
Licencia Pública General de GNU.
4.2.1. Software
Python
TensorflowTM
TensorFlowTM es una biblioteca de software libre que se utiliza para realizar cálculos numéri-
cos mediante diagramas de flujo de datos. Los nodos de los diagramas representan opera-
ciones matemáticas y las aristas reflejan las matrices de datos multidimensionales (tensores)
comunicadas entre ellas. Gracias a la flexibilidad de la arquitectura, solo necesitas una API
para desplegar el sistema informático de una o varias CPU o GPU en un escritorio, servi-
dor o dispositivo móvil. En su origen, TensorFlow fue fruto del trabajo de investigadores e
ingenieros de Google Brain Team que formaban parte de la organización de investigación
del aprendizaje automático de Google. Su objetivo era realizar investigaciones en el campo
del aprendizaje automático y las redes neuronales profundas. A pesar de que este era su
propósito inicial, se trata de un sistema lo bastante general como para poder aplicarse en
muchos otros campos.[18]
4.2 Elementos utilizados 13
4.2.2. Raspberry Pi
Raspberry Pi es un ordenador de placa reducida, ordenador de placa única u ordenador de
placa simple (SBC) de bajo coste desarrollado en el Reino Unido por la Fundación Raspberry
Pi, con el objetivo de estimular la enseñanza de informática en las escuelas. Aunque no se
indica expresamente si es hardware libre o con derechos de marca, en su web oficial explican
que disponen de contratos de distribución y venta con dos empresas, pero al mismo tiempo
cualquiera puede convertirse en revendedor o redistribuidor de las tarjetas RaspBerry Pi, por
lo que da a entender que es un producto con propiedad registrada, manteniendo el control
de la plataforma, pero permitiendo su uso libre tanto a nivel educativo como particular. En
cambio, el software sı́ es de código abierto, siendo su sistema operativo oficial una versión
adaptada de Debian, denominada Raspbian, aunque permite usar otros sistemas operativos,
incluido una versión de Windows 10. En todas sus versiones incluye un procesador Broadcom,
una memoria RAM, una GPU, puertos USB, HDMI, Ethernet (El primer modelo no lo tenı́a),
40 pines GPIO y un conector para cámara. Ninguna de sus ediciones incluye memoria, siendo
esta en su primera versión una tarjeta SD y en ediciones posteriores una tarjeta MicroSD.
La fundación da soporte para las descargas de las distribuciones para arquitectura ARM,
Raspbian (derivada de Debian), RISC OS 5, Arch Linux ARM (derivado de Arch Linux)
y Pidora (derivado de Fedora); y promueve principalmente el aprendizaje del lenguaje de
programación Python. Otros lenguajes también soportados son Tiny BASIC, C, Perl y Ruby.
Raspbian
Raspbian es un sistema operativo diseñado por Mike Thompson y Peter Green en 2012.
Es una distribución del sistema operativo para ordenadores GNU/LINUX basado en debı́an.
Este sistema está basado en el hardware propio de una Raspberry logrando con esto optimizar
los procesos permitiendo con esto un mejor uso de los recursos y optimizar el rendimiento del
dispositivo. Otorga una interfaz gráfica dando con esto beneficios como una configuración
más sencilla de los puertos y pines que posee, la posibilidad de trabajar en entornos de
desarrollo como Geany o Thonny Python entre otros. También se pueden encontrar otros
beneficios como Juegos, reproductor de audio y la posibilidad de navegar en internet. Como
el sistema operativo es una distribución de GNU/LINUX soporta todo el software de código
abierto existente para ser compilado bajo la arquitectura de la Raspberry pi.
Libnfc
Es una biblioteca de software libre desarrollada para el control de Near Field Comunication
(NFC). Es compatible con dispositivos NXP PN531, PN532 y PN533. Posee un tamaño
pequeño de aproximadamente 65 KB, además posee archivos de ejemplo que dan una muestra
del fácil uso de la biblioteca. Para que esta pueda funcionar es necesario que a la par estén
instaladas la librerı́as libusb e i2c-tools.
14 4 Marco Teórico
Libusb
i2c-tools
Es un conjunto de herramientas desarrolladas sobre Linux para el uso y el control del bus i2c.
Las herramientas que contiene son i2cdetect es un programa que escanea y busca dispositivos
en el bus i2c de la placa y devuelve una tabla con la lista de los dispositivos detectados, i2cget
se utiliza para la lectura de los registros que están visibles a través del bus i2C, también se
puede encontrar el programa i2Ctransfer que es el encargado de crear y enviar mensajes i2C.
Este módulo NFC que se puede ver en la figura 4-1 está desarrollado por la empresa NXP
originaria de los Paı́ses Bajos, que está dedicada a la fabricación de dispositivos semicon-
ductores entre los cuales destacan los NFC, implantados en celulares de alta gama como el
NEXUS S de Google. Caracterı́sticas:
Es un módulo que opera con dispositivos NFC de frecuencias de 13.56 MHZ con una
antena incluida en la propia PCB.
Posee varias interfaces de comunicación como lo son SPI, I2C y UART con fácil inter-
cambio entre ellas.
Posee las ventajas de NFC que son lecturas a distancias de no más de 7 cm y además
poder hacer intercambio de información entre dos lectores (2P2).
Es compatible para lectura y escritura con tarjetas Mifare1 S50, S70 Mifare1, MIFARE
Ultralight, Mifare Pro, Mifare DESFire, ISO/IEC 14443-4, P5CN072 (SMX).
4.2 Elementos utilizados 15
Este módulo de cámara que se puede ver en la figura 4-2 está desarrollado directamen-
te por Raspberry pi. Esta es la primera versión (5 megapı́xeles) lanzada en el 2013. Las
caracterı́sticas de esta cámara son las siguientes:
Posee unas dimensiones y peso pequeños.
Resolución de imagen fija 2592 x 1944 y modo de video 1080 x 720 p60.
Campo de visión Horizontal 53.5 grados y campo de visión vertical 41.41 grados.
Picamera
Picamera es una libreria dedicada para el uso de el modulo de camara de Raspberry Pi. La
librerı́a entrega muchas ventajas y facilidades, con solo crear un objeto de este tipo se podrá
tener acceso a todas las funciones incorporadas en la librerı́a, desde allı́ se podrán realizar
cambios como el brillo, la rotación de la imagen, el tamaño, el factor ISO, la resolución, un
balance automático de blancos y negros y con llamar una función.capture() se podrá guardar
en la Raspberry una foto. Esta librerı́a también permite de la misma manera poder llamar
otra función que logra capturar y guardar videos al cual se le podrán hacer los mismos
cambios de caracterı́sticas como en el caso de una foto y poder programar el tiempo de
grabación del video. Los formatos en los que guarda la información son JPEG (accelerated),
JPEG + RAW, GIF, BMP, PNG, YUV420, RGB888 para imágenes y raw h.264 (accelerated)
para los videos.
4.2 Elementos utilizados 17
4.2.5. MySQL
MySQL es un sistema de gestión de bases de datos relacional desarrollado bajo licencia dual:
Licencia pública general/Licencia comercial por Oracle Corporation y está considerada como
la base de datos de código abierto más popular del mundo, y una de las más populares en
general junto a Oracle y Microsoft SQL Server, sobre todo para entornos de desarrollo web.
MySQL fue inicialmente desarrollado por MySQL AB (empresa fundada por David Axmark,
Allan Larsson y Michael Widenius). MySQL AB fue adquirida por Sun Microsystems en 2008,
y ésta a su vez fue comprada por Oracle Corporation en 2010, la cual ya era dueña desde
2005 de Innobase Oy, empresa finlandesa desarrolladora del motor InnoDB para MySQL.
Al contrario de proyectos como Apache, donde el software es desarrollado por una comunidad
pública y los derechos de autor del código están en poder del autor individual, MySQL es
patrocinado por una empresa privada, que posee el copyright de la mayor parte del código.
Esto es lo que posibilita el esquema de doble licenciamiento anteriormente mencionado. La
base de datos se distribuye en varias versiones, una Community, distribuida bajo la Licencia
pública general de GNU, versión 2, y varias versiones Enterprise, para aquellas empresas que
quieran incorporarlo en productos privativos. Las versiones Enterprise incluyen productos o
servicios adicionales tales como herramientas de monitorización y asistencia técnica oficial.
5. Estado del arte
que tuviera un sistema de doble validación, la primera un sistema de validación por tarjetas
con tecnologı́a NFC y otro sistema formado por un lector biométrico de huella digital (MIFA-
RE) acompañado con una controladora InBio260, donde se observa una limitación y es que
la base de datos que puede tener el sistema del lector biométrico es de 30.000 usuarios. En los
resultados del proyecto se observa que la implementación del sistema no se pudo completar
en su totalidad ya que por el precio del sistema biométrico fue imposible su implementación
en el prototipo.[2]
Ben Afflek
Elton John
Jerry Seinfeld
Madonna
Mindy Kaling
24 7 Desarrollo
El directorio de validación tiene 5 fotos de cada celebridad. Las fotos no se han recortado
para obtener relaciones de aspecto consistentes. Con tan pocas fotos de entrenamiento, esta
es una prueba especialmente interesante de técnicas de visión por computadora. Este data
set se escogió para evaluar el prototipo en una primera fase sin tantas etiquetas de salida en
el sistema de clasificación.
Esta[5] es una base de datos de fotografı́as faciales diseñada para estudiar el problema del
reconocimiento facial sin restricciones. El conjunto de datos contiene más de 13,000 imágenes
de caras recopiladas de la web de 5749 personas diferentes. Cada cara ha sido etiquetada con
el nombre de la persona en la foto, 1680 de las personas fotografiadas tienen dos o más fotos
distintas en el conjunto de datos. La única restricción en estas caras es que fueron detectadas
por el detector de caras Viola-Jones. La distribución de las imágenes por numero se puede
ver en la tabla 7-1. Este data set será utilizado para simular una gran cantidad de personas
en el sistema de acceso, un ejemplo de las imágenes que componen este data set se puede
ver en la fı́gura 7-2.
7.2 Algoritmo de identificación 25
es una gran cantidad de detecciones faciales y muchas detecciones falsas. La segunda parte
usa imágenes y salidas de la primera predicción. Refina el resultado para eliminar la mayorı́a
de las detecciones falsas y los cuadros de lı́mite agregados. La última parte refina aún más
las predicciones y agrega predicciones de puntos de referencia faciales (en la implementación
original de MTCNN). El diagrama del algoritmo planteado se puede ver en la imagen 7-4
Luego de la identificación de los rostros, el sistema debe recortar el área en donde se en-
cuentran los mismos para finalizar el pre-procesamiento de las imágenes recibidas para el
7.3 Algoritmo de extracción de caracterı́sticas 27
posterior entrenamiento del modelo. El resultado de este proceso se puede ver en la figura
7-5
Figura 7-5.: Resultado del proceso de identificación y procesamiento de rostros, izq. Imágen
de entrada al algoritmo, der. Imagen resultado del algoritmo
Este sistema emplea una función de pérdida particular llamada pérdida de triplete. La pérdi-
da de triplete minimiza la distancia L2 entre imágenes de la misma identidad y maximiza
la distancia L2 entre las imágenes de la cara de diferentes personajes. La motivación detrás
del uso de la pérdida de triplete es que alienta a que todas las imágenes de una identidad se
proyecten en un solo punto en el espacio de incrustación, los creadores idearon un mecanismo
de selección de triplete eficiente que selecciona de manera inteligente tres imágenes a la vez.
Estas imágenes son de los siguientes tres tipos:
Se miden dos distancias euclidianas: una entre el ancla y la imagen positiva, llamémosla A.
Otra entre el ancla y la imagen negativa, llamémosla B. El proceso de entrenamiento tiene
como objetivo reducir A y maximizar B, de modo que se encuentren imágenes similares cerca
uno del otro y las imágenes distintas se encuentran muy lejos en el espacio de inserción. Este
algoritmo fue desarrollado y utilizado en python para la creación de un modelo computacional
que transforma la cara en un espacio euclidiano de 128 dimensiones que, dado el tipo de
entrenamiento, generara espacios similares con rostros de la misma persona.
Figura 7-7.: Distintas fases de los rostros a travesa del sistema de clasificación. izq. Imagen
inicial de entrada, der. Rostro previamente procesado antes de entrar a la fase
de clasificación, ab. Predicción final del sistema
En la figura 7-7 se puede ver el resultado del sistema de clasificación, el sistema genera dos
vectores, el primero son las etiquetas (nombre de los artistas) que el clasificador reconoce, el
segundo vector es la probabilidad de coincidencia calculada para cada una de las etiquetas.
30 7 Desarrollo
Se utiliza Flask como framework para el desarrollo del servidor web debido a su facilidad en
la implementación, se plantea una URL y un body para la petición que será enviada por el
dispositivo IoT. Como requerimiento para esta parte del proyecto se tiene que:
Debe existir una base de datos con información de las personas en la base de datos que
contenga al menos el id de la tarjeta asignada.
Se debe tener un sistema de roles que permita al personal de seguridad manejar incon-
venientes que no puedan ser controlados por el sistema
A partir de estos requerimientos se plantea una base de datos para permitir el almacena-
miento de la información, el modelo entidad-relacion propuesto se puede ver en la figura
7-9
Roles: Esta tabla guarda los distintos tipos de roles que el sistema puede reconocer, para
efectos de este prototipo solo se tendrán 3 roles, estudiante, docente y administrativo.
Eventos: En esta tabla se almacenarán los datos correspondientes a los eventos recibidos
por el sistema, por ejemplo ingresos exitosos de algún usuario, ingresos fallidos de algún
usuario etc.
32 7 Desarrollo
La figura 7-10 muestra el flujo de una petición de acceso dentro del sistema,
1. El dispositivo IoT envı́a una petición HTTP al servidor web donde está ubicado el
sistema de control de acceso con los campos id (Id de la tarjeta RFID utilizada), tipo
(Evento de entrada o salida) y dispositivo (Código del dispositivo donde se generó la
petición de acceso), también debe incluir la imagen obtenida desde la cámara.
2. La información se envı́a como una peticion HTTP tipo POST hasta el servidor web, si
la persona que usó la tarjeta fue identificada por el sistema y tiene a su nombre dicha
tarjeta, el servidor web responderá con un estado 200 (La transacción salió bien), en
caso contrario se responderá con un estado 400 (No se pudo comprobar la persona)
3. La URL que se expone para el acceso al sistema es /upload, el dispositivo IoT dirigirá
sus peticiones a esta URL con los datos mencionados anteriormente
Tanto el servicio web como la base de datos se despliegan en el servidor usando la herra-
mienta de docker-compose esto con el fin de que en cada ocasión que se añada una persona
nueva al sistema o haya un cambio en el mismo se pueda reiniciar el servicio con los nue-
vos cambios en el menor tiempo posible. Gracias a la Universidad Distrital se consigue la
utilización de un servidor propio con la ayuda de RITA, el acceso a este servidor se reali-
za mediante una conexión ssh y una llave pem de acceso, el comando utilizado es: ssh -i
tesisaccessystem.pem servidores@ritaportal.udistrital.edu.co -p 10259.
Con el sistema funcionando localmente se procede a llevar el código a un repositorio remoto
para realizar control de versiones, se utiliza github.com para crear el repositorio y subir los
archivos del sistema como se ve en la figura 7-11. Para optimizar la generación del sistema
se incluye un archivo Dockerfile para la creacion de una imágen de docker con el sistema de
acceso y a su vez un archivo docker-compose para realizar el despliegue de todo el sistema,
el archivo Dockerfile y el docker-compose se pueden ver en las figuras 7-12 y 7-13
Se crea una cuenta en dockerhub para realizar la creación de la imagen de docker del sistema
de acceso y poder descargarla desde cualquier lugar con acceso a internet y docker. Al iniciar
el servicio web usando el comando docker-compose up se muestran en la consola los logs
de iniciación de los servicios como se ve en la figura 7-14
Usando un programa para generar peticiones HTTP llamado Postman, se comprueba que
el servidor se encuentra disponible como se ve en la figura 7-15, se envı́a el body y el tipo
de petición esperado por el servidor pero no se adjunta imagen a la petición, a respuesta
devuelve un código 400 de error en el cual indica que la imagen no fue adjuntada.
34 7 Desarrollo
Figura 7-11.: Repositorio en github con los archivos requeridos para el sistema de acceso
A partir de este diagrama y con los requerimientos hechos en la fase de metodologı́a se selec-
ciona el micro controlador que se va a utilizar para el dispositivo IoT. El micro controlador
debe soportar conexiones a internet mediante protocolo Wifi o por medio de Ethernet, tam-
bién debe soportar los dispositivos como el lector de tarjetas NFC, una cámara y pines de uso
libre para los indicadores de acceso. Bajo estos criterios se selecciona como micro controlador
la placa Raspberry pi 3 B+ ya que cumple con todos los requerimientos necesarios para el
sistema. Esta placa posee las siguientes caracterı́sticas:
Conexión a internet Gigabit Ethernet (via USB channel), 2.4GHz and 5GHz 802.11b/g/n/ac
Wi-Fi.
40-pines GPIO.
Puertos HDMI, 3.5mm audio análogo-video jack, 4x USB 2.0, Ethernet, Camara Serial
interfaz (CSI), pantalla por interfaz serial (DSI).
Al descomprimir este archivo se crea una carpeta y dentro de esta aparece un archivo con
extensión img. Se selecciona un Software de preferencia para quemar esta imagen en la micro
SD en nuestro caso se utilizo etcher ya que es un software libre y de código abierto. Se pone la
micro SD en la Raspberry se conectan los periféricos como mouse y teclado, cuando se inicia
pide unos datos como nombre del dispositivo y conexión a una red y se tiene un escritorio
como el que se muestra en la figura 7-18.
El sistema operativo trae paquetes como Python por defecto o librerı́as como numpy, mat-
plotlib, libusb entre una infinidad de librerı́as que traen los sistemas GNU/LINUX, pero se
requiere una actualización si existe, de todos estos paquetes, por lo cual se abre el terminal
y se escriben los siguientes comandos sudo apt-get update y sudo apt-get upgrade, se
debe tener en cuenta que para poder realizar el proceso satisfactoriamente se debe establecer
una conexión a internet , esto es tan sencillo como ir a la barra de búsqueda seleccionar el
logo de wifi escoger la red y digitar la clave.
Pin Pin
pn532 Raspberry
GND 6
VCC 4
SDA 3
SCL 5
dispositivos lectores NFC con caracterı́sticas similares, además de esto es un chip que permite
ser controlado por la Raspberry mediante una librerı́a.
Este módulo tiene 3 interfaces de conexión (SPI, I2C, UART) se configuró para conexión
mediante I2C, esto se hizo por medio de 2 switch que posee, quedando de la en la forma que
se ve en la imagen 7-19
Se tomaron los pines de comunicación por I2C del modulo y se conectaron al bus de comuni-
cación de I2C de la Raspberry como se observa en la tabla 7-2. Se instaló la librerı́a I2C-tool
esto se hizo abriendo el terminal en la Raspberry y escribiendo el siguiente comando en la
consola sudo apt-get install i2c-tools, luego se procedió a abrir las configuraciones de
la Raspberry y se habilito la interfaz I2C para poder trabajar con el módulo pn532 como se
observa en la figura 7-20
Con esto ya quedó configurada la conexión entre el modulo NFC y las Raspberry, seguida-
mente se procedió a descargar la biblioteca llamada libnfc-1.7.1 de la pagina de repositorios
40 7 Desarrollo
de Github. Esta es la librerı́a por la cual se pueden realizar escrituras, lecturas entre los dis-
positivos NFC inclusive los chips puestos en los teléfonos inteligentes, pero para que funcione
fue necesario modificar el archivo de configuración para poderle indicar a la librerı́a bajo que
interfaz se está trabajando en este caso I2C modificando los campos name y connstring.
Se realizaron pruebas con varios dispositivos, entre estos están dos tags con chip NFC S50,
una tarjeta de Transmilenio, una tarjeta blanca con chip NFC S50 un carnet de la Universidad
7.6 Implementación de dispositivo IoT 41
Distrital Francisco José de Caldas obteniendo como resultado los UID de cada dispositivo.
Se observa con las pruebas realizadas en la tarjeta tu llave que la UID cambia cada vez que
el dispositivo es leı́do, por lo tanto se descarta el uso de este dispositivo como chip de acceso
ya que no es posible asignar una UID a esta tarjeta.
Librerı́a Picamera
Es una librerı́a creada por Raspberry pi Nativa de Python. Para instalar esta librerı́a en la
Raspberry pi 3b+ es necesario tener el micro controlador actualizado, por eso se ejecutaron
42 7 Desarrollo
los comandos utilizados en la configuración del módulo NFC, además de esto es necesario
tener el micro controlador conectado a Internet. Luego de que esta actualización finalizara
se ejecuta en la consola el siguiente comando sudo apt-get install python-picamera
mediante el cual se va a realizar la instalación de la librerı́a picamera. Con esto finaliza la
instalación de la librerı́a, después se procedió a conectar la cámara en la interfaz (CSI) y se
escribió un pequeño código para probar la correcta instalación de la librerı́a y algunas de las
funciones que vienen con la librerı́a. En la imagen 7-23, se muestra una foto tomada por la
cámara donde se observa la conexión realizada en la interfaz CSI.
Con toda la configuración en orden el diagrama final del prototipo del sistema IoT con el
módulo NFC, la cámara y algunos indicadores visuales queda como se puede ver en la figura
7-24
En el diagrama se observa una tarea llamada subproceso esto se debe a que la biblioteca
libnfc esta escrita en lenguaje C y programa está desarrollado en Python por lo tanto fue
necesario iniciar un subproceso para poder hacer uso de la librerı́a libnfc, este subproceso
consiste en ejecutar el archivo encargado de la validación y lectura de los chips NFC y
cuando este finalice capturar la salida y almacenarla en un arreglo que serı́a nuestra UID.
El diagrama de flujo de este subproceso se muestra en la figura 7-26
Este programa se decidió hacer en lenguaje Python ya que posee una gran cantidad de
librerı́as y es de código abierto, para esto se uso la IDE de Thonny Python que es una IDE
incluida en Raspbian. Cuando el programa se ejecuta después de inicializar las variables
7.6 Implementación de dispositivo IoT 45
ejecuta un subproceso iniciando otro programa encargado de la lectura del chip NFC, este
programa fue basado en los programas de ejemplos que trae la librerı́a libnfc, este subproceso
retorna una cadena de caracteres con el número UID del chip, en dado caso que no se detecte
ningún chip después de un tiempo retorna una cadena de ceros. El programa en Python
captura esa cadena de caracteres y la almacena en un array verifica que lo que se encuentra
en ese array es un valor diferente a cero si no es ası́ vuelve a llamar a subproceso hasta que
el retorno sea un valor diferente, cuando esto sucede procede a tomar una foto de la persona
que está pasando la tarjeta y la guarda en la misma carpeta donde se encuentra el archivo
del programa, luego pasa a una función donde se define la URL de nuestra máquina virtual
y el puerto, también se carga a una variable esta foto que se acabo de tomar y luego se
carga a una variable el UID que se encuentra en el array. Todo esto para hacer una solicitud
post gracias a la librerı́a Requests de Python donde se envı́an la imagen y la UID a la URL
deseada. Esta solicitud post tiene un try except por si no es posible realizar la solicitud
por algún error en la conexión. Si la solicitud es enviada el programa queda en espera de
la respuesta y cuando esta llega tenemos 3 posibilidades, la primera que obtengamos un
46 7 Desarrollo
400 que indica que la validación es correcta es decir que la persona que aparece en la foto
corresponde a la UID de la tarjeta y se enciende un led de color verde, la segunda es un 403
que indica que por un error en la toma de la foto o en el procesamiento de la maquina no se
obtuvieron resultados lo que obliga a volver a pasar la tarjeta y se enciende un led azul y el
ultimo es un 404 donde el usuario de la tarjeta no coincide con el UID de la tarjeta, es decir
no es el propietario registrado en la base de datos se enciende un led rojo. Para finalizar el
programa se debe pasar la solicitud con uno llave que seria un chip con una UID especifica.
Tarjeta RFID, para esta tarjeta los posibles estados son, tarjeta válida y asociada a la
persona reconocida, tarjeta válida pero asociada a otra persona y tarjeta no válida.
Rostro identificado, para un rostro identificado los posibles estados son: Rostro válido
y asociado a la tarjeta usada, rostro válido pero no asociado a la tarjeta usada y rostro
invalido con tarjeta válida.
Numero de imágenes del rostro usadas para el entrenamiento, para esta variable se
toma como referencia la tabla 7-1 y se realizan pruebas con rostro válido y tarjeta
válida con rostros de los diferentes grupos que se ven en la misma tabla
Como resultado se obtiene la tabla de pruebas 7-3, se encuentran 4 casos de prueba y se eje-
cuta cada uno 100 veces variando el rostro enviado y la tarjeta usada. En una segunda parte
se ejecuta la primera prueba pero seleccionando rostros de los distintos grupos mostrados en
la tabla 7-1 con al menos 50 iteraciones de la misma prueba usando rostros distintos.
7.7.1. Resultados
Una imagen tomada directamente del servidor remoto de procesamiento con el rostro aso-
ciado al la tarjeta con id b92df16e se puede ver en la imagen 7-27, en esta imagen se puede
7.7 Pruebas y validación 47
Figura 7-27.: Imagen obtenida del servidor remoto luego del procesamiento y clasificación
de la misma
Figura 7-28.: Imagen obtenida del servidor remoto luego del procesamiento y errónea cla-
sificación de la misma
ver la sección resaltada que pertenece al rostro de la persona (pre procesamiento del rostro),
la probabilidad de la clasificación siendo esta de 0.04322 y el id de la tarjeta asociada a ese
rostro.
De la misma forma una imagen tomada directamente del servidor remoto de procesamiento
con el rostro asociado al la tarjeta con id b92df16e pero que no fue reconocida exitosamente
se puede ver en la imagen 7-28, en esta imagen se puede ver de igual manera la sección
resaltada que pertenece al rostro de la persona, pero en esta ocasión no logró identificar
correctamente al id de la tarjeta asociada, algo para resaltar es que la probabilidad de la
clasificación es menor que en la prueba exitosa resultando con 0.02182.
48 7 Desarrollo
Para la primera parte de las pruebas el sistema mostró un error por debajo del 5 % el
compilado de los resultados se puede ver en la tabla 7-4. En la segunda fase de pruebas los
resultados se pueden ver en la imagen 7-29
8. Conclusiones
El prototipo de algoritmo de identificación y pre-procesamiento de rostros basado en
MTCNN otorgó una gran fiabilidad, mayor al 90 % conservando las caracterı́sticas que
se pueden ver en el articulo [21], esto influye en los resultados de las pruebas obtenidos
por encima del 95 % de efectividad.
Algo interesante obtenido a partir de las pruebas del sistema es la relación entre la tasa
de error y la cantidad de imágenes usadas en el entrenamiento, se puede evidenciar que
se obtiene un gran porcentaje de error con menos de 5 imágenes por persona, pero si
se tienen más de 10 imágenes por persona el incremento en la cantidad de aciertos no
se incrementa significativamente al punto en que la diferencia entre entrenar el sistema
con 10 imágenes por persona y hacerlo con más de 80 solo es de un 4 %.
Para configurar el controlador del dispositivo NFC es necesario clonar el repositorio ubicado
en GitHub para esto se debe abrir el terminal de la raspberry y ejecutar el comando git
clone https://github.com/nfc-tools/libnfc.git, luego se debe entrar a la carpeta,
desde el terminal se ejecuta el comando cd libnfc-1.7.1 y seguidamente el comando sudo
A.2 Configuración del software en la Raspberry 51
make install, con esto se instalan los paquetes necesarios para controlar el modulo NFC. Es
necesario especificar el tipo de comunicación que se va a utilizar entre el dispositivo NFC y el
controlador, para esto se debe ejecutar el comando sudo mkdir /etc/nfc luego se ejecuta
el comando sudo nano /etc/libnfc/libnfc.conf y se insertan las dos siguientes lı́neas de
código al final del documento
Con estos comandos se logra configurar el controlador con el dispositivo NFC por medio del
puerto I2C.
La cámara se controla con una librerı́a nativa de Python y compatible con raspberry, para la
configuración de la cámara de Raspi se ejecuta en una página terminal el comando apt-get
install Python-camera. Se copia el paquete de instalación que contiene una versión modi-
ficada del ejecutable de la librerı́a NFC y un código desarrollado en Python en la dirección
/home/pi.
52A Anexo: Manual para instalación de la aplicación en una Raspberry pi
Por ultimo es necesario incluir el script de la ejecución dentro de la carpeta raiz, este script
se encuentra en https://github.com/dasrodriguezs/sistema-acceso/blob/master/rpi-scrpit.py,
al ejecutar este script el dispositivo se encuentra funcional.
B. Anexo: Manual de uso para el
dispositivo IoT
El prototipo final se puede ver en la imagen B-1.
Figura B-1.: Prototipo de dispositivo IoT para la adquisición de las imágenes e información
de la tarjeta RFiD
3. Carcasa de protección para los componentes del dispositivo con lamina de acrı́lico.
el dispositivo esta listo para su funcionamiento. Para la lectura se ubica la tarjeta NFC sobre
la lámina de acrı́lico y se espera la respuesta, el dispositivo tiene 3 diferentes indicadores que
son LEDs de color verde, azul y rojo cuya descripción se explica a continuación:
Verde: si el dispositivo nos arroja un indicador de color verde significa que el usuario
que porta la tarjeta NFC está autorizado para ingresar a la institución.
Rojo: Si el dispositivo arroja un indicador rojo significa que el usuario no tiene permiso
para ingresar a la institución, puede ser porque el rostro no se encuentra en la base de
datos o el id de la tarjeta no coincide con el rostro.
3. Cambiar la ubicación actual a la carpeta que contiene el sistema, esto se realiza me-
diante el comando cd tesis/sistema-acceso
5. Levantar todos los servicios del sistema de acceso mediante el comando docker-compose
up -d
Luego de seguir estos pasos el sistema de acceso deberia estar funcional.
En dado caso de ser necesario, el sistema se puede acondicionar en cualquier otro servidor
siguiendo los siguientes pasos:
1. Acceder al nuevo servidor remoto como super usuario
4. Cambiar la ubicación actual a la carpeta que contiene el sistema, esto se realiza me-
diante el comando cd tesis/sistema-acceso
6. Levantar todos los servicios del sistema de acceso mediante el comando docker-compose
up -d
Bibliografı́a
[1] Your Machine Learning and Data Science Community
[2] Alvaro Javier Balsero Meneses, Cristian German Vargas G. Diseño e implemen-
tación de un prototipo para el control de acceso en la sede de ingenierı́a de la universidad
Distrital Francisco José de Caldas mediante el uso de torniquetes controlados por carnet
con tecnologia nfc y lector biométrico de huella dactilar. 2016
[4] C., José D. O.: RFID: Aplicaciones, retos y oportunidades. En: Revista colombiana de
computación 17 (2016), Nr. 2, p. 102–110
[5] Huang, Gary B. ; Mattar, Marwan ; Berg, Tamara ; Learned-Miller, Eric: La-
beled faces in the wild: A database forstudying face recognition in unconstrained envi-
ronments, 2008
[6] Jimenez Carrion, Flabio; Celi Pinzon J.: Modelado y Predicción del Fenómeno El
Niño en Piura, Perú. En: Información Tecnológica (2018), p. 303–316
[10] Masruroh, Siti U. ; Fiade, Andrew ; Julia, Imelda R.: NFC Based Mobile Attendence
System with Facial Authorization on Raspberry Pi and Cloud Server. En: 2018 6th
International Conference on Cyber and IT Service Management (CITSM) IEEE, 2018,
p. 1–6
Bibliografı́a 57
[17] SENGUPTA, SOMINI: Machines Made to Know You, by Touch, Voice, Even by Heart.
En: The New York Times (2013)
[21] Zhang, K. ; Zhang, Z. ; Li, Z. ; Qiao, Y.: Joint Face Detection and Alignment Using
Multitask Cascaded Convolutional Networks. En: IEEE Signal Processing Letters 23
(2016), Oct, Nr. 10, p. 1499–1503. – ISSN 1070–9908