Создайте инструмент для ручной классификации изображений учебных данных.

Вопрос или проблема

У меня есть большое количество изображений, которые мне нужно классифицировать для обучения алгоритма кластеризации, и я хотел бы сделать это офлайн (данные являются собственностью). По сути, я хотел бы создать настольный инструмент для опросов, который позволит мне быстро разместить каждое изображение в одну или две категории. В идеале инструмент должен:

  1. Искать изображение в заранее указанной папке на рабочем столе;
  2. Отображать изображение и статический список категорий, позволяя мне кликнуть на одну;
  3. При нажатии зафиксировать категорию, связанную с изображением;
  4. Сохранять имя файла изображения и соответствующую категорию в набор данных где-то;
  5. Отображать следующее непромаркированное изображение в папке и повторять процесс.

Есть ли простой способ создать такой инструмент на 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 для ручной классификации изображений, который будет соответствовать всем вашим требованиям.

Функциональные требования:

  1. Поиск изображений: Инструмент должен уметь искать изображения в заранее заданной папке на компьютере.
  2. Отображение изображений и категорий: Интерфейс должен показывать текущее изображение и статический список категорий для выбора.
  3. Запись выбранной категории: После выбора категории, необходимо зафиксировать ассоциацию между изображением и категорией.
  4. Хранение данных: Информация о названии файла изображения и соответствующей категории должна сохраняться в наборе данных.
  5. Переключение на следующее изображение: После классификации текущего изображения, должно автоматически загружаться следующее без необходимости вмешательства со стороны пользователя.

Реализация на 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 позволяет вам быстро и эффективно классифицировать изображения в оффлайн-режиме, что идеально подходит для работы с конфиденциальными данными. В результате, вы получите структурированный файл с данными, который можно будет использовать для дальнейшего анализа и обучения алгоритмов кластеризации.

Этот инструмент не только соответствует всем вашим требованиям, но и обеспечивает простоту в использовании. Если у вас есть дополнительные вопросы или нуждаетесь в доработках, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...