From 8d203a00695c190964226f58044c2fd87af8df0e Mon Sep 17 00:00:00 2001 From: skylights <51323448+SKYLIGHTSUFA@users.noreply.github.com> Date: Sat, 30 Mar 2024 06:46:09 +0300 Subject: [PATCH] add app files --- notebooks/app/FDJ.jpg | Bin 0 -> 25036 bytes notebooks/app/FastMtcnn.py | 79 ++++++++++++ notebooks/app/PredictServer.py | 117 ++++++++++++++++++ notebooks/app/Predict_photo.py | 88 +++++++++++++ notebooks/app/Predict_video.py | 87 +++++++++++++ notebooks/app/Start.py | 19 +++ .../app/__pycache__/FastMtcnn.cpython-310.pyc | Bin 0 -> 3464 bytes .../__pycache__/PredictServer.cpython-310.pyc | Bin 0 -> 4293 bytes .../__pycache__/Predict_photo.cpython-310.pyc | Bin 0 -> 4042 bytes .../__pycache__/Predict_video.cpython-310.pyc | Bin 0 -> 3482 bytes .../app/__pycache__/Start.cpython-310.pyc | Bin 0 -> 981 bytes notebooks/app/main.py | 23 ++++ 12 files changed, 413 insertions(+) create mode 100644 notebooks/app/FDJ.jpg create mode 100644 notebooks/app/FastMtcnn.py create mode 100644 notebooks/app/PredictServer.py create mode 100644 notebooks/app/Predict_photo.py create mode 100644 notebooks/app/Predict_video.py create mode 100644 notebooks/app/Start.py create mode 100644 notebooks/app/__pycache__/FastMtcnn.cpython-310.pyc create mode 100644 notebooks/app/__pycache__/PredictServer.cpython-310.pyc create mode 100644 notebooks/app/__pycache__/Predict_photo.cpython-310.pyc create mode 100644 notebooks/app/__pycache__/Predict_video.cpython-310.pyc create mode 100644 notebooks/app/__pycache__/Start.cpython-310.pyc create mode 100644 notebooks/app/main.py diff --git a/notebooks/app/FDJ.jpg b/notebooks/app/FDJ.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ace1b2d8d20a8b02d398772212948bcb2782af4a GIT binary patch literal 25036 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 3: + f.write(data) + break + if not data: + f.write(data) + break + break + #break + + f.write(data) + + break + + #break + + print("break") + break + if self.counter > 0: + self.label.destroy() + self.counter+=1 + filename = 'FDJ.jpg' + dicter3 = {} + if filename.endswith("png") or filename.endswith("jpg"): + print(filename) + img = cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2RGB) + img = cv2.resize(img, (1080, 720)) + detections = self.detector.detect_faces(img) + if len(detections) > 1: + print("AAAAAAAAA") + for detection in detections: + confidence = detection["confidence"]# + if confidence > 0.9: + x, y, w, h = detection["box"] + detected_face = img[int(y):int(y + h), int(x):int(x + w)]## + image = cv2.rectangle(img, (int(x), int(y)), (int(x+w), int(y+h)), (255, 0, 0), 2) + embedding = DeepFace.represent(detected_face, model_name='Facenet', enforce_detection=False) + ebd = embedding[0]["embedding"] + dicter3[1] = ebd + data_usa = pd.DataFrame.from_dict(dicter3.items()) + data_usa.rename(columns={0: "id", 1: "embd"}, inplace=True, errors="ignore") + new_cols = pd.DataFrame(data_usa['embd'].apply(pd.Series)) + df_usa = pd.concat([data_usa, new_cols], axis=1) + df_usa.drop(["embd"], axis=1, inplace=True, errors="ignore") + #df_usa["id"] = df_usa["id"].apply(lambda x: str(x)[:str(x).find("_")]) + y, X = df_usa["id"], df_usa.drop(["id"], axis=1) + result = self.catboost_model_usa.predict(X) + index_usa = result[0][0] + print(result) + string = self.name_usa[result[0][0]] + encoded_string = string.encode('utf-8') # Кодируем строку в UTF-8 + binary_representation = ''.join(format(byte, '08b') for byte in encoded_string) + con.send(binary_representation.encode('utf-8')) + con.close() + print(self.name_usa[result[0][0]]) + for images in os.listdir(f'C://Users//fatik//PycharmProjects//UfaHack2024//data//actors_usa//{index_usa}'): + image_usa = cv2.imread(os.path.join(f'C://Users//fatik//PycharmProjects//UfaHack2024//data//actors_usa//{index_usa}', images)) + break + image[0:128, 0:128] = cv2.resize(cv2.cvtColor(image_usa, cv2.COLOR_BGR2RGB), (128,128)) + #print(np.argmax(result[0], axis=0)) + #print(len(result[0])) + self.image = Image.fromarray(image) + self.image_tk = ctk.CTkImage(self.image, size=(self.image.width, self.image.height)) + self.label = ctk.CTkLabel(self, image=self.image_tk, text=self.name_usa[result[0][0]], text_color="red") + self.label.grid(row=3, column=0, pady=10, sticky="ew") diff --git a/notebooks/app/Predict_photo.py b/notebooks/app/Predict_photo.py new file mode 100644 index 0000000..21990b6 --- /dev/null +++ b/notebooks/app/Predict_photo.py @@ -0,0 +1,88 @@ +import pickle +import customtkinter as ctk +import os +import cv2 +from PIL import Image +from deepface import DeepFace +from mtcnn import MTCNN +from catboost import CatBoostClassifier +import pandas as pd + + +class Predict(ctk.CTkFrame): + def __init__(self, master): + super().__init__(master) + self.counter = 0 + self.storage_name: str + self.grid_columnconfigure(0, weight=1) + self.detector = MTCNN() + self.catboost_model_usa = CatBoostClassifier() + self.catboost_model_usa.load_model("../catboost_usa.cbm") + self.catboost_model_ussr = CatBoostClassifier() + self.catboost_model_ussr.load_model("../catboost_ussr.cbm") + with open('../model/saved_dictionary.pkl', 'rb') as f: + self.name_usa = pickle.load(f) + with open('../model/saved_dictionary_russia.pkl', 'rb') as f: + self.name_ussr = pickle.load(f) + self.label = ctk.CTkLabel(self, text="Photo", fg_color="blue", text_color="white") + self.label.grid(row=0, column=0, sticky="ew") + self.button_get_dir = ctk.CTkButton(self, text="Choose folder", command=self.__open_file_dialog) + self.button_get_dir.grid(row=1, column=0, pady=10, sticky="ew") + self.button_start_predict = ctk.CTkButton(self, text="Start predict", command=self.__start_predict) + self.button_start_predict.grid(row=2, column=0, pady=10, sticky="ew") + + def __open_file_dialog(self): + root = ctk.CTk() + root.withdraw() + file_path = ctk.filedialog.askdirectory(title='Choose image dataset') + if file_path != '': + root.destroy() + self.storage_name = file_path + self.iterator = iter(os.listdir(self.storage_name)) + return file_path + + def __start_predict(self): + if self.counter > 0: + self.label.destroy() + self.counter+=1 + filename = next(self.iterator) + dicter3 = {} + if filename.endswith("png") or filename.endswith("jpg"): + print(filename) + img = cv2.cvtColor(cv2.imread(os.path.join(self.storage_name, filename)), cv2.COLOR_BGR2RGB) + img = cv2.resize(img, (1080, 720)) + detections = self.detector.detect_faces(img) + if len(detections) > 1: + print(f'len detection = {len(detections)}') + for detection in detections: + confidence = detection["confidence"]# + if confidence > 0.9: + x, y, w, h = detection["box"] + detected_face = img[int(y):int(y + h), int(x):int(x + w)]## + image = cv2.rectangle(img, (int(x), int(y)), (int(x+w), int(y+h)), (255, 0, 0), 2) + embedding = DeepFace.represent(detected_face, model_name='Facenet', enforce_detection=False) + ebd = embedding[0]["embedding"] + dicter3[1] = ebd + data_usa = pd.DataFrame.from_dict(dicter3.items()) + data_usa.rename(columns={0: "id", 1: "embd"}, inplace=True, errors="ignore") + new_cols = pd.DataFrame(data_usa['embd'].apply(pd.Series)) + df_usa = pd.concat([data_usa, new_cols], axis=1) + df_usa.drop(["embd"], axis=1, inplace=True, errors="ignore") + X = df_usa.drop(["id"], axis=1) + result = self.catboost_model_usa.predict(X) + result_ussr = self.catboost_model_ussr.predict(X) + index_usa = result[0][0] + index_ussr = result_ussr[0][0] + for images in os.listdir(f'C://Users//fatik//PycharmProjects//UfaHack2024//data//actors_usa//{index_usa}'): + image_usa = cv2.imread(os.path.join(f'C://Users//fatik//PycharmProjects//UfaHack2024//data//actors_usa//{index_usa}', images)) + break + for images in os.listdir(f'C://Users//fatik//PycharmProjects//UfaHack2024//data//actors_ussr_russia//{index_ussr}'): + image_ussr = cv2.imread(os.path.join(f'C://Users//fatik//PycharmProjects//UfaHack2024//data//actors_ussr_russia//{index_ussr}', images)) + break + image[0:128, 0:128] = cv2.resize(cv2.cvtColor(image_usa, cv2.COLOR_BGR2RGB), (128,128)) + image[0:128, 138:266] = cv2.resize(cv2.cvtColor(image_ussr, cv2.COLOR_BGR2RGB), (128,128)) + self.image = Image.fromarray(image) + self.image_tk = ctk.CTkImage(self.image, size=(self.image.width, self.image.height)) + self.label = ctk.CTkLabel(self, image=self.image_tk, text=self.name_usa[result[0][0]], text_color="red") + self.label.grid(row=3, column=0, pady=10, sticky="ew") + diff --git a/notebooks/app/Predict_video.py b/notebooks/app/Predict_video.py new file mode 100644 index 0000000..93bda6d --- /dev/null +++ b/notebooks/app/Predict_video.py @@ -0,0 +1,87 @@ +import pickle +import customtkinter as ctk +import os +from mtcnn import MTCNN +from catboost import CatBoostClassifier +from facenet_pytorch import MTCNN +from PIL import Image +import torch +import cv2 +import time +from FastMtcnn import FastMTCNN +import threading + +device = 'cuda' if torch.cuda.is_available() else 'cpu' + + +class PredictV(ctk.CTkFrame): + def __init__(self, master): + super().__init__(master) + self.counter = 0 + self.storage_name: str + self.grid_columnconfigure(0, weight=1) + self.detector = MTCNN() + self.catboost_model_usa = CatBoostClassifier() + self.catboost_model_usa.load_model("../catboost_usa.cbm") + self.fast_mtcnn = FastMTCNN( + stride=32, + resize=1, + margin=14, + factor=0.6, + keep_all=True, + device=device + ) + self.catboost_model_usa.load_model("../catboost_usa.cbm") + with open('../model/saved_dictionary.pkl', 'rb') as f: + self.name_usa = pickle.load(f) + self.label = ctk.CTkLabel(self, text="Video", fg_color="blue", text_color="white") + self.label.grid(row=0, column=0, sticky="ew") + self.button_start_predict = ctk.CTkButton(self, text="Start predict", command=self.run_detection) + self.button_start_predict.grid(row=1, column=0, pady=10, sticky="ew") + + def __open_file_dialog(self): + root = ctk.CTk() + root.withdraw() + file_path = ctk.filedialog.askdirectory(title='Choose image dataset') + if file_path != '': + root.destroy() + self.storage_name = file_path + self.iterator = iter(os.listdir(self.storage_name)) + return file_path + + def run_detection(self): + frames = [] + batch_size = 256 + cap = cv2.VideoCapture(0) + self.image_usa = cv2.resize(cap.read()[1], (1080, 720)) + while True: + frame = cv2.resize(cap.read()[1], (1080, 720)) + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + frames.append(frame) + im_h = cv2.hconcat([frame, self.image_usa]) + cv2.imshow("tester", im_h) + if cv2.waitKey(1) == 27: + break + + if len(frames) >= batch_size: + index_usa = self.fast_mtcnn(frames) + frames = [] + def set_image_all(index_usa): + print(index_usa) + for images in os.listdir( + f'C://Users//fatik//PycharmProjects//UfaHack2024//data//actors_usa//{index_usa}'): + self.image_usa = cv2.imread( + os.path.join(f'C://Users//fatik//PycharmProjects//UfaHack2024//data//actors_usa//{index_usa}', images)) + self.image_usa = cv2.resize(self.image_usa, (1080, 720)) + break + def set_image(): + self.image = Image.fromarray(self.image_usa) + self.image_tk = ctk.CTkImage(self.image, size=(self.image.width, self.image.height)) + self.label_image = ctk.CTkLabel(self, image=self.image_tk, text=self.name_usa[index_usa], text_color="red") + self.label_image.grid(row=2, column=0, pady=10, sticky="ew") + thread = threading.Thread(target=set_image) + thread.start() + + target1 = threading.Thread(target=set_image_all, args=(index_usa,)) + target1.start() + diff --git a/notebooks/app/Start.py b/notebooks/app/Start.py new file mode 100644 index 0000000..e98bac2 --- /dev/null +++ b/notebooks/app/Start.py @@ -0,0 +1,19 @@ +import customtkinter +from Predict_photo import Predict +from Predict_video import PredictV + + +class Start(customtkinter.CTk): + def __init__(self): + super().__init__() + customtkinter.set_appearance_mode("dark") + self.title("Face recognition system") + self.grid_columnconfigure(0, weight=1) + self.grid_columnconfigure(1, weight=1) + self.grid_rowconfigure(0, weight=1) + self.grid_rowconfigure(1, weight=1) + self.grid_rowconfigure(2, weight=1) + self.predict = Predict(self) + self.predict.grid(row=0, column=0, sticky="nswe", pady=5) + self.video= PredictV(self) + self.video.grid(row=0, column=1, sticky="nsew", pady=5) diff --git a/notebooks/app/__pycache__/FastMtcnn.cpython-310.pyc b/notebooks/app/__pycache__/FastMtcnn.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..caa296b334472bbc907e3c51b30544eb123a4a53 GIT binary patch literal 3464 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 literal 0 HcmV?d00001 diff --git a/notebooks/app/__pycache__/Predict_video.cpython-310.pyc b/notebooks/app/__pycache__/Predict_video.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b59f922c070f3a261863dd55edc21efae52ce4a8 GIT binary patch literal 3482 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 literal 0 HcmV?d00001 diff --git a/notebooks/app/__pycache__/Start.cpython-310.pyc b/notebooks/app/__pycache__/Start.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9144074a83e9da1652b29a762bcbc23a7a9b1f8b GIT binary patch literal 981 zcmZ8g%We}f6t(BwG^qqcZ5J%M%?2TaSRjNzm4H=Msg%WNB+J-NI+=$D+aXGoT`P6f ze`qB({TV*MTUPl6R$R}dC1A^U&h_~u!1WGYSsdt6Om}Bl;CaHgg0+a?2*tg+{p~^74;qPz+%Z1TDKp1p^ZtyL_ z$aptC$F~@xCAtZ?*P&_1eOLE2bhCuI0sqyae{9izHmA3KCSIZoyhJ2{2+4E{ynG(> zgl}B~FQ&J)Zi98ZwFbO*Z{-MD**;1GPE~Qf_kl8TpaheXIybqj5A;GCQ7PBg$_XGZ znu~mLW>#=xz(lR*Vih_|V0|U$He#}zRdpI^le1!x1`Xv43+Kdq)VHCYHA2~hkQ_1) zVh3!djjT+O*G8!Hi57;?rV&)pnh8=#E^KIWQwlqrsGO57Jd^b}pUjl7kJ??x{II3k z%HpQGZX37*%H2pBe$Tm(&_kd_IljYoix5^)tqHk9zuzCe&Q7&ZIvZ1y7uoTGol#XC zD>)U+=dyLR!bwkN?GU(ip|=G@T^&=0c43`>3tAA?B>qH?BOBk`}lmP zJAco?D0F<(v=YEakGP&^rNezfzRhUaS=!ikur8R1vLr<9LYhtt9olok{Wb0lY6lWD z#O=-~Ry&}lgZ0xV&6zZ^qv~O=rKh9HKm1&@jvG1JY%YgQ-gHI2b#Fo^ZK6Kz<6Zv` Dd4KZT literal 0 HcmV?d00001 diff --git a/notebooks/app/main.py b/notebooks/app/main.py new file mode 100644 index 0000000..e030523 --- /dev/null +++ b/notebooks/app/main.py @@ -0,0 +1,23 @@ +from tkinter import messagebox +from Start import Start +import platform + + +def on_closing(): + if messagebox.askokcancel("Подтверждение закрытия", "Вы уверены, что хотите закрыть приложение?"): + app.destroy() + + +app = Start() +app.geometry(f"{app.winfo_screenwidth()}x{app.winfo_screenheight()}") +app.protocol("WM_DELETE_WINDOW", on_closing) +app.mainloop() + +system = platform.system() +if system == "Windows": + app.after(0, lambda: app.state('zoomed')) +elif system == "Linux": + app.attributes("-fullscreen", True) +app.bind("", lambda event: app.attributes("-fullscreen", + not app.attributes("-fullscreen"))) +app.bind("", lambda event: app.attributes("-fullscreen", False))