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

النتائج رائعة للغاية ، دعنا نرى ما يستحق الترجمة إلى واقع حقيقي.
U-الصافي
الشبكة العصبية الأكثر شهرة ، وضعت أصلا للطب.
المصدر الرئيسيأدرك الناس بسرعة أنه يمكن استخدام هذا النهج لجميع المناسبات.
هناك العديد من المقالات على الإنترنت حول كيفية إعداد البيانات وتدريب شبكات U-net:
ومع ذلك ، لم أجد شبكة U-net جاهزة لأخذها وتجربتها بسرعة.
E-الشباك
شبكة أصغر وأقل شهرة. مصممة فقط للتعرف على شوارع المدينة.
معطيات
أكثر مجموعات البيانات شيوعًا لتجزئة الشوارع (قاموا بتدريس E-net في البداية):
على مجموعات البيانات نفسها ، يتم تدريب U-net الآن.
اختيار التنفيذ
طوفان من المعلومات الجديدة على تجزئة كانت ساحقة جدا. غريزي ، أردت أن ألحق بشيء أكثر بساطة. لم أشعر بالزن الداخلي لفهم بنية الشبكات وقضاء الوقت في التعلم. ولكن في مقالة من
PyImageSearch ، كانت
هناك شبكة عصبية جاهزة ومدربة ، علاوة على ذلك ، بتنسيق متوافق مع OpenCV-DNN.
لذلك تم الاختيار نحو أقل مقاومة.
استخدام بسيط جدا:
(الأمر الأكثر إثارة للقلق هو أن الشبكة مدربة على صور 1024 × 512 - وهذا ، أولاً ، أكثر مما تقدمه الكاميرا على Raspberry ، وثانياً ، الأداء المطلوب لمعالجة هذه الكمية من البيانات مربك إلى حد ما. ونتيجة لذلك ، ستكون المشكلة الرئيسية هي بالضبط).
نقرأ الشبكة العصبية من الملفات (في أحدها ، النموذج نفسه ، في أسماء الفئات الأخرى ، بالألوان الثالثة).
def load_segment_model(): try: classes = None with open(PiConf.SEGMENT_CLASSES) as f: classes = f.read().strip().split("\n") colors = None with open(PiConf.SEGMENT_COLORS) as f: colors= f.read().strip().split("\n") colors = [np.array(c.split(",")).astype("int") for c in colors] colors = np.array(colors, dtype="uint8") print("[INFO] loading model...") net = cv2.dnn.readNet(PiConf.SEGMENT_MODEL) return net, classes, colors except Exception as e: logging.exception("Cannot load segment model") return None, None, None
نقوم بتقسيم الصورة ، مع وضع علامات في نفس الوقت على الجزء العلوي من الصورة الأصلية
(في حالتي ، جميع الفئات باستثناء الطريق غير مرئية).
def segment_image(image_path, seg_net, seg_classes, seg_colors): image0 = cv2.imread(image_path) image = cv2.resize(image0, (1024, 512),interpolation=cv2.INTER_NEAREST) blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (1024, 512), 0, swapRB=True, crop=False) seg_net.setInput(blob) start = time.time() output = seg_net.forward() end = time.time() print("[INFO] inference took {:.4f} seconds".format(end - start)) (numClasses, height, width) = output.shape[1:4] classMap = np.argmax(output[0], axis=0) mask = seg_colors[classMap] mask = cv2.resize(mask, (image0.shape[1], image0.shape[0]),interpolation=cv2.INTER_NEAREST) classMap = cv2.resize(classMap, (image0.shape[1], image0.shape[0]), interpolation=cv2.INTER_NEAREST) gmask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY) gmask = cv2.resize(gmask, (128, 64), interpolation=cv2.INTER_NEAREST) gmask = gmask[0:64,32:96] output = ((0.6 * image0) + (0.4 * mask)).astype("uint8") return output, gmask
تفتيش
نلتقط صورا جاهزة من الخزان ونضع شبكة عصبية مجزأة عليها.
1

يتم التعرف فقط على الجانب الأيسر من الرصيف كمكلف.
نضغط الصورة ونأخذ منها بحجم مركز 64 × 64:
(هذا الحجم متوقع من قبل الشبكة العصبية ، والتي تقرر تغيير الاتجاه)

أوامر الشبكة العصبية الاتجاه (في الواقع - المصنف) إلى اليسار. ليس صحيحا جدا ، ولكن محتمل.
2

موقف مماثل ، مرة أخرى ، يتم فقد الزاوية اليمنى السفلى (هناك أيضا الأسفلت الرطب).
ومع ذلك ، لا يزال يتم التعرف على معظم الطريق.

المصنف عروض للذهاب مباشرة.
3
الوضع عندما كان الروبوت في منتصف الرصيف.

يتم التعرف على الطريق بشكل كامل تقريبا.

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

بشكل عام ، لا يمكن هضم الصور بهذا الحجم على التوت.
يبدو أنه لا يزال يتعين عليك القيام بتدريب شبكة عصبية متخصصة.
مراجع