Увеличаване на изображението: Направете валежи, направете сняг. Как да модифицирате снимки, за да тренирате автомобили със самостоятелно управление

Увеличаване на изображението е техника за вземане на изображение и използването му за генериране на нови. Полезно е да правите неща като обучение на автомобил със самостоятелно управление.

Помислете за човек, който кара кола в слънчев ден. Ако започне да вали, първоначално може да им е трудно да шофират в дъжд. Но бавно свикват с него.

Изкуствената невронна мрежа също смята за объркваща да шофира в нова среда, освен ако не го е видяла по-рано. Те са различни техники за увеличаване като прелистване, превеждане, добавяне на шум или промяна на цветовия канал.

В тази статия ще проуча метеорологичната част на това. Използвах библиотеката OpenCV за обработка на изображения. Намерих го доста лесно след известно време и успях да въведа различни климатични сценарии в изображение.

Избутах напълно реализиран Jupyter Notebook, с който можете да играете на GitHub.

Нека погледнем.

Първо ще ви покажа оригинално тестово изображение и след това ще го увелича.

Слънчево и сенчесто

След добавяне на случаен слънчев и сенчест ефект, яркостта на изображението се променя. Това е лесна и бърза трансформация за изпълнение.

def add_brightness (изображение):
    image_HLS = cv2.cvtColor (изображение, 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 (лекота)
    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
    връщане на изображение_RGB

Яркостта на изображението може да бъде променена чрез промяна на пикселните стойности на „Лекота“ - канал 1 на изображението в цветовото пространство на HLS. Преобразуването на изображението обратно в RGB дава същото изображение с подобрено или потиснато осветление.

слънчевосенчест

сенки

За автомобила сянката не е нищо друго освен тъмните части на изображението, което също може да бъде ярко на моменти. Така че автомобилът със самостоятелно управление винаги трябва да се научи да шофира със или без сенки. Случайно променящата се яркост по хълмовете или в гората често заблуждава възприятието на автомобила, ако не е тренирано правилно. Това е още по-разпространено в слънчеви дни и различно високи сгради в един град, което позволява светлинни лъчи да надникнат през.

Яркостта е добра за възприятието, но неравномерната, внезапната или твърде много яркост създават проблеми с възприятието. Да създадем някои фалшиви сенки.

дефинирай_shadow_coordinate (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 ()))
        vertices = np.array ([vertex], dtype = np.int32) ## единични върхове в сянка
        vertices_list.append (върха)
    return vertices_list ## Списък на върховете в сянка
def add_shadow (изображение, no_of_shadows = 1):
    image_HLS = cv2.cvtColor (изображение, cv2.COLOR_RGB2HLS) ## Преобразуване в HLS
    маска = np.zeros_like (изображение)
    imshape = image.shape
    vertices_list = create_shadow_coordinate (imshape, 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
    връщане на изображение_RGB

Функцията fillPoly () на OpenCV наистина е полезна в този случай. Нека създадем някои произволни върхове и наложим многоъгълника на празна маска, като използва fillPoly (). След като направите това, единственото, което ви остава, е да проверите маската за горещи пиксели и да намалите „Лекотата“ в HLS изображението, където и да се намерят тези горещи пиксели.

Случайни полигони в сянка на пътя

сняг

Ами това е нещо ново. Често се чудим как би се държало нашето превозно средство по заснежени пътища. Един от начините да тествате е да получите снимки на покрити със сняг пътища или да направите нещо върху изображенията, за да получите подобен ефект. Този ефект не е пълна алтернатива на заснежените пътища, но е подход, който си струва да се опита.

def add_snow (изображение):
    image_HLS = cv2.cvtColor (изображение, 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
    връщане на изображение_RGB

Мда! Това е. Този код обикновено избелва най-тъмните части на изображението, които са предимно пътища, дървета, планини и други характеристики на пейзажа, използвайки същия метод за увеличаване на HLS „Лекота“, използван в другите подходи по-горе. Тази техника не работи добре за тъмни изображения, но можете да я промените, за да го направите. Ето какво получавате:

зимата е тук

Можете да настроите някои параметри в кода за повече или по-малко сняг от този. Тествах това и на други изображения и тази техника ми дава втрисане.

Дъжд

Да, чухте това право. Защо не и дъжд? Когато хората изпитват затруднения при шофиране в дъжд, защо превозните средства трябва да бъдат пощадени от това? Всъщност това е една от ситуациите, за които искам моята самостоятелно управлявана кола да бъде обучена най-много. Хлъзгавите пътища и замъглените визии са рискови и автомобилите трябва да знаят как да се справят с тях.

дефинирайте_различни_линии (imshape, наклон, drop_length):
    капки = []
    за i in range (1500): ## Ако искате силен дъжд, опитайте да го увеличите
        ако е наклонен <0:
            x = np.random.randint (наклон, imshape [1])
        друго:
            x = np.random.randint (0, imshape [1] -slant)
        y = np.random.randint (0, imshape [0] -drop_length)
        drops.append ((х, у))
    капки за връщане
        
    
def add_rain (изображение):
    
    imshape = image.shape
    slant_extreme = 10
    наклонен = np.random.randint (-slant_extreme, slant_extreme)
    drop_length = 20
    drop_width = 2
    drop_color = (200,200,200) ## нюанс на сивото
    rain_drops = generator_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 (изображение, (7,7)) ## дъждовен изглед са размити
    
    lightness_coefficient = 0.7 ## дъждовни дни обикновено са сенчести
    image_HLS = cv2.cvtColor (изображение, cv2.COLOR_RGB2HLS) ## Преобразуване в HLS
    image_HLS [:,:, 1] = image_HLS [:,:, 1] * яркост_коефициент ## стойности на пиксела на скалата надолу за канал 1 (лекота)
    image_RGB = cv2.cvtColor (image_HLS, cv2.COLOR_HLS2RGB) ## Преобразуване в RGB
    връщане на изображение_RGB

Това, което направих тук, е, че отново генерирах случайни точки по цялото изображение и след това използвах функцията на OpenCV's line (), за да генерирам малки линии по цялото изображение. Използвал съм и случаен наклон в дъждовните капки, за да усетя действителния дъжд. Също така намалих яркостта на изображението, защото дъждовните дни обикновено са сенчести, а също и замъглени заради дъжда. Можете да промените размерите на филтъра си за размазване и броя на дъждовните капки за желания ефект.

Ето резултата:

Лъжлив дъжд, но не много размазване

Мъгла

Това е още един сценарий, който много възпрепятства визията на самостоятелно управляван автомобил. Размазаният бял пух в изображението прави много трудно да се види извън определен участък и намалява остротата в изображението.

Интензивността на мъглата е важен параметър за обучението на автомобила за това колко газ трябва да даде. За кодиране на такава функция можете да вземете произволни лепенки от цялото изображение и да увеличите лекотата на изображението в рамките на тези пачове. С просто замъгляване това дава приятен мъгляв ефект.

def add_blur (изображение, x, y, hw):
    изображение [y: y + hw, x: x + hw, 1] = изображение [y: y + hw, x: x + hw, 1] +1
    image [:,:, 1] [изображение [:,:, 1]> 255] = 255 ## Задава всички стойности над 255 до 255
    изображение [y: y + hw, x: x + hw, 1] = cv2.blur (изображение [y: y + hw, x: x + hw, 1], (10,10))
    връщане на изображението
дефинирайте_различни_бъл_координати (imshape, hw):
    blur_points = []
    midx = imshape [1] // 2-hw-100
    midy = imshape [0] // 2-hw-100
    индекс = 1
    докато (midx> -100 или midy> -100): ## радиално генериране на координати
        за i в диапазон (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 (изображение, cv2.COLOR_RGB2HLS) ## Преобразуване в HLS
    маска = np.zeros_like (изображение)
    imshape = image.shape
    ТВ = 100
    image_HLS [:,:, 1] = image_HLS [:,:, 1] * 0.8
    haze_list = create_random_blur_coordinate (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
    връщане на изображение_RGB

Кодирането на това беше най-трудното от всички функции по-горе. Опитах с радиален подход за генериране на пластири тук. Тъй като в мъгливия ден обикновено по-голямата част от мъглата е в далечния край на пътя и когато се приближаваме, зрението продължава да се изчиства.

Мъгли магистрала

За една машина е наистина трудна задача да разпознава близките автомобили и платна в такова замъглено състояние и е добър начин да тренирате и тествате здравината на шофиращия модел.

Проливен дъжд

Мислех да направя част от дъжда малко по-добра, като комбинирам мъгла и дъжд. Тъй като винаги има мъгла по време на дъждове и е добре да обучите колата и за това. Не е необходима нова функция за това. Можем да постигнем ефекта, като последователно извикваме и двете.

Колата вдясно почти не се вижда на това изображение и това е истински сценарий в света. Едва ли можем да разберем нещо на пътя при силен дъжд.

Надявам се тази статия да ви помогне да обучите модела при различни метеорологични условия. За моя пълен код можете да посетите моя профил в GitHub. И аз написах много други статии, които можете да прочетете в Medium и в моя сайт WordPress.

Наслади се!