File size: 5,044 Bytes
ba3ed11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3a8e48b
 
ba3ed11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3a8e48b
ba3ed11
 
 
 
 
 
 
 
 
 
 
 
3a8e48b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ba3ed11
 
 
 
 
 
 
 
 
 
 
 
 
3a8e48b
 
 
 
ba3ed11
3a8e48b
 
 
ba3ed11
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# -*- coding: utf-8 -*-
"""
Jos茅 Carlos Machicao
GestioDin谩mica
Fecha de producci贸n: 2021_10
Fecha de actualizaci贸n 2022_07
Ubicaci贸n Original: PythonScripts/gdmk_facerecog/
"""

import streamlit as st
import face_recognition
from PIL import Image
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime
import base64
from io import BytesIO
from pyxlsb import open_workbook as open_xlsb

# BODY
st.image('gdmk.png', width=150)

st.subheader('Aplicativos de Reconocimiento Facial')
st.title('Comparaci贸n de Identidades')

nom_oper = st.text_input('Nombre de Operador(a):')
st.subheader('**Procedimiento: Comparaci贸n de Identidades**')

up_base = st.file_uploader('Cargue Archivo Base Recibido de su Supervisor: ')

if up_base is not None:
   
    base = pd.read_pickle(up_base)
    st.write(base.shape)
    st.write(base.lista)

# 2. CARGA DE FOTOS EVENTO
st.subheader('**Procedimiento: Carga de Pantallazos de Evento**')

up_evento = st.file_uploader('Elija pantallazos del evento: ', accept_multiple_files=True)

if len(up_evento)==0:
    
    mensaje='Todav铆a no se han cargado im谩genes.'
    st.write(mensaje)

else:
    mensaje='Confirmaci贸n, se han cargado '+str(len(up_evento))+' im谩genes.'
    st.write(mensaje)

    caras_embed = []    
    
    for j, pic in enumerate(up_evento):
        ima = face_recognition.load_image_file(pic)
        face_locs = face_recognition.face_locations(ima)
        face_enco = face_recognition.face_encodings(ima)
        
        for k, facex in enumerate(face_enco):
            top, right, bottom, left = face_locs[k]
            face_frame = ima[top:bottom, left:right]
            pil_image = Image.fromarray(face_frame)
            pil_image_100 = pil_image.resize((100,100))
            rotulox = 'nom_' + str(j) + '_' + str(k) + '.jpg'
            #pil_image_100.save(rotulox)
            caras_embed.append([rotulox, facex, pil_image_100])
            
    caras_evento_code_df = pd.DataFrame(caras_embed)
    caras_evento_code_df.columns = ['rotulo', 'face_embed', 'image']

    # 3. COMPARACI脫N

    st.subheader('**Procedimiento: Comparaci贸n**')

    codesx = base.codigos
    lista_fotos = base.lista
    
    resultados = []
    for face in caras_evento_code_df.face_embed:
        matches = face_recognition.compare_faces(list(codesx), face)
        timestamp = datetime.datetime.now()
        try:
            indice = int(np.where(matches)[0])
            halla = lista_fotos[indice]
            resultados.append([timestamp, halla])
        except:
            resultados.append([timestamp, 'Desconocido'])
    
    timestamp = str(datetime.datetime.now()).replace(':','-')
    
    resultados_df = pd.DataFrame(resultados)
    resultados_df.columns = ['timestamp', 'nombre']
    resultados_df['arch_evento'] = caras_evento_code_df.rotulo
    resultados_df['imagenes'] = caras_evento_code_df.image

    st.dataframe(resultados_df.drop(['imagenes'], axis=1))
    asistentes = resultados_df.nombre
    
    asistencia = []
    for nom in base.lista:
        if nom in list(asistentes):
            asistencia.append([nom, 'Asisti贸'])
        else:
            asistencia.append([nom, 'No Asisti贸'])
    asist_df = pd.DataFrame(asistencia)
    st.dataframe(asist_df)
    
    def convierte_excel(df):
        output = BytesIO()
        writer = pd.ExcelWriter(output, engine='xlsxwriter')
        df.to_excel(writer, index=False, sheet_name='data_extraida')
        workbook = writer.book
        worksheet = writer.sheets['data_extraida']
        format1 = workbook.add_format({'num_format': '0.00'}) 
        worksheet.set_column('A:A', None, format1)  
        writer.save()
        processed_data = output.getvalue()
        writer.close()
        return processed_data
    
    df_xlsx = convierte_excel(asist_df)
    st.download_button(label='馃摡 Descargar XLSX', data=df_xlsx,
                                file_name = 'resultados_'+timestamp+'.xlsx')
                                
    n_fig = 10
    fig, ax = plt.subplots(1, n_fig, figsize=(21, 2))
    for i in range(n_fig):
        if i > len(resultados_df)-1:
            img = Image.open('void.jpg')
            ax[i].imshow(img)
            ax[i].axis('off')
        else:
            img = resultados_df.imagenes.iloc[i]
            ax[i].imshow(img)
            ax[i].set_title(str(resultados_df.nombre.iloc[i]))
            ax[i].axis('off')
            
    #timestamp = str(datetime.datetime.now()).replace(':','-')
    #plt.savefig('resultados_'+timestamp+'.jpg')
    #st.image(Image.open('resultados_'+timestamp+'.jpg'), width=800)
    st.pyplot(fig)
    
    #st.write('Se ha guardado los archivos en el folder resultados.')
    #resultados_df.to_csv('resultados/verificacion.csv')
    #asist_df.to_csv('resultados/asistencia.csv')
    
    c1, c2, c3 = st.columns(3)
    with c1:
        st.write(' ')
    with c2:
        st.write(' ')
    with c3:
        st.write(' ')
        st.image('gdmk.png', width=100, caption='Designed and Powered by GestioDin谩mica')