Skip to content

mmkolpakov/MIPT_Drones

Repository files navigation

Сбор и Анализ Метаданных Изображений с Помощью Python

Описание

Данный Python-скрипт предназначен для обработки фотографий в формате JPG/JPEG, сделанных с дрона DJI с камерой Zenmuse P1. Скрипт рекурсивно обходит указанный каталог, извлекает EXIF-данные из изображений, рассчитывает дополнительные параметры, визуализирует перекрытия фотографий на карте и сохраняет результаты в форматах CSV и Excel. Также скрипт обнаруживает и предупреждает о дубликатах изображений, основываясь на их хеш-суммах, и предоставляет возможность выбрать и скопировать определенное количество изображений на основе заданных критериев.

Основные Возможности:

  • Рекурсивный Поиск Изображений: Обходит все вложенные папки и ищет изображения в форматах .jpg и .jpeg.
  • Извлечение EXIF-данных: Получает информацию о GPS-координатах, времени съемки, высоте, размерах изображения, фокусном расстоянии и других важных параметрах.
  • Расчет Дополнительных Параметров:
    • Углы обзора камеры (горизонтальный и вертикальный).
    • Размеры захваченной области на земле (в метрах).
    • Разрешение изображения (см/пиксель).
    • Расстояние до предыдущего снимка (в метрах).
    • Типовой линейный размер объекта (в пикселях) при известном размере объекта (1 метр).
  • Обнаружение Дубликатов: Выявляет идентичные изображения по их MD5-хешам и предупреждает пользователя, пропуская дубликаты при записи данных.
  • Получение Высот Местности: Использует API open-elevation для получения высот местности и расчета относительной высоты (relative_altitude).
  • Визуализация Перекрытий: Создает интерактивную карту с отображением полигонов изображений и их перекрытий с помощью библиотеки Folium.
  • Выбор и Копирование Изображений: Позволяет выбрать определенное количество изображений на основе заданных критериев (минимальный процент перекрытия, исключение по ключевому слову, распределение по диапазонам высот) и скопировать их в указанную папку.
  • Логирование: Ведет подробный лог работы скрипта, включая отладочную информацию, ошибки и предупреждения. Логи сохраняются в файл debug.log.
  • Сохранение Результатов: Экспорт данных в два формата:
    • CSV (output.csv) для простого анализа.
    • Excel (output.xlsx) для удобного просмотра и дальнейшей обработки в Microsoft Excel.

Требования

  • Python: Версия 3.6 и выше.
  • Библиотеки Python:
    • exifread
    • pandas
    • openpyxl
    • hashlib (стандартная библиотека)
    • math (стандартная библиотека)
    • csv (стандартная библиотека)
    • os (стандартная библиотека)
    • datetime (стандартная библиотека)
    • requests
    • shapely
    • pyproj
    • dateutil
    • concurrent.futures (стандартная библиотека)
    • geopy
    • folium
    • logging (стандартная библиотека)
    • time (стандартная библиотека)
    • random (стандартная библиотека)
    • shutil (стандартная библиотека)

Установка зависимостей:

pip install exifread pandas openpyxl requests shapely pyproj python-dateutil geopy folium

Настройка Скрипта

Откройте файл скрипта (script_name.py) в текстовом редакторе и настройте следующие параметры:

# Настраиваемые параметры
ROOT_DIR = r'C:\Path\To\Your\Dataset'  # Корневой каталог с изображениями
OUTPUT_CSV = 'output.csv'              # Имя выходного CSV файла
OUTPUT_EXCEL = 'output.xlsx'           # Имя выходного Excel файла
SENSOR_WIDTH_MM = 36.0                 # Ширина сенсора в мм (для камеры Zenmuse P1)
SENSOR_HEIGHT_MM = 24.0                # Высота сенсора в мм (для камеры Zenmuse P1)
OBJECT_SIZE_M = 1.0                    # Размер объекта в метрах для расчета size_in_pixels
MAX_WORKERS = 4                        # Максимальное количество потоков для параллельной обработки
MAX_FILES_TO_PROCESS = 1000            # Максимальное количество файлов для обработки

# Параметры для выбора и копирования изображений
NUM_IMAGES_TO_SELECT = 50              # Количество изображений для выбора
MIN_OVERLAP_PERCENT = 20.0             # Минимальный процент перекрытия
EXCLUDE_KEYWORD = 'example_keyword'    # Ключевое слово для исключения изображений
DESTINATION_DIR = r'C:\Path\To\Selected_Images'  # Папка назначения для копирования

DEBUG = True                           # Флаг отладки. Установите в True для вывода подробной информации

Пояснения к Параметрам:

  • ROOT_DIR: Полный путь к корневой папке, содержащей фотографии. Скрипт будет рекурсивно обходить все вложенные папки внутри этого каталога.
  • OUTPUT_CSV: Имя файла CSV, куда будут сохранены результаты обработки.
  • OUTPUT_EXCEL: Имя файла Excel, куда будут сохранены результаты обработки.
  • SENSOR_WIDTH_MM и SENSOR_HEIGHT_MM: Размеры сенсора камеры в миллиметрах. По умолчанию установлены для камеры Zenmuse P1 (36mm x 24mm).
  • OBJECT_SIZE_M: Размер объекта в метрах для расчета типового линейного размера объекта в пикселях.
  • MAX_WORKERS: Максимальное количество потоков для параллельной обработки файлов.
  • MAX_FILES_TO_PROCESS: Ограничение на количество обрабатываемых файлов. Установите None для обработки всех файлов.
  • NUM_IMAGES_TO_SELECT: Количество изображений, которое нужно выбрать для копирования.
  • MIN_OVERLAP_PERCENT: Минимальный процент перекрытия между изображениями для выбора.
  • EXCLUDE_KEYWORD: Ключевое слово для исключения изображений из выбора (например, если вы хотите исключить изображения, связанные с определенной темой).
  • DESTINATION_DIR: Путь к папке, куда будут скопированы выбранные изображения.
  • DEBUG: Флаг отладки. Если установлен в True, скрипт будет записывать подробную информацию о процессе в файл debug.log.

Использование

  1. Настройка Скрипта:

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

  2. Запуск Скрипта:

    Перейдите в каталог, где находится скрипт, и выполните команду:

    python scv_calculate.py

    Примечание: Замените scv_calculate.py на фактическое имя вашего скрипта.

  3. Процесс Выполнения:

    Скрипт выведет в консоль сообщения, информируя о текущем этапе выполнения:

    • Сканирование каталогов.
    • Количество найденных изображений.
    • Параллельная обработка изображений.
    • Обнаружение дубликатов.
    • Извлечение и расчет параметров.
    • Получение высот местности.
    • Вычисление перекрытий между изображениями.
    • Создание интерактивной визуализации.
    • Выбор и копирование изображений на основе заданных критериев.
    • Запись данных в CSV и Excel файлы.
    • Завершение обработки.
  4. Результаты:

    После завершения работы скрипта в указанной директории появятся следующие файлы и папки:

    • output.csv — содержит собранные данные в формате CSV.
    • output.xlsx — содержит те же данные в формате Excel для удобного просмотра и дальнейшей обработки.
    • overlaps_visualization.html — интерактивная карта с визуализацией перекрытий изображений.
    • selected_images.txt — текстовый файл со списком выбранных изображений.
    • Папка, указанная в DESTINATION_DIR, содержащая выбранные и скопированные изображения.

Обнаружение Дубликатов

  • Механизм Обнаружения:

    Скрипт вычисляет MD5-хеш каждого файла изображения. Если хеш уже существует в наборе хешей (hash_set), файл считается дубликатом, и его обработка пропускается. Пользователь получает предупреждение о каждом обнаруженном дубликате.

  • Предупреждения:

    При обнаружении дубликата в консоли и лог-файле выводится сообщение:

    Предупреждение: Обнаружен дубликат файла <имя_файла>. Запись будет пропущена.
    
  • Общее Сообщение:

    Если были обнаружены дубликаты, после обработки всех файлов выводится:

    Обнаружены дубликаты файлов. Проверьте предупреждения выше.
    

Визуализация Перекрытий

  • Интерактивная Карта:

    Скрипт создает файл overlaps_visualization.html, который можно открыть в веб-браузере. Карта отображает полигоны каждого изображения с цветовой индикацией процента перекрытия:

    • Зеленый: Перекрытие ≤ 15%
    • Оранжевый: Перекрытие > 15% и ≤ 50%
    • Красный: Перекрытие > 50%
  • Информация на Карте:

    При клике на полигон отображается всплывающее окно с информацией:

    • Имя файла.
    • Процент перекрытия.
    • Относительная высота съемки.

Выбор и Копирование Изображений

  • Критерии Выбора:

    • Минимальный Процент Перекрытия: Изображения с перекрытием меньше заданного не будут выбраны.
    • Исключение по Ключевому Слову: Изображения, в имени файла или пути которых содержится заданное ключевое слово, будут исключены.
    • Распределение по Диапазонам Высот: Изображения распределяются по диапазонам высот (20-80 м, 80-140 м, 140-200 м) для равномерного выбора.
  • Копирование Изображений:

    Выбранные изображения копируются в папку, указанную в параметре DESTINATION_DIR. В консоли и лог-файле выводятся сообщения о процессе копирования.

Логирование

  • Файл Лога:

    Если параметр DEBUG установлен в True, скрипт ведет подробный лог работы и записывает его в файл debug.log.

  • Содержимое Логов:

    • Отладочная информация о процессе обработки.
    • Предупреждения и ошибки.
    • Информация о повторных попытках при запросах к API.
    • Данные о выбранных и скопированных изображениях.

Примечания

  • Обработка Исключений:

    Скрипт устойчив к ошибкам и продолжает работу даже при возникновении исключений с отдельными файлами или запросами к API, выводя соответствующие сообщения.

  • Ограничения API:

    При запросах к API open-elevation скрипт использует механизм повторных попыток с экспоненциальной задержкой, чтобы избежать перегрузки сервера и обработки ошибок 504.

  • Настройка Параметров:

    Рекомендуется внимательно настроить параметры скрипта в соответствии с вашими потребностями и возможностями системы.

  • Совместимость:

    Убедитесь, что все необходимые библиотеки установлены, и используемая версия Python соответствует требованиям.

Пример Данных

Ниже приведен пример извлеченных и рассчитанных данных для одного изображения:

filename,relative_path,latitude,longitude,altitude,terrain_elevation,relative_altitude,fov_horizontal,fov_vertical,shooting_time,image_width,image_height,width_meters,height_meters,resolution_cm_per_pixel,distance_to_previous,size_in_pixels,overlap_percentage,digital_zoom_ratio
DJI_0001.JPG,Folder/Subfolder/DJI_0001.JPG,56.092484,36.090163,333.252,300.0,33.252,54.432,37.567,2024-09-07 11:44:38,8192,5460,40.0,30.0,0.5,10.0,200.0,15.0,1.0

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages