티스토리 뷰

Contribution 일지

YOLOV5 Faster HSV augmentation

developer0hye 2021. 6. 5. 13:03

https://github.com/ultralytics/yolov5/pull/3462

 

Faster HSV augmentation by developer0hye · Pull Request #3462 · ultralytics/yolov5

remove datatype conversion process that can be skipped. import random import numpy as np import cv2 import time def anchor_augment_hsv(img, hgain=0.5, sgain=0.5, vgain=0.5): r = np.random.unif...

github.com

 

YOLOv5에서 쓰이는 augmentation 중에 영상의 컬러와 명도를 조정함으로써 데이터를 증강시키는 기법이 있다.

 

이를 수행하는 함수가 augment_hsv 함수이다.

 

def augment_hsv(img, hgain=0.5, sgain=0.5, vgain=0.5):
    r = np.random.uniform(-1, 1, 3) * [hgain, sgain, vgain] + 1  # random gains
    hue, sat, val = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV))
    dtype = img.dtype  # uint8

    x = np.arange(0, 256, dtype=np.int16)
    lut_hue = ((x * r[0]) % 180).astype(dtype)
    lut_sat = np.clip(x * r[1], 0, 255).astype(dtype)
    lut_val = np.clip(x * r[2], 0, 255).astype(dtype)

    img_hsv = cv2.merge((cv2.LUT(hue, lut_hue), cv2.LUT(sat, lut_sat), cv2.LUT(val, lut_val))).astype(dtype)
    cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR, dst=img)  # no return needed

 

위 코드는 수정하기 전 코드

 

일단 봤을때

 

x = np.arange(0, 256, dtype=np.int16)

 

요녀석 문제다.

 

왜?

 

r 이 float 자료형인데 lut_hue, lut_sat, lut_val 생성과정에 x와 r이 쓰인다.

 

그럼 x는 r과 연산되는 과정에 float 자료형으로 변환된다.  애초에 x를 float형으로 만들면 이 과정을 스킵할 수 있다.

 

그다음 문제!

 

img_hsv = cv2.merge((cv2.LUT(hue, lut_hue), cv2.LUT(sat, lut_sat), cv2.LUT(val, lut_val))).astype(dtype)

 

cv2.merge(...).astype(dtype) 으로 되어 있는데 이미 cv2.merge(...)의 결과로 나오는 어레이의 자료형은 dtype과 같다.

 

그렇다면 굳이 저 형변환 함수를 호출할 이유가 없다.

 

위 문제들을 수정하여 코드를 구현하면 아래와 같다.

 

def augment_hsv(img, hgain=0.5, sgain=0.5, vgain=0.5):
    r = np.random.uniform(-1, 1, 3) * [hgain, sgain, vgain] + 1  # random gains
    hue, sat, val = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV))
    dtype = img.dtype  # uint8

    x = np.arange(0, 256, dtype=r.dtype)
    lut_hue = ((x * r[0]) % 180).astype(dtype)
    lut_sat = np.clip(x * r[1], 0, 255).astype(dtype)
    lut_val = np.clip(x * r[2], 0, 255).astype(dtype)

    img_hsv = cv2.merge((cv2.LUT(hue, lut_hue), cv2.LUT(sat, lut_sat), cv2.LUT(val, lut_val)))
    cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR, dst=img)  # no return needed

 

결과로는 

 

 

1.06배 정도 빨라진다.

 

속도 증가폭이 크다고는 말할 수 없다... 이런 미미한 개선이 모이고 모이다보면 의미있는 변화를 만들어갈거라 생각한다!

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함