import cv2 import streamlit as st from sqlalchemy import text from preprocess import read_image, extract_id_card, save_image from ocr_engine import extract_text from postprocess import extract_information from face_verification import detect_and_extract_face, face_comparison, get_face_embeddings from mysqldb_operations import insert_records, fetch_records, check_duplicacy # { # "ID": "CCNPA", # "Name": "BIBEK RAUTH", # "Father's Name": "AJAY RAUTH", # "DOB": "14/09/1994", # "ID Type": "PAN" # } # Set wider page layout def wider_page(): max_width_str = f"max-width: 1200px;" st.markdown( f""" """, unsafe_allow_html=True, ) # Customized Streamlit theme def set_custom_theme(): st.markdown( """ """, unsafe_allow_html=True, ) # Sidebar def sidebar_section(): st.sidebar.title("Select ID Card Type") option = st.sidebar.selectbox("", ("PAN", " ")) return option # Header def header_section(option): if option == "Aadhar": st.title("Registration Using Aadhar Card") elif option == "PAN": st.title("Registration Using PAN Card") # Main content def main_content(image_file, face_image_file, conn): if image_file is not None: face_image = read_image(face_image_file, is_uploaded=True) if face_image is not None: image = read_image(image_file, is_uploaded=True) image_roi, _ = extract_id_card(image) face_image_path2 = detect_and_extract_face(img=image_roi) face_image_path1 = save_image(face_image, "face_image.jpg", path="data\\02_intermediate_data") is_face_verified = face_comparison(image1_path=face_image_path1, image2_path=face_image_path2) if is_face_verified: extracted_text = extract_text(image_roi) text_info = extract_information(extracted_text) records = fetch_records(text_info) if records.shape[0] > 0: st.write(records.shape) st.write(records) is_duplicate = check_duplicacy(text_info) if is_duplicate: st.write(f"User already present with ID {text_info['ID']}") else: st.write(text_info) # Convert the DOB to string in format MySQL expects text_info['DOB'] = text_info['DOB'].strftime('%Y-%m-%d') text_info['Embedding'] = get_face_embeddings(face_image_path1) st.write(text_info) insert_records(text_info) # DB Operations # with conn.session as s: # s.execute( # 'INSERT INTO users (id, name, father_name, dob, id_type, embedding) VALUES (:id, :name, :father_name, :dob,:id_type, :embedding );', # params=dict(id=text_info['ID'], name=text_info['Name'], father_name=text_info["Father's Name"], # dob=text_info['DOB'], id_type=text_info['ID Type']) # ) # s.execute( # text('INSERT INTO users (id, name, father_name, dob, id_type, embedding) VALUES (:id, :name, :father_name, :dob, :id_type, :embedding);'), # { # 'id': text_info['ID'], # 'name': text_info['Name'], # 'father_name': text_info["Father's Name"], # 'dob': text_info['DOB'], # Make sure this is formatted as a string 'YYYY-MM-DD' # 'id_type': text_info['ID Type'], # 'embedding': str(text_info['Embedding']) # } # ) # s.commit() # col1, col2 = st.columns(2) # # Display ID card image # with col1: # st.header("ID Card Image") # image_roi = cv2.cvtColor(image_roi, cv2.COLOR_BGR2RGB) # st.image(image_roi, use_column_width=True, caption="ID card") # # Display uploaded face image # with col2: # st.header("Uploaded Face Image") # face_image = cv2.cvtColor(face_image, cv2.COLOR_BGR2RGB) # st.image(face_image, use_column_width=True, caption="Uploaded Face") # # Display extracted information # st.header("Extracted Information") # st.dataframe(text_df) else: st.error("Face verification failed. Please try again.") else: st.error("Face image not uploaded. Please upload a face image.") else: st.warning("Please upload an ID card image.") def main(): # Initialize connection. conn = st.connection('mysql', type='sql') wider_page() set_custom_theme() option = sidebar_section() header_section(option) image_file = st.file_uploader("Upload ID Card") if image_file is not None: face_image_file = st.file_uploader("Upload Face Image") main_content(image_file, face_image_file, conn) if __name__ == "__main__": main()