Перейти к основному содержимому

Отчет о качестве реконструкции

Обзор

MipMapEngine SDK генерирует подробный отчет о качестве после завершения задач реконструкции, содержащий информацию об устройстве, эффективности реконструкции, настройках параметров и качестве результатов. Отчет сохраняется в формате JSON в файле report/report.json вместе с миниатюрами визуализации для быстрого предварительного просмотра.

Структура отчета

1. Информация об устройстве

Записывает конфигурацию оборудования, используемого для реконструкции:

ПолеТипОписание
cpu_namestringНазвание процессора
gpu_namestringНазвание видеокарты

Пример:

{
"cpu_name": "Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz",
"gpu_name": "NVIDIA GeForce RTX 3080"
}

2. Эффективность реконструкции

Записывает время обработки для каждого этапа (в минутах):

ПолеТипОписание
feature_extraction_timefloatВремя извлечения признаков
feature_match_timefloatВремя сопоставления признаков
sfm_timefloatВремя связной корректировки
at_timefloatОбщее время AT
reconstruction_timefloatОбщее время реконструкции (без AT)

Пример:

{
"feature_extraction_time": 12.5,
"feature_match_time": 8.3,
"sfm_time": 15.2,
"at_time": 36.0,
"reconstruction_time": 48.6
}

3. Параметры реконструкции

Записывает входные параметры задачи и конфигурацию:

Параметры камеры

"initial_camera_parameters": [
{
"camera_name": "DJI_FC6310",
"width": 5472,
"height": 3648,
"id": 0,
"parameters": [3850.5, 2736, 1824, -0.02, 0.05, 0.001, -0.001, 0.01]
}
]

Порядок массива параметров: [f, cx, cy, k1, k2, p1, p2, k3]

  • f: Фокусное расстояние
  • cx, cy: Координаты главной точки
  • k1, k2, k3: Коэффициенты радиальной дисторсии
  • p1, p2: Коэффициенты тангенциальной дисторсии

Другие параметры

ПолеТипОписание
input_camera_countintКоличество входных камер
input_image_countintКоличество входных изображений
reconstruction_levelintУровень реконструкции (1=Ультравысокий, 2=Высокий, 3=Средний)
production_typestringТип продукта
max_ramfloatМаксимальное использование ОЗУ (ГБ)

Информация о системе координат

"production_cs_3d": {
"epsg_code": 4326,
"origin_offset": [0, 0, 0],
"type": 2
}

Типы систем координат:

  • 0: LocalENU (Локальная восток-север-верх)
  • 1: Local (Локальная система координат)
  • 2: Geodetic (Геодезическая система координат)
  • 3: Projected (Проекционная система координат)
  • 4: ECEF (Геоцентрическая система координат)

4. Результаты реконструкции

Параметры камеры после AT

Записывает оптимизированные внутренние параметры камеры:

"AT_camera_parameters": [
{
"camera_name": "DJI_FC6310",
"width": 5472,
"height": 3648,
"id": 0,
"parameters": [3852.1, 2735.8, 1823.6, -0.019, 0.048, 0.0008, -0.0009, 0.009]
}
]

Различия в положении изображений

Записывает оптимизацию положения для каждого изображения:

"image_pos_diff": [
{
"id": 0,
"pos_diff": 0.125
},
{
"id": 1,
"pos_diff": 0.087
}
]

Метрики качества

ПолеТипОписание
removed_image_countintИзображения, удаленные после AT
residual_rmsefloatСКО невязок точек изображения
tie_point_countintКоличество связующих точек
scene_areafloatПлощадь сцены (квадратные метры)
scene_gsdfloatРасстояние выборки на местности (метры)
flight_heightfloatВысота полета (метры)
block_countintКоличество блоков реконструкции

5. Прочая информация

ПолеТипОписание
sdk_versionstringВерсия SDK

Миниатюры визуализации

Папка thumbnail в каталоге отчета содержит следующие файлы визуализации:

1. График невязок камеры

camera_{id}_residual.png - 24-битное цветное изображение

  • Хороший результат калибровки: Невязки схожи по размеру во всех положениях со случайными направлениями
  • Плохой результат калибровки: Большие невязки с очевидными направленными паттернами
подсказка

Большие невязки не обязательно указывают на плохую общую точность, так как это отражает только внутреннюю точность камеры. Окончательная точность должна комплексно учитывать точность координат контрольных точек и качество модели.

2. Карта перекрытия

overlap_map.png - 8-битное изображение в градациях серого

  • Диапазон значений пикселей: 0-255
  • Может быть отрендерена как цветная карта для отображения распределения перекрытия
  • Используется для оценки проектирования траектории полета и качества покрытия изображениями

3. Миниатюра области съемки

rgb_thumbnail.jpg - 32-битное цветное изображение

  • Для быстрого предварительного просмотра проекта
  • Показывает протяженность области съемки и результаты реконструкции

Примеры интерпретации отчета

Пример полного отчета

{
"cpu_name": "Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz",
"gpu_name": "NVIDIA GeForce RTX 3080",
"feature_extraction_time": 12.5,
"feature_match_time": 8.3,
"sfm_time": 15.2,
"at_time": 36.0,
"reconstruction_time": 48.6,
"initial_camera_parameters": [{
"camera_name": "DJI_FC6310",
"width": 5472,
"height": 3648,
"id": 0,
"parameters": [3850.5, 2736, 1824, -0.02, 0.05, 0.001, -0.001, 0.01]
}],
"input_camera_count": 1,
"input_image_count": 156,
"reconstruction_level": 2,
"production_type": "all",
"production_cs_3d": {
"epsg_code": 4326,
"origin_offset": [0, 0, 0],
"type": 2
},
"production_cs_2d": {
"epsg_code": 3857,
"origin_offset": [0, 0, 0],
"type": 3
},
"max_ram": 28.5,
"AT_camera_parameters": [{
"camera_name": "DJI_FC6310",
"width": 5472,
"height": 3648,
"id": 0,
"parameters": [3852.1, 2735.8, 1823.6, -0.019, 0.048, 0.0008, -0.0009, 0.009]
}],
"removed_image_count": 2,
"residual_rmse": 0.68,
"tie_point_count": 125840,
"scene_area": 850000.0,
"scene_gsd": 0.025,
"flight_height": 120.5,
"block_count": 1,
"sdk_version": "3.0.1"
}

Метрики оценки качества

Стандарты отличного качества

  • residual_rmse < 1.0 пикселей
  • removed_image_count / input_image_count < 5%
  • tie_point_count > 10000
  • Средняя разница положений < 0.5 метров

Ситуации, требующие внимания

  • residual_rmse > 2.0 пикселей: Возможные систематические ошибки
  • removed_image_count > 10%: Проблемы с качеством изображений или перекрытием
  • tie_point_count < 5000: Недостаточно характерных точек, влияет на точность

Инструменты анализа отчетов

Пример анализа на Python

import json
import numpy as np

def analyze_quality_report(report_path):
with open(report_path, 'r', encoding='utf-8') as f:
report = json.load(f)

# Вычисление метрик эффективности
total_time = report['at_time'] + report['reconstruction_time']
images_per_minute = report['input_image_count'] / total_time

# Вычисление метрик качества
removal_rate = report['removed_image_count'] / report['input_image_count']
avg_pos_diff = np.mean([item['pos_diff'] for item in report['image_pos_diff']])

# Генерация отчета анализа
analysis = {
'efficiency': {
'total_time_minutes': total_time,
'images_per_minute': images_per_minute,
'area_per_hour': report['scene_area'] / (total_time / 60)
},
'quality': {
'residual_rmse': report['residual_rmse'],
'removal_rate_percent': removal_rate * 100,
'avg_position_diff_meters': avg_pos_diff,
'tie_points_per_image': report['tie_point_count'] / report['input_image_count']
},
'scale': {
'area_sqm': report['scene_area'],
'gsd_cm': report['scene_gsd'] * 100,
'flight_height_m': report['flight_height']
}
}

return analysis

# Пример использования
analysis = analyze_quality_report('report/report.json')
print(f"Эффективность обработки: {analysis['efficiency']['images_per_minute']:.1f} изображений/минуту")
print(f"Средние невязки: {analysis['quality']['residual_rmse']:.2f} пикселей")
print(f"Разрешение на местности: {analysis['scale']['gsd_cm']:.1f} см")

Визуализация отчета о качестве

import matplotlib.pyplot as plt
from PIL import Image

def visualize_quality_report(report_dir):
# Чтение данных отчета
with open(f'{report_dir}/report.json', 'r') as f:
report = json.load(f)

# Создание графиков
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 1. Круговая диаграмма распределения времени
times = [
report['feature_extraction_time'],
report['feature_match_time'],
report['sfm_time'],
report['reconstruction_time']
]
labels = ['Извлечение признаков', 'Сопоставление признаков', 'Связная корректировка', '3D-реконструкция']
axes[0, 0].pie(times, labels=labels, autopct='%1.1f%%')
axes[0, 0].set_title('Распределение времени обработки')

# 2. Гистограмма различий положений
pos_diffs = [item['pos_diff'] for item in report['image_pos_diff']]
axes[0, 1].hist(pos_diffs, bins=20, edgecolor='black')
axes[0, 1].set_xlabel('Разница положений (метры)')
axes[0, 1].set_ylabel('Количество изображений')
axes[0, 1].set_title('Распределение оптимизации положений изображений')

# 3. Карта перекрытия
overlap_img = Image.open(f'{report_dir}/thumbnail/overlap_map.png')
axes[1, 0].imshow(overlap_img, cmap='jet')
axes[1, 0].set_title('Распределение перекрытия изображений')
axes[1, 0].axis('off')

# 4. Текст ключевых метрик
metrics_text = f"""
Входных изображений: {report['input_image_count']}
Удаленных изображений: {report['removed_image_count']}
СКО невязок: {report['residual_rmse']:.2f} пикс.
Связующих точек: {report['tie_point_count']:,}
Площадь сцены: {report['scene_area']/10000:.1f} гектаров
Разрешение на местности: {report['scene_gsd']*100:.1f} см
"""
axes[1, 1].text(0.1, 0.5, metrics_text, fontsize=12,
verticalalignment='center', family='monospace')
axes[1, 1].set_title('Ключевые метрики качества')
axes[1, 1].axis('off')

plt.tight_layout()
plt.savefig('quality_report_summary.png', dpi=150)
plt.show()

Автоматическая проверка качества

Настройка пороговых значений качества

QUALITY_THRESHOLDS = {
'excellent': {
'residual_rmse': 0.5,
'removal_rate': 0.02,
'tie_points_per_image': 1000,
'pos_diff_avg': 0.1
},
'good': {
'residual_rmse': 1.0,
'removal_rate': 0.05,
'tie_points_per_image': 500,
'pos_diff_avg': 0.5
},
'acceptable': {
'residual_rmse': 2.0,
'removal_rate': 0.10,
'tie_points_per_image': 200,
'pos_diff_avg': 1.0
}
}

def assess_quality(report):
"""Автоматическая оценка уровня качества реконструкции"""

# Вычисление метрик
removal_rate = report['removed_image_count'] / report['input_image_count']
tie_points_per_image = report['tie_point_count'] / report['input_image_count']
pos_diff_avg = np.mean([item['pos_diff'] for item in report['image_pos_diff']])

# Оценка уровня
for level, thresholds in QUALITY_THRESHOLDS.items():
if (report['residual_rmse'] <= thresholds['residual_rmse'] and
removal_rate <= thresholds['removal_rate'] and
tie_points_per_image >= thresholds['tie_points_per_image'] and
pos_diff_avg <= thresholds['pos_diff_avg']):
return level

return 'poor'

Приложения для интеграции отчетов

Мониторинг качества пакетной обработки

def batch_quality_monitor(project_dirs):
"""Мониторинг качества пакета проектов"""

results = []

for project_dir in project_dirs:
report_path = os.path.join(project_dir, 'report/report.json')

if os.path.exists(report_path):
with open(report_path, 'r') as f:
report = json.load(f)

quality_level = assess_quality(report)

results.append({
'project': project_dir,
'images': report['input_image_count'],
'area': report['scene_area'],
'gsd': report['scene_gsd'],
'rmse': report['residual_rmse'],
'quality': quality_level,
'time': report['at_time'] + report['reconstruction_time']
})

# Генерация сводного отчета
df = pd.DataFrame(results)
df.to_csv('batch_quality_report.csv', index=False)

# Статистика
print(f"Всего проектов: {len(results)}")
print(f"Отличное: {len(df[df['quality'] == 'excellent'])}")
print(f"Хорошее: {len(df[df['quality'] == 'good'])}")
print(f"Приемлемое: {len(df[df['quality'] == 'acceptable'])}")
print(f"Плохое: {len(df[df['quality'] == 'poor'])}")

return df

Лучшие практики

  1. Регулярные проверки отчетов: Просматривайте метрики качества после каждой реконструкции
  2. Установка базовых показателей: Записывайте метрики качества типичных проектов в качестве эталонов
  3. Оповещения об аномалиях: Настройте автоматизированные скрипты для обнаружения аномальных метрик
  4. Анализ тенденций: Отслеживайте тенденции метрик качества с течением времени
  5. Предложения по оптимизации: Корректируйте параметры съемки и обработки на основе метрик отчета

Совет: Отчет о качестве является важным инструментом для оценки и оптимизации рабочих процессов реконструкции. Рекомендуется интегрировать его в автоматизированные рабочие процессы.