كشف الحواف في الوقت الحقيقي باستخدام FPGA

مقدمة


يطبق مشروعنا نظامًا للكشف عن الحواف في الوقت الفعلي استنادًا إلى التقاط إطارات الصور من كاميرا OV7670 وتدفقها إلى شاشة VGA بعد تطبيق مرشح درجات الرمادي ومشغل Sobel. تم تصميمنا على لوحة Cyclone IV FPGA التي تمكننا من تحسين الأداء باستخدام الميزات القوية للأجهزة ذات المستوى المنخفض والحسابات المتوازية ، وهو أمر مهم لتلبية متطلبات النظام في الوقت الفعلي.


استخدمنا لوحة تطوير ZEOWAA FPGA التي تستند إلى Cyclone IV (EP4CE6E22C8N). أيضًا ، استخدمنا Quartus Prime Lite Edition كبيئة تطوير و Verilog HDL كلغة برمجة. بالإضافة إلى ذلك ، استخدمنا واجهة VGA المدمجة لتشغيل شاشة VGA ، و GPIO (دبابيس عامة للإدخال والإخراج) لتوصيل الأجهزة الخارجية بلوحنا.


ZEOWAA FPGA مجلس التنمية


العمارة


ينقسم تصميمنا إلى 3 أجزاء رئيسية:


  1. قراءة وحدات بكسل البيانات من الكاميرا.
  2. تنفيذ خوارزمية الكشف عن الحواف (محول درجات الرمادي ومشغل سوبل).
  3. عرض الصورة النهائية من خلال التواصل مع شاشة VGA.

أيضا ، هناك تخزين متوسط ​​للذاكرة بين قراءة / كتابة البيانات والعمل على هذه البيانات. لهذا الغرض ، قمنا بتنفيذ اثنين من المخازن المؤقتة التي تعمل كمساحة مؤقتة للبكسل قبل استخدامها.


العمارة المنفذة


لاحظ أننا بعد أن أخذنا البكسل من الكاميرا ، لم نخزنها مباشرة في ذاكرة التخزين المؤقت المتوسطة. بدلاً من ذلك ، قمنا بتحويله إلى التدرج الرمادي ثم قمنا بتخزينه في المخزن المؤقت. وذلك لأن تخزين وحدات البكسل الرمادية 8 بت يستغرق ذاكرة أقل من تخزين وحدات البكسل الملونة التي تبلغ 16 بت. أيضا ، لدينا مخزن مؤقت آخر يقوم بتخزين البيانات بعد تطبيق مشغل Sobel لجعلها جاهزة للعرض على الشاشة.


فيما يلي تفاصيل حول تنفيذ بنيتنا:


الكاميرا

استخدمنا كاميرا OV7670 وهي واحدة من أرخص وحدات الكاميرا التي وجدناها. أيضًا ، يمكن أن تعمل هذه الكاميرا على 3.3V ولا تحتاج إلى بروتوكولات اتصال صعبة مثل I2c أو SPI لاستخراج بيانات الصورة. يتطلب فقط واجهة SCCB التي تشبه واجهة I2c لتعيين تكوين الكاميرا من حيث تنسيق الألوان (RGB565 ، RGB555 ، YUV ، YCbCr 4: 2: 2) ، الدقة (VGA ، QVGA ، QQVGA ، CIF ، QCIF) والعديد من الإعدادات الأخرى.


وحدة الكاميرا OV7670


يتكون الفيديو من إطارات يتم تغييرها بمعدل معين. إطار واحد هو صورة تتكون من صفوف وأعمدة بكسل حيث يتم تمثيل كل بكسل بقيم اللون. في هذا المشروع ، استخدمنا التكوين الافتراضي للكاميرا حيث حجم الإطار هو دقة VGA 640 × 480 (0.3 ميجابكسل) ، وتنسيق ألوان البكسل هو RGB565 (5 بت للأحمر ، 6 بت للأزرق ، 5 بت للأخضر ) ومعدل تغيير الإطارات هو 30 إطارًا في الثانية.


في الأسفل ، توصيلات الكاميرا بـ FPGA باستخدام GPIO الموجود في لوحة التطوير:


ثبّت الكاميرادبوس في FPGAالوصفثبّت الكاميرادبوس في FPGAالوصف
3.3 فولت3.3 فولتالتيار الكهربائي (+)GNDGNDمستوى الإمداد الأرضي (-)
SdiocGNDساعة SCCBSDIODGNDبيانات SCCB
VSYNCص 31التزامن العموديHrefص 55التزامن الأفقي
PCLKص 23ساعة بكسلXclkص 54ساعة نظام الإدخال (25 ميجا هرتز)
د 7ص 468 بت البياناتد 6ص 44الجزء السابع من البيانات
د 5ص 43الجزء السادس من البياناتد 4ص 42الجزء الخامس من البيانات
د 3ص 394 بت البياناتد 2ص 383 بت من البيانات
د 1ص 34الجزء الثاني من البياناتد 0ص 33الجزء الأول من البيانات
RESET (نشط منخفض)3.3 فولتإعادة تعيين دبوسPWDNGNDدبوس الطاقة لأسفل

لاحظ أننا لم نستخدم واجهة SCCB للتكوين. لذا ، نضع الأسلاك المقابلة على الأرض لمنع أي إشارات عائمة يمكن أن تؤثر على البيانات.


لتوفير ساعة 25 ميجاهرتز للكاميرا ، استخدمنا حلقة قفل الطور (PLL) وهو نظام التحكم في التردد ذي الحلقة المغلقة لتوفير الساعة المطلوبة من 50 ميجاهرتز المقدمة من اللوحة. لتنفيذ PLL ، استخدمنا أداة كتالوج IP الداخلية داخل برنامج Quartus.


تستخدم هذه الكاميرا إشارة التزامن العمودي (VSYNC) للتحكم في عملية إرسال الإطار وإشارة التزامن الأفقي (HREF) للتحكم في إرسال كل صف من الإطار. تستخدم هذه الكاميرا 8 أسطر فقط من البيانات (D0-D7) لنقل البتات التي تمثل قيم ألوان البكسل حيث تقوم الكاميرا بتقسيم قيمة RGB 16 بت إلى جزأين (8 بت) وإرسال كل واحد على حدة.


توضح الأشكال التالية من ورقة البيانات لوحدة الكاميرا OV7670 إشارات التزامن الرأسي والأفقي.


توقيت إطار VGA


توقيت أفقي


رسم تخطيطي لتوقيت إخراج RGB565


محول درجات الرمادي

لإنتاج صورة رمادية من صورتها الملونة الأصلية ، يجب مراعاة العديد من العوامل ، لأن الصورة قد تفقد التباين والحدة والظل والهيكل. علاوة على ذلك ، يجب أن تحتفظ الصورة بالإضاءة النسبية لمساحة اللون. يتم استخدام العديد من التقنيات الخطية وغير الخطية لتحويل الصورة الملونة إلى درجات رمادية. وفقًا لذلك ، لتحقيق هدفنا ، استخدمنا التحويل اللوني (الحفاظ على النصوع الإدراكي) إلى التدرج الرمادي في المعادلة التالية:



لتحسين الأداء من حيث الحسابات ، من الأسرع استخدام عامل النقل. وبالتالي ، يمكن تخفيض المعادلة أعلاه إلى ما يلي:



ونتيجة لذلك ، بعد التقاط قيمة بكسل (565 RGB) من الكاميرا ، يمكن تحويلها على الفور إلى قيمة بكسل بتدرج الرمادي 8 بت تطبق صيغة التحويل. من السهل تخزين الصورة ذات التدرج الرمادي في الذاكرة وبسرعة كافية لخدمة وظائف نظامنا في الوقت الفعلي نظرًا لتعقيدها اللوغاريتمي تقريبًا ويمكن لـ FPGA جعلها أسرع من خلال الوصول إلى الذاكرة بالتوازي. بعد ذلك ، تكون الصورة المخزنة جاهزة لتنفيذ خوارزمية اكتشاف الحواف.


الذاكرة الوسيطة (المخزن المؤقت)

لدينا 2 مخزن مؤقت ، الأول يستخدم لتخزين البيكسلات بعد تحويلها إلى درجات الرمادي وحجمها (8 بت × 150 × 150) والثاني يستخدم لتخزين البيكسل بعد تطبيق عامل سوبل والعتبة قيمة الإخراج وحجمه (1 بت × 150 × 150). لسوء الحظ ، لا تخزن 150 × 150 مخزنًا مؤقتًا الصورة بالكامل من الكاميرا ولكنها تخزن جزءًا منها فقط.


لقد اخترنا حجم المخازن المؤقتة لدينا ليكون 150 × 150 بسبب محدودية ذاكرة الإعصار الرابع لأنه يحتوي فقط على 276.480 كيلوبايت بينما يأخذ المخزنان المؤقتان 202.500 كيلوبايت (150 × 150 × 9) وهو ما يعادل 73.24٪ من الذاكرة الأصلية لـ يستخدم الإعصار الرابع وبقية الذاكرة لتخزين الخوارزمية والهندسة المعمارية. علاوة على ذلك ، جربنا (170 × 170) كحجم لمخازننا المؤقتة التي تأخذ 94.07٪ من الذاكرة التي لا تترك مساحة كافية لتنفيذ الخوارزمية.


المخازن المؤقتة الخاصة بنا هي ذاكرة وصول عشوائي ثنائية المنفذ يمكنها القراءة والكتابة في دورات ساعة مختلفة في نفس الوقت. هنا ، أنشأنا تطبيقنا بدلاً من استخدام أداة كتالوج IP داخل برنامج Quartus للحصول على المزيد من المرونة في التنفيذ. أيضا ، قمنا بدمج كل من المخازن المؤقتة في وحدة واحدة فقط بدلاً من وجود وحدات مختلفة.


مشغل سوبل

استخدمنا أول عامل للكشف عن الحافة المشتقة وهو عامل التدرج في منطقة المصفوفة والذي يحدد تغيير النصوع بين وحدات البكسل المختلفة. لكي نكون أكثر دقة ، نظرًا لأنها طريقة مباشرة وفعالة من حيث استخدام الذاكرة وتعقيد الوقت ، استخدمنا عامل التدرج Sobel الذي يستخدم نواة 3x3 تتمحور حول بكسل تم اختياره لتمثيل قوة الحافة. عامل سوبل هو حجم التدرج المحسوب بواسطة:


معادلة G


حيث يمكن تمثيل Gx و Gy باستخدام أقنعة الالتفاف:


مصفوفات الالتفاف Gx و Gy


لاحظ أن وحدات البكسل الأقرب إلى مركز القناع تُعطى وزنًا أكبر. كما يمكن حساب G x و G y على النحو التالي:


معادلات Gx و gy


حيث p i هي البكسل المقابل في الصفيف التالي ، وقيمة p i هي قيمة درجات الرمادي 8 بت:


مصفوفة بكسل


إنها ممارسة شائعة لتقريب حجم التدرج لعامل Sobel بالقيم المطلقة:


المعادلة


هذا التقريب أسهل في التنفيذ وأسرع في الحساب والذي يخدم وظائفنا مرة أخرى من حيث الوقت والذاكرة.


فيما يلي رسم تخطيطي لمشغل Sobel يأخذ 9 بكسل (8 بت) كمدخلات وينتج قيمة بكسل (8 بت):


جوهر سوبل


وهنا الرسم التخطيطي المفصل لتنفيذ مشغل سوبل.


مفصل الأساسية سوبل


شاشة VGA

تحتوي لوحة التطوير الخاصة بنا على واجهة VGA مدمجة لديها القدرة على عرض 8 ألوان فقط على شاشة VGA حيث تحتوي على 3 بت فقط للتحكم في الألوان من خلال بت واحد للأحمر ، وواحد للأخضر والآخر للأزرق. وقد جعل هذا من تصحيح الأخطاء لدينا أكثر صعوبة لأنه يمنعنا من عرض الصورة من الكاميرا مباشرة إلى الشاشة. لذلك ، استخدمنا عتبة لتحويل وحدات البكسل إلى قيمة 1 بت بحيث يمكن عرض الصورة.


تعمل واجهة VGA مثل الكاميرا حيث تعمل بكسلًا من بكسل من الزاوية العلوية اليسرى إلى الزاوية السفلية اليمنى. باستخدام المزامنة الرأسية والأفقية ، يمكننا مزامنة الإشارات التي تتحكم في تدفق البكسل.


تستخدم إشارة التزامن العمودي لتمثيل فهرس الصف بينما تستخدم إشارة التزامن الأفقي لتمثيل فهرس العمود. أيضًا ، تستخدم كلتا الإشارات الشرفة الأمامية والنبضة المتزامنة والشرفة الخلفية كإشارات مزامنة لفصل الصف القديم عن الصف الجديد في إشارة التزامن الأفقي والإطار القديم من الإطار الجديد في إشارة التزامن الرأسي.


مخطط توقيت إشارة VGA


استخدمنا واجهة إشارة VGA القياسية (640 × 480 عند 60 ميجاهرتز). جميع المواصفات القياسية للإشارة موصوفة هنا .


الاختبار


قبل وضع كل شيء معًا واختبار نظام الوقت الفعلي. كان علينا أولاً اختبار كل جزء على حدة. في البداية ، قمنا بفحص القيم والإشارات التي تأتي من الكاميرا من خلال عرض قيم بكسل معينة. بعد ذلك ، بمساعدة OpenCV باستخدام لغة برمجة Python ، تمكنا من تطبيق مرشح Sobel على عدة صور لمقارنة النتائج مع الخوارزمية الخاصة بنا والتحقق من صحة منطقنا. علاوة على ذلك ، قمنا باختبار المخازن المؤقتة ومحرك VGA الخاص بنا من خلال عرض العديد من الصور الثابتة على شاشة VGA بعد تطبيق مشغل Sobel والعتبة. علاوة على ذلك ، من خلال تغيير قيمة العتبة ، تتأثر دقة الصورة.


كود الثعبان الذي استخدمناه:


# This code is made to test the accuracy of our algorithm on FPGA import cv2 #import opencv library f = open("sample.txt",'w') # Open file to write on it the static image initialization lines img = cv2.imread('us.jpg') # Read the image which has our faces and its size 150x150 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grayscale sobelx = cv2.Sobel(gray,cv2.CV_64F,1,0,ksize=3) #x-axis sobel operator sobely = cv2.Sobel(gray,cv2.CV_64F,0,1,ksize=3) #y-axis sobel operator abs_grad_x = cv2.convertScaleAbs(sobelx) abs_grad_y = cv2.convertScaleAbs(sobely) grad = abs_grad_x + abs_grad_y for i in range(0,150): for x in range(0,150): #read the pixels of the grayscaled image and Store them into file with specific format to initialize the buffer in FPGA code f.write("data_a[{:d}]<=8'd{:d};\n".format(i*150+x,gray[i][x])) #apply threshold to be exactly like the code on FPGA if(grad[i][x] < 100): grad[i][x] = 255 else: grad[i][x] = 0 cv2.imshow("rgb", img) #Show the real img cv2.imshow("gray",gray) #Show the grayscale img cv2.imshow("sobel",grad)#Show the result img cv2.waitKey(0) #Stop the img to see it 

النتائج


نتيجة لتطبيقنا ، حصلنا على نظام للكشف عن الحواف في الوقت الفعلي ينتج صورة 150x150 بعد تطبيق مرشح درجات الرمادي ومشغل Sobel. يوفر النظام المطبق 30 إطارًا في الثانية. تعمل الكاميرا على مدار الساعة بسرعة 25 ميجاهرتز ويفي النظام بشكل عام بالمواعيد النهائية في الوقت الفعلي دون تأخر ملحوظ. علاوة على ذلك ، يمكن أن تؤثر قيمة العتبة على مقدار التفاصيل والضوضاء في الصورة النهائية.


فيما يلي مقارنة بين مشغل Sobel على FPGA وعامل OpenCV:


مقارنة


يوجد أدناه فيديو توضيحي للنتائج:


فيديو المشروع


هذا هو رابط المستودع على Github الذي يحتوي على جميع رموز المصدر.


التحسينات المستقبلية


نظرًا لأننا نستخدم FPGA Cyclone IV ، فنحن نقتصر على سعة الذاكرة وعدد البوابات المنطقية. وبالتالي ، كتحسين مستقبلي ، يمكننا استخدام مصدر ذاكرة خارجي أو يمكننا تنفيذ عملنا على لوحة أخرى حتى نتمكن من عرض جميع وحدات البكسل من الصورة المستلمة من الكاميرا.


علاوة على ذلك ، على الرغم من أن مشغل Sobel سريع وبسيط في التنفيذ ، إلا أنه حساس بشكل ملحوظ للضوضاء. للتخلص من الضوضاء الناتجة ، يمكننا استخدام مرشح ضوضاء مثل مرشح متوسط ​​غير خطي يعمل بشكل جيد تمامًا مع نظامنا إذا كان لدينا ذاكرة كافية لتنفيذ مخزن مؤقت ثالث. سيؤدي ذلك إلى إنتاج صورة أكثر سلاسة مع إزالة الميزات الحادة.


وفقًا لذلك ، استخدمنا واجهة VGA المضمنة لـ FPGA التي يمكنها فقط إنتاج صورة 3 بت. وبالتالي ، لم نتمكن من عرض الصورة ذات التدرج الرمادي لأنها تحتاج إلى عرض 8 بت. ونتيجة لذلك ، سيؤدي تنفيذ واجهة أخرى أو استخدام لوحة أكثر قوة إلى تعزيز مرونة عرض الصورة.


الخلاصة


تمكنا من استخدام معرفتنا وفهمنا للمفاهيم الأساسية في الأنظمة المضمنة مثل آلات الحالة ، والتوازي الحسابي ، وواجهات الأجهزة والبرامج لإنشاء تطبيق فعال لكشف الحواف يلبي أهدافنا.


شكر وتقدير


تم بناء هذا المشروع من قبل فريق يتكون من طالبين: حسين يونس وهاني حامد في السنة الأولى بكالوريوس علوم الكمبيوتر في جامعة إنوبوليس في روسيا.


هذا المشروع جزء من دورة هندسة الكمبيوتر لخريف 2018 في جامعة إنوبوليس .


Source: https://habr.com/ru/post/ar431326/


All Articles