الأخبار التكنولوجية والاستعراضات والنصائح!

قم ببناء تطبيق تجزئة دلالي باستخدام مكتبة جافا العميقة – نحو الذكاء الاصطناعي

ستساعدك المقالة التالية: قم ببناء تطبيق تجزئة دلالي باستخدام مكتبة جافا العميقة – نحو الذكاء الاصطناعي

نُشر في الأصل على نحو AI ، الشركة الرائدة في العالم في مجال الذكاء الاصطناعي والأخبار التقنية والإعلام. إذا كنت تقوم ببناء منتج أو خدمة متعلقة بالذكاء الاصطناعي ، فنحن ندعوك للتفكير في أن تصبح راعيًا للذكاء الاصطناعي. في نحو الذكاء الاصطناعي ، نساعد في توسيع نطاق الشركات الناشئة في مجال الذكاء الاصطناعي والتكنولوجيا. دعنا نساعدك على إطلاق التكنولوجيا الخاصة بك للجماهير.

تحتوي مكتبة جافا العميقة (DJL) على العديد من تطبيقات PyTorch Android التجريبية التي يمكنها تشغيل استدلال التعلم العميق محليًا على هاتفك. هذه الأمثلة سهلة الاستخدام كأساس لبناء تطبيقك الخاص. اليوم ، أود التركيز على أحد هذه المدونة تركز على مثال واحد ساهمت فيه في مشروع مفتوح المصدر ، التقسيم الدلالي: مجال التعلم العميق الذي يشيع استخدامه في السيارات ذاتية القيادة وآلات التصوير الطبي ، من بين أشياء أخرى.

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

يثبت

في بيئة الكمبيوتر / المطور المحلية ، قم باستنساخ مستودع djl-demo من GitHub. ستحتاج إلى القيام بذلك من أجل تشغيل تطبيق Semantic Segmentation (أو أحد تطبيقات DJL الأخرى).

استنساخ بوابة https://github.com/deepjavalibrary/djl-demo.git

قم بإعداد بيئة التطوير الخاصة بك باتباع هذه التعليمات.

لتشغيل التطبيق على هاتف Android الخاص بك ، اتبع هذه الخطوات في المحطة الطرفية على جهاز الكمبيوتر الخاص بك:

  1. القرص المضغوط djl-demo / android / pytorch_android
  2. ثم cd مرة أخرى في التطبيق الذي ترغب في تشغيله. إذا كنت تريد تشغيل التجزئة الدلالية ، فقم بتشغيل هذا الأمر: cd semantic_segmentation
  3. من هنا ، قم بتشغيل المشروع وفقًا لنظام تشغيل الكمبيوتر الخاص بك:

ماك: ./gradlew iD

Windows: .. \ gradlew iD

إذا لم يكن لديك هاتف Android ، فيمكنك تثبيت Android Studio لتشغيل التطبيقات.

لتشغيل التطبيق في Android Studio Emulator ، اتبع الخطوات التالية:

  1. افتح المجلد pytorch_android الخاص بدليل djl-demo في Android Studio. سيعرض هذا تطبيقات DJL PyTorch الأربعة الموجودة حاليًا والتي يمكنك تشغيلها. قد تضطر إلى الانتظار لمدة دقيقة حتى يقوم Gradle بفهرسة المشروع.
  2. انقر فوق زر التشغيل الأخضر في الجزء العلوي الأيمن بجوار اسم التطبيق المراد تشغيله ، والمحاكي المختار ، وستكون جاهزًا.

بقدر ما تذهب مدخلات ومخرجات النموذج ، فهي مباشرة نسبيًا. الإدخال عبارة عن صورة PNG أو JPG ، ويقيدها النموذج بحجم 600 × 800 أو أصغر. الناتج عبارة عن صورة ذات كائنات ملونة بحجم 600 × 800. يقوم المترجم بتغيير حجم الصورة إلى أبعادها الأصلية.

الإستنباط

تم أخذ مقطع الكود أدناه مباشرة من SemanticSegmentationTranslator.java من مستودع DJL على GitHub. المترجم هو ما يعد المدخلات للنموذج ، ويأخذ المعلومات من مخرجات النموذج ، ويحولها إلى مخرجات منطقية للبشر. أثناء إنشاء تطبيق Semantic Segmentation ، وجدت أن إنشاء المترجم ساهم بشكل كبير في فهمي لـ DJL. لقد تعلمت أنواع البيانات والهياكل التي تقدمها DJL والطرق الفعالة لاستخدامها. كان استكشافها ممتعًا ومثيرًا ، مثل تجميع أحجية مع القطع المخفية. يجعل DJL من السهل العثور على القطعة المناسبة وتناسبها مع إبداعك الحالي.

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

دعنا نتعمق في بعض رموز المترجم ونفحصها لفهم ما يحدث.

حجم الصورة int = العرض * الارتفاع ؛
ByteBuffer bb = manager.allocateDirect (CHANNEL * imageSize) ،
int r = 0 ؛ // تعديل للبكسل الأحمر
كثافة العمليات ز = 1 ؛ // تعديل البكسل الأخضر
الباحث ب = 2 ؛ // تعديل البكسل الأزرق
بايت[][] ألوان = بايت جديد[CLASSNUM][3]؛ // قم بتعيين الألوان بشكل عشوائي لكل مرة يتم فيها تشغيل النموذج
لـ (int i = 0 ؛ i البايت الأحمر = (بايت) RandomUtils.nextInt (256) ؛
البايت الأخضر = (بايت) RandomUtils.nextInt (256) ؛
البايت الأزرق = (بايت) RandomUtils.nextInt (256) ؛
الألوان[i][r] = أحمر ؛
الألوان[i][g] = أخضر ؛
الألوان[i][b] = أزرق ؛
}

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

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

// double for loop للتكرار خلال كل بكسل
لـ (int h = 0 ؛ h لـ (int w = 0؛ w مؤشر int = h * width + w ؛
كثافة العمليات ماكسي = 0 ؛
مضاعفة maxnum = -Double.MAX_VALUE ؛

// حلقات من خلال احتمالية كل كائن عند البكسل المحدد
لـ (int i = 0 ؛ i // احصل على نقاط لكل i عند h ، w بكسل من الصورة
درجة تعويم = عشرات[i * (imageSize) + index]؛
إذا (النتيجة> الحد الأقصى) {
maxnum = النتيجة ؛
ماكسي = أنا ؛
}
}

// إذا تم العثور على كائن احتماليًا ، فقم بتلوينه
إذا (ماكسي> 0) {
bbput (الألوان[maxi][r]) ؛
bbput (الألوان[maxi][g]) ؛
bbput (الألوان[maxi][b]) ؛
} آخر {
bb.position (bb.position () + 3) ؛
}
}
}

// إنشاء الصورة من المخزن المؤقت
bb.rewind () ،
int originW = (int) ctx.getAttachment (“originalWidth”) ؛
أصل int = (int) ctx.getAttachment (“originalHeight”) ؛
NDArray fullImage =
manager.create (bb ، شكل جديد (الارتفاع ، العرض ، القناة) ، DataType.UINT8) ؛
NDArray resized = NDImageUtils.resize (fullImage ، originW ، originH) ؛ إرجاع ImageFactory.getInstance (). fromNDArray (بحجم ثانية) ؛

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

بمجرد اكتمال هذا التلوين ، يتم إنشاء الصورة في NDArray بالحجم الكامل 600 × 800. يتم بعد ذلك تصغير الحجم إلى العرض والارتفاع الأصليين للصورة وإعادته على هذا النحو.

هذا ما يبدو عليه من التطبيق.

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

ملخص

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

يمكن توسيع التقسيم الدلالي بشكل كبير إلى ما هو أبعد من استخدامه البسيط الموضح هنا. كما أشرت من قبل ، هذا ليس التطبيق الوحيد في DJL. كان هناك بالفعل ثلاثة آخرين في وقت كتابة هذه المدونة. أحد هذه التطبيقات هو Quickdraw Recognition ، الذي يتعرف على الكائنات التي ترسمها في التطبيق ويصنفها في الوقت الفعلي. تطبيق آخر هو Style Transfer ، والذي يستخدم صورة التقطتها ويحولها لتلائم أسلوب فنانين مثل Vincent Van Gogh أو كلود مونيه. والثالث هو الترجمة الآلية العصبية ، والذي يأخذ مدخلات النص الفرنسي ويعيد الإخراج الإنجليزي المترجم. لذا ، حتى لو لم تتطابق التجزئة الدلالية تمامًا مع نمط التطبيق الذي تريد إنشاءه ، فهناك العديد من الخيارات والأمثلة الأخرى في DJL لمساعدتك على البدء!


تم نشر تطبيق Build Semantic Segmentation App باستخدام Deep Java Library في الأصل في Towards AI on Medium ، حيث يواصل الأشخاص المحادثة من خلال تسليط الضوء على هذه القصة والرد عليها.

تم النشر عبر نحو الذكاء الاصطناعي

Table of Contents