# مخصّص الصور: محرك RAG لصورة غامضة محدودة

<!-- category -- AI,Patterns,Architecture,LLM,DiSE -->
<datetime class="hidden">2026-01-06T17:00</datetime>

**أجزاء 1-3** وصف الفوضى المقيدة كنموذج تجريدي. هذه المقالة تطبق هذه الأنماط على خط تحليل الصور العملي الذي يوضح مبادئ العمل

- **[أداة CLI](https://github.com/scottgal/lucidrag/tree/main/src/Mostlylucid.ImageSummarizer.Cli)** - कमांड-واجهة خطية لتحليل الصور
- **[مكتبة أساسية](https://github.com/scottgal/lucidrag/tree/main/src/Mostlylucid.DocSummarizer.Images)** - مكتبة التحليل الأساسي للصور

> ملاحظة: مازالت تضبط النظام. لكن هناكM SK2 الآن نسخة مكتبية كما هو الحال مع CLI . يعمل بشكل جيد جداً ولكن بعض الحواف لتسهيل

### دليل قارئ

هذا المقال يخدم أهداف متعددة. Navigate to what interests you:

- **أنماط العمارة** → أنظر إلى " فن العمارة الموجية", | | " العقد الإلزاميM SK4 ♫ " المذكرةMSC6
- **تفاصيل الـ OCR** → أنظر [جزء 4.1: أنابيب الـOCR](/blog/constrained-fuzzy-image-ocr-pipeline) للانهيار التقني العميق
- **استخدام CLI** → القفز إلى " الـ CLI: بإستخدامه
- **خصائص GUI** → consulte "Desktop GUI"
- **التنفيذ** → أمثلة رمزية في جميع أنحاء, المصدر الكامل على [GitHub](https://github.com/scottgal/lucidrag)

![شريط الحركة](imagesumamrizerui.png?width=500&format=webp)

ImageSummarizer هو أنابيب استهلاك RAG للصور التي تستخرج بيانات ميتادات مبنية , نص , تعليقات | , و إشارات بصرية باستخدام **الهندسة المعمارية على أساس wave-**. يتصاعد النظام من التحليل المحلي السريع (Florence-2 ONNXM SK3 إلى أجهزة الرؤية LLMs فقط عند الحاجة

**المبادئ الرئيسية:**

- لا autonomie (models never decide execution paths)
- لا يوجد حالة طبيعية-لغة (الsignals are typed , not proseM SK3
- النماذج تقترح إشارات

ImageSummarizer يوضح أن الـ LLM المتعددة يمكن استخدامها دون تنازل عن التفاضل والتكامل **الاحتمال يقترح , الإثبات يبقى**.

> **قواعد التصميم**
> 
> - النماذج لا تستهلك أي نماذج أخرى
> - اللغة الطبيعية لا تكون أبداً حالة
> - التسارع هو عتبة محددة
> - كل مخرج يحمل الثقة provenance +

[![رخصة: عدم رخصة](https://img.shields.io/badge/license-Unlicense-blue.svg)](http://unlicense.org/)
[![إطلاق](https://img.shields.io/github/v/release/scottgal/lucidrag?label=release)](https://github.com/scottgal/lucidrag/releases)
[![بناء](https://img.shields.io/github/actions/workflow/status/scottgal/lucidrag/release-imagesummarizer.yml?label=build)](https://github.com/scottgal/lucidrag/actions)
[![.NET](https://img.shields.io/badge/.NET-10.0-purple)](https://dotnet.microsoft.com/)

[toc]

---


## ما تفعله

تُستخرج أنابيب البيانات المجازية الهيكلية من الصور لأنظمة RAG. given any image or animated GIFM SK1 it produces:

- نص تم استخراجه (three-tier OCRMSC2 Tesseract → FlorenceM SK4 ONNX → Vision LLM fallbackMST6
- لوحة الألوان ( مبرمجة, غير متوقعة )
- قياسات الجودة (sharpness, blurMSC2 exposureM SK3
- تصنيف الأنواع (صورة, لقطة شاشةM SK2 رسم بيانيMSC3 مذكرة )
- تحليل الحركة (للصور المتحركة)
- عنوان إختياري (FlorenceM SK1 محلي أو Vision LLM, مقيدة بالحقائق الحاسوبية )
- إضافات الدلالية (لبحث فيكتوري)

الكلمة الرئيسية هي **مبنية**. كل مخرج لديه نقاط الثقة, إفتراض المصدرM SK2 ومؤشرات الأدلة . لا يوجد أي نموذج هو المصدر الوحيد للحقيقة

## ثلاثة -Tier إستراتيجية الـOCR

> **الغوص العميق**: أنابيب الـOCR معقدة بما فيه الكفاية لتوجب أن تصنع مقالاً خاصاً [أجزاء 4.1: ثلاثية - تير أنابيب الـ OCR](/blog/constrained-fuzzy-image-ocr-pipeline) للقسمة التقنية الكاملة بما في ذلك East, CRAFT , RealM SK2ESRGAN, CLIPMSC4 و تحسين مسار الأفلامMNK5

يستعمل النظام استراتيجية تدرج ثلاثية - في استخراج النص :

| الطبقة | الطريقة | السرعة | التكلفة | الأفضل |
| ----- | ------------------- | ------ | ----------- | ---------------------------- |
| **1** | **تيسيراكت** | ~50ms | مجانا | نظيفة, مرتفعةM SK5كتابة متباينة M|
| **2** | **فلورانس-2 أونكس** |
| **3** | **Vision LLM** | ~1-5s | | $0.001-0.01 | || | مركبة | / | نص مشحوم ||

### التنقل الذكي

**إكتشاف نص أونكس** ([الشرق](https://github.com/argman/EAST), [CRAFT](https://github.com/clovaai/CRAFT-pytorch), ~20-30ms) يحدد المسار الأمثلM SK3

- **الطريق السريع**: فلورانسM SK1 فقط (~100ms)
- **طريق BALANCED**: فلورانس-2 + التصويت Tesseract (~300msM SK4
- **طريق الجودة**: متعددة-تحليل الإطار + رؤية LLM

### دعم نماذج أونكس

- **[Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN)**: 4× سوبرM SK2دقة للصور ذات الجودة المنخفضة-
- **[قفص](https://github.com/openai/CLIP)**:បង្កប់ لغوية للبحث عن الصور (~100ms, مجانيةM SK3

**النتيجة**: ~1.16GB من نماذج الـONNX المحلية التي تتعامل مع 85%+ الصور بدون تكلفة API.

---


## رؤيتها في عمل

### كشف الحركة & تحليل الرسوم المتحركة

![القط على الأريكة](https://raw.githubusercontent.com/scottgal/lucidrag/main/src/Mostlylucid.ImageSummarizer.Cli/demo-images/cat_wag.gif)

```bash
$ imagesummarizer demo-images/cat_wag.gif --pipeline caption --output text
Caption: A cat is sitting on a white couch.
Scene: indoor
Motion: MODERATE object_motion motion (partial coverage)
```

جملات الحركة تصدر فقط عندما تدعمها قياسات التدفق الضوئي و دلالات الإطار ; وإلا فإن النظام يرجع إلى وصفات محايدة ("حركة دقيقة | ", | |" | حركة الكاميرا |

### Meme & إستخراج عنوان فرعي

![الميم الناشر](https://raw.githubusercontent.com/scottgal/lucidrag/main/src/Mostlylucid.ImageSummarizer.Cli/demo-images/anchorman-not-even-mad.gif)

```bash
$ imagesummarizer demo-images/anchorman-not-even-mad.gif --pipeline caption --output text
"I'm not even mad."
"That's amazing."
Caption: A person wearing grey turtleneck sweater with neutral expression
Scene: meme
Motion: SUBTLE general motion (localized coverage)
```

عنوان فرعي-إدراك تقليل الإطارات يكشف عن تغيرات النص في الأسفل 25% من الإطاراتM SK2 تزن ភីكسات اللامعة ( بيضاءMSC4 نص أصفرMNK5 أكثر قوةMRK6

### تقنية شريحة الإطار

بالنسبة للGIF المتحركة مع الأشرطة , الأداة تخلق شرائح الإطار الأفقية لتحليل "Vision LLM"

**النص-فقط شريحة** (

الطريقة الأكثر فعالية تستخرج فقط أ Boxes متنية , تقلل بشكل كبير تكاليف الرموز :

![النص-فقط شريحة](https://raw.githubusercontent.com/scottgal/lucidrag/main/src/Mostlylucid.DocSummarizer.Images/demo-images/anchorman-not-even-mad_textonly_strip.png)

```bash
$ imagesummarizer export-strip demo-images/anchorman-not-even-mad.gif --mode text-only
Detecting subtitle regions (bottom 30%)...
  Found 2 unique text segments
Saved text-only strip to: anchorman-not-even-mad_textonly_strip.png
  Dimensions: 253×105 (83% token reduction)
```

| المقاربة | الأبعاد | الرموز | التكلفة S|
| -------------------- | ------------ | ------- | ------- |
| الإطارات الكاملة (10) | | | 3000×185 |
| شريط التصوير بالرنين المغناطيسي (2 إطارات) | | |
| **النص-شريحة واحدة فقط**  | **253×105** | **~50** | **الأسفل** |

**كيف تعمل**: يكشف OpenCV مناطق عنوان فرعي ( الجزء السفلي | 30%), مُحدّد من البكسلات اللامعة |( أبيض ٬ / نص أصفر ٬), يستخرج خانات المزج الصّغيرة ,, ٬ ويقوم بتقليد النسخ بناء على تغييرات النص .. .

**إدارة الـ OCR** (تغييرات نصية فقط - | | 93 | إطارات تقلل إلى |

![شريحة الـ OCR](https://raw.githubusercontent.com/scottgal/lucidrag/main/src/Mostlylucid.DocSummarizer.Images/demo-images/anchorman-not-even-mad_ocr_strip.png)

```bash
$ imagesummarizer export-strip demo-images/anchorman-not-even-mad.gif --mode ocr
Deduplicating 93 frames (OCR mode - text changes only)...
  Reduced to 2 unique text frames
Saved ocr strip to: anchorman-not-even-mad_ocr_strip.png
  Dimensions: 600x185 (2 frames)
```

**إدارة الحركة** (keyframes for motion inference):

![شريط الحركة](https://raw.githubusercontent.com/scottgal/lucidrag/main/src/Mostlylucid.DocSummarizer.Images/demo-images/cat_wag_motion_strip.png)

```bash
$ imagesummarizer export-strip demo-images/cat_wag.gif --mode motion --max-frames 6
Extracting 6 keyframes from 9 frames (motion mode)...
  Extracted 6 keyframes for motion inference
Saved motion strip to: cat_wag_motion_strip.png
  Dimensions: 3000x280 (6 frames)
```

هذا يسمح لـ Vision LLMs بقراءة كل نص الأشرطة في مكالمة API واحدة.

### لماذا ليس مجرد عنوانه

هذا يضرب " فقط تصفيه مع نموذج الحد الأقصى " لنفس السبب أن اشعة X- تضرب القصةM SK3 النموذج لم يطلب أبداً ملء الفجواتMSC4 إنه يستقبل مسجل مغلقاًMNK5 الألوان المُقيّمة MNK6 الحركة المتتبعة MMK7 إطارات الأشرطة الخاطئة , الثقة في التصوير بالرنين المغناطيسيّّيّّّ - ويقوم فقط بعرض ما يحتوي عليه الأسطوانة بالفعلMRK10 عندما يقوم GPT بـ-4 أو تصفيق صورةٍ ــ, إنه ــ ' تخمينٍ ـــ. عندما تقوم ImageSummarizer بـ , هو ـــ ' تلخيص الإشارات التي موجودة بالفعل ٬.

---


## فن العمارة الموجية

النظام يستخدم **أنابيب موجة - مبنية على** حيث كل موجة تحليل مستقل ينتج إشارات مكتوبة **تنفذ الموجات في ترتيب أولي (أصغر عدد يعمل أولاً)**, والأشجار الأخيرة يمكنها قراءة الإشارات من الأشجار السابقة.

> **توصيل تنفيذ**: موجة 10 تمر قبل موجة

```mermaid
flowchart TB
    subgraph Wave10["Wave 10: Foundational Signals"]
        W1[IdentityWave - Format, dimensions]
        W2[ColorWave - Palette, saturation]
    end

    subgraph Wave40["Wave 40: Text Detection"]
        W9[TextLikelinessWave - OpenCV EAST/CRAFT]
    end

    subgraph Wave50["Wave 50: Traditional OCR"]
        W3[OcrWave - Tesseract]
    end

    subgraph Wave51["Wave 51: ML OCR"]
        W8[MlOcrWave - Florence-2 ONNX]
    end

    subgraph Wave55["Wave 55: ML Captioning"]
        W10[Florence2Wave - Local captions]
    end

    subgraph Wave58["Wave 58: Quality Gate"]
        W5[OcrQualityWave - Escalation decision]
    end

    subgraph Wave70["Wave 70: Embeddings"]
        W7[ClipEmbeddingWave - Semantic vectors]
    end

    subgraph Wave80["Wave 80: Vision LLM"]
        W6[VisionLlmWave - Cloud fallback]
    end

    Wave10 --> Wave40 --> Wave50 --> Wave51 --> Wave55 --> Wave58 --> Wave70 --> Wave80

    style Wave10 stroke:#22c55e,stroke-width:2px
    style Wave40 stroke:#06b6d4,stroke-width:2px
    style Wave50 stroke:#f59e0b,stroke-width:2px
    style Wave51 stroke:#8b5cf6,stroke-width:2px
    style Wave55 stroke:#8b5cf6,stroke-width:2px
    style Wave58 stroke:#ef4444,stroke-width:2px
    style Wave70 stroke:#3b82f6,stroke-width:2px
    style Wave80 stroke:#8b5cf6,stroke-width:2px
```

**الترتيب الأولي** (يجري الأسفل أولا): 10 | | → ♫ ♫ 40 \ ♫

هذا هو [MoM مقيدة](/blog/constrained-mom-mixture-of-models) applied to image analysis: **العديد من المقترحين ينشرون على أساس مشترك** (the `AnalysisContext`), والخروج النهائي يجمع إشاراتهم

### موجات مفاتيح

- **موجة تشبه النص** (NEWM SK1 OpenCV EAST/CRAFT إكتشاف النص (~5-20msMSC4 يحدد قرارات التنقل
- **موجة أوكرا**: رسم بياني تقليدي Tesseract للكتابة النظيفة (Tier 1)
- **موجة الـ MlOcr**: فلورانس-2 يعملون محلياً (~200msM SK3 يتحكمون بخطوط مصممة MSC4Tier S2)
- **فلورانس2Wave**: وضع مخطوطات ML محلية عندما لا تحتاج لـ Vision LLM
- **موجة جودة أوكرا**: العبارة-تفتيش البوابةM SK2 يحدد مسار التدرج
- **موجة VisionLlm**: السحب-based Vision LLMM SK2 يعمل فقط عندما تفشل الموجات السابقة أو يشير إلى ثقة ضعيفة (Tier 3)

> **Note on wave ordering**: الثلاث أُCR **الطبقات** (Tesseract/Florence-2/Vision LLMMSC3 هي مستويات التدرج المفاهيميM SK4 الموجات الفردية مثل Advanced OCR أو Quality Gate هي **التحسينات** داخل تلك الطبقات, لا توجد مستويات متفروعة من التدرج— تقوم بفحص الاستقرار الزمني و اختبارات الجودة , بالضبط

---


## العقد الإشارات

كل موجة تنتج إشارات باستخدام عقد قياسي:

```csharp
public record Signal
{
    public required string Key { get; init; }      // "color.dominant", "ocr.quality.is_garbled"
    public object? Value { get; init; }             // The measured value
    public double Confidence { get; init; } = 1.0;  // 0.0-1.0 reliability score
    public required string Source { get; init; }    // "ColorWave", "VisionLlmWave"
    public DateTime Timestamp { get; init; }        // When produced
    public List<string>? Tags { get; init; }        // "visual", "ocr", "quality"
    public Dictionary<string, object>? Metadata { get; init; }  // Additional context
}
```

هذا هو الجزء 2 عقد الإشارات في العمل. الأمواج لا تتحدث مع بعضها البعض من خلال اللغة الطبيعية . إنهم ينشرون إشارات مكتوبة في السياق المشترك , والأمواج التي تتجه إلى الأسفل يمكن أن يسألوا تلك الإشارات

لاحظوا أن `Confidence` هو per-signalM SK1 ليس per -wave. موجة واحدة يمكنها أن ترسل إشارات متعددة مع قوة متباينة من الإبستيزيةMSC4ColorWave' قائمة الألوان المهيمنة لديها الثقة MST6 MST7 مبرمجةM ST8 لكن نسبة الألوان الفردية تستخدم الثقة كعامل وزن للخلاصة السلبيةM st9

الثقة هنا تعني *قابلية للاستعمال في الأسفل*, ليس يقيناً رياضياً

> **تحذير التفاضل والتكامل**: "Deterministic" تعني عدم عشوائيية العينات والنتائج المستقرة لوقت التشغيل وال configuración المعطىM SK3 مُقدمي تنفيذ GPU ONNX يمكن أن يضعوا إختلافا رقمياً صغيراًMSC4 وهو مقبول لقرارات التوجيهMNK5 عقد الإشارات | | ( | مُحدرات |, | منطق التسارع |

---


### تصنيف إشارات الـ OCR

من أجل تجنب التشويش, هنا' هو إسم إشارات الـ OCR القياسية المستخدمة في جميع أنحاء النظام :

| مفاتيح الإشارة | المصدر | الوصف |
| ------------------------------- | ---------------------- | ---------------------------------------------- |
| `ocr.text` | Tesseract (Tier MSC2 MSC3 Raw single-frame OCR S|
| `ocr.confidence` | Tesseract | نمره الثقة في Tesserac |
| `ocr.ml.text` | فلورانس-2 (Tier 2) ♫| ML OCR واحدM SK5frame ♫
| `ocr.ml.multiframe_text` | فلورانس-2 (Tier 2) \|MultiM SK5frame GIF OCR
| `ocr.ml.confidence` | فلورانسM SK1 | فلورنس-2 درجة الثقة |
| `ocr.quality.spell_check_score` | OcrQualityWave
| `ocr.quality.is_garbled` | OcrQualityWave | إشارة التصاعد البولينية |
| `ocr.vision.text` | VisionLlmWave (Tier 3) S| إستخلاص Vision LLM .
| `caption.text` | VisionLlmWave

**الاختلاف المهم**: `ocr.vision.text` هو **استخراج النص** (OCR), بينما `caption.text` هو **وصف المشهد** (captioning). يمكن أن تأتي كلاهما من نفس مكالمة الـ Vision LLM

**أولوية اختيار النص النهائي** (أعلى من أقل

1. `ocr.vision.text` (Vision LLM OCR
2. `ocr.ml.multiframe_text` (Florence-2 GIFM SK2
3. `ocr.ml.text` (Florence-2singleM SK2frame )
4. `ocr.text` (Tesseract)

---


## واجهة الأمواج

كل موجة تطبق واجهة بسيطة

```csharp
public interface IAnalysisWave
{
    string Name { get; }
    int Priority { get; }           // Lower number = runs earlier (10 before 50 before 80)
    IReadOnlyList<string> Tags { get; }

    Task<IEnumerable<Signal>> AnalyzeAsync(
        string imagePath,
        AnalysisContext context,    // Shared substrate with earlier signals
        CancellationToken ct);
}
```

الـ `AnalysisContext` هو **الفضاء المشترك** من الجزء 2. موجات يمكنها :

- قراءة الإشارات من الموجات السابقة: `context.GetValue<bool>("ocr.quality.is_garbled")`
- الحصول على نتائج متداخلة مخزنة في المخزن `context.GetCached<Image<Rgba32>>("ocr.frames")`
- أضف إشارات جديدة التي يمكن أن تستهلكها الموجات السفلية

---


## ColorWave: أساس التفاضل والتكامل

يعمل ColorWave أولا (priority 10) ويقوم بحساب الحقائق التي تقيد كل شيء آخر:

```csharp
public class ColorWave : IAnalysisWave
{
    public string Name => "ColorWave";
    public int Priority => 10;  // Runs first (lowest priority number)
    public IReadOnlyList<string> Tags => new[] { "visual", "color" };

    public async Task<IEnumerable<Signal>> AnalyzeAsync(
        string imagePath,
        AnalysisContext context,
        CancellationToken ct)
    {
        var signals = new List<Signal>();

        using var image = await LoadImageAsync(imagePath, ct);

        // Extract dominant colors (computed, not guessed)
        var dominantColors = _colorAnalyzer.ExtractDominantColors(image);
        signals.Add(new Signal
        {
            Key = "color.dominant_colors",
            Value = dominantColors,
            Confidence = 1.0,  // Reproducible measurement
            Source = Name,
            Tags = new List<string> { "color" }
        });

        // Individual colors for easy access
        for (int i = 0; i < Math.Min(5, dominantColors.Count); i++)
        {
            var color = dominantColors[i];
            signals.Add(new Signal
            {
                Key = $"color.dominant_{i + 1}",
                Value = color.Hex,
                Confidence = color.Percentage / 100.0,
                Source = Name,
                Metadata = new Dictionary<string, object>
                {
                    ["name"] = color.Name,
                    ["percentage"] = color.Percentage
                }
            });
        }

        // Cache the image for other waves (no need to reload)
        context.SetCached("image", image.CloneAs<Rgba32>());

        return signals;
    }
}
```

ويستقبل الـ Vision LLM لاحقاً هذه الألوان **القيود**. لا يجب أن يدعي أن الصورة تحتوي على " أحمرات متوهجة " إذا قام ColorWave بحساب لونها المهيمنة هو الأزرق M SK3 وإذا كان كذلك MSC4 التناقض قابل للكشف ويمكن رفضه في الأسفل

---


## OcrQualityWave: البوابة للإنزلاق

هذا هو المكان [الغموض المقيد](/blog/constrained-fuzziness-pattern) تشعّم . OcrQualityWave هو **المدرّس** الذي يقرر ما إذا كان يجب أن يزداد إلى مكلفة الرؤية LLM:

```csharp
public class OcrQualityWave : IAnalysisWave
{
    public string Name => "OcrQualityWave";
    public int Priority => 58;  // Runs after OCR waves
    public IReadOnlyList<string> Tags => new[] { "content", "ocr", "quality" };

    public async Task<IEnumerable<Signal>> AnalyzeAsync(
        string imagePath,
        AnalysisContext context,
        CancellationToken ct)
    {
        var signals = new List<Signal>();

        // Get OCR text from earlier waves (canonical taxonomy)
        string? ocrText =
            context.GetValue<string>("ocr.ml.multiframe_text") ??  // Florence-2 GIF
            context.GetValue<string>("ocr.ml.text") ??             // Florence-2 single
            context.GetValue<string>("ocr.text");                  // Tesseract

        if (string.IsNullOrWhiteSpace(ocrText))
        {
            signals.Add(new Signal
            {
                Key = "ocr.quality.no_text",
                Value = true,
                Confidence = 1.0,
                Source = Name
            });
            return signals;
        }

        // Tier 1: Spell check (deterministic, no LLM)
        var spellResult = _spellChecker.CheckTextQuality(ocrText);

        signals.Add(new Signal
        {
            Key = "ocr.quality.spell_check_score",
            Value = spellResult.CorrectWordsRatio,
            Confidence = 1.0,
            Source = Name,
            Metadata = new Dictionary<string, object>
            {
                ["total_words"] = spellResult.TotalWords,
                ["correct_words"] = spellResult.CorrectWords
            }
        });

        signals.Add(new Signal
        {
            Key = "ocr.quality.is_garbled",
            Value = spellResult.IsGarbled,  // < 50% correct words
            Confidence = 1.0,
            Source = Name
        });

        // This signal triggers Vision LLM escalation
        if (spellResult.IsGarbled)
        {
            signals.Add(new Signal
            {
                Key = "ocr.quality.correction_needed",
                Value = true,
                Confidence = 1.0,
                Source = Name,
                Tags = new List<string> { "action_required" },
                Metadata = new Dictionary<string, object>
                {
                    ["quality_score"] = spellResult.CorrectWordsRatio,
                    ["correction_method"] = "llm_sentinel"
                }
            });

            // Cache for Vision LLM to access
            context.SetCached("ocr.garbled_text", ocrText);
        }

        return signals;
    }
}
```

قرار التدرج هو **إختباري**: إذا كانت علامة الاختبار للغة < 50%, تبعث إشارة تثير الرؤية LLM. لا الحكم الإحتماليM SK4 لا M" ربما ينبغي علينا أن نسأل LLM

### الإنخفاض في العمل

![أرس بيسكويت](https://raw.githubusercontent.com/scottgal/lucidrag/main/src/Mostlylucid.DocSummarizer.Images/demo-images/arse_biscuits.gif)

```bash
$ imagesummarizer demo-images/arse_biscuits.gif --pipeline caption --output text
OCR: "ARSE BISCUITS"
Caption: An elderly man dressed as bishop with text reading "arse biscuits"
Scene: meme
```

حصلت الـ OCR على النص ; Vision LLM provided scene context . Each wave contributes what it is good at

---


## VisionLlmWave: المقترح المقيد

موجة الـ Vision LLM تعمل فقط عندما تشير الإشارات المسبقة إليها.

```csharp
public class VisionLlmWave : IAnalysisWave
{
    public string Name => "VisionLlmWave";
    public int Priority => 50;  // Runs after quality assessment
    public IReadOnlyList<string> Tags => new[] { "content", "vision", "llm" };

    public async Task<IEnumerable<Signal>> AnalyzeAsync(
        string imagePath,
        AnalysisContext context,
        CancellationToken ct)
    {
        var signals = new List<Signal>();

        if (!Config.EnableVisionLlm)
        {
            signals.Add(new Signal
            {
                Key = "vision.llm.disabled",
                Value = true,
                Confidence = 1.0,
                Source = Name
            });
            return signals;
        }

        // Check if OCR was unreliable (garbled text)
        var ocrGarbled = context.GetValue<bool>("ocr.quality.is_garbled");
        var textLikeliness = context.GetValue<double>("content.text_likeliness");
        var ocrConfidence = context.GetValue<double>("ocr.ml.confidence",
            context.GetValue<double>("ocr.confidence"));

        // Only escalate when: OCR failed OR (text likely but low OCR confidence)
        // Models never decide paths; deterministic signals do (no autonomy)
        bool shouldEscalate = ocrGarbled ||
                              (textLikeliness > 0.7 && ocrConfidence < 0.5);

        if (shouldEscalate)
        {
            var llmText = await ExtractTextAsync(imagePath, ct);

            if (!string.IsNullOrEmpty(llmText))
            {
                // Emit OCR signal (Vision LLM tier)
                signals.Add(new Signal
                {
                    Key = "ocr.vision.text",  // Vision LLM OCR extraction
                    Value = llmText,
                    Confidence = 0.95,  // High but not 1.0 - still probabilistic
                    Source = Name,
                    Tags = new List<string> { "ocr", "vision", "llm" },
                    Metadata = new Dictionary<string, object>
                    {
                        ["ocr_was_garbled"] = ocrGarbled,
                        ["escalation_reason"] = ocrGarbled ? "quality_gate_failed" : "low_confidence_high_likeliness",
                        ["text_likeliness"] = textLikeliness,
                        ["prior_ocr_confidence"] = ocrConfidence
                    }
                });

                // Optionally emit caption (separate signal)
                var llmCaption = await GenerateCaptionAsync(imagePath, ct);
                if (!string.IsNullOrEmpty(llmCaption))
                {
                    signals.Add(new Signal
                    {
                        Key = "caption.text",  // Descriptive caption (not OCR)
                        Value = llmCaption,
                        Confidence = 0.90,
                        Source = Name,
                        Tags = new List<string> { "caption", "description" }
                    });
                }
            }
        }

        return signals;
    }
}
```

الفكرة الرئيسية: **النص لـ Vision LLM لديه الثقة 0.95, ليس 1.0**. إنها ' أفضل من الرسم البياني الممزق , لكنها ' مازالت محتملة . تجمعات السلكية تعرف هذا . . *تملك* قيمة هي't 1.0.)

---


## ال Ledger: Synthesis المقيد

الـ `ImageLedger` يجمع الإشارات إلى أجزاء مبنية من أجل استهلاك الأسفل [سحب السياق](/blog/constrained-fuzzy-context-dragging) applied to image analysis:

```csharp
public class ImageLedger
{
    public ImageIdentity Identity { get; set; } = new();
    public ColorLedger Colors { get; set; } = new();
    public TextLedger Text { get; set; } = new();
    public MotionLedger? Motion { get; set; }
    public QualityLedger Quality { get; set; } = new();
    public VisionLedger Vision { get; set; } = new();

    public static ImageLedger FromProfile(DynamicImageProfile profile)
    {
        var ledger = new ImageLedger();

        // Text: Priority order - corrected > voting > temporal > raw
        ledger.Text = new TextLedger
        {
            ExtractedText =
                profile.GetValue<string>("ocr.final.corrected_text") ??  // Tier 2/3 corrections
                profile.GetValue<string>("ocr.voting.consensus_text") ?? // Temporal voting
                profile.GetValue<string>("ocr.full_text") ??             // Raw OCR
                string.Empty,
            Confidence = profile.GetValue<double>("ocr.voting.confidence"),
            SpellCheckScore = profile.GetValue<double>("ocr.quality.spell_check_score"),
            IsGarbled = profile.GetValue<bool>("ocr.quality.is_garbled")
        };

        // Colors: Computed facts, not guessed
        ledger.Colors = new ColorLedger
        {
            DominantColors = profile.GetValue<List<DominantColor>>("color.dominant_colors") ?? new(),
            IsGrayscale = profile.GetValue<bool>("color.is_grayscale"),
            MeanSaturation = profile.GetValue<double>("color.mean_saturation")
        };

        return ledger;
    }

    public string ToLlmSummary()
    {
        var parts = new List<string>();

        parts.Add($"Format: {Identity.Format}, {Identity.Width}x{Identity.Height}");

        if (Colors.DominantColors.Count > 0)
        {
            var colorList = string.Join(", ",
                Colors.DominantColors.Take(5).Select(c => $"{c.Name}({c.Percentage:F0}%)"));
            parts.Add($"Colors: {colorList}");
        }

        if (!string.IsNullOrWhiteSpace(Text.ExtractedText))
        {
            var preview = Text.ExtractedText.Length > 100
                ? Text.ExtractedText[..100] + "..."
                : Text.ExtractedText;
            parts.Add($"Text (OCR, {Text.Confidence:F0}% confident): \"{preview}\"");
        }

        return string.Join("\n", parts);
    }
}
```

المسجل هو **القنابل** في مصطلحات CFCD. إنها تنقل ما تبقى من الانتقاء, وsynthesis LLM يجب أن يحترم هذه الحقائق

---


## إتخاذ قرار التسارع

لقد رأيتم منطق التدرج في مكانين `OcrQualityWave` يصدر *الإشارات* عن الجودة; `EscalationService` يطبق *السياسة* عبر تلك الإشارات.

- **موجة -تصاعد محلي**: كل موجة تبعث حقائق عن مجالها (eM SK2g., "OCR مشوه
- **تصاعد مستوى الخدمة**: `EscalationService` يجمع الإشارات ويطبق المراحل العالمية

الـ `EscalationService` يربط كل ذلك معا. إنه ينفذ الجزء 1 النمط **substrate → proposer → constrainer**:

```csharp
public class EscalationService
{
    private bool ShouldAutoEscalate(ImageProfile profile)
    {
        // Escalate if type detection confidence is low
        if (profile.TypeConfidence < _config.ConfidenceThreshold)
            return true;

        // Escalate if image is blurry
        if (profile.LaplacianVariance < _config.BlurThreshold)
            return true;

        // Escalate if high text content
        if (profile.TextLikeliness >= _config.TextLikelinessThreshold)
            return true;

        // Escalate for complex diagrams or charts
        if (profile.DetectedType is ImageType.Diagram or ImageType.Chart)
            return true;

        return false;
    }
}
```

كل قرار تصاعدي هو **إختباري**: نفس المدخلات, نفس السقوطM SK2 نفس القرار . لا حكم LLM في منطق التسارع

---


## محرك الرؤية لـ LLM : القيود على الأدلة

عندما يعمل الـ Vision LLM ــ , ــ يستقبل الحقائق المحسوبية كقيود ــ:

```csharp
private static string BuildVisionPrompt(ImageProfile profile)
{
    var prompt = new StringBuilder();

    prompt.AppendLine("CRITICAL CONSTRAINTS:");
    prompt.AppendLine("- Only describe what is visually present in the image");
    prompt.AppendLine("- Only reference metadata values provided below");
    prompt.AppendLine("- Do NOT infer, assume, or guess information not visible");
    prompt.AppendLine();

    prompt.AppendLine("METADATA SIGNALS (computed from image analysis):");

    if (profile.DominantColors?.Any() == true)
    {
        prompt.Append("Dominant Colors: ");
        var colorDescriptions = profile.DominantColors
            .Take(3)
            .Select(c => $"{c.Name} ({c.Percentage:F0}%)");
        prompt.AppendLine(string.Join(", ", colorDescriptions));

        if (profile.IsMostlyGrayscale)
            prompt.AppendLine("  → Image is mostly grayscale");
    }

    prompt.AppendLine($"Sharpness: {profile.LaplacianVariance:F0} (Laplacian variance)");
    if (profile.LaplacianVariance < 100)
        prompt.AppendLine("  → Image is blurry or soft-focused");

    prompt.AppendLine($"Detected Type: {profile.DetectedType} (confidence: {profile.TypeConfidence:P0})");

    prompt.AppendLine();
    prompt.AppendLine("Use these metadata signals to guide your description.");
    prompt.AppendLine("Your description should be grounded in observable facts only.");

    return prompt.ToString();
}
```

لا يجب أن يدعي الـ Vision LLM "اللونات المتحركة" إذا قمنا بحساب القياس الرماديM SK2 إذا كان ذلك صحيحاً,التعارض قابل للإكتشاف . لا ينبغي أن يزعم الـ "تفاصيل حادةMSC6 اذا قمنا بالحساب للتردد المنخفض لـ Laplacian **القشرة الإفتراضية تقيد الناتج الإحتمالي**.

هذه القيود تقلل الهلوسة ولكن لا يمكن القضاء عليها

---


## أولويات النص الناتج

عند استخراج النص النهائي, يستخدم النظام ترتيب أولويات صارع:

```csharp
static string? GetExtractedText(DynamicImageProfile profile)
{
    // Priority chain using canonical signal names (see OCR Signal Taxonomy above)
    //   1. Vision LLM OCR (best for complex/garbled)
    //   2. Florence-2 multi-frame GIF (temporal stability)
    //   3. Florence-2 single-frame (stylized fonts)
    //   4. Tesseract (baseline)

    var visionText = profile.GetValue<string>("ocr.vision.text");
    if (!string.IsNullOrEmpty(visionText))
  ocally (confidence 0.85-0.90, no cost)
- **Tesseract voting**: Reliable for clean text (confidence varies, deterministic)
- **Raw Tesseract**: Baseline fallback (confidence < 0.7 for stylized fonts)

The priority order encodes this knowledge. Florence-2 sitting between Vision LLM and Tesseract provides a "sweet spot" for most images—better than traditional OCR, cheaper than cloud Vision LLMs.

Note: this function selects *one* source, but the ledger exposes *all* sources with their confidence scores. Downstream consumers can-and should-inspect provenance when the domain requires it. The priority order is a sensible default, not a straitjacket.

---

## Selection and Conflict Resolution

The priority chain above is the current implementation-a simple fallback. But the architecture supports adding rejection rules as config-driven policy. Here's the pattern for contradiction detection (not yet implemented, but the signals exist to support it):

```csharp
// Pattern: Contradiction detection as policy rules
public static class SelectionPolicy
{
    public static string? SelectTextWithConstraints(DynamicImageProfile profile)
    {
        var visionText = profile.GetValue<string>("vision.llm.text");
        if (!string.IsNullOrEmpty(visionText))
        {
            // Rule: Reject if Vision claims text but deterministic signals say no text
            var textLikeliness = profile.GetValue<double>("content.text_likeliness");
            if (textLikeliness < _config.TextLikelinessThreshold && visionText.Length > 50)
            {
                // Contradiction detected - log and fall through
                profile.AddSignal(new Signal
                {
                    Key = "selection.vision_rejected",
                    Value = "text_likeliness_contradiction",
                    Confidence = 1.0,
                    Source = "SelectionPolicy",
                    Metadata = new Dictionary<string, object>
                    {
                        ["text_likeliness"] = textLikeliness,
                        ["vision_text_length"] = visionText.Length,
                        ["threshold"] = _config.TextLikelinessThreshold
                    }
                });
                // Fall through to OCR sources
            }
            else
            {
                return visionText;
            }
        }

        // Continue with priority chain...
        return profile.GetValue<string>("ocr.voting.consensus_text")
            ?? profile.GetValue<string>("ocr.full_text");
    }
}
```

نفس النمط ينطبق على أنواع الإشارات الأخرى:

- **تناقض الألوان**: نرفض العنوان الذي يدعي "أحمرات حيوية" إذا `color.is_grayscale` صحيح
- **تناقض Sharpness**: نرفض العنوان الذي يدعي "تفاصيل دقيقة" إذا `quality.sharpness` حد <
- **Type contradiction**: نرفض العنوان الذي يدعي "شخص " إذا `content.type` هو رسم مع ثقة عالية

الخصائص الرئيسية لطبقة الانتقاء:

- **سلسلة الأولوية**: كل مصدر لديه ترتيب ردود الفعل محدد, ليس ad
- **بوابة الجودة في الأسفل**: يقبل الـ OCR عندما تقول البوابة الإفتراضية أنها ' ليست مشوهة
- **نقطة التوسع**: قواعد التناقض هي config- مدفوعة وبادارة مثل أي سياسة أخرى
- **مسار الفحص**: الرفض يصدر إشارات مع القيم الملاحظة والحدود

هذا هو المكان الذي يستمر فيه "التحديدية " يصبح صحيحا ميكانيكيا | . | LLM يقترح |; | قواعد التحديدistic تقرر ما إذا كان من المفترض قبول

---


## Konfigurة أنابيب JSON

أنابيب قابلة للتركيب بشكل كامل من خلال JSON, مما يجعل مكونات الموجات واضحة وقابلة للفحص:

```json
{
  "name": "advancedocr",
  "displayName": "Advanced OCR (Default)",
  "description": "Multi-frame temporal OCR with stabilization and voting",
  "estimatedDurationSeconds": 2.5,
  "accuracyImprovement": 25,
  "phases": [
    {
      "id": "color",
      "name": "Color Analysis",
      "priority": 100,
      "waveType": "ColorWave",
      "enabled": true
    },
    {
      "id": "simple-ocr",
      "name": "Simple OCR",
      "priority": 60,
      "waveType": "OcrWave",
      "earlyExitThreshold": 0.98
    },
    {
      "id": "advanced-ocr",
      "name": "Advanced Multi-Frame OCR",
      "priority": 59,
      "waveType": "AdvancedOcrWave",
      "dependsOn": ["simple-ocr"],
      "parameters": {
        "maxFrames": 30,
        "ssimThreshold": 0.95,
        "enableVoting": true
      }
    },
    {
      "id": "quality",
      "name": "OCR Quality Assessment",
      "priority": 58,
      "waveType": "OcrQualityWave",
      "dependsOn": ["advanced-ocr"]
    }
  ]
}
```

خطوات الخروج المبكرة تترك موجات مكلفة تتخطى عندما وصلت موجات رخيصة بالفعل إلى الثقة العالية.

---


## خط أنابيب الآلية: التصفية الذكية

الـ `auto` خط أنابيب ينفذ توجيهاً ذكياً على أساس خصائص الصورة, اختيار مسار المعالجة الأمثل:

```
Image Analysis (OpenCV ~5-20ms)
    │
    ├── Is animated (>1 frame)?
    │   └── ANIMATED route
    │       ├── Has subtitle regions? → Text-only strip extraction
    │       ├── Minimal text? → FAST (Florence-2 only)
    │       └── Motion significant? → Motion analysis
    │
    ├── Has text regions (OpenCV detection)?
    │   ├── High contrast, clean text → FAST route (Florence-2, ~100ms)
    │   ├── Moderate confidence → BALANCED route (Florence-2 + Tesseract, ~300ms)
    │   └── Low confidence → QUALITY route (Multi-frame + Vision LLM, ~1-5s)
    │
    ├── Is chart/diagram (type detection)?
    │   └── QUALITY route → Vision LLM caption
    │
    └── Default → FAST route (Florence-2 caption)
```

### أداء الطريق

| الطريق | يحدد متى | المعالجة | الوقت | التكلفة |
| -------- | ------------------------------------------------ | ----------------------------- | ------ | ------------ |
| أسرع | نص بسيط, متباينة عاليةM SK3 шрифтات قياسية | فلورانس-2 فقط | ~100ms SMk8 منخفض ( محليMSк10 .|
| متوازن | نص عاديM SK2 ثقة متوسطة | فلورانس-2 M+ التصويت Tesseract | |~300ms | | منخفض ( | محلي |) | |
| جودة | الرسوم البيانية, الرسم البيانيM SK3 Schriftات مصممة بأسلوبٍ مدهشMSC4 الثقة المنخفضة || |Multi | - |frame |+ | Vision LLM | |
| مدمجة |GIFs مع الأشرطة الفرعية | | | النص |- | شريط فقط | МSK4 | الشريط التصويري |

### مثال حقيقي: الخيار الذاتي للطريق

```bash
$ imagesummarizer anchorman-not-even-mad.gif --pipeline auto --output visual
[Route selection...]
  Image: 300×185, 93 frames
  Text detection: 15 regions found (bottom 30%)
  Subtitle pattern: DETECTED
  → Selected ANIMATED route (text-only filmstrip)

[Processing...]
  MlOcrWave: Extracted 10 frames → 2 unique text segments
  Text-only strip: 253×105 (83% token reduction)
  VisionLlmWave: Processing filmstrip...

[Results - 2.3s total]
Text: "I'm not even mad." + "That's amazing."
Caption: A person wearing grey turtleneck sweater with neutral expression
Scene: meme
Motion: SUBTLE general motion
```

قرار التوجيه هو محدد ومسجل في الإشارات للaudit:

```json
{
  "routing": {
    "selected_route": "ANIMATED",
    "reason": "subtitle_pattern_detected",
    "text_regions": 15,
    "frames": 93,
    "decision_time_ms": 18
  }
}
```

---


## ال CLI: باستخدامه

### الإستخدام الأساسي

```bash
# Use auto pipeline (smart routing - recommended)
imagesummarizer meme.gif --pipeline auto

# Fast local caption with Florence-2 ONNX (~200ms)
imagesummarizer photo.jpg --pipeline florence2

# Best quality: Florence-2 + Vision LLM
imagesummarizer complex-diagram.png --pipeline florence2+llm

# Extract text only (three-tier OCR)
imagesummarizer screenshot.png --pipeline advancedocr

# Motion analysis for GIFs
imagesummarizer animation.gif --pipeline motion

# Process a directory with visual output
imagesummarizer ./photos/ --output visual
```

### مجموعات الإشارات

أطلب فقط الإشارات التي تحتاجها باستخدام الجمعات المحددة

```bash
# Minimal metadata (fast)
imagesummarizer image.png --signals "@minimal"

# Alt text for accessibility
imagesummarizer image.png --signals "@alttext"

# Motion analysis
imagesummarizer animation.gif --signals "@motion"

# Full analysis
imagesummarizer image.png --signals "@full"

# Custom wildcard patterns
imagesummarizer image.png --signals "color.dominant*, ocr.text, motion.*"
```

| التجميع | الإشارات | | | موضوع الاستخدام ||
| ---------- | --------------------------------------- | ------------------ |
| `@minimal` |هوية.*, جودة.sharpness
| `@alttext` |ចំណងជើង.كتابةM SK2ocr .كتملةMST4لونMSC5مسيطر* | سهولة الوصول |
| `@motion` | الحركة.*,هويةM SK1صورة_عدّة |تحليل الرسوم المتحركة |
| `@full` | جميع الإشارات | التحليل الكامل |
| `@tool` | مجموعة فرعية مُحسنة | MCP/automation |

### ناتج JSON حقيقي

```bash
$ imagesummarizer princess-bride.gif --output json
```

```json
{
  "image": "princess-bride.gif",
  "duration_ms": 1838,
  "waves_executed": ["ColorWave", "OcrWave", "AdvancedOcrWave", "VisionLlmWave"],
  "text": {
    "value": "You keep using that word.\nI do not think it means what you think it means.",
    "source": "ocr.voting.consensus_text",
    "confidence": 0.95
  },
  "escalation": {
    "triggered": true,
    "reason": "text_likeliness_above_threshold",
    "threshold": 0.4,
    "observed": 0.67
  },
  "signals": {
    "color.dominant_1": { "value": "#1a1a2e", "confidence": 1.0 },
    "ocr.quality.spell_check_score": { "value": 0.82, "confidence": 1.0 },
    "ocr.quality.is_garbled": { "value": false, "confidence": 1.0 },
    "motion.type": { "value": "static", "confidence": 0.95 }
  }
}
```

كل حقل لديه أصل `escalation` عرضات بلاك *لماذا* كان اسم Vision LLM .

### تحليل الحركة

![آلان رشوغ](https://raw.githubusercontent.com/scottgal/lucidrag/main/src/Mostlylucid.ImageSummarizer.Cli/demo-images/alanshrug_opt.gif)

```bash
$ imagesummarizer demo-images/alanshrug_opt.gif --pipeline motion
Motion: SUBTLE general motion (localized coverage)
Direction: up-down
Magnitude: 0.23
```

### والطريقة التفاعلية

```bash
$ imagesummarizer
ImageSummarizer Interactive Mode
Pipeline: advancedocr | Output: auto | LLM: auto
Commands: /help, /pipeline, /output, /llm, /model, /ollama, /models, /quit

Enter image path (or drag & drop): F:\Gifs\meme.gif
Processing...
I'm not even mad. That's amazing.

Enter image path: /llm true
Vision LLM: enabled

Enter image path: /model minicpm-v:8b
Vision model: minicpm-v:8b
```

### لوحة مفاتيح डेस्कटॉप

للاكتشاف البصري, يقدم تطبيق डेस्कटॉप:

- **Drag & drop interface**: رمي الصور لتحليل فوري
- **سجل إشارات حية**: تنفذ موجات الساعة في الوقت الحقيقي- مع لون الثقة
- **مؤشرات حالة النموذج**: نظام إشارة المرور (🟢 جاهزة, 🟡 المعالجةMSC4 MSC5 خاطئة MSc6
- **لمحة GIF الرسوم المتحركة**: شاهد توليد شرائح الأفلام و إستخراج الإطار
- **مستكشف إشارات**: أضغط على أي إشارة لرؤية provenance الكاملة والبيانات المجازية
- **إختيار أنابيب**: إختيار بين انظمة الـ
- **Export options**: نسخ الإشارات ك JSON, حفظ شرائح الأفلامM SK2 إخراج النص

الواجهة البيانية للផ្ទៃតុ تبين المعمار بصريا— يمكنكم رؤية بالضبط أي أمواج تدور, ما هي الإشارات التي تصدرهاM SK2 وكيف تم اتخاذ قرارات التوجيهMSC3 ممتازة لفهم النظام أو إصلاح خطوط الأنابيب الخاصة

CLI يكشف عن كل التعقيد بعرض خيارات بسيطة. يمكنك تحويل خطوط الأنابيب, نماذجM SK2 ونماذج البث دون أن تفهم هيكلة الأمواج .

---


## أين تظهر الأنماط

| جزء | نمط | تطبيق مركب التصوير S|
| ---- | ---------------------------------------------------------------- | ----------------------------------------------------------------------- |
| 1    | [الغموض المقيد](/blog/constrained-fuzziness-pattern) | ColorWave يقوم بحساب الحقائق; VisionLlmWave يحترمها |
| 2    | [MoM مقيدة](/blog/constrained-mom-mixture-of-models) | نشر موجات متعددة لتحليل السياق; نقاط ارتكاز الموجة |
| 3    | [سحب السياق](/blog/constrained-fuzzy-context-dragging) | ImageLedger يجمع الخصائص البارزة; نتائج مخازن قاعدة بيانات الإشارات |

نفس الأنماط. مجال مختلف. نفس القاعدةM SK2 **الاحتمال يقترح , الإثبات يبقى**.

---


## ما تحصل عليه

- **RAG-إخراج جاهز**: JSON مبنية مع نقاط الثقة, ليس بروية
- **محلي- المعالجة الأولى**: فلورانس-2 ONNX يعمل محليا (~200msM SK3 لا توجد تكاليف API للكثير من الصور
- **التوجيه الذكي**: خط أنابيب أوتوماتيكي يختار مساراً مثالياً
- **فعالية الرموز**: النص-فقط الأشرطة تحصل على 30× تقليل الرموز لعناوين فرعية GIF
- **القرارات الشفافية**: كل التسارع لديه سبب واضح مع provenance
- **النموذج-agnostic**: استبدال أولاما لOpenAI أو أنثروبيك دون تغيير الهندسة المعمارية
- **محفظة حسب المحتوى**: نفس الصورة | = | نفس التحليل |, | حتى لو تم تغيير اسمها ♫ ( | مخزن SQLite ♫, ♫ ♫
- **لوحة مفاتيح डेस्कटॉप**: DragM SK1and-drop interface with live signal visualization
- **نظام تشغيل MCP**: تدمج مع أي LLM يدعم بروتوكول السياق النموذجي (Claude Desktop, وهلمجرا
- **الواجهة الإتصالية المبنية على -**: تطلب فقط ما تحتاجه باستخدام نمط الاوراق أو مجموعات

## ما تكلفه

- **رأس مال إدراكي**: يجب عليك أن تفهم العقد الإشارات , أولويات الموجة , و منطق التسارع قبل كتابة موجة واحدة.
- **تخصص الفيزياء**: كل مفاتيح إشارة تحتاج إلى تعريف واضح . كل علامة الثقة تحتاج إلى عقلانية
- **Per- التعقيد الموجي**: كل موجة لديها نظامها الخاص, حالات الحافةM SK2 ومدارات الخلل . تحل الحوائط في مستوى الموجة
- **سطح الاختبار**: المزيد من المكونات يعني المزيد من الإختبارات. تحريك السياقM SK2 إثبات الإشارات , تتأكد من مسارات التسارع
- **الاستثمار المبكر**: تقوم بتحديد الموجاتM SK1 الإشارات , وبنية ال ledger قبل أن ترى النتائج. النتيجة تأتي لاحقاً

هذا ليس الطريق السريع. إنه' الطريق الموثوق بهM SK2 يستحق ذلك إذا كنت بحاجة لفهم صورة قابلة للفحص على نطاق واسعMSC3 الخلط الفائق إذا كنت فقط تحتاج إلى تعليقات لعرض صور .

---


## طرق الفشل وكيف يعالجها هذا

| حالت الفشل | ما الذي يحدث | كيف يتم التعامل معه '
| ------------------------------ | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **GIF ضجيج** | تذبذب الإطارات, آثار التدخين | الاستقرار المؤقت | + | تقليل SSIM |+ | إجماع صوتي | МSK5 | نص | مSK6 | إستخراج شريط فقط | المSK7
| **OCR يعيد النفايات** | فشلت تيسيراكت في كتابة الخطوط المصممة | اللّعب | - detects check gate | |< | МSK4 | correct | → | escalates to Florence
| **تكاليف API عالية** | الكثير من مكالمات الـ LLM للرؤية السحابية | فلورانس-2 يتعاملون مع ONNX | 80%+ | محليا |(~200 |ms |), | نص | - | فقط الشرائح تخفيض الرموز | مSK7 | للGIF | المSK8
| **هلوسات الرؤية** | claims text that is not't there | Signals enable contradiction detection MSC3pattern shown aboveMSC4 downstream consumers can compare`vision.llm.text` ضد `content.text_likeliness` |
| **تغيرات الأنبوب مع مرور الوقت** | أضف موجات جديدة , حد مُحدّد | المحتوى - تخزين الخشاش | + | ال provenance الكامل في كل إشارة |+ | نسخ التتبع | |
| **النموذج لا يعيد شيئاً** | وقفة لرؤية LLM أو رد فعل فارغ | سلسلة التراجع: رؤية LLM → فلورانسMSC4 S→ التصويت Tesseract

كل حالت الفشل لديها استجابة إفتراضية. لا تحلل صامت.

---


## الصورة الأكبر: متعددة- رسم بياني موادي RAG

> **السياق المهم**: ImageSummarizer هو **أنابيب الإمتصاص للصورة** لنظام البيئة LucidRAG.

هذا المقال يركز على استخراج الإشارات الهيكلية من الصور. لكن القوة الحقيقية تظهر عندما تدمج مع المختصين الآخرين:

- **[DocSummarizer](https://github.com/scottgal/lucidrag)** - تحليل مستندات مبنية (PDFs, نَكْرْدَمَ, شُدْمْ)
- **[المزيج للبيانات](https://github.com/scottgal/lucidrag)** - رسم نمط بيانات Tabular (CSVM SK2 قواعد البيانات)
- **ImageSummarizer** (هذا المقال) - تحليل الصور و الرسوم المتحركة

عندما يتم ربطها مع **LucidRAG** (سنأتي قريبا!), هذه الأنواع الثلاثة من الأنابيب تمكن **الرسوم البيانية المتحركة RAG -**:

```
Document → DocSummarizer → Structured signals
    ↓
Images → ImageSummarizer → Structured signals
    ↓
Data → DataSummarizer → Structured signals
    ↓
    ↓ (all signals)
    ↓
LucidRAG Graph Builder → Multi-modal knowledge graph
    ↓
Query → Multi-modal retrieval + constrained generation
```

**لماذا هذا مهم**: RAG التقليدي يتعامل مع الصور كفقاعات غامضة التي تحصل على عنوان **أول مصادر إشارات من فئة -** مع العلاقات المكتوبة للكتابة.

يقياس النمط : إذا كان بإمكانك إستخلاص إشارات مبنية من الصور (هذا المقال | ), | مستندات |([DocSummarizer](/blog/building-a-document-summarizer-with-rag)), وبيانات  ([المزيج للبيانات](/blog/datasummarizer-how-it-works)), يمكنك بناء رسم بياني للمعرفة حيث كل عقد يحمل جذورا وكل حافة لديها نقاط ثقة

**ستأتي قريبا**: التكامل الكامل لـ LucidRAG يوضح كيف تتكون هذه الأنابيب إلى عدة graphs .

---


## الاستنتاجات

الهندسة المعمارية لها بنية : كل موجة مستقلة , كل إشارة مكتوبة | , كل التسارع هو محدد |. | فلورانس ♫ -2 | يوفر تحليلا محليا سريعا ♪ , | Vision LLM يتعامل مع الحالات المعقدة ♪

منذ نشر المقال الأول , لقد تطور النظام بشكل كبير "MSSK1"

- **فلورانس-2 تكامل أونكس** تخفيض تكاليف الAPI وبقايا العمل (~200ms محلية مقابل ~1-5s بادل )
- **النص-مجرد شرائح الأفلام** تحقيق 30× تقليل من الرموز لترجمات الGIF
- **أنابيب ذاتية التحكم** يختار المسار الأمثل بناء على خصائص الصورة
- **مجموعات الإشارات** لتسهيل حالات الاستخدام العام (@alttext, @motionM SK3
- **لوحة مفاتيح डेस्कटॉप** يقدم تحليل "drag-and-drop" مع تصور المؤشر الحي

أنابيب الـ OCR وحدها ــ — ــ بثلاثة أصعدة ــ- ــ متصاعدة ـــ , ــ متعددة ـــ- ــ صوت إطار ــ МSK4 ــ تحسين مسارات الفيلم ـ , ــ وكتابة النص ــ[تكامل التصوير بالرسوم المتقاطعة](https://github.com/scottgal/lucidrag/blob/main/src/Mostlylucid.DocSummarizer.Images/docs/vision-ocr-integration.md) دليل لفصل التقنية الكاملة.

إذا كان بإمكانك فعل هذا بالنسبة للصور—أكثر أنواع الإدخال فوضوية, مع ضجيج التصوير بالرنين المغناطيسيM SK2 ألواح مصممة بأسلوبٍ مُصَلَّدMSC3 إطاراتٍ رسومٍ متحركة , و هلوساتٍ .- تعليقاتٍ مثيرةٍ ,— يمكنك فعل ذلك لأي جزءٍ إفتراضيّ

ذلك ' محدود الغموض في الواقع . ليس نمط تجريدي

---


## الموارد

### المخزن

- **[مخزن LucidRAG](https://github.com/scottgal/lucidrag)** - شفرة المصدر الكاملة

### أداة CLI

- **[ImageSummarizer CLI](https://github.com/scottgal/lucidrag/tree/main/src/Mostlylucid.ImageSummarizer.Cli)** - Command-line tool for image analysis
- **[قراءة CLI](https://github.com/scottgal/lucidrag/blob/main/src/Mostlylucid.ImageSummarizer.Cli/README.md)** - Montage, Usage , and configuration
- **[صور تجريبية](https://github.com/scottgal/lucidrag/tree/main/src/Mostlylucid.ImageSummarizer.Cli/demo-images)** - عينة GIF وشريحة إطار تظهر في هذا المقال

### مكتبة أساسية

- **[DocSummarizer.صور](https://github.com/scottgal/lucidrag/tree/main/src/Mostlylucid.DocSummarizer.Images)** - مكتبة تحليل الصور الأساسية
- **[مكتبة README](https://github.com/scottgal/lucidrag/blob/main/src/Mostlylucid.DocSummarizer.Images/README.md)** - توصيل API, هيكلة موجاتM SK2 و دليل التكامل
- **[دليل العمارة](https://github.com/scottgal/lucidrag/blob/main/src/Mostlylucid.DocSummarizer.Images/docs/architecture.md)** - الموجاتM SK1 الإشارات, التدرج
- **[مستندات أنابيب](https://github.com/scottgal/lucidrag/blob/main/src/Mostlylucid.DocSummarizer.Images/docs/pipelines.md)** - أوتوماتM SK1 متوازن, جودةMSC3 فلورانس 2+llm
- **[تكامل التصوير بالرسوم المتقاطعة](https://github.com/scottgal/lucidrag/blob/main/src/Mostlylucid.DocSummarizer.Images/docs/vision-ocr-integration.md)** - التنقلM SK1 شرائح الأفلام , إقتصاد الرموز
- **[تحليل الحركة](https://github.com/scottgal/lucidrag/blob/main/src/Mostlylucid.DocSummarizer.Images/docs/motion.md)** - استخراج إطار GIF, كشف الحركة
- **[الإشارات مرجعية](https://github.com/scottgal/lucidrag/blob/main/src/Mostlylucid.DocSummarizer.Images/docs/signals.md)** - دليل الإشاراتM SK1 مجموعات, تركيب خانات عشوائية

### المقالات المرتبطة

- [DocSummarizer](/blog/building-a-document-summarizer-with-rag) - أنابيب تحليل الوثائق باستخدام أنماط مماثلة
- [المزيج للبيانات](/blog/datasummarizer-how-it-works) - رسم بيانات مع نفس التفاضل والتكامل

---


## السلسلة

| جزء | نمط | محور |
| ---- | ------------------------------------------------------------------------- | ------------------------------- |
| 1    | [الغموض المقيد](/blog/constrained-fuzziness-pattern) | عنصر واحد |
| 2    | [MoM مقيدة](/blog/constrained-mom-mixture-of-models) | أجزاء متعددة |
| 3    | [سحب السياق](/blog/constrained-fuzzy-context-dragging) | الوقت / الذاكرة |
| 4    | **استخبارات الصورة (هذا المقال)**                                     | **فن العمارة الموجية, نمط** |
| 4.1  | [أنابيب تير ثلاثية -](/blog/constrained-fuzzy-image-ocr-pipeline) | OCRM SK1 نماذج ONNX, شرائح الأفلام |

**التالي**: الجزء 5 سيظهر كيف ImageSummarizer [DocSummarizer](/blog/building-a-document-summarizer-with-rag), و [المزيج للبيانات](/blog/datasummarizer-how-it-works) compose into multi-modal graph RAG with LucidRAG.

كل الأجزاء تتبع نفس المتغير: **مكونات الإحتمالية تقترح ; أن الأنظمة الثابتة تستمر**.