반응형

try exception을 할 때 터미널에서 프린트하고싶을때가 있습니다.

import traceback
try:
	...
except:
	traceback.print_exc()

위와 같이 하시면 됩니당

반응형
반응형

서비스를 개발하다보면 로깅이 필수입니다. 그러나 로깅또한 로그서버와 통신을 하므로 지연이 있습니다.

단일 스레드에서 로깅까지 진행하게 된다면 서비스는 상당히 느리겠죠.

따라서 로깅은 queue thread를 이용해봅니다.

class logThread(thread):
    def __init__(self):
        Thread.__init__(self)
        self.log_queue = Queue()

    def run(self):
        new_logger = logging.getLogger('log')
        new_logger.setLevel(logging.DEBUG)

        stream_handler = logging.StreamHandler()
        stream_handler.setLevel(logging.DEBUG)

        gelf_udp_handler = graypy.GELFUDPHandler(config.GRAYLOG_HTTP_ADDR, config.GRAYLOG_PORT)

        new_logger.addHandler(gelf_udp_handler)

        while True:
            try:
                message = self.log_queue.get()
                if message is None:
                    continue
                new_logger.debug(message)
            except queue.Empty:
                pass
            except Exception as e:
                pass

    def queue_put(self, data):
        self.log_queue.put(data)

     def queue_get(self):
         return self.log_queue.get()

queue_put(data)의 data에 로그를 넣으면 그레이 로그로 전송이 되는 구조입니다.

반응형
반응형

docker 를 사용하여 처음
pip install opencv-python
을 사용해보면 에러가 날 때가 있다 대체로 다음과 같은 에러이다.

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

이 에러는 라이브러리가 설치 안된 것으로 설치만 해주면 에러가 없어진다 :)

sudo apt-get install libgl1-mesa-glx

반응형
반응형

대체로 도커 처음 환경에서 apt-get update만 했을 경우 opencv 이용한 코드를 실행할 때 제목과 같은 에러를 볼 수 있습니다.

해결법:

sudo apt-get install libgl1-mesa-glx

설치해주시면 opencv 사용 가능해집니다.

외우시면 될 듯..

반응형
반응형

계층의 개수에 따라 for 문을 추가하면 되는 코드입니다.

import glob, os, natsort, cv2

root = "some_path"
file_list = []

for img_folder in natsort.natsorted(glob.glob(os.path.join(root, '*'))):
    folder_name = img_folder.split('/')[-1]
    for img_file in natsort.natsorted(glob.glob(os.path.join(img_folder, '*'))):
    	filename = img_file.split('/')[-1]
        file_list.append(img_file)
        img = cv2.imread(img_file)
        
        

뎁스가 두 계층 있는 데이터 셋을 건든다고 가정해봅시다. 즉 아래와 같은 계층입니다.

root
  |
  -----class
  |       |
  |        -----file
  -----class
          |
           -----file

여기서 주목해야할 것은 glob.glob, os.path.join, natsort입니다.

glob.glob(path) -> list

os.path.join(separate_path) -> str

natsort.natsorted(list) -> list

natsort.natsorted는 sort.sorted와 비슷한 기능을 하지만 폴더가 숫자로 되어 있는경우 ex) 1, 2, 3, 4 ~ 100, 101~

sort.sorted는 1, 100 이런식으로 정렬하게 됩니다. 이때 해결방법은 앞에 0001, 0002 이런식으로 0을 붙여주거나 하는 것인데, natsort는 그럴 필요 없이 정렬해 줍니다.

 

 

 

반응형
반응형

영상을 반전시키고 싶을 때가 있다.

img = cv2.imread(os.path.join([img_path]))
img = cv2.flip(img,1)

1일 경우 수평 뒤집기 0일 경우 수직 뒤집기이다.

반응형
반응형

히스토그램 평활화나 스트레칭은 주로 어두운 영상이나 밝은 영상에서 명암 대비를 높여주기위해 사용한다. 

히스토그램을 가지고 평활화를 하거나 스트레칭을 하는 기법은 주로 그레이스케일 차원에서 이루어진다. 즉, rgb 데이터인 경우 명암을 관장하는 채널을 추출하기 위해 Yuv나 Lab 컬러모델로 변환 후 Y 값이나 L 값을 이용하여 평활화, 스트레칭 적용 후 다시 머징하는 것이 기본 과정이다.

히스토그램 평활화에 여러 기법들이 있는데 크게 두가지로 나눌 수 있다.

Global: 영상 전체를 입력하여같은 모든 픽셀에 파라미터를 적용하는 것

Adaptive: 윈도우 사이즈를 정하여 부분 별로 파라미터를 적용하는 것

Global의 단점을 개선하기 위해 Adaptive 기법이 제안되었는데 Global의 단점은 특정 부분의 명도대비가 적고 특정부분이 높을 경우 모두 원만하게 처리가 불가능하다는 점이다. 즉, 같은 파라미터로 적용하니 제대로된 값을 얻기 어렵다는 뜻이다.

히스토그램 평활화를 python으로 적용하려면 간단하게 아래와 같은 코드를 사용하면 된다.

src = cv2.imread('something.png', cv2.IMREAD_GRAYSCALE)

dst = cv2.equalizeHist(src)

Adaptive 기법의 대표주자는 Contrast Limited Adaptive Histogram Equalization (CLAHE) 기법이 있다. 마찬가지로 Python으로 적용해 보려면 다음과 같다. CLAHE는 말 그대로 명도대비를 제한하며 적응적으로 히스토그램을 평활화하는 것으로 파라미터가 윈도우 사이즈, 클립 리미트가 들어간다. 클립 리미트가 명도 제한 값이고 tilieGridSize가 윈도우 사이즈이다.

#CLAHE
lab = cv2.cvtColor(im, cv2.COLOR_BGR2LAB)
lab_planes = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(4,4))
lab_planes[0] = clahe.apply(lab_planes[0])

lab = cv2.merge(lab_planes)
bgr1 = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)

위에서 언급했듯 불러온 im이 rgb 데이터라 가정할 때 opencv에선 bgr로 변환되므로 bgr2lab을 통해 명암 채널(l)을 추출한다. 

이후 opencv에서 제공하는 createCLAHE 메소드에 파라미터를 입력하여 clahe를 생성해주고 명암 채널에 clahe를 적용한 후 머징한다.

다음은 스트레칭인데 스트레칭은 단순히 명암채널을 0~255로 노멀라이즈하는 것 뿐이다. 만약 어떤 영상의 픽셀값이 100~200 사이에 분포되어 있다면 노멀라이즈를 통해 스트레칭, 쫙 펴줄 수 있다. 코드는 아래와 같다.

#stretching
lab = cv2.cvtColor(im, cv2.COLOR_BGR2LAB)
lab_planes = cv2.split(lab)
lab_planes[0] = cv2.normalize(lab_planes[0], None, 0, 255, cv2.NORM_MINMAX)

lab = cv2.merge(lab_planes)
bgr1 = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)

아래 이미지는 각각 손금 데이터 원본, CLAHE, 스트레칭을 적용한 결과값이다.

반응형
반응형
$ CUDA_VISIBLE_DEVICES=[GPU_NUMBER] python [PY_FILE]

ex)
$ CUDA_VISIBLE_DEVICES=0 python main.py

위 명령은 터미널 상에서 GPU 선정 방법이다.

import os

os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"   
os.environ["CUDA_VISIBLE_DEVICES"]="[GPU_NUMBER]"

ex)
import os

os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"   
os.environ["CUDA_VISIBLE_DEVICES"]="0" 
os.environ["CUDA_VISIBLE_DEVICES"]="1"
os.environ["CUDA_VISIBLE_DEVICES"]="0,1"
반응형

+ Recent posts