تقرير جودة إعادة البناء
نظرة عامة
يقوم MipMapEngine SDK بإنشاء تقرير جودة مفصل بعد إكمال مهام إعادة البناء، يحتوي على معلومات الجهاز وكفاءة إعادة البناء وإعدادات المعلمات وجودة النتائج. يتم تخزين التقرير بتنسيق JSON في ملف report/report.json، إلى جانب الصور المصغرة للتصور للمعاينة السريعة.
هيكل التقرير
1. معلومات الجهاز
يسجل تكوين الأجهزة المستخدمة لإعادة البناء:
| الحقل | النوع | الوصف |
|---|---|---|
cpu_name | string | اسم وحدة المعالجة المركزية |
gpu_name | string | اسم وحدة معالجة الرسومات |
مثال:
{
"cpu_name": "Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz",
"gpu_name": "NVIDIA GeForce RTX 3080"
}
2. كفاءة إعادة البناء
يسجل وقت المعالجة لكل مرحلة (بالدقائق):
| الحقل | النوع | الوصف |
|---|---|---|
feature_extraction_time | float | وقت استخراج الميزات |
feature_match_time | float | وقت مطابقة الميزات |
sfm_time | float | وقت ضبط الحزمة |
at_time | float | إجمالي وقت AT |
reconstruction_time | float | إجمالي وقت إعادة البناء (باستثناء 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_count | int | عدد الكاميرات المدخلة |
input_image_count | int | عدد الصور المدخلة |
reconstruction_level | int | مستوى إعادة البناء (1=فائق، 2=عالي، 3=متوسط) |
production_type | string | نوع المنتج |
max_ram | float | أقصى استخدام للذاكرة (جيجابايت) |
معلومات نظام الإحداثيات
"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_count | int | الصور المزالة بعد AT |
residual_rmse | float | RMSE للبقايا نقطة الصورة |
tie_point_count | int | عدد نقاط الربط |
scene_area | float | مساحة المشهد (متر مربع) |
scene_gsd | float | مسافة العينة الأرضية (متر) |
flight_height | float | ارتفاع الطيران (متر) |
block_count | int | عدد كتل إعادة البناء |
5. معلومات أخرى
| الحقل | النوع | الوصف |
|---|---|---|
sdk_version | string | إصدار 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 = ['استخراج الميزات', 'مطابقة الميزات', 'ضبط الحزمة', 'إعادة البناء ثلاثي الأبعاد']
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']}
RMSE البقايا: {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
أفضل الممارسات
- فحوصات التقارير المنتظمة: مراجعة مقاييس الجودة بعد كل إعادة بناء
- إنشاء خطوط الأساس: تسجيل مقاييس الجودة من المشاريع النموذجية كمراجع
- تنبيهات الشذوذ: إعداد البرامج النصية الآلية لاكتشاف المقاييس غير الطبيعية
- تحليل الاتجاه: تتبع اتجاهات مقاييس الجودة بمرور الوقت
- اقتراحات التحسين: ضبط معلمات الالتقاط والمعالجة بناءً على مقاييس التقرير
نصيحة: تقرير الجودة أداة مهمة لتقييم وتحسين سير عمل إعادة البناء. يُنصح بدمجه في سير العمل الآلي.