Рубрики
Без рубрики

Усовершенствованное распознавание лица с Python

Представьте, что у нас есть тысячи изображений в папке, и мы хотим удалить все изображения, где … Tag с Python, ShowDev, Productivity, MachineLearning.

Представьте, что у нас есть тысячи изображений внутри папки, и мы хотим удалить все изображения, где появляется конкретный человек. Этот процесс может занять часы или даже дни, и именно здесь этот сценарий.

Программа работает простым способом, вам нужно загрузить папку и выбрать изображение человека, после этого скрипт найдет все изображения, связанные с этим человеком, и удалить его.

Это набор данных: https://www.kaggle.com/anku5hk/5-face-dataset

Давайте прыгнем к коду!

Сначала нам нужно импортировать зависимости

import tkinter as tk
from threading import Thread
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import askdirectory
from PIL import ImageTk, Image
from tkinter.ttk import Progressbar
from tkinter import messagebox
import face_recognition
import os

Я использую Распознавание лица. Признайте и манипулируйте лицами из Python или из командной строки с самой простой в мире библиотекой распознавания лица. Построен с помощью dlib Современное распознавание лица, построенное с глубоким обучением.

Поскольку это графический интерфейс, мы используем tkinter :

class FaceApp(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.geometry("900x800")
        self.resizable(True, True)
        self.title('Bulker')
        row = tk.Frame(self)
        lab = tk.Label(row, width=5, text="Image : ", anchor='w')
        self._file_field = tk.Entry(row)
        self._file_open_btn = tk.Button(row, text='Find',
                                        command=lambda: self.load_file())
        row1 = tk.Frame(self)
        lab1 = tk.Label(row1, width=5, text="Folder : ", anchor='w')
        self._folder_field = tk.Entry(row1)
        self._folder_open_btn = tk.Button(row1, text='Open',
                                          command=lambda: self.load_folder())

        self._image_panel = tk.Frame(self)

        bottom_row = tk.Frame(self)
        self._start_btn = tk.Button(bottom_row, text='Start',
                                    command=lambda: self.run_process())
        self._progress = Progressbar(bottom_row, orient=tk.HORIZONTAL, length=500, mode='determinate')

        lab.pack(side=tk.LEFT, padx=30)
        self._file_field.pack(side=tk.LEFT, ipadx=250)
        self._file_open_btn.pack(side=tk.LEFT, ipadx=10, padx=10)
        row.pack(side=tk.TOP, fill=tk.X, padx=10, pady=8)

        lab1.pack(side=tk.LEFT, padx=30)
        self._folder_field.pack(side=tk.LEFT, ipadx=250)
        self._folder_open_btn.pack(side=tk.LEFT, ipadx=10, padx=10)
        row1.pack(side=tk.TOP, fill=tk.X, padx=10, pady=8)

        self._image_panel.pack(side=tk.TOP, fill=tk.X, padx=10, pady=8)

        self._start_btn.pack(side=tk.BOTTOM, ipadx=10, padx=10)
        self._progress.pack(side=tk.BOTTOM, pady=5)
        bottom_row.pack(side=tk.TOP, fill=tk.X, padx=10, pady=8)

Наш графический интерфейс выглядит так:

После этого мы определяем наш load_file , load_folder с опцией удалить текущее значение:

def load_file(self):
        filename = askopenfilename()
        self._file_field.delete(0, tk.END)  
        self._file_field.insert(0, filename)
        for widget in self._image_panel.winfo_children():
            widget.destroy()

        img = ImageTk.PhotoImage(Image.open(filename))
        panel = tk.Label(self._image_panel, image=img)
        panel.img = img
        panel.pack(side="bottom", fill="both", expand="yes")

    def load_folder(self):
        filename = askdirectory()
        self._folder_field.delete(0, tk.END)  
        self._folder_field.insert(0, filename)

Далее мы можем определить start_process и run_process :

 def start_process(self):
        ref_path = self._file_field.get()
        folder_path = self._folder_field.get()
        self.find_and_delete(folder_path, ref_path)

    def run_process(self):
        self._run_task = True
        t = Thread(target=self.start_process)
        t.start()

Затем начнется фактический процесс, нам нужно найти и удалить лицо (изображения):

def find_and_delete(self, directory, ref_image_path):
        ref_face = self.get_ref_face(ref_image_path)
        if ref_face is None:
            messagebox.showinfo("Error", "Can't find a face. Reference Image quality is not enough")
            return
        files = os.listdir(directory)
        i = 1
        for filename in files:
            try:
                percentage = int((i / len(files)) * 100)
                self._progress['value'] = percentage
                self.update_idletasks()
                i += 1
                file_path = os.path.join(directory, filename)
                if self.is_user_in_image(ref_face, file_path):
                    os.remove(file_path)
                    print(filename, 'deleted.')
            except:
                print('Error reading file', filename)
        messagebox.showinfo("Information", "Process Finished")

    def get_ref_face(self, ref_image_path):
        try:
            ref_image = face_recognition.load_image_file(ref_image_path)
            ref_face = face_recognition.face_encodings(ref_image)[0]
            return ref_face
        except:
            return None


    def is_user_in_image(self, ref_face, image_path):
        unknown_picture = face_recognition.load_image_file(image_path)
        unknown_faces = face_recognition.face_encodings(unknown_picture)

        for unknown_face in unknown_faces:
            results = face_recognition.compare_faces([ref_face], unknown_face)
            if results[0]:
                return True

        return False


if __name__ == "__main__":
    app = FaceApp()
    app.mainloop()

Данные тестирования:

Программа найдет все изображения Билла Гейтса и удаляет их.

Полный код: Булькер

Если кто -то хочет быть частью этого проекта, не стесняйтесь говорить мне. Сценарий должен быть быстрым и иметь лучшую точность. Вы все более чем приветствуются.

Оригинал: “https://dev.to/stokry/advanced-face-recognition-with-python-261l”