👁️

بناء خبير الرؤية (OCR) بـ C++ الخالص

SYS.TIME12 أغسطس 2026 - 16:45 PM (GMT+3)
CATEGORYالتأسيس

بناء خبير الرؤية (OCR) بـ C++ الخالص

في هذه المرحلة، حققنا إنجازاً معمارياً مهماً: قمنا ببناء خط معالجة رؤية حاسوبية (Computer Vision Pipeline) متكامل بـ C++ الخالص، دون الاعتماد على مكتبات ضخمة مثل OpenCV أو Python.

كيف يعمل خط المعالجة (Pipeline)؟

بدلاً من الاعتماد على بيئات جاهزة، بنينا الخطوة تلو الأخرى داخل pz_vision_engine_wrapper.cpp:

  1. فك التشفير (Decoding): استخدمنا مكتبة stb_image.h الخفيفة جداً (ملف واحد) لتحويل بايتات الصورة القادمة من Rust إلى مصفوفة بكسلات RGB خام في الذاكرة.
  2. تغيير الحجم (Resizing): برمجنا خوارزمية Bilinear Interpolation يدوية لتغيير ارتفاع الصورة إلى 48 بكسل (المقاس المعياري لنموذج PaddleOCR) مع الحفاظ على نسبة العرض إلى الارتفاع ديناميكياً.
  3. التطبيع (Normalization): قمنا بتحويل البكسلات من 0-255 إلى نطاق -1.0 إلى 1.0 لتتناسب مع أوزان الشبكة العصبية.
  4. التشغيل (Inference): مررنا المصفوفة الجاهزة إلى محرك ONNX Runtime (v1.21).
  5. فك التشفير النهائي (CTC Decoding): المحرك يُعيد مصفوفة احتمالات (مثلاً [1, 16, 749]). برمجنا خوارزمية CTC Greedy Decoder لترجمة أعلى الاحتمالات إلى أحرف عربية، مع تجاهل الـ Blank Tokens والتكرارات المتتالية.

لماذا هذا الإنجاز مهم؟

  • أداء فائق السرعة (Bare-metal speed): لا يوجد أي overhead قادم من استدعاءات Python أو مكتبات معالجة الصور الضخمة.
  • استقلالية تامة (Self-contained): المشروع لا يعتمد إلا على libonnxruntime.so، مما يجعله جاهزاً للتضمين في أي بيئة دون الحاجة لبيئات افتراضية (Virtual Environments).
  • كفاءة الذاكرة: نتحكم تماماً بمتى يتم حجز وتحرير الذاكرة عبر OrtAllocator.

الخطوة التالية

تم تشغيل المحرك بنجاح دون أي انهيار (Crash-free) وأخرج مصفوفة الأبعاد الصحيحة. الخطوة القادمة هي ضبط أرقام الفهارس (Index Mapping) في القاموس، حيث اكتشفنا أن نموذج PaddleOCR يضع الـ Blank Token في نهاية القاموس وليس بدايته.