Сделайте дождь, сделайте снег. Как изменить фотографии, чтобы научить самоуправляемые автомобили

1656642016 sdelajte dozhd sdelajte sneg kak izmenit fotografii chtoby nauchit samoupravlyaemye

от Ujjwal Saxena

Увеличение изображения – это техника получения изображения и его использование для создания новых. Это полезно для таких вещей, как обучение самоуправляемому автомобилю.

Представьте человека, управляющего автомобилем в солнечный день. Если начнется дождь, поначалу им будет тяжело ездить под дождем. Но медленно привыкают.

Искусственная нейронная сеть также считает, что трудно двигаться в новой среде, если она не видела его раньше. Это различные методы увеличения, такие как переворачивание, перевод, добавление шума или изменение цветового канала.

В этой статье я расскажу о погоде. Я использовал OpenCV библиотека для обработки изображений Через некоторое время я обнаружил, что это довольно легко, и я смог ввести разные сценарии погоды в изображение.

Я полностью реализовал Тетрадь Юпитер с которыми можно играть на GitHub.

Давай посмотрим.

Сначала я покажу вам оригинальное тестовое изображение, затем дополню его.

DPVOfe-5jaoOME91KftyK1dlzvHu2FYMyzrO

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

После добавления случайного солнечного и теневого эффекта яркость изображения меняется. Это легкое и быстрое превращение.

def add_brightness(image):    image_HLS = cv2.cvtColor(image,cv2.COLOR_RGB2HLS) ## Conversion to HLS    image_HLS = np.array(image_HLS, dtype = np.float64)     random_brightness_coefficient = np.random.uniform()+0.5 ## generates value between 0.5 and 1.5    image_HLS[:,:,1] = image_HLS[:,:,1]*random_brightness_coefficient ## scale pixel values up or down for channel 1(Lightness)    image_HLS[:,:,1][image_HLS[:,:,1]>255]  = 255 ##Sets all values above 255 to 255    image_HLS = np.array(image_HLS, dtype = np.uint8)    image_RGB = cv2.cvtColor(image_HLS,cv2.COLOR_HLS2RGB) ## Conversion to RGB    return image_RGB

Яркость изображения можно изменить, изменив значение пикселей «Lightness» – канал 1 изображения в цветовом пространстве HLS. Преобразование изображения обратно в RGB дает то же изображение с улучшенным или подавленным освещением.

tny-s9fdRMRzn1zfmy1e3OIK82csRqGJ5Yv1
Солнечно
D-cHi--aKE1HWME2vjtrkshXS8JIbAvljuOx
Теневой

Тени

Для автомобиля тень – это не что иное, как темные части изображения, которые иногда могут быть яркими. Таким образом, беспилотный автомобиль должен всегда учиться ездить с тенью или без нее. Случайное изменение яркости на холмах или лесу часто поражает восприятие автомобиля, если его не научить должным образом. Это даже более распространенное в солнечные дни и разную высоту построек в городе, что позволяет пучкам света проникать сквозь них.

Яркость полезна для восприятия, но неравномерная, внезапная или слишком большая яркость создает проблемы с восприятием. Давайте сгенерируем несколько ложных теней.

def generate_shadow_coordinates(imshape, no_of_shadows=1):    vertices_list=[]    for index in range(no_of_shadows):        vertex=[]        for dimensions in range(np.random.randint(3,15)): ## Dimensionality of the shadow polygon            vertex.append(( imshape[1]*np.random.uniform(),imshape[0]//3+imshape[0]*np.random.uniform()))        vertices = np.array([vertex], dtype=np.int32) ## single shadow vertices         vertices_list.append(vertices)    return vertices_list ## List of shadow vertices
def add_shadow(image,no_of_shadows=1):    image_HLS = cv2.cvtColor(image,cv2.COLOR_RGB2HLS) ## Conversion to HLS    mask = np.zeros_like(image)     imshape = image.shape    vertices_list= generate_shadow_coordinates(imshape, no_of_shadows) #3 getting list of shadow vertices    for vertices in vertices_list:         cv2.fillPoly(mask, vertices, 255) ## adding all shadow polygons on empty mask, single 255 denotes only red channel        image_HLS[:,:,1][mask[:,:,0]==255] = image_HLS[:,:,1][mask[:,:,0]==255]*0.5   ## if red channel is hot, image's "Lightness" channel's brightness is lowered     image_RGB = cv2.cvtColor(image_HLS,cv2.COLOR_HLS2RGB) ## Conversion to RGB    return image_RGB

OpenCV fillPoly() функция очень удобна в этом случае. Давайте создадим несколько случайных вершин и наложим многоугольник на пустую маску с помощью fillPoly(). Сделав это, единственное, что осталось сделать, это проверить маску на наличие горячих пикселей и снизить «легкость» на изображении HLS, где бы эти горячие пиксели были обнаружены.

uUsWjNO5bi7SPGP6DsfUdmtY-onV4tblz7eG
Случайный многоугольник тени на дороге

Снег

Ну, это что-то новое. Мы часто задаемся вопросом, как бы вел себя наш автомобиль на заснеженных дорогах. Один из способов проверить это – получить фотографии заснеженных дорог или сделать что-то с изображениями, чтобы получить подобный эффект. Этот эффект не является полной альтернативой заснеженным дорогам, но его следует попробовать.

def add_snow(image):    image_HLS = cv2.cvtColor(image,cv2.COLOR_RGB2HLS) ## Conversion to HLS    image_HLS = np.array(image_HLS, dtype = np.float64)     brightness_coefficient = 2.5     snow_point=140 ## increase this for more snow    image_HLS[:,:,1][image_HLS[:,:,1]<snow_point] = image_HLS[:,:,1][image_HLS[:,:,1]<snow_point]*brightness_coefficient ## scale pixel values up for channel 1(Lightness)    image_HLS[:,:,1][image_HLS[:,:,1]>255]  = 255 ##Sets all values above 255 to 255    image_HLS = np.array(image_HLS, dtype = np.uint8)    image_RGB = cv2.cvtColor(image_HLS,cv2.COLOR_HLS2RGB) ## Conversion to RGB    return image_RGB

Да! Это оно. Этот код обычно отбеливает самые темные части изображения, которыми в основном являются дороги, деревья, горы и другие объекты ландшафта, используя тот же метод увеличения «Освещенности» HLS, который использовался в других подходах выше. Этот прием плохо работает для темных изображений, но вы можете изменить его для этого. Вот что вы получаете:

6ZAXeTp2IK9QmJN8f9hUTqwrVMWNbVuOSANj
зима здесь

Можно настроить некоторые параметры в коде для большего или меньшего количества снега, чем это. Я тоже проверял это на других изображениях, и эта техника вызвала у меня муравьи.

Дождь

Да, вы правильно услышали. Почему не дождь? Когда люди испытывают трудности с вождением под дождем, почему транспортные средства должны быть сохранны от этого? Фактически это одна из ситуаций, для которых я больше всего хочу, чтобы мой самоуправляемый автомобиль был обучен. Скользкие дороги и затуманенное видение рискованны, и автомобили должны знать, как с ними справляться.

def generate_random_lines(imshape,slant,drop_length):    drops=[]    for i in range(1500): ## If You want heavy rain, try increasing this        if slant<0:            x= np.random.randint(slant,imshape[1])        else:            x= np.random.randint(0,imshape[1]-slant)        y= np.random.randint(0,imshape[0]-drop_length)        drops.append((x,y))    return drops            def add_rain(image):        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) ## a shade of gray    rain_drops= generate_random_lines(imshape,slant,drop_length)        for rain_drop in rain_drops:        cv2.line(image,(rain_drop[0],rain_drop[1]),(rain_drop[0]+slant,rain_drop[1]+drop_length),drop_color,drop_width)    image= cv2.blur(image,(7,7)) ## rainy view are blurry        brightness_coefficient = 0.7 ## rainy days are usually shady     image_HLS = cv2.cvtColor(image,cv2.COLOR_RGB2HLS) ## Conversion to HLS    image_HLS[:,:,1] = image_HLS[:,:,1]*brightness_coefficient ## scale pixel values down for channel 1(Lightness)    image_RGB = cv2.cvtColor(image_HLS,cv2.COLOR_HLS2RGB) ## Conversion to RGB    return image_RGB

Я снова генерировал случайные точки по всему изображению, а затем использовал OpenCV line() для создания небольших линий по всему изображению. Я также использовал случайный наклон капель дождя, чтобы почувствовать настоящий дождь. Я также снизил яркость изображения, поскольку дождливые дни обычно бывают темными, а также размытыми из-за дождя. Вы можете изменить размер фильтра размытия и количество капель дождя для достижения желаемого эффекта.

Вот результат:

buoiIOE1acHFNb6-nFEqEMGH7Tlq7fE82mEV
Фальшивый дождь, но не очень размытый

туман

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

Интенсивность тумана – важный параметр для того, чтобы научить машине, сколько газа она должна давать. Для кодирования такой функции можно взять случайные фрагменты со всего изображения и увеличить легкость изображения в этих фрагментах. С помощью простого размытия это дает хороший эффект тумана.

def add_blur(image, x,y,hw):    image[y:y+hw, x:x+hw,1] = image[y:y+hw, x:x+hw,1]+1    image[:,:,1][image[:,:,1]>255]  = 255 ##Sets all values above 255 to 255    image[y:y+hw, x:x+hw,1] = cv2.blur(image[y:y+hw, x:x+hw,1] ,(10,10))    return image
def generate_random_blur_coordinates(imshape,hw):    blur_points=[]    midx= imshape[1]//2-hw-100    midy= imshape[0]//2-hw-100    index=1    while(midx>-100 or midy>-100): ## radially generating coordinates        for i in range(250*index):            x= np.random.randint(midx,imshape[1]-midx-hw)            y= np.random.randint(midy,imshape[0]-midy-hw)            blur_points.append((x,y))        midx-=250*imshape[1]//sum(imshape)        midy-=250*imshape[0]//sum(imshape)        index+=1    return blur_points    def add_fog(image):    image_HLS = cv2.cvtColor(image,cv2.COLOR_RGB2HLS) ## Conversion to HLS    mask = np.zeros_like(image)     imshape = image.shape    hw=100    image_HLS[:,:,1]=image_HLS[:,:,1]*0.8    haze_list= generate_random_blur_coordinates(imshape,hw)    for haze_points in haze_list:         image_HLS[:,:,1][image_HLS[:,:,1]>255]  = 255 ##Sets all values above 255 to 255        image_HLS= add_blur(image_HLS, haze_points[0],haze_points[1], hw) ## adding all shadow polygons on empty mask, single 255 denotes only red channel    image_RGB = cv2.cvtColor(image_HLS,cv2.COLOR_HLS2RGB) ## Conversion to RGB    return image_RGB

Кодирование этой функции было самым сложным из всех вышеперечисленных функций. Я попробовал радиальный подход к созданию патчей здесь. Поскольку в туманный день большинство тумана находится на дальнем конце дороги, и когда мы приближаемся, зрение продолжает проясняться.

Wb0JBy40QWvfm65-n0GHn24MOBHXnSrPRRzt
Туманное шоссе

Для машины действительно сложно обнаруживать автомобили и полосы в таком тумане, и это хороший способ научиться и проверить надежность модели вождения.

Дождь

Я думал немного улучшить дождь, соединив туман и дождь. Поскольку во время дождей всегда туман, хорошо приучить машину к этому. Для этого не требуется новой функции. Мы можем добиться эффекта, последовательно вызывая оба.

MzAyhI05YhGfg9hN7Adb-40MM2iZ3pCtqvtn

Автомобиль справа едва виден на этом изображении, и это реальный сценарий. Под сильным дождем мы почти ничего не различаем по дороге.

Надеюсь, эта статья поможет вам тренировать модель в разных погодных условиях. Для получения полного кода вы можете посетить мой профиль GitHub. И я написал много других статей, которые вы можете прочесть на Medium и на моем сайте WordPress.

Наслаждайтесь!

Добавить комментарий

Ваш адрес email не будет опубликован.