'zsh: segmentation fault python3 home.py

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



Solution 1:[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..

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Mansi mishra