القائمة الرئيسية

الصفحات

إزالة الضوضاء بإستخدام المشفرات التلقائية (Denoising using autoencoders)

 




إزالة الضوضاء بإستخدام المشفرات التلقائية

(Denoising using autoencoders)



المهندس حسن فنجان عداي

 

مقدمة:

بسم إلله الرحمن الرحيم

يعتبر موضوع إزالة الضوضاء من الصور بإستخدام التقنية المسماة بالتشفير التلقائي (Autoencoder) من المواضيع المهمة والذي يعتبر أحد تطبيقات التعلم العميق (Deep Learning), بإعتبار أنَّ تقنية التشفير التلقائي تعتمد في عملها على فكرة الشبكات العصبية الإصطناعية (Artificial Neural Networks) وقد تحتوي على طبقات إلتفافية (Convolutional layers) بالإضافة إلى طبقات أخرى تشكل بمجموعها نموذج يبتنى على ضوء هذه التقنية, وقد رأينا من المناسب أن نبدأ أولاً بشرح وتوضيح تقنية التشفير أو الترميز التلقائي (Autoencoder) بشكل منفصل ووافي قبل الشروع بإستخدام هذه التقنية في عملية التخلص من الضوضاء العالقة في الصور لكي تكون الصورة واضحة لدينا عند إستخدام هذه التقنية.


الترميز التلقائي للصور الأولية

 (Autoencoders of raw images)

يعتبر الترميز التلقائي للصور من الخوارزميات التي تنتمي الى التعلم بدون إشراف (unsupervised), وهذه الخوارزمية تتيح لنا الحصول على ترميزات فعّالة (efficient encodings).

بالرغم من أنَّ هذه الخوارزمية تنتمي الى التعلم العميق (deep learning) إلاَّ أنها تحسب على قسم التعلم بدون إشراف والذي هو بدوره من أقسام تعلم الآلة (machine learning), وذلك لأنَّ هذه الخوارزمية تكون فيها بيانات الإدخال (input data) والإخراج (output data) شيء واحد, أي أنها تستخدم بيانات الإدخال كبيانات تسمية (labels) أيضاً.

تتكون الشبكة التي تبنى على ضوء هذه الخوارزمية إلى ثلاثة أقسام هي:

1 – قسم الترميز: (Encoding) والذي يبدأ من طبقة الإدخال (input layer) وينتهي عند الطبقة الوسطى من الشبكة والتي تسمى (bottleneck hidden layer), حيث إنَّ الطبقات التي يحويها هذا القسم ممكن أن تكون من نوع (dense layer) أو من نوع (convolutional layer).

2 – الطبقة المخفية الوسطى: والتي تسمى (bottleneck hidden layer) أي طبقة عنق الزجاجة والتي هي من نوع الطبقة المسطحة (flatten layer).

3 – قسم فك الترميز (decoding): والذي يبدأ من بعد الطبقة المخفية الوسطى وينتهي في نهاية الشبكة ويضم طبقة الإخراج (output layer). ويجب أن يكون عدد الطبقات التي يحويها هذا القسم مساوية تماماً لعدد طبقات قسم الترميز (encoding) ويكون الترتيب من حيث نوع الطبقات وعدد الوحدات وكذلك عدد المرشحات في كل طبقة معاكساً لما موجود في طبقة الترميز (encoding).

الشكل التالي يوضح معمارية هذه الخوارزمية بأبسط أنواعها:

من خلال الصورة أعلاه نلاحظ أنَّ الطبقة الوسطى المسماة "عنق الزجاجة" (bottleneck layer) هي الطبقة التي تكون أقل الطبقات من حيث الأبعاد (reduced dimension). يسمى جزء الشبكة الذي على يسار الطبقة الوسطى بقسم التشفير (encoder) والذي يقوم بتقليل أبعاد البيانات (dimensions of the data), أما جزء الشبكة الواقع إلى يمين الطبقة الوسطى فهو قسم فك التشفير (decoder) والذي يقوم بزيادة أبعاد البيانات (increases the dimensions).

إنَّ عملية الدمج بين قسم التشفير (encoder) مع قسم فك التشفير (decoder) يطلق عليه التشفير الذاتي (autoencoder).

 يتم تدريب الشبكة بأكملها على هدف محدد هو بناء الصورة الأصلية وتتم عملية تحديث الأوزان على ضوء دالة الفقد (loss function) والتي تكون في حالتنا هذه عبارة عن الخطأ في الحصول على الصورة الأصلية (reconstruction error).

تعتبر الطبقة الوسطى المسماة عنق الزجاجة (bottleneck layer) والتي تكون البيانات فيها ذات أبعاد قليلة قياساً مع الصورة الأصلية, هذه البيانات تعتبر بيانات مضغوطة تمثل الصورة الأصلية حيث إنه يمكن خزنها في ملفات حيث إنها تشغل حيزاً أقل من الذاكرة, ويمكن إسترجاع الصورة الأصلية بإستخدام قسم فك التشفير (decoder), وهذه التقنية ممكن إستخدامها كطريقة لحفظ بيانات الصور في قواعد البيانات وذلك لتقليل الحيز من الذاكرة الذي تشغله هذه البيانات.

تستخدم هذه الخوارزمية أيضاً في عملية التخلص من الضوضاء في الصور والذي نتناوله في الباب القادم.

نقوم الآن بإنشاء تطبيق يقوم بتنفيذ هذه الخوارزمية:

شرح الكود:

الأسطر من (1) لغاية (3): لإستدعاء المكتبات الضرورية لكتابة أكواد التطبيق.


السطر رقم (1): لتحميل مجموعة البيانات المسماة (MNIST handwritten digits), والتي تضم بيانات صور (Images) و جداول تسمية (Labels). وبعد إكتمال التحميل يتم توزيع هذه البيانات إلى أربعة أقسام كما هو واضح. ومن المعلوم بأننا هنا لانحتاج إلى جداول التسميات (Labels) أي (y_train and y_test).

السطر رقم (2): لإجراء ثلاثة تغيرات على بيانات الصور الخاصة بالتدريب وهي:

1 – تغيير شكل كل مصفوفة بيانات من شكل (60000, 28, 28) إلى (60000, 784). حيث يتم تحويل بيانات كل صورة من صور التدريب إلى متجه (Vector) ذو (784) عنصر, لحاجة النموذج إلى هذا الشكل من البيانات.

2 – تحويل نوع البيانات من (uint8) إلى نوع (float32).

3 – تقسيم قيمة كل بكسل من بكسلات الصورة على العدد (255) علماً أنَّ المقصود بالبكسل هنا هو كل عنصر من عناصر المصفوفة المكونة للصورة. وبهذا التقسيم سوف يكون حدود القيم للبكسلات تتراوح مابين (0.0 – 1.0) بعد أن كانت تتراوح مابين (0.0 – 255.0).

السطر رقم (4): إستخلاص بيانات التحقق من صحة مسار التدريب (x_val) وذلك بنسخ جزء من بيانات التدريب وبالتحديد البيانات الأخيرة أي آخر (10000) نقطة بيانات (Data points).


السطر رقم (1): الشروع بإنشاء النموذج, حيث إننا سوف نستخدم أسلوب (Keras functional API) الذي توفره لنا مكتبة (Tensorflow 2) كأحد الخيارات لإنشاء النموذج مع بعض الإمتيازات لهذا الأسلوب. حيث نقوم في هذا السطر بإنشاء نواة لهذا النموذج وذلك بإنشاء طبقة الإدخال (Input layer). ونقوم بتحديد شكل هذه الطبقة حيث يكون شكلها عبارة عن متجه واحد ذو (784) عنصر أي (Neuron) أو (Unit).

السطر رقم (2): إنشاء الطبقة المخفية لهذا النموذج أي (Hidden layer) والتي تسمى أيضاً (bottleneck layer), وقد إخترنا عدد عناصرهذه الطبقة لتكون (64) وحدة (Units). وإعتبرناها هي وطبقة الإدخال كقسم تشفير (Encoder).

السطر رقم (3): إنشاء طبقة الإخراج (Output layer) وهي هنا بمثابة قسم فك التشفير (Decoder) حيث يجب أن يكون شكلها مساوياً لشكل طبقة الإدخال (Input layer) من حيث عدد الوحدات (Units) المكونة لها والشكل (Shape).

السطر رقم (4): إنشاء النموذج عن طريق الكلاس (Model) حيث نمرر له طبقة الإدخال وكذلك طبقة الإخراج.


الأسطر من (1) لغاية (5): لتجهيز النموذج وجعله جاهزاً لعملية التدريب عن طريق الدالة (compile) حيث نمرر لها بعض العناصر التي يجب توفرها في عملية التدريب مثل الخوارزمية المناسبة في عملية التحسين (Optimization) وقد إخترنا هنا الخوارزمية التي يطلق عليها (Adam), كذلك نمرر لها نوع الدالة التي تستخدم في عملية حساب الفقد (Loss function) وقد إخترنا الدالة المسماة (MeanSquaredError) والتي تقوم بحساب الفرق بين قيمة كل بكسل من بكسلات الصورة الخارجة من النموذج مع البكسل المناظر له العائد إلى الصورة الداخلة للنموذج ثم يقوم بتربيع ناتج الطرح بعدها يقوم بجمع الفروق لكل البكسلات ولعدة خطوات تدريب أي بحجم الدفعة (batch size) ثم يقوم بإيجاد المتوسط (Mean)  وذلك بقسمة المجموع على عدد خطوات الدفعة الواحدة.


الأسطر من (1) لغاية (7): للبدأ بعملية التدريب عن طريق الدالة (fit) حيث نقوم بتمرير المتطلبات التالية:

1 – بيانات التدريب, حيث إننا نستخدم بيانات صور التدريب (x_train) مرتين, مرةً كبيانات إدخال ومرة أخرى كبيانات إخراج بدل التسميات (Labels).

2 – حجم دفعة التدريب الواحدة (Batch size).

3 – عدد حقب التدريب (أي عدد مرات تكرار نفس بيانات التدريب).

4 – بيانات التأكد من صحة مسار التدريب (Validation data).

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

نستخدم لهذا الغرض الدالة (predict) حيث نمرر لها بيانات صور الإختبار (x_test), ونحصل منها على مصفوفة من الصور الخارجة من النموذج حيث يتم إيداع هذه المصفوفة في المتغير (predictions).

السطر رقم (1): لتحديد المساحة الكلية التي يتم عرض مجموعة الصور داخلها.

السطر رقم (2): تعيين عدد الصور أفقياً.

السطر رقم (3): إنشاء حلقة تكرار بعدد الصور بالمستوى الأفقي.

السطر رقم (4): تحديد مكان وضع الصورة وتسلسلها, حيث إنَّ (i + 1) يشير إلى التسلسل.

السطر رقم (5): لإضهار صورة من صور التدريب الداخلة إلى النموذج (x_test) بعد إعادتها إلى الوضع الطبيعي من حيث شكلها (28 x 28).

السطرين (6) و (7): للتخلص من التدريجات التي تظهر على المحاور مع الصورة.

السطر رقم (8): تحديد مكان وضع الصورة في الصف الأسفل وكذلك تسلسلها وهذا الصف خاص بالصور الخارجة من النموذج.

السطر رقم (9): لإظهار صورة من الصور الخارجة من النموذج والموجودة في المصفوفة (prediction).

وأخيراً وبعد التنفيذ نحصل على مايلي:

حيث إنَّ الصور في الصف العلوي هي الصور التي أدخلناها إلى النموذج, أما التي في الصف السفلي فهي الصور التي حصلنا عليها من النموذج المدرب.

يمكن إجراء تغييرات على النموذج وجعله يتقبل صور ذات أحجام أكبر وكذلك يتقبل صور ملونة.

والآن وبعد أن إتضحت لنا تقنية التشفير الذاتي بعض الشي نقوم بتناول عملية التخلص من الضوضاء بإستخدام هذه التقنية وكما يلي:


إزالة الضوضاء بإستخدام المشفرات التلقائية

(Denoising using autoencoders)

إنَّ خوارزمية التشفير الذاتي (autoencoder) يمكن إستخدامها في عملية التخلص من الضوضاء التي قد تلحق ببعض الصور نتيجة ضروف معينة.

إنَّ الضوضاء التي قد تلحق بالصور يمكن أن تكون على الهيئات التالية:

1 – ضوضاء ناتجة من أخطاء في مستشعرات أو متحسسات الصور مثل الكاميرات أو غيرها, أو رداءة في جودتها.

2 – إختلافات عشوائية في السطوع (Brightness) أو اللون (Color) بين بعض الصور والصور الأخرى.

3 – ضوضاء ناتجة من عملية مايسمى الضوضاء الكمي (Quantization noise) مثل عملية توليد مجموعة بيانات صغيرة الحجم من مجموعة بيانات ضخمة غالباً تكون مجاميع مستمرة (Continuous sets) وذلك بإستخدام أسلوب الإقتطاع والتقريب.

4 – يحدث ضوضاء عند إستخدام خوارزمية الضغط (JPEG compression).

5 – الضوضاء الناتجة عند إستخدام الماسح الضوئي (Image scanner), أو التي تنتج في مرحلة مابعد المعالجة للصور (Threshold post-processing).

6 – ضوضاء ناتجة عن رداءة الورق المطبوعة عليه الصور وخاصة عند محاولة إجراء عملية التعرف الضوئي على الحروف (OCR).

تعتبر خوارزمية (Denoising using autoencoder) كإحدى التقنيات التي تستخدم في مجال معالجة الصور (Image processing).

إنَّ هذه التقنية (denoising) والتي تسمى أحياناً (noise reduction), يمكن إستخدامها في تدريب نموذج مبني على ضوء خوارزمية ال (autoencoder), حيث تصنف عملية التدريب والتعلم هنا من نوع التعلم بدون إشراف (unsupervised) أيضاً, حيث لانحتاج في عملية التدريب بيانات التسمية (labels), حيث تؤخذ الصور الأصلية كبيانات تسمية.

أما بيانات الإدخال في عملية التدريب (training) فهي الصور الأصلية أيضاً ولكن بعد إضافة أنواع من الضوضاء (noise) عليها.

إنَّ عملية تحديث الأوزان في عملية التدريب والتي تعتمد على دالة الفقد (loss function) والتي تكون هنا هي عبارة عن قيمة الخطأ (error) بين الصورة الخارجة من الشبكة (denoising) والصورة الأصلية (original image), وبعد تدريب النموذج يمكن إستخدامه لإزالة الضوضاء من الصور والحصول على صور خالية من

التشويش. يمكن توضيح عملية إزالة الضوضاء بإستخدام خوارزمية (Autoencoder) بالرسم التوضيحي التالي:

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


شرح الكود:

الأسطر من (1) لغاية (3): إستدعاء المكتبات التي نحتاجها في كتابة الأكواد.

الأسطر من (1) لغاية (6): إنشاء دالة تقوم بإضافة ضوضاء على بيانات كل مجموعة صور تمرر إليها. علماً بأنَّ الضوضاء يكون عشوائي.

السطر رقم (1): لتحميل مجموعة الصور (MNIST dataset) وتوزيعها إلى أربعة أقسام كما مر بنا في التطبيق السابق.

السطر رقم (2): تحويل نوع بيانات صور التدريب إلى (float32) وكذلك قسمتها على العدد (255).

السطر رقم (3): تحويل نوع بيانات صور الإختبار إلى (float32) وكذلك قسمتها على العدد (255).

السطر رقم (4): لتغيير شكل (Shape) مجموعة بيانات صور التدريب من ثلاثة أبعاد (60000, 28, 28) إلى بعدين فقط أي (60000, 784).

السطر رقم (5): لتغيير شكل (Shape) مجموعة بيانات صور الإختبار من ثلاثة أبعاد (10000, 28, 28) إلى بعدين فقط أي (10000, 784).

السطر رقم (6): إنشاء مجموعة بيانات للصور الخاصة بالتدريب عبارة عن نفس بيانات صور التدريب (x_train) مضافاً عليها ضوضاء (Noise).

السطر رقم (7): إنشاء مجموعة بيانات للصور الخاصة بالإختبار عبارة عن نفس بيانات صور الإختبار (x_test) مضافاً عليها ضوضاء (Noise).

السطر رقم (8): إستخلاص بيانات التحقق من صحة مسار التدريب (x_val) وذلك بنسخ جزء من بيانات التدريب وبالتحديد البيانات الأخيرة أي آخر (10000) نقطة بيانات (Data points).


الأسطر من (1) لغاية (4): إنشاء النموذج الذي سوف نقوم بتدريبه, وقد إستخدمنا أسلوب (Keras functional API) كما مر بنا في التطبيق السابق.

الأسطر من (1) لغاية (5): لتجهيز النموذج وجعله جاهزاً لعملية التدريب عن طريق الدالة (compile) حيث نمرر لها بعض العناصر التي يجب توفرها في عملية التدريب مثل الخوارزمية المناسبة في عملية التحسين (Optimization) وقد إخترنا هنا الخوارزمية التي يطلق عليها (Adam), كذلك نمرر لها نوع الدالة التي تستخدم في عملية حساب الفقد (Loss function) وقد إخترنا الدالة المسماة (MeanSquaredError) والتي تقوم بحساب الفرق بين قيمة كل بكسل من بكسلات الصورة الخارجة من النموذج مع البكسل المناظر له العائد إلى الصورة الداخلة للنموذج ثم يقوم بتربيع ناتج الطرح بعدها يقوم بجمع الفروق لكل البكسلات ولعدة خطوات تدريب أي بحجم الدفعة (batch size) ثم يقوم بإيجاد المتوسط (Mean)  وذلك بقسمة المجموع على عدد خطوات الدفعة الواحدة.

الأسطر من (1) لغاية (7): للبدأ بعملية التدريب عن طريق الدالة (fit) حيث نقوم بتمرير المتطلبات التالية:

1 – بيانات التدريب, حيث إننا نستخدم بيانات الصور التي تم إضافة الضوضاء لها (x_train_noisy) كبيانات إدخال وبيانات الصور بدون ضوضاء (x_train)  كبيانات إخراج بدل التسميات (Labels).

2 – حجم دفعة التدريب الواحدة (Batch size).

3 – عدد حقب التدريب (أي عدد مرات تكرار نفس بيانات التدريب).

4 – بيانات التأكد من صحة مسار التدريب (Validation data), كما في بيانات التدريب.

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

نستخدم لهذا الغرض الدالة (predict) حيث نمرر لها بيانات صور الإختبار (x_test_noisy), ونحصل منها على مصفوفة من الصور الخارجة من النموذج حيث يتم إيداع هذه المصفوفة في المتغير (predictions).


السطر رقم (1): لتحديد المساحة الكلية التي يتم عرض مجموعة الصور داخلها.

السطر رقم (2): تعيين عدد الصور أفقياً.

السطر رقم (3): إنشاء حلقة تكرار بعدد الصور بالمستوى الأفقي.

السطر رقم (4): تحديد مكان وضع الصورة وتسلسلها, حيث إنَّ (i + 1) يشير إلى التسلسل.

السطر رقم (5): لإظهار صورة من صور التدريب الداخلة إلى النموذج (x_test) بعد إعادتها إلى الوضع الطبيعي من حيث شكلها (28 x 28).

السطرين (6) و (7): للتخلص من التدريجات التي تظهر على المحاور مع الصورة.

السطر رقم (8): تحديد مكان وضع الصورة في الصف الأسفل وكذلك تسلسلها وهذا الصف خاص بالصور الخارجة من النموذج.

السطر رقم (9): لإظهار صورة من الصور الخارجة من النموذج والموجودة في المصفوفة (prediction).

وأخيراً وبعد التنفيذ نحصل على مايلي:


نلاحظ من مقارنة كل صورة في الصف العلوي مع نظيرتها في الصف السفلي مدى التحسن الذي طرأ على الصور بإستخدام هذه الخوارزمية ومن الممكن تحسين الأداء بعدة طرق من بينها زيادة حقب التدريب (Epochs), وكذلك من خلال إستخدام طبقات إلتفافية (Convolutional layers) في النموذج.

 

وبهذا نكون قد إنتهينا من هذه المقالة والتي تطرقنا فيها إلى أحد تطبيقات التعلم العميق (Deep learning) وهو عملية التخلص من الضوضاء في الصور بإستخدام تقنية التشفير أو الترميز الذاتي (Autoencoder), حيث قمنا أولاً بتوضيح خوارزمية التشفير الذاتي ثم شرعنا في موضوع التخلص من الضوضاء في الصور.

أرجو أن أكون قد وفقت في المساهمة في توضيح هذا الموضوع.

ومن ألله تعالى نستمد العون والتسديد.

المهندس حسن فنجان عداي.

 




 






 

 






هل اعجبك الموضوع :

تعليقات