Skip to content

Instantly share code, notes, and snippets.

@niradler
Last active December 12, 2024 14:22
Show Gist options
  • Save niradler/19de14362e6262a29932e826bbaa2c64 to your computer and use it in GitHub Desktop.
Save niradler/19de14362e6262a29932e826bbaa2c64 to your computer and use it in GitHub Desktop.
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()
@niradler
Copy link
Author

ImageTagger: A simple GUI application for tagging images as containing a drone or not.

Features:

  • Select a folder containing images.
  • Display images one by one.
  • Tag images as "Yes" or "No" based on whether a drone is recognized.
  • Automatically move tagged images to corresponding subfolders.

Usage:

  1. Run the script.
  2. Click "Select Image Folder" to choose a folder containing images.
  3. Use the "Yes" and "No" buttons or press 'y' and 'n' keys to tag images.
  4. Tagged images will be moved to subfolders within the selected folder:
    • "yes_positive" for images tagged "Yes" containing 'DRONE' in the filename.
    • "no_positive" for images tagged "No" containing 'DRONE' in the filename.
    • "yes_negative" for images tagged "Yes" without 'DRONE' in the filename.
    • "no_negative" for images tagged "No" without 'DRONE' in the filename.
  5. Click "Exit" to close the application.

Dependencies:

  • Python 3.x
  • tkinter
  • PIL (Pillow)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment