Last active
December 12, 2024 14:22
-
-
Save niradler/19de14362e6262a29932e826bbaa2c64 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import shutil | |
import tkinter as tk | |
from tkinter import messagebox, filedialog | |
from PIL import Image, ImageTk | |
class ImageTagger: | |
def __init__(self, root): | |
self.root = root | |
self.image_folder = None | |
self.yes_positive = None | |
self.no_positive = None | |
self.yes_negative = None | |
self.no_negative = None | |
self.current_image_path = None | |
self.image_files = [] | |
self.current_image_index = 0 | |
self.root.title("Image Tagger") | |
self.root.geometry("800x600") | |
self.select_folder_button = tk.Button( | |
root, text="Select Image Folder", command=self.select_folder) | |
self.select_folder_button.pack(pady=20) | |
self.image_label = tk.Label(root) | |
self.image_label.pack() | |
self.image_path_label = tk.Label(root, text="") | |
self.image_path_label.pack() | |
self.question_label = tk.Label( | |
root, text="Do you recognize a drone in the image? (Press 'y' for Yes, 'n' for No)") | |
self.question_label.pack(pady=10) | |
self.button_frame = tk.Frame(root) | |
self.button_frame.pack(pady=10) | |
self.yes_button = tk.Button(self.button_frame, text="Yes", command=self.yes) | |
self.yes_button.pack(side=tk.LEFT, padx=20) | |
self.no_button = tk.Button(self.button_frame, text="No", command=self.no) | |
self.no_button.pack(side=tk.LEFT, padx=20) | |
self.exit_button = tk.Button(self.button_frame, text="Exit", command=root.quit) | |
self.exit_button.pack(side=tk.LEFT, padx=20) | |
self.root.bind('<y>', lambda event: self.yes()) | |
self.root.bind('<n>', lambda event: self.no()) | |
def select_folder(self): | |
self.image_folder = filedialog.askdirectory() | |
if self.image_folder: | |
self.select_folder_button.pack_forget() | |
self.yes_positive = os.path.join(self.image_folder, "yes_positive") | |
self.no_positive = os.path.join(self.image_folder, "no_positive") | |
self.yes_negative = os.path.join(self.image_folder, "yes_negative") | |
self.no_negative = os.path.join(self.image_folder, "no_negative") | |
for folder in [self.yes_positive, self.no_positive, self.yes_negative, self.no_negative]: | |
if not os.path.exists(folder): | |
os.makedirs(folder) | |
self.image_files = [f for f in os.listdir( | |
self.image_folder) if f.lower().endswith(('png'))] | |
self.current_image_index = 0 | |
self.show_image() | |
else: | |
messagebox.showwarning("Warning", "No folder selected. Please select a folder to proceed.") | |
def show_image(self): | |
if self.current_image_index < len(self.image_files): | |
image_path = os.path.join( | |
self.image_folder, self.image_files[self.current_image_index]) | |
self.current_image_path = image_path | |
image = Image.open(image_path) | |
image = image.resize((600, 400), Image.LANCZOS) | |
photo = ImageTk.PhotoImage(image) | |
self.image_label.config(image=photo) | |
self.image_label.image = photo | |
self.image_path_label.config(text=image_path) | |
else: | |
messagebox.showinfo("Info", "No more images to tag.") | |
self.root.quit() | |
def yes(self): | |
if 'DRONE' in self.current_image_path: | |
self.move_image(self.yes_positive) | |
else: | |
self.move_image(self.yes_negative) | |
self.next_image() | |
def no(self): | |
if 'DRONE' in self.current_image_path: | |
self.move_image(self.no_positive) | |
else: | |
self.move_image(self.no_negative) | |
self.next_image() | |
def move_image(self, target_folder): | |
image_path = os.path.join( | |
self.image_folder, self.image_files[self.current_image_index]) | |
shutil.move(image_path, target_folder) | |
def next_image(self): | |
self.current_image_index += 1 | |
self.show_image() | |
if __name__ == "__main__": | |
root = tk.Tk() | |
app = ImageTagger(root) | |
root.mainloop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
ImageTagger: A simple GUI application for tagging images as containing a drone or not.
Features:
Usage:
Dependencies: