ybrother0의 등록된 링크

 ybrother0로 등록된 네이버 블로그 포스트 수는 36건입니다.

Pyinstaller 배포 시 QThread와 Multiprocessing 간의 문제 발생 [내부링크]

PySide6 버전으로 한땀 한땀 제작한 GUI를 회사 내부에 배포를 시작하였다. 기능으로는 이미지를 불러와 분석하여서 분석 결과 이미지와 결과 데이터를 Table로 Display를 해주고, 엑셀 파일로 저장하는 프로그램이다. 그런데 vscode 상으로는 문제가 발생하지 않았는데 배포를 하였을 때, 분석 기능을 한 번 프로그램을 실행하여서 두 번 연속으로 진행하였을 때 프로그램이 아무런 에러가 없이 종료되는 현상이었다. 작업 관리자에서 확인해보니 CPU의 사용률이 100%가 되는 것으로 확인, Multiprocessing 에서 CPU에 과도하게 작업량을 부과하였다고 판단하여서 작업량을 줄여보았다. inputs_ = [img_paths ...] num_cores = multiprocessing.cpu_count() use_cores = num_core // 2 with multiprocessing.Pool(use_cores) as P: results = [P.apply_async(an

PySide6 Zooming QGraphicsView using custom class. [내부링크]

이미지를 불러와 보여주는 GUI를 PySide6를 이용하여서 만들었다. 해당 과정 중 이미지를 불러와서 Zoom-in, Zoom-out을 Ctrl를 누르고서 휠 스크롤 통하여 조절하고 싶어서 QGraphicsView를 상속받아 Custom class로 만들었다. from PySide6.QtWidgets import QGraphicsView, QPushButton from PySide6.QtGui import QWheelEvent, QTransform from PySide6.QtCore import Qt class Custom_GraphicsView(QGraphicsView): def __init__(self, parent): super(Custom_GraphicsView, self).__init__(parent) self.reset_button = QPushButton("D", self) self.reset_button.clicked.connect(self.reset_scale) s

Python에서 분산 시스템 비교 [내부링크]

정리가 잘 된 두 포스팅을 참고. https://ivdevlog.tistory.com/3 Multiprocessing VS Threading VS AsyncIO in Python Introduction 현대 컴퓨터 프로그래밍에서, 동시성(concurrency)은 문제를 보다 더 빨리 해결하기 위하여 필요합니다. 여기서 동시성이란 개념은 여러 작업들을 마치 '동시에 실행되는 것 같아 보이게' 실행하는 방법을 말합니다. 실제 여러 작업을 동시에 수행하는 병렬(parallel)과는 조금 다른 개념입니다. 굉장히 비슷해 보이는데, 그림 1을 참고하시면 이해하기 쉬울 것 입니다. 한대의 커피 머신에 두 줄로 선 사람들이 번갈아 가면서 커피를 받는 상황(concurrency)과 두 대의 커피 머신이 존재는 상황(par... ivdevlog.tistory.com https://velog.io/@carrykim/%EB%B6%84%EC%82%B0-%EC%8B%9C%EC%8A%A4%ED%85%9C-2

PySide6 QThread Class 복사하기. [내부링크]

PySide6를 사용하던 중 "시작" 버튼을 클릭하면 내부 동작을 ProgressBar로 실시간으로 UI상에서 업데이트 해줘야 하는 기능이 필요해졌다. 하지만 작업 진행 중 freeze 현상이 발생하여 새로운 QThread를 생성하여 실시간으로 업데이트가 가능하도록 변경하였다. 위 과정 중 1번의 thread가 종료되고 제거된 후에 다시 "시작" 버튼을 누르면 다음과 같은 에러가 발생하면서 올바르게 동작을 안하였다. RuntimeError: Internal C++ object (MyClass) already deleted. 문제가 되는 코드는 아래와 같다. from PySide6.QtCore import QThread, Slot class ThreadClass: def __init__(self, view: MainView, model: MyClass): self._view = view self._model = model def __run_thread(self): self.thread

Multi GPU 사용 [내부링크]

기존에 1개의 GPU만 사용하던 모델을 학습과 추론 단계에서 4개의 Multi GPU로 사용하도록 변경하였다. tf.device("/device:GPU:0")으로 선택하던 방식을 tensorflow 내부의 tf.distribute.mirroredstrategy 함수를 이용하여 Multi GPU를 활성화 시켰다. https://www.tensorflow.org/guide/distributed_training?hl=ko 텐서플로로 분산 훈련하기 | TensorFlow Core Google I/O는 끝입니다! TensorFlow 세션 확인하기 세션 보기 TensorFlow 학습 TensorFlow Core 가이드 텐서플로로 분산 훈련하기 이 페이지의 내용 개요 전략의 종류 MirroredStrategy CentralStorageStrategy MultiWorkerMirroredStrategy TPUStrategy ParameterServerStrategy 케라스와 함께 tf.distrib

C++ Tensorflow 빌드하기 [내부링크]

Python 으로 만들어진 모델을 C++ 에서 사용하기 위해서 tensorflow 를 빌드하여 사용하기로 했다. 아래의 사이트를 토대로 진행. https://www.tensorflow.org/install/source_windows?hl=ko Windows의 소스에서 빌드 | TensorFlow TensorFlow 설치 Windows의 소스에서 빌드 이 페이지의 내용 Windows용 설정 Python 및 TensorFlow 패키지 종속성 설치 Bazel 설치 MSYS2 설치 Visual C++ 빌드 도구 2019 설치 GPU 지원 설치(선택사항) TensorFlow 소스 코드 다운로드 빌드 구성 소스에서 TensorFlow pip 패키지를 빌드하고 Windows에 설치합니다. Windows용 설정 다음 빌드 도구를 설치하여 Windows 개발 환경을 구성합니다. Python 및 TensorFlow 패키지 종속 항목 설치 W... www.tensorflow.org 환경 tensorfl

Python value to 4 bytes hex 변환 [내부링크]

Custom Header 정보가 담겨 있는 파일을 받아 수정할 일이 생겨서 찾아보았다. 방법1. to_bytes 사용 https://docs.python.org/ko/3/library/stdtypes.html#int.to_bytes 내장형 — Python 3.10.6 문서 내장형 다음 섹션에서는 인터프리터에 내장된 표준형에 관해 설명합니다. 기본 내장 유형은 숫자, 시퀀스, 매핑, 클래스, 인스턴스 및 예외입니다. 일부 컬렉션 클래스는 가변입니다. 제자리에서 멤버를 추가, 삭제 또는 재배치하고 특정 항목을 반환하지 않는 메서드는 컬렉션 인스턴스 자체를 반환하지 않고 None 을 반환합니다. 일부 연산들은 여러 객체 형에서 지원됩니다; 특히 사실상 모든 객체를 동등 비교하고, 논리값을 검사하고, ( repr() 함수 또는 약간 다른 str() 함수를 사용해서) 문자열로 변환할 수 있습니다. 두 번째 함... docs.python.org (512).to_bytes(4, byteorder

pyinstaller 에러 [내부링크]

multiprocessing 을 사용할 때 IDE 상에서 정상 동작하는 코드가 pyinstaller 로 exe 파일로 만들어서 사용하면 올바르게 동작하지 않는 에러가 발생. 다음 내용을 추가하면 정상적으로 동작한다. if __name__ == "__main__": multiprocessing.freeze_support()

Tensorflow .dll load error 해결 [내부링크]

기존에 사용하던 1660 gpu에서 3080 ti 로 업그레이드를 하였습니다. rtx 30 시리즈에 맞게 tensorflow 와 cuda를 업데이트 한 뒤 gpu를 사용안하는 현상이 발생하였습니다. tensorflow 를 import 시 2021-11-23 11:55:44.344350: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found 2021-11-23 11:55:44.344668: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine. 에러 메세지에 따르면 GPU 사용을 위해선 cudart

분산 학습에 대한 정리글 [내부링크]

https://hadaney.tistory.com/39 분산 학습과 집합 통신 안녕하세요~ 오늘은 분산학습이 등장하게 된 배경과 정의 그리고 실제 분산학습에서 Gradient 전달을 위한 통신 흐름을 소개해보고자 합니다. 개인적으로 작년에 분산학습이 무엇인지 빠르게 배우고 적용해보는 시간들이 많았습니다만.. 올해 들어 그런 기회가 없어 블로그로 제가 배웠던 내용들을 한곳에 모아보려고 합니다. 소개해보려는 순서는 다음과 같습니다. 1편: 분산학습과 집합통신 2편: 분산학습 대표 유형 (DP, MP, PP, Zero Infinity…) 3편: 분산학습 테크닉과 디버깅 노하우 학습 트렌드 분산학습이 무엇인지 알기 ... hadaney.tistory.com

Segmentation Loss 정리 [내부링크]

Loss function type Loss use cases 출처: A survey of loss functions for semantic segmentation Image Segmentation has been an active field of research as it has a wide range of applications, ranging from automated disease detection to self-driving cars. In the past five years, various papers came up with different objective loss functions used in different cases such as biased data, sparse se... arxiv.org

PySide6 QMenu 관련 문제 [내부링크]

QMenu 를 처음 추가하여 UI 작업 중 듀얼 모니터에서 1번 메인 모니터에서만 QMenu 의 하위 항목들이 나타나는 문제가 발생. 메인 모니터에서의 메뉴 항목 메인모니터 서브 모니터에서의 메뉴 항목 좌: 서브모니터, 우: 메인모니터 구글링 결과 PySide6의 버전 문제인 경우 발생한다는 것을 확인 후 6.5.2 버전에서 6.4.3 버전으로 낮추니 정상 동작하였다. 소스는 아래에 첨부한다. import sys from PySide6.QtWidgets import QMainWindow, QApplication, QLabel, QVBoxLayout, QWidget, QMenu from PySide6.QtGui import QAction, QCursor class MainView(QMainWindow): def __init__(self): super().__init__() # UI 초기화 self.initUi() def initUi(self): # 메뉴바 생성 menubar = sel

Python) Opencv 한글 경로 인식 문제 [내부링크]

cv2.imread와 cv2.imwrite를 사용하면 한글 경로를 인식하지 못하는 오류가 발생. 바이트 형태의 배열로 읽어와 numpy array로 다시 변환하여 cv2.imdecode로 읽어온다. 저장 시에는 cv2.imencode를 이용하여서 저장. def imread(path_file,flag = cv2.IMREAD_COLOR,dtype = np.uint8): stream = open(path_file,"rb") bytes = bytearray(stream.read()) numpyarray = np.asanyarray(bytes,dtype = dtype) bgrImage = cv2.imdecode(numpyarray,flag) return bgrImage def imwrite(path_file,img,params = None): ext = os.path.splitext(path_file)[1] result, n = cv2.imencode(ext, img, params) if r

Python) Keras의 predict_on_batch Memory leak [내부링크]

학습을 통해 모델을 저장한 뒤 불러와서 예측을 진행. 약 12시간 후 predict_on_batch 단에서 OOM error, dst tensor error 등 GPU Memory가 가득 차 코드가 정지되는 현상을 발견하였다. GPU Memory가 채워지는 부분을 확인한 결과, 코드의 첫 시작 후 동일한 사용량을 보였지만, 반복될 수록 점점 증가하는 것을 확인, 코드 분석에 들어갔다. 데이터를 불러와 전처리를 한 뒤 predict_on_batch 함수에 넣는 과정까지 중 예측 함수단에서 model을 predict 경로의 폴더 하나가 끝날 때 마다 재 load하는 것을 확인. 해결법) 전체 코드에서 단일 모델을 사용하기 때문에 모델은 코드 첫 시작과 함께 한 번만 선언. 테스트 결과) 12시간이 지나도 코드가 정상적으로 동작하는 것을 확인. 모델을 반복적으로 불러오는 과정에서 GPU 메모리가 제대로 해소되지 않는 현상이었다.

C++) Visual studio 프로젝트 관리 [내부링크]

#directory #library 기존에 사용하던 프로젝트를 받아 새로운 환경에서 사용하기 전에 설정을 별도로 해주어야 한다. 해당 설정이란, 프로젝트의 속성으로 들어가 C/C++ -> 일반 항목 설정한다. 한 프로젝트에서 다른 디렉터리에 있는 코드를 참조할 경우에 "추가 포함 디렉터리" 라는 항목으로 들어가 참조할 코드들의 include 폴더를 지정해 주어야한다. 빌드 시 Zm error가 발생하면 속성에서 명령줄에 들어가 -Zm256이라는 명령줄을 추가 옵션 칸에 추가해준다. 첫 단락에서 말한 다른 디렉터리의 코드를 참조할 때 라이브러리도 등록을 해주어야 한다. 라이브러리는 속성 -> 링커 -> 일반에서 "추가 라이브러리 디렉터리"에서 참조할 코드 경로의 lib폴더를 지정한다.

Memory Mapped File [내부링크]

http://egloos.zum.com/sweeper/v/2990023 Memory Mapped File 1. 메모리 맵 파일 메모리 맵 파일 기능은 가상 메모리처럼 프로세스 주소 공간을 예약하고, 예약한 영역에 물리 저장소를 커밋하는 기능을 제공한다. 가상 메모리와 유일한 차이점이라면, 시스템의 페이징 파일을 사용하는 대신 디스크 상에 존재하는 어떤 파일이라도 물리 저장소로 사용 가능하다는 점이다. (메모리 맵 파일도 페이징 파일 사용이 가능하 egloos.zum.com

C++) window process 찾기 및 종료 [내부링크]

프로그램을 실행하다 보면 기존의 프로세스를 종료하였을 때 비정상적으로 종료되어 실행하려는 프로세스가 이미 실행중인 경우가 있다. 이 때 실행중인 프로세스를 탐색하여 종료시키는 방법을 적용시켜 보았다. 알아본 바 방법을 두 가지 정도가 있다. 1) 현재 실행중인 모든 프로세스의 ID를 받아와 해당 프로세스를 찾아서 종료시키는 방법 2) 해당 프로세스의 ClassName과 캡션명을 받아와 탐색하여 종료시키는 방법 내 코드의 경우에는 ClassName과 캡션명을 명확하게 알고 있으므로 2번째 방법을 사용하였다. ClassName과 캡션명은 visual studio의 도구(T)의 Spy++(+)에서 확인하였다. BOOL FindAndKillProcess(const CString& strClassName /*= _T("")*/,const CString& strWindowName /*= _T("")*/) { HWND hWnd; //먼저 핸들값을 얻어낸다. hWnd = FindWindow(str

Matrox MIL 라이브러리 MappFree 문제 [내부링크]

MIL_ID를 이용해 생성한 App, Sys, Buf 3가지를 Alloc을 통해 순서대로 메모리에 할당을 한 뒤, 할당된 Alloc 들을 함수 구문이 끝날 때 역순으로 Free를 해주는 과정에서 Error가 발생하였다. 에러의 내용은 Error in MappFree(): 의 에러가 발생. 위치를 여러가지로 옮겨봐도 같은 에러가 발생하여서 구글링한 결과는 다른 메모리에 올라가 사용이 되고 있는 인스턴스의 메모리 할당이 해제가 되어야 Free가 올바르게 된다고 함. 따라서, SharedMemory를 사용하는 변수들의 메모리 할당을 모두 해제한 후에 MIL_ID를 Free를 통해 할당을 해제하니 에러 없이 정상적으로 작동한다. 해결!!

C++) nvJPEG CODEC, nppimirror [내부링크]

//////////// 20211029 유준상, nvJPEG CODEC 기능 추가 BOOL IsDecodeFlipEncode(char* ImagePath_tmp, char* SavePath) { unsigned char * pBuffer = NULL; nvjpegOutputFormat_t output_format = NVJPEG_OUTPUT_RGB; nvjpegInputFormat_t input_format = NVJPEG_INPUT_RGB; std::ifstream InputStream(ImagePath_tmp, std::ios::in | std::ios::binary | std::ios::ate); if(!(InputStream.is_open())) { std::cerr << "Cannot open image: " << ImagePath_tmp << std::endl; return FALSE; } std::streamsize nSize = InputStream.tellg(); I

Python) Visual studio 2017 세팅(Anaconda) 에러 [내부링크]

기존에 VS 2019에서 사용하던 파이썬 코드를 다른 PC의 VS 2017 버전으로 옮기는 작업을 진행하였다. 사용하던 아나콘다의 가상환경과 동일한 환경을 만든 뒤 테스트하였으나 에러가 발생.... 잘 import 되던 numpy, opencv, tensorflow, keras 들이 import가 안되는 현상 발생.... cuda, cudnn 버전도 재차 확인하였으나 동일한 문제발생.... 설치되어 있던 라이브러리들의 버전 문제라 판단되어서 numpy를 1.19.2에서 1.20.2로 업그레이드 하였다.

MFC) AfxOleInit() [내부링크]

Com 객체를 초기화

Anaconda requirements.txt 생성 시 불필요한 경로 제거 [내부링크]

pip freeze > requirements.txt 을 통해 생성 시 파일의 버전 번호가 아닌 경로로 얻어지는 경우 pip list --format=freeze > requirements.txt 로 생성

Pyqt5) 외부 함수를 호출하여서 실행 시 GUI가 멈추는 현상 [내부링크]

GUI freezing 현상을 멈추기 위해선 Pyqt5의 QThread를 이용하여 방지하여야 함 https://realpython.com/python-pyqt-qthread/ Use PyQt's QThread to Prevent Freezing GUIs – Real Python In this step-by-step tutorial, you’ll learn how to prevent freezing GUIs by offloading long-running tasks to worker QThreads in PyQt. realpython.com 위 사이트를 참조하여 작성 중

Python) Image overlay [내부링크]

조건) 배경 이미지와 오버레이 이미지의 사이즈가 같음 배경 이미지에서 오버레이 이미지가 들어갈 픽셀값을 0으로 조정한 뒤 cv2.addWeighted 함수를 이용하여 두 이미지를 합침 attached_img = cv2.merge([attached_b, attached_g, attached_r]) # 배경 이미지 3 channel color_img = cv2.merge([b, g, r]) # 오버레이용 이미지 3 channel gray_overlay = cv2.cvtColor(color_img, cv2.COLOR_BGR2GRAY) overlay_mask = cv2.threshold(gray_overlay, 250, 255, cv2.THRESH_BINARY)[1] overlay_mask = cv2.cvtColor(overlay_mask, cv2.COLOR_GRAY2BGR) face_part = (attached_img / 255) * (background_mask / 255) overl

Python) Memory Leak 발생!!! [내부링크]

기존에 사용하던 Unet 기반 DeepLearning 코드를 Pyqt5를 이용해 GUI를 만들었다. 그 후에 작업 관리자를 통해 메모리 사용량을 확인해보니 RAM 메모리가 지속적으로 증가하는 것을 확인. 원인을 찾아보니 GUI를 만들면서 변경한 AI 코드 중 Predict하는 영역에서 메모리 누수가 발생하였다. 사용한 변수를 재선언하여도 지속적인 누수가 발생.... 세부적으로 확인해봐야겠다! # Predict할 split image (numpy array) testGene = testGenerator(split_images) save_on_memory=[] index = 1 image_index=0 for x in testGene: print("predicting... %30s" % test_image_name, "(", index, '/', max, ')', end = '\r') result = model.predict_on_batch(x) result = result[0,:,:,

Output tensor size [내부링크]

O : Output size I : Input size K : Conv Kernels size S : Stride P : Padding size 출력 이미지 채널 수 = 커널 수

손실 함수(Loss Function) [내부링크]

참조 교재 밑바닥부터 시작하는 딥러닝 - 파이썬으로 익히는 딥러닝 이론과 구현- 직접 구현하고 움직여보며 익히는 - 인터파크 추가 회원 중복 할인 쿠폰, 교재/전집에 대한 상품입니다. shopping.interpark.com 손실 함수란 신경망 학습에서 최적의 매개변수 값을 탐색하는 지표로 현재 신경망이 훈련 데이터를 얼마나 잘 처리하지 '못'하느냐를 나타낸다. 기계 학습 문제는 훈련 데이터에 대한 손실 함수의 값을 구하고, 그 값을 최대한 줄여주는 매개변수를 찾아낸다. 현재 포스터에서는 손실 함수 중 일반적으로 자주 쓰이는 "평균 제곱 오차" 와 "교차 엔트로피 오차"를 알아본다. 1. 평균 제곱 오차(mean squared error, MSE) 식으로는 다음과 같이 나타낸다. yk : 신경망의 출력, softmax 함수의 출력(0~1 사이의 값으로 모두 더하면 1이 됨) tk : 정답 레이블, one-hot 인코딩된 결과로 한 원소만 1, 그 외는 0 k : 데이터의 차원 수 #

numpy 범용 함수 정리 [내부링크]

설명이 잘 되어있는 블로그 첨부 https://rfriend.tistory.com/294 [Python NumPy] 범용 함수 (universal functions) : (1-2) 단일 배열 unary ufuncs : 합(sum), 누적합(cum_sum), 곱(product), 누적곱(cum_prod), 차분(difference), gradient 범용함수 지난번 포스팅에서는 NumPy 에서 제공하는 - (1) 단일 배열 대상의 범용 함수 (Unary Universal Functions) - (2) 2개 배열 대상의 범용 함수 (Binary Universal Functions) 에 대해서.. rfriend.tistory.com

np.array vs np.asarray [내부링크]

import numpy as np a = np.ones([3,3]) b = np.array(a) c = np.asarray(a) a[1]=2 b[0]=0 c[2]=3 print(f"a\n{a}\nb\n{b}\nc\n{c}") ################# a [[1. 1. 1.] [2. 2. 2.] [3. 3. 3.]] b [[0. 0. 0.] [1. 1. 1.] [1. 1. 1.]] c [[1. 1. 1.] [2. 2. 2.] [3. 3. 3.]] np.array로 선언된 "b"는 기존의 "a" 변수를 복사하여서 선언이 되었고, np.asarray "c"는 기존의 "a" 원본 데이터를 수정이 가능하다. np.asarray는 이미 존재하는 배열은 복사하지 않고, 다르거나 dtype이 다른 경우에만 배열은 복사한다. 참조) numpy.asarray — NumPy v1.22 Manual numpy.asarray numpy. asarray ( a , dtype = None , order

Python) 속도 향상 [내부링크]

Deep Learning 모델에서의 stride, learning rate, 등이나 batch_size를 통해 속도를 향상시키는 것에 어느정도 최적화가 이루어 졌다고 판단을 하였다. 위 부분은 Train단에서 큰 속도를 향상시키는데 성공을 하였다. 하지만 Predict단에서 속도가 느린 것을 확인. GPU를 사용하는 부분 외에 opencv를 이용하여 imdecode와 imencode함수를 사용할 때 encoding, decoding 작업에서의 속도가 생각보다 너무 느리다고 판단을 하여서, 코드를 살펴봤다. 살펴본 결과, 원인은 매 프로세스마다 imdecode와 imencode함수를 사용하는 것을 확인. 따라서 불필요한 imdecode와 imencode함수를 작업들을 최소화하여 로컬에 파일들을 저장한 뒤에 작업을 진행하는 것이 아닌 메모리단에 해당 작업 결과들을 올려서 로컬에서 저장하고 다시 읽는 작업들을 최소화하니 눈에 띄게 속도가 향상하는 것을 확인. 놓치기 쉬운 부분이라 생각하여

Pyqt5 사용법(with qt designer) [내부링크]

기존 딥러닝 코드를 사용자가 사용하기 편하게 ui로 만들기로 함 config.ini 파일을 이용하여 기본 세팅들을 설정하기 때문에 ui단에서 ini 파일의 인자들을 받음. 각각 radio button, QLineedit에 초기 ini파일의 값들을 넣어 주고, 그 후 ui 조작을 통해 값이 변화하면 기존의 config.ini파일에 인자값을 수정하여 저장하는 방식을 채택. 아나콘다 가상환경에 Pyqt5를 설치, 아나콘다 프롬프트로 해당 가상환경을 activate시킨 뒤 designer를 입력하여 qt designer를 사용. 작업을 완료한 ui를 저장한 뒤, 실행하려는 코드의 경로로 붙여넣기. 사용한 모듈 import sys #####QApplication에서 절대경로를 획득하는데 사용 (sys.argv) from PyQt5.QtWidgets import* from PyQt5 import uic from PyQt5.QtCore import QSettings from imp import

Python) Merging Bounding Boxes Algorithm [내부링크]

Darknet의 Yolov5 버전을 이용해서 결과로 나온 Bounding Boxes들이 너무 겹치는 현상을 발견, NMS를 통해 merging 작업을 하기엔 Detect이 완료된 객체의 크기가 제각각이며, 이미지 전체 중 70%를 넘어가는 경우도 발생하였다. 따라서 겹치는 Boxes들을 합쳐서 하나의 Box로 만드는 작업에 들어감. Box의 좌표는 (x1, y1, x2, y2). Bounding Boxes의 plot 방식) 1. 각각의 bbox에 index로 번호를 매겨 메모리에 저장 2. 합쳐진 bbox들의 index만을 따로 저장 3. 2번에서 그려지는 영역이 똑같은 bbox의 index중 첫 번째의 index 외에는 제외 4. 3번에서 추려진 index들의 값을 넣어 plot_box 함 5. 2번의 index 값들을 기존 1번의 bbox에서 제외 6. 합쳐진 bbox를 제외하고 나머지 독립적인 bbox들을 plot 위 그림과 같이 총 4개의 꼭지점들 중 하나의 꼭지점만이 박스에

Text data classification [내부링크]

csv 파일 형식의 data를 받아와 sklearn의 RandomForestClassifier로 돌려보았다. from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn import metrics import pandas as pd import warnings warnings.filterwarnings('ignore') import matplotlib.pyplot as plt load_data = pd.read_csv('sample.csv') data = load_data.drop(['type_id'], axis=1) label = load_data['type_id'].values # 데이터를 train, test, validation 3가지로 6:2:2의 비율로 나누었다. x_train, x_test, y_train, y_test =

(MFC)C++에서 프린터 출력이 안되는 문제 수정 [내부링크]

20210510) 과거에 만들었던 Windows 7 버전의 C++ with MFC 코드를 Windows 10에서 사용한 결과, 프린터 출력이 안되는 문제가 발생 해당 코드를 받아서 정상작동 하도록 수정에 들어감. 20210512) 프로그램을 실행시킨 후, 파일을 불러와 인쇄를 누르면 멈추는 에러가 발생 ##############<Error Message>################ named.exe의 0x74cae58e에 처리되지 않은 예외가 있습니다. 0xC0000005:Access violation ########################################### 위 메세지를 알아본 바, Access violation은 프로세스가 접근할 권한이 없는 메모리 영역에 접근하고자 했을 때 발생한다고 한다. 이 말은 Null Pointer 즉, 잘못된 포인터 접근이거나 메모리 침범으로 인해 발생한다는 뜻으로 해석. 디버깅 작업을 한 결과 DoModal()이 들어간 라인을

Python memory leak 발견 [내부링크]

Unet 모델을 이용하여 deep learning을 하던 중 keras 2.4.0 버전에서 memory leak를 발견. 총 3대의 PC중 2대는 rtx 20series, 1대는 rtx 30series. 원인 : 한 줄씩 디버깅 한 결과 model.predict_on_batch와 imread를 통해 불러온 메모리들이 지속적으로 쌓이는 것을 발견. 해결방안1) predict와 imread로 할당한 메모리를 해당 프로세스가 끝난 뒤 해제시키기 20210429) model.predict_on_batch함수에서 model.predict_generator함수로 변경. model.predict_generator 함수로부터 전해받은 인자를 저장시킨 후, python의 Garbage Collection(gc)를 import하여, 참조된 인자가 없는 객체에 대해서 수거를 해주는 함수인 gc.collect()를 사용한 뒤, del()함수를 통하여 predict의 결과를 저장한 객체를 지워주었다. 실행

43708dbb779046ba9f8c163a8a43c6d2 [내부링크]

43708dbb779046ba9f8c163a8a43c6d2