반응형

흔히 코딩할 때 쓰이는 친구들을 이용해서 적당한 구조를 만들어보자.

일단 파이썬도 자바와 동일하게 객체지향이기 때문에 클래스(Class)를 많이 사용한다.

클래스는 붕어빵 틀과 같다. 그리고 클래스로 객체를 만들 수 있는데 이는 인스턴스라고도 하고 객체라고도 한다.

즉, 붕어빵 틀인 클래스로 붕어빵인 객체(인스턴스)를 만드는 것이다. 이 때 붕어빵 틀은 고정되어 있지만 붕어빵안에는 슈크림, 팥 등 다양한 것이 들어갈 수 있다. 무슨 이야기인지 밑의 코드로 확인하자.

class FishBread:
    def __init__(self):
        self.source = 'red_bean'

    def set_source(self, source):
        self.source = source

    def get_source(self):
        return self.source

if __name__ == '__main__':
    fish_bread = FishBread()
    fish_bread.set_source('puff')
    what_source = fish_bread.get_source()
    print(what_source)

차근차근 살펴보자 먼저, FishBread 클래스를 생성(정의)한다. FishBread는 붕어빵 틀 답게 소스(팥, 슈크림 등)을 세팅해주는 기능이 있다. 여기서 __init__메소드는 객체(인스턴스)를 생성할 때 딱 한번 제일 처음으로 실행되는 메소드이므로 번역하자면 붕어빵 틀의 기본 소스는 팥(red_bean)인 셈이다.

메인으로 넘어와서 fish_bread = FishBread()로 객체(인스턴스)를 생성해준다. 즉 붕어빵 틀로 붕어빵을 만들어 낸다.

이때 fish_bread.set_source('puff')로 붕어빵의 소스를 슈크림(puff)로 세팅한다.

그러면 fish_bread는 슈크림을 가지고 있는 붕어빵이 된다.

그리고 fish_bread.get_source()로 어떤 소스가 담겨있는지를 what_source변수에 넣어주고 프린트한다.

그렇다면 손님이 팥붕과 슈붕을 모두 주문했다면 어떻게 할까?

답은 간단하다.

if __name__ == '__main__':
    fish_bread_1 = FishBread()
    fish_bread_2 = FishBread()
    fish_bread_1.set_source('puff')
    fish_bread_2.set_source('red_bean')
    what_source_1 = fish_bread_1.get_source()
    what_source_2 = fish_bread_2.get_source()
    print(what_source_1)
    print(what_source_2)

위와 같이 코딩을 해내면 1개의 붕어빵 틀로 두가지 맛의 붕어빵을 만들 수 있다.

안에 피자맛을 넣어도 좋다.

암튼 클래스를 이용한다면 다음과 같은 절차를 따르면 된다.

1. 클래스 생성

2. 메인에서 객체(인스턴스)생성

3. 인스턴스를 이용하여 메소드 사용

반응형

'Python' 카테고리의 다른 글

opencv cv2.imshow 에러 해결방법  (0) 2022.03.31
pix2pix augmentation  (0) 2022.03.31
exception print하기  (0) 2022.01.26
log threading 로깅이 서비스에 방해되지 않게 하기  (0) 2021.08.31
pip install opencv-python 에러  (0) 2021.07.13
반응형

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에 로그를 넣으면 그레이 로그로 전송이 되는 구조입니다.

반응형
반응형

대체로 도커 처음 환경에서 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는 그럴 필요 없이 정렬해 줍니다.

 

 

 

반응형
반응형

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

히스토그램을 가지고 평활화를 하거나 스트레칭을 하는 기법은 주로 그레이스케일 차원에서 이루어진다. 즉, 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"
반응형
반응형
pip install pytube

pytube에서 다운로드 기능을 제공합니다.

 

from pytube import YouTube

def Downloader(link):     
    url =YouTube('https://www.youtube.com/watch?v='+str(link))
    video = url.streams.first()
    video.download('../../database/videos/')
    
Downloader(random_youtube_link)

제가 사용한 메소드의 파라미터는 유튜브 랜덤 생성 토큰만 전달하는 기능을 갖고있습니다.

 

또한 video.download()의 파라미터는 저장 경로입니다.

반응형

+ Recent posts