تكبير الصورة: اجعلها تمطر ، اجعلها تساقط ثلوج. كيفية تعديل الصور لتدريب السيارات ذاتية القيادة

تكبير الصورة هي تقنية لالتقاط صورة واستخدامها لإنشاء صور جديدة. إنها مفيدة للقيام بأشياء مثل تدريب سيارة ذاتية القيادة.

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

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

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

لقد ضغطت على Jupyter Notebook الذي تم تنفيذه بالكامل ، حيث يمكنك اللعب به على GitHub.

لنلقي نظرة.

سأعرض عليك أولاً صورة اختبار أصلية ثم سأزيدها.

مشمس وشادي

بعد إضافة تأثير مشمس ومظلل عشوائي ، يتغير سطوع الصورة. هذا هو تحول سهل وسريع لأداء.

add_brightness (صورة):
    image_HLS = cv2.cvtColor (image، cv2.COLOR_RGB2HLS) ## التحويل إلى HLS
    image_HLS = np.array (image_HLS ، dtype = np.float64)
    random_brightness_coefficient = np.random.uniform () + 0.5 ## يولد قيمة بين 0.5 و 1.5
    image_HLS [:،:، 1] = image_HLS [:،:، 1] * random_brightness_coefficient ## قيم البيكسل لأعلى أو لأسفل للقناة 1 (Lightness)
    image_HLS [:،:، 1] [image_HLS [:،:، 1]> 255] = 255 ## تعيين جميع القيم أعلى من 255 إلى 255
    image_HLS = np.array (image_HLS ، dtype = np.uint8)
    image_RGB = cv2.cvtColor (image_HLS، cv2.COLOR_HLS2RGB) ## التحويل إلى RGB
    إرجاع image_RGB

يمكن تغيير سطوع الصورة من خلال تغيير قيم البكسل في "Lightness" - القناة 1 للصورة في فراغ ألوان HLS. تحويل الصورة مرة أخرى إلى RGB يعطي نفس الصورة مع الإضاءة المحسنة أو المكبوتة.

مشمسظليلة

الظلال

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

السطوع مفيد للإدراك لكن السطوع غير المتساوي أو المفاجئ أو المفرط يخلق مشاكل إدراكية. دعنا نولد بعض الظلال المزيفة.

def gener_shadow_coordinates (imshape ، no_of_shadows = 1):
    vertices_list = []
    لفهرس في النطاق (no_of_shadows):
        = قنة []
        للأبعاد في النطاق (np.random.randint (3،15)): ## أبعاد مضلع الظل
            vertex.append ((imshape [1] * np.random.uniform () ، imshape [0] // 3 + imshape [0] * np.random.uniform ()))
        الرؤوس = np.array ([vertex] ، dtype = np.int32) ## رؤوس الظل المفردة
        vertices_list.append (القمم)
    return vertices_list ## قائمة رؤوس الظل
def add_shadow (الصورة ، no_of_shadows = 1):
    image_HLS = cv2.cvtColor (image، cv2.COLOR_RGB2HLS) ## التحويل إلى HLS
    قناع = np.zeros_like (صورة)
    imshape = image.shape
    vertices_list = gener_shadow_coordinates (صورة ، no_of_shadows) # 3 الحصول على قائمة برؤوس الظل
    بالنسبة للرؤوس في vertices_list:
        cv2.fillPoly (قناع ، رؤوس ، 255) ## مضيفا جميع المضلعات الظل على قناع فارغ ، 255 واحد يدل على قناة حمراء فقط
    
    image_HLS [:،:، 1] [قناع [:،:، 0] == 255] = image_HLS [:،:، 1] [قناع [:،:، 0] == 255] * 0.5 ## إذا قناة حمراء حار ، يتم تقليل سطوع قناة "الخفة" في الصورة
    image_RGB = cv2.cvtColor (image_HLS، cv2.COLOR_HLS2RGB) ## التحويل إلى RGB
    إرجاع image_RGB

تعتبر وظيفة fillPoly () من OpenCV مفيدة حقًا في هذه الحالة. لنقم بإنشاء بعض الرؤوس العشوائية وفرض المضلع على قناع فارغ باستخدام fillPoly (). بعد القيام بذلك ، فإن الشيء الوحيد المتبقي هو التحقق من القناع للبكسلات الساخنة وتقليل "الإضاءة" في صورة HLS أينما وجدت البكسلات الساخنة.

مضلع الظل العشوائي على الطريق

ثلج

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

def add_snow (الصورة):
    image_HLS = cv2.cvtColor (image، cv2.COLOR_RGB2HLS) ## التحويل إلى HLS
    image_HLS = np.array (image_HLS ، dtype = np.float64)
    سطوع_الكفاءة = 2.5
    snow_point = 140 ## زيادة هذا لمزيد من الثلوج
    image_HLS [:،:، 1] [image_HLS [:،:، 1]  255] = 255 ## تعيين جميع القيم أعلى من 255 إلى 255
    image_HLS = np.array (image_HLS ، dtype = np.uint8)
    image_RGB = cv2.cvtColor (image_HLS، cv2.COLOR_HLS2RGB) ## التحويل إلى RGB
    إرجاع image_RGB

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

الشتاء هنا

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

تمطر

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

def gener_random_lines (imshape ، مائل ، drop_length):
    قطرات = []
    for i in range (1500): ## إذا كنت ترغب في هطول أمطار غزيرة ، فحاول زيادة ذلك
        إذا كانت الميل <0:
            x = np.random.randint (مائل ، imshape [1])
        آخر:
            x = np.random.randint (0 ، imshape [1] -llant)
        y = np.random.randint (0، imshape [0] -drop_length)
        drops.append ((س، ص))
    قطرات العودة
        
    
def add_rain (الصورة):
    
    imshape = image.shape
    slant_extreme = 10
    slant = np.random.randint (-slant_extreme ، slant_extreme)
    drop_length = 20
    drop_width = 2
    drop_color = (200،200،200) ## ظلال رمادية
    rain_drops = gener_random_lines (imshape ، مائل ، drop_length)
    
    ل rain_drop في rain_drops:
        cv2.line (صورة، (rain_drop [0]، rain_drop [1])، (rain_drop [0] + مائل، rain_drop [1] + drop_length)، drop_color، drop_width)
    image = cv2.blur (image، (7،7)) ## طريقة العرض الممطرة ضبابية
    
    brightness_coefficient = 0.7 ## الأيام الممطرة عادة ما تكون مظللة
    image_HLS = cv2.cvtColor (image، cv2.COLOR_RGB2HLS) ## التحويل إلى HLS
    image_HLS [:،:، 1] = image_HLS [:،:، 1] * brightness_coefficient ## تصغير قيم البيكسل للقناة 1 (Lightness)
    image_RGB = cv2.cvtColor (image_HLS، cv2.COLOR_HLS2RGB) ## التحويل إلى RGB
    إرجاع image_RGB

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

هذه هي النتيجة:

المطر وهمية ولكن ليس طمس كثيرا

ضباب

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

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

def add_blur (الصورة ، س ، ص ، الأب):
    صورة [y: y + hw ، x: x + hw ، 1] = صورة [y: y + hw ، x: x + hw ، 1] +1
    image [:،:، 1] [image [:،:، 1]> 255] = 255 ## يعين جميع القيم أعلى من 255 إلى 255
    image [y: y + hw، x: x + hw، 1] = cv2.blur (image [y: y + hw، x: x + hw، 1]، (10،10))
    عودة الصورة
def gener_random_blur_coordinates (imshape، hw):
    blur_points = []
    midx = imshape [1] // 2-hw-100
    midy = imshape [0] // 2-hw-100
    مؤشر = 1
    بينما (midx> -100 أو midy> -100): ## إحداثيات إنشاء شعاعي
        بالنسبة لي في النطاق (250 * الفهرس):
            x = np.random.randint (midx ، imshape [1] -midx-hw)
            y = np.random.randint (midy ، imshape [0] -midy-hw)
            blur_points.append ((س، ص))
        midx- = 250 * imshape [1] // مبلغ (imshape)
        midy- = 250 * imshape [0] // مبلغ (imshape)
        مؤشر + 1 =
    عودة blur_points
    
def add_fog (صورة):
    image_HLS = cv2.cvtColor (image، cv2.COLOR_RGB2HLS) ## التحويل إلى HLS
    قناع = np.zeros_like (صورة)
    imshape = image.shape
    الأب = 100
    image_HLS [:،:، 1] = image_HLS [:،:، 1] * 0.8
    haze_list = gener_random_blur_coordinates (imshape، hw)
    بالنسبة إلى haze_points في haze_list:
        image_HLS [:،:، 1] [image_HLS [:،:، 1]> 255] = 255 ## تعيين جميع القيم أعلى من 255 إلى 255
        image_HLS = add_blur (image_HLS ، haze_points [0] ، haze_points [1]، hw) ## مضيفا جميع مضلعات الظل على قناع فارغ ، الرمز 255 يشير إلى القناة الحمراء فقط
    image_RGB = cv2.cvtColor (image_HLS، cv2.COLOR_HLS2RGB) ## التحويل إلى RGB
    إرجاع image_RGB

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

ضبابي الطريق السريع

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

الامطار الغزيرة

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

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

آمل أن تساعدك هذه المقالة في تدريب النموذج في مختلف الظروف الجوية. لرمزي الكامل ، يمكنك زيارة ملفي الشخصي في جيثب. لقد كتبت الكثير من المقالات الأخرى ، والتي يمكنك قراءتها على "متوسط" وعلى موقع WordPress الخاص بي.

استمتع!