Вопрос или проблема
У меня есть большое количество изображений, которые мне нужно классифицировать для обучения алгоритма кластеризации, и я хотел бы сделать это офлайн (данные являются собственностью). По сути, я хотел бы создать настольный инструмент для опросов, который позволит мне быстро разместить каждое изображение в одну или две категории. В идеале инструмент должен:
- Искать изображение в заранее указанной папке на рабочем столе;
- Отображать изображение и статический список категорий, позволяя мне кликнуть на одну;
- При нажатии зафиксировать категорию, связанную с изображением;
- Сохранять имя файла изображения и соответствующую категорию в набор данных где-то;
- Отображать следующее непромаркированное изображение в папке и повторять процесс.
Есть ли простой способ создать такой инструмент на Python или какой-либо другой готовый утилите, которую я мог бы использовать бесплатно офлайн?
Я создал код, который удовлетворяет 5 вашим требованиям, он доступен на GitHub как image-sorter2. В отличие от других предложенных скриптов, image-sorter2 полностью бесплатен, и вам не нужно тратить время на рисование ограничивающих рамок – скрипт просто открывает графический интерфейс, вы кликаете на одну из нескольких кнопок, и каждое изображение сортируется в желаемую папку-класс, например “кошки”, “собаки”, “грузовики” и т.д.
Я бы рекомендовал создать собственное веб-приложение с поддержкой базы данных, так как у вас есть собственные данные и всего (лишь два?) класса. Я бы создал таблицы для изображений, пользователей и меток.
пользователь: (id, имя)
изображение: (id, url)
метка: (user.id, image.id, время, класс)
Класс метки может быть перечислением. Если вы не хотите, чтобы пользователи оценивали одно и то же изображение несколько раз, вы можете убрать столбец времени и установить первые два столбца ID в качестве составного первичного ключа.
Если вы никогда не имели дела с веб-приложениями и базами данных, это может показаться сложным, но это легко, как только вы освоитесь. Вот учебник. Преимущества этого подхода – это сохранность; вы можете выключить компьютер и продолжить с места, где остановились, благодаря базе данных.
Проще всего собрать все ваши данные за одну сессию, используя компоненты GUI, такие как ipywidgets для jupyter, и записать метки в файл. При этом подходе у вас не будет сохранности.
Одним замечательным онлайн-сервисом является Dataturks. У него супер удобный UX и легко использовать. Также поддерживает ваши приватные данные в нашей внутренней облачной системе.
Также поддерживает многоугольники, сегментацию и т.д.
Вот демонстрация, которую вы можете попробовать (без необходимости регистрации):
Демонстрация классификации изображений
П.С.: Поскольку браузеры не могут напрямую получать доступ к файлам на вашем локальном диске, вам может понадобиться запустить пустой веб-сервер, чтобы получить локальные URL для файлов.
Вы можете использовать этот сайт: https://zabop.github.io/image-url-sorter/.
Он позволяет вам сортировать URL на 3 категории. Вы можете нажимать кнопки или просто нажимать 1, 2 или 3 на вашей клавиатуре. Следующее изображение автоматически загружается.
Ответ или решение
Создание инструмента для ручной классификации изображений
Работа с большими объемами изображений требует эффективных и интуитивно понятных решений для их классификации, особенно когда данные являются конфиденциальными и не могут быть загружены в облачные сервисы. В данном руководстве мы рассмотрим, как создать десктопный инструмент на Python для ручной классификации изображений, который будет соответствовать всем вашим требованиям.
Функциональные требования:
- Поиск изображений: Инструмент должен уметь искать изображения в заранее заданной папке на компьютере.
- Отображение изображений и категорий: Интерфейс должен показывать текущее изображение и статический список категорий для выбора.
- Запись выбранной категории: После выбора категории, необходимо зафиксировать ассоциацию между изображением и категорией.
- Хранение данных: Информация о названии файла изображения и соответствующей категории должна сохраняться в наборе данных.
- Переключение на следующее изображение: После классификации текущего изображения, должно автоматически загружаться следующее без необходимости вмешательства со стороны пользователя.
Реализация на Python
Для реализации данного инструмента мы будем использовать библиотеки tkinter
для создания графического интерфейса и Pandas
для хранения данных в формате CSV. Вот примерный код, который иллюстрирует описанный функционал:
import os
import tkinter as tk
from tkinter import filedialog, messagebox
import pandas as pd
class ImageClassifier:
def __init__(self, root, image_folder):
self.root = root
self.root.title("Image Classifier")
self.image_folder = image_folder
self.images = self.load_images()
self.current_image_index = 0
self.category_data = []
self.image_label = tk.Label(root)
self.image_label.pack()
self.category_var = tk.StringVar(value="")
self.categories = ["cat", "dog", "truck"] # Ваш список категорий
for category in self.categories:
rb = tk.Radiobutton(root, text=category, variable=self.category_var, value=category)
rb.pack(anchor=tk.W)
self.next_button = tk.Button(root, text="Save and Next", command=self.save_and_next)
self.next_button.pack()
self.show_image()
def load_images(self):
return [f for f in os.listdir(self.image_folder) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
def show_image(self):
if self.current_image_index < len(self.images):
img_path = os.path.join(self.image_folder, self.images[self.current_image_index])
img = tk.PhotoImage(file=img_path)
self.image_label.config(image=img)
self.image_label.image = img # сохранить ссылку на изображение
else:
messagebox.showinfo("Info", "Все изображения классифицированы!")
self.root.destroy()
def save_and_next(self):
selected_category = self.category_var.get()
if selected_category:
self.category_data.append((self.images[self.current_image_index], selected_category))
self.current_image_index += 1
self.show_image()
else:
messagebox.showwarning("Warning", "Пожалуйста, выберите категорию!")
def save_data(self):
df = pd.DataFrame(self.category_data, columns=["Filename", "Category"])
df.to_csv("classified_images.csv", index=False)
if __name__ == "__main__":
root = tk.Tk()
folder_path = filedialog.askdirectory(title="Выберите папку с изображениями")
classifier = ImageClassifier(root, folder_path)
root.protocol("WM_DELETE_WINDOW", classifier.save_data)
root.mainloop()
Пояснение кода
- Импорт библиотек: Мы используем
os
для работы с файловой системой,tkinter
для графического интерфейса иPandas
для хранения данных о классификации. - Класс
ImageClassifier
: В этом классе реализована вся логика, включая загрузку изображений, отображение текущего изображения и выбор категории. - Методы:
load_images
— загружает все изображения из заданной папки.show_image
— отображает текущее изображение.save_and_next
— сохраняет выбранную категорию и загружает следующее изображение.save_data
— сохраняет собранные данные в CSV файл по завершении работы.
Заключение
Создание такого инструмента на Python позволяет вам быстро и эффективно классифицировать изображения в оффлайн-режиме, что идеально подходит для работы с конфиденциальными данными. В результате, вы получите структурированный файл с данными, который можно будет использовать для дальнейшего анализа и обучения алгоритмов кластеризации.
Этот инструмент не только соответствует всем вашим требованиям, но и обеспечивает простоту в использовании. Если у вас есть дополнительные вопросы или нуждаетесь в доработках, не стесняйтесь обращаться.