0

Here is the code of main file

import mysql.connector
import tracemalloc
from tkinter import *
import tkinter as tk
from tkinter import ttk, messagebox,Label, filedialog
from tkinter.tix import Tk
from PIL.Image import Image
from PIL import ImageTk
import threading
import shutil
from facerec import *
from register import *
from face_detection import *
from dbHandler import *
from handler import *
import time
import csv
import numpy as np
import pymysql
import ntpath
import os
from main_login import *
from PIL import Image

tracemalloc.start()
active_page = 0
thread_event = None
left_frame = None
right_frame = None
heading = None
webcam = None
img_label = None
img_read = None
img_list = []
slide_caption = None
slide_control_panel = None
current_slide = -1

root = tk.Tk()
root.title("Criminal Detection Project")
root.geometry("1000x900+200+100")



# create Pages
pages = []
for i in range(5):
    pages.append(tk.Frame(root, bg="#cccccc"))
    pages[i].pack(side="top", fill="both", expand=True)
    pages[i].place(x=0, y=0, relwidth=1, relheight=1)


def goBack():
    global active_page, thread_event, webcam

    if (active_page==4 and not thread_event.is_set()):
        thread_event.set()
        webcam.release()

    for widget in pages[active_page].winfo_children():
        widget.destroy()

    pages[0].lift()
    active_page = 0



def basicPageSetup(pageNo):
    global left_frame, right_frame, heading

    back_img = tk.PhotoImage(file="back.png")
    back_button = tk.Button(pages[pageNo], image=back_img, bg="#cccccc", bd=0, highlightthickness=0,
           activebackground="#cccccc", command=goBack)
    back_button.image = back_img
    back_button.place(x=10, y=10)

    heading = tk.Label(pages[pageNo], fg="white", bg="#cccccc", font="Helvetica 20 bold", pady=10)
    heading.pack()

    content = tk.Frame(pages[pageNo], bg="#cccccc", pady=20)
    content.pack(expand="true", fill="both")

    left_frame = tk.Frame(content, bg="#cccccc")
    left_frame.grid(row=0, column=0, sticky="nsew")

    right_frame = tk.LabelFrame(content, text="Detected Criminals", fg="white", bg="#cccccc", font="Helvetica 20 bold", bd=4,
                             foreground="#000000", labelanchor="n")
    right_frame.grid(row=0, column=1, sticky="nsew", padx=20, pady=20)

    content.grid_columnconfigure(0, weight=1, uniform="group1")
    content.grid_columnconfigure(1, weight=1, uniform="group1")
    content.grid_rowconfigure(0, weight=1)


def showImage(frame, img_size):
    global img_label, left_frame

    img = cv2.resize(frame, (img_size, img_size))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = Image.fromarray(img)
    img = ImageTk.PhotoImage(img)
    if (img_label == None):
        img_label = tk.Label(left_frame, image=img, bg="#cccccc")
        img_label.image = img
        img_label.pack(padx=20)
    else:
        img_label.configure(image=img)
        img_label.image = img


def getNewSlide(control):
    global img_list, current_slide

    if(len(img_list) > 1):
        if(control == "prev"):
            current_slide = (current_slide-1) % len(img_list)
        else:
            current_slide = (current_slide+1) % len(img_list)

        img_size = left_frame.winfo_height() - 200
        showImage(img_list[current_slide], img_size)

        slide_caption.configure(text = "Image {} of {}".format(current_slide+1, len(img_list)), fg = "black")


def selectMultiImage(opt_menu, menu_var):
    global img_list, current_slide, slide_caption, slide_control_panel

    filetype = [("images", "*.jpg *.jpeg *.png")]
    path_list = filedialog.askopenfilenames(title="Choose atleast 5 images", filetypes=filetype)

    if(len(path_list) < 5):
        messagebox.showerror("Error", "Choose atleast 5 images.")
    else:
        img_list = []
        current_slide = -1

        # Resetting slide control panel
        if (slide_control_panel != None):
            slide_control_panel.destroy()

        # Creating Image list
        for path in path_list:
            img_list.append(cv2.imread(path))

        # Creating choices for profile pic menu
        menu_var.set("")
        opt_menu['menu'].delete(0, 'end')

        for i in range(len(img_list)):
            ch = "Image " + str(i+1)
            opt_menu['menu'].add_command(label=ch, command= tk._setit(menu_var, ch))
            menu_var.set("Image 1")


        # Creating slideshow of images
        img_size =  left_frame.winfo_height() - 200
        current_slide += 1
        showImage(img_list[current_slide], img_size)

        slide_control_panel = tk.Frame(left_frame, bg="#cccccc", pady=20)
        slide_control_panel.pack()

        back_img = tk.PhotoImage(file="previous.png")
        next_img = tk.PhotoImage(file="next.png")

        prev_slide = tk.Button(slide_control_panel, image=back_img, bg="#cccccc", bd=0, highlightthickness=0,
                            activebackground="#cccccc", command=lambda : getNewSlide("prev"))
        prev_slide.image = back_img
        prev_slide.grid(row=0, column=0, padx=60)

        slide_caption = tk.Label(slide_control_panel, text="Image 1 of {}".format(len(img_list)), fg="#ff9800",
                              bg="#cccccc", font="Helvetica 13 bold")
        slide_caption.grid(row=0, column=1)

        next_slide = tk.Button(slide_control_panel, image=next_img, bg="#cccccc", bd=0, highlightthickness=0,
                            activebackground="#cccccc", command=lambda : getNewSlide("next"))
        next_slide.image = next_img
        next_slide.grid(row=0, column=2, padx=60)


def register(entries, required, menu_var):
    global img_list

    # Checking if no image selected
    if(len(img_list) == 0):
        messagebox.showerror("Error", "Select Images first.")
        return

    # Fetching data from entries
    entry_data = {}
    for i, entry in enumerate(entries):
        # print(i)
        val = entry[1].get()
        # print(val)

        if (len(val) == 0 and required[i] == 1):
            messagebox.showerror("Field Error", "Required field missing :\n\n%s" % (entry[0]))
            return
        else:
            entry_data[entry[0]] = val.lower()


    # Setting Directory
    path = os.path.join('face_samples', "temp_criminal")
    if not os.path.isdir(path):
        os.mkdir(path)

    no_face = []
    for i, img in enumerate(img_list):
        # Storing Images in directory
        id = registerCriminal(img, path, i + 1)
        if(id != None):
            no_face.append(id)

    # check if any image doesn't contain face
    if(len(no_face) > 0):
        no_face_st = ""
        for i in no_face:
            no_face_st += "Image " + str(i) + ", "
        messagebox.showerror("Registration Error", "Registration failed!\n\nFollowing images doesn't contain"
                        " face or Face is not clear:\n\n%s"%(no_face_st))
        shutil.rmtree(path, ignore_errors=True)
    else:
        # Storing data in database
        insertData(entry_data)
        rowId=1
        if(rowId >= 0):
            messagebox.showinfo("Success", "Criminal Registered Successfully.")
            print("New Criminal registered.")
            shutil.move(path, os.path.join('face_samples', entry_data["Name"]))

            # save profile pic
            profile_img_num = int(menu_var.get().split(' ')[1]) - 1
            if not os.path.isdir("profile_pics"):
                os.mkdir("profile_pics")
            cv2.imwrite("profile_pics/criminal %d.png"%rowId, img_list[profile_img_num])

            goBack()
        else:
            shutil.rmtree(path, ignore_errors=True)
            messagebox.showerror("Database Error", "Some error occured while storing data.")


## update scrollregion when all widgets are in canvas
def on_configure(event, canvas, win):
    canvas.configure(scrollregion=canvas.bbox('all'))
    canvas.itemconfig(win, width=event.width)

## Register Page ##
def getPage1():
    global active_page, left_frame, right_frame, heading, img_label
    active_page = 1
    img_label = None
    opt_menu = None
    menu_var = tk.StringVar(root)
    pages[1].lift()

    basicPageSetup(1)
    heading.configure(text="Register Criminal here",fg="black", highlightthickness=2, highlightbackground="black",bg="#cccccc")
    right_frame.configure(text="Enter Details", fg="black", bg="#cccccc")

    btn_grid = tk.Frame(left_frame, bg="#cccccc")
    btn_grid.pack()

    tk.Button(btn_grid, text="Select Images", command=lambda: selectMultiImage(opt_menu, menu_var), font="Helvetica 13 bold", bg="#000000",
           fg="black", pady=10, bd=0, highlightthickness=2,highlightbackground="black", activebackground="#000000",
           activeforeground="white").grid(row=0, column=0, padx=25, pady=25)


    # Creating Scrollable Frame
    canvas = tk.Canvas(right_frame, bg="#cccccc", highlightthickness=0)
    canvas.pack(side="left", fill="both", expand="true", padx=30)
    scrollbar = tk.Scrollbar(right_frame, command=canvas.yview, width=20, troughcolor="#cccccc", bd=0,
                          activebackground="#cccccc", bg="#000000", relief="raised")
    scrollbar.pack(side="left", fill="y")

    scroll_frame = tk.Frame(canvas, bg="#cccccc", pady=20)
    scroll_win = canvas.create_window((0, 0), window=scroll_frame, anchor='nw')

    canvas.configure(yscrollcommand=scrollbar.set)
    canvas.bind('<Configure>', lambda event, canvas=canvas, win=scroll_win: on_configure(event, canvas, win))


    tk.Label(scroll_frame, text="* Required Fields", bg="#cccccc", fg="red", font="Helvetica 13 bold").pack()
    # Adding Input Fields
    input_fields = ("Criminal-ID","Address","Phone","Name", "Father's Name", "Gender", "DOB(yyyy-mm-dd)", "Crimes Done","Date of Arrest(yyyy-mm-dd)","Place of Arrest", "Profile Image")
    ip_len = len(input_fields)
    required = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

    entries = []
    for i, field in enumerate(input_fields):
        print()
        row = tk.Frame(scroll_frame, bg="#cccccc")
        row.pack(side="top", fill="x", pady=15)

        label = tk.Text(row, width=20, height=1, bg="#cccccc", fg="black", font="Helvetica 13", highlightthickness=0, bd=0)
        label.insert("insert", field)
        label.pack(side="left")

        if(required[i] == 1):
            label.tag_configure("star", foreground="red", font="Helvetica 13 bold")
            label.insert("end", "  *", "star")
        label.configure(state="disabled")

        if(i != ip_len-1):
            ent = tk.Entry(row, font="Helvetica 13", selectbackground="#90ceff")
            ent.pack(side="right", expand="true", fill="x", padx=10)
            entries.append((field, ent))
        else:
            menu_var.set("Image 1")
            choices = ["Image 1"]
            opt_menu = tk.OptionMenu(row, menu_var, *choices)
            opt_menu.pack(side="right", fill="x", expand="true", padx=10)
            opt_menu.configure(font="Helvetica 13", bg="#000000", fg="white", bd=0, highlightthickness=0, activebackground="#cccccc")
            menu = opt_menu.nametowidget(opt_menu.menuname)
            menu.configure(font="Helvetica 13", bg="white", activebackground="#000000", bd=0)

    # print(entries)

    tk.Button(scroll_frame, text="Register", command=lambda: register(entries, required, menu_var), font="Helvetica 13 bold",
           bg="#000000", fg="white", pady=10, padx=30, bd=0, highlightthickness=2,highlightbackground="black", activebackground="#cccccc",
           activeforeground="white").pack(pady=25)


# def showCriminalProfile(name):
#     top = tk.Toplevel(bg="#cccccc")
#     top.title("Criminal Profile")
#     top.geometry("1500x900+%d+%d"%(root.winfo_x()+10, root.winfo_y()+10))

#     tk.Label(top, text="Criminal Profile", fg="black", bg="#cccccc", font="Helvetica 20 bold", pady=10).pack()

#     content = tk.Frame(top, bg="#cccccc", pady=20)
#     content.pack(expand="true", fill="both")
#     content.grid_columnconfigure(0, weight=3, uniform="group1")
#     content.grid_columnconfigure(1, weight=5, uniform="group1")
#     content.grid_rowconfigure(0, weight=1)


#     (id, crim_data) = retrieveData(name)

#     path = os.path.join("profile_pics", "criminal %d.png"%id)
#     profile_img = cv2.imread(path)
#     # print(path)
#     profile_img = cv2.resize(profile_img, (500, 500))
#     img = cv2.cvtColor(profile_img, cv2.COLOR_BGR2RGB)
#     img = Image.fromarray(img)
#     img = ImageTk.PhotoImage(img)
#     img_label = tk.Label(content, image=img, bg="#cccccc")
#     img_label.image = img
#     img_label.grid(row=0, column=0)

#     info_frame = tk.Frame(content, bg="#cccccc")
#     info_frame.grid(row=0, column=1, sticky='w')

#     for i, item in enumerate(crim_data.items()):
#         tk.Label(info_frame, text=item[0], pady=15, fg="black", font="Helvetica 13 bold", bg="#cccccc").grid(row=i, column=0, sticky='w')
#         tk.Label(info_frame, text=":", fg="black", padx=50, font="Helvetica 13 bold", bg="#cccccc").grid(row=i, column=1)
#         val = "---" if (item[1]=="") else item[1]
#         tk.Label(info_frame, fg="black", font="Helvetica 15", bg="#cccccc").grid(row=i, column=2, sticky='w')


def startRecognition():
    global img_read, img_label

    if(img_label == None):
        messagebox.showerror("Error", "No image selected !! ")
        return

    crims_found_labels = []
    for wid in right_frame.winfo_children():
        wid.destroy()

    frame = cv2.flip(img_read, 1, 0)
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    face_coords = detect_faces(gray_frame)

    if (len(face_coords) == 0):
        messagebox.showerror("Error", "Image doesn't contain any face or face is not clear.")
    else:
        (model, names) = train_model()
        print('Training Successful.')
        print('Detecting Faces....')

        print('Thankyou for using this project.')
        (frame, recognized) = recognize_face(model, frame, gray_frame, face_coords, names)

        img_size = left_frame.winfo_height() - 40
        frame = cv2.flip(frame, 1, 0)
        showImage(frame, img_size)

        if (len(recognized) == 0):
            messagebox.showerror("Oops", "No criminal recognized.")
            return

        for i, crim in enumerate(recognized):
            crims_found_labels.append(tk.Label(right_frame, text=crim[0], bg="black",
                                            font="Helvetica 13 bold", pady=20))
            crims_found_labels[i].pack(fill="x", padx=20, pady=10)
            # crims_found_labels[i].bind("<Button-1>", lambda e, name=crim[0]:showCriminalProfile(name))
        

def selectImage():
    global left_frame, img_label, img_read
    for wid in right_frame.winfo_children():
        wid.destroy()

    filetype = [("images", "*.jpg *.jpeg *.png")]
    path = filedialog.askopenfilename(title="Choose a image", filetypes=filetype)

    if(len(path) > 0):
        img_read = cv2.imread(path)

        img_size =  left_frame.winfo_height() - 40
        showImage(img_read, img_size)
#---------------------------------------------------------------Login Function --------------------------------------


#-------------------------------------------------------------------------- End Login Window ---------------------------------------------------


## Detection Page ##
def getPage2():
    global active_page, left_frame, right_frame, img_label, heading
    img_label = None
    active_page = 2
    pages[2].lift()

    basicPageSetup(2)
    heading.configure(text="Detect Criminal",  highlightthickness=2,highlightbackground="black",fg="black" )
    right_frame.configure(text="Detected Criminals", highlightthickness=2,highlightbackground="black",fg="black")

    btn_grid = tk.Frame(left_frame, bg="#cccccc")
    btn_grid.pack()

    tk.Button(btn_grid, text="Select Image", command=selectImage, font="Helvetica 13 bold", padx=20, bg="#000000",
            fg="black", pady=10, bd=0, highlightthickness=2,highlightbackground="black", activebackground="#cccccc",
            activeforeground="black").grid(row=0, column=0, padx=25, pady=25)
    tk.Button(btn_grid, text="Recognize", command=startRecognition, font="Helvetica 13 bold", padx=20, bg="#000000",
           fg="black", pady=10, bd=0, highlightthickness=2,highlightbackground="black", activebackground="#cccccc",
           activeforeground="black").grid(row=0, column=1, padx=25, pady=25)


def videoLoop(path,model, names):
    p=path
    q=ntpath.basename(p)
    filenam, file_extension = os.path.splitext(q)
    # print(filename)
    global thread_event, left_frame, webcam, img_label
    start=time.time()
    webcam = cv2.VideoCapture(p)
    old_recognized = []
    crims_found_labels = []
    times = []
    img_label = None
    field=['S.No.', 'Name', 'Time']
    g=filenam+'.csv'
    # filename = "g.csv"
    filename = g
    # with open('people.csv', 'w', ) as csvfile:
    # peoplewriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
    # os.path.join(path, vid.split('.')[0]+'_'+str(count)+'.png'
    num=0
    try:
        # with open('people_Details.csv', 'w', ) as csvfile:
        with open(filename, 'w') as csvfile:
            # peoplewriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
            csvwriter = csv.writer(csvfile)
            csvwriter.writerow(field)   
            while not thread_event.is_set():
                
             
                # Loop until the camera is working
                
                    
                    while (True):
                        # Put the image from the webcam into 'frame'
                        (return_val, frame) = webcam.read()
                        if (return_val == True):
                            break
                        # else:
                        #     print("Failed to open webcam. Trying again...")

                    # Flip the image (optional)
                    frame = cv2.flip(frame, 1, 0)
                    # Convert frame to grayscale
                    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

                    # Detect Faces
                    face_coords = detect_faces(gray_frame)
                    (frame, recognized) = recognize_face(model, frame, gray_frame, face_coords, names)

                    # Recognize Faces
                    recog_names = [item[0] for item in recognized]
                    if(recog_names != old_recognized):
                        for wid in right_frame.winfo_children():
                            wid.destroy()
                        del(crims_found_labels[:])

                        for i, crim in enumerate(recognized):
                            num+=1
                            x=time.time()-start
                            crims_found_labels.append(tk.Label(right_frame, text=crim[0], bg="orange",
                                                            font="Helvetica 13 bold", pady=20))
                            crims_found_labels[i].pack(fill="x", padx=20, pady=10)
                            # crims_found_labels[i].bind("<Button-1>", lambda e, name=crim[0]: showCriminalProfile(name))
                            y=crim[0]
                            print(x,y)
                            arr = [num,y,x]
                            # peoplewriter.writerow(arr)
                            csvwriter.writerow(arr)  
                            
                            # print('hello')
                        old_recognized = recog_names

                    # Display Video stream
                    img_size = min(left_frame.winfo_width(), left_frame.winfo_height()) - 20

                    showImage(frame, img_size)

    except RuntimeError:
        print("[INFO]Caught Runtime Error")
    except tk.TclError:
        print("[INFO]Caught Tcl Error")


# video Observation Page ##
def getPage4(path):
    p=path
    # print(p)
    global active_page, video_loop, left_frame, right_frame, thread_event, heading
    active_page = 4
    pages[4].lift()

    basicPageSetup(4)
    heading.configure(text="Video Observation", fg="black")
    right_frame.configure(text="Detected Criminals",highlightthickness=2,highlightbackground="black", fg="black")
    left_frame.configure(pady=40)

    btn_grid = tk.Frame(right_frame,bg="#cccccc")
    btn_grid.pack()

    (model, names) = train_model()
    print('Training Successful. Detecting Faces')

    thread_event = threading.Event()
    thread = threading.Thread(target=videoLoop, args=(p,model, names))
    thread.start()

def getPage3():
    global active_page, video_loop, left_frame, right_frame, thread_event, heading
    active_page = 3
    pages[3].lift()

    basicPageSetup(3)
    heading.configure(text="Video Observation", padx=20, pady=10, fg='black', highlightthickness=2,highlightbackground="black")

    btn_grid = tk.Frame(left_frame,bg="#cccccc")
    btn_grid.pack()

    tk.Button(btn_grid, text="Select Video", command=selectvideo, font="Helvetica 13 bold", padx=20, bg="#000000",
                fg="black", pady=10, bd=0, highlightthickness=2,highlightbackground="black", activebackground="#cccccc",
                activeforeground="black").grid(row=0, column=0, padx=25, pady=25)

def selectvideo():
    global left_frame, img_label, img_read
    for wid in right_frame.winfo_children():
        wid.destroy()

    filetype = [("video", "*.mp4 *.mkv")]
    path = filedialog.askopenfilename(title="Select a video", filetypes=filetype)
    p=''
    p=path
    
    if(len(path) > 0):
        # vid_read = cv2.imread(path)
        # print(vid_read)
        getPage4(p)
        # img_read = cv2.imread(path)

    #     img_size =  left_frame.winfo_height() - 40
    #     showImage(img_read, img_size)



######################################## Home Page ####################################
tk.Label(pages[0], text="Welcome to the Face Recognition System for Criminal Detection", highlightbackground="black", highlightthickness=4, fg="black", bg="#cccccc",
      font="Helvetica 25 bold", pady=10).pack(padx=50, pady=20)

logo = tk.PhotoImage(file = "logo1.png")
tk.Label(pages[0], image=logo, bg="#cccccc").pack(side='top', padx=20, pady=30)

btn_frame = tk.Frame(pages[0], bg="#cccccc", pady=30, )
btn_frame.pack()

# b0 = Button(btn_frame, text="Login/Sign-up", command=login)
b1 = tk.Button(btn_frame, text="1. Register Criminal",foreground="#000000", highlightthickness=2, command=getPage1)
b2 = tk.Button(btn_frame, text="2. Image Observation", command=getPage2)
# b3 = Button(btn_frame, text="3. Input Video", command=selectvideo1)
b4 = tk.Button(btn_frame, text="3. Video Observation", command=getPage3)
# b0.pack()
b1.pack()
b2.pack()
# b3.pack()
b4.pack()
tk.Label(pages[0], text="Project made for Microsoft Engage'22 Face-recognition Challenge with love ", highlightbackground="black", highlightthickness=4,fg="black", bg="#cccccc",
      font="Helvetica 25 bold", pady=10).pack()

for btn in btn_frame.winfo_children():
    btn.configure(font="Helvetica 20 bold", width=17, bg="#000000", fg="black",
        pady=15, bd=0, highlightthickness=4, activebackground="#cccccc")
    btn.pack(pady=30)
 

pages[0].lift()
root.mainloop()






I am using mac and trying to export my all files in the main python file to convert them into an executable file but my program is crashing with this error zsh: segmentation fault python3 home.py sometimes its also gives me errors like zsh: trace trap python3 home.py and bus error. if I run these files individually all files are running but when I imported all these files into the main file it's crashing. How can I solve this error??

Thankyou

Mansi mishra
  • 442
  • 1
  • 5
  • 11

1 Answers1

1
import faulthandler
faulthandler.enable()

you can add this in the start of the file and give it a try. It will give you the exact trace to from where the segmentation fault is coming.

for me it works for some more time but again crashed..

Mansi mishra
  • 442
  • 1
  • 5
  • 11