2025년 5월 4일 일요일

Gstreamer와 연결된 opencv 컴파일 방법

(1) gstreamer가 설치된 docker image를 다운받고 이것으로 container진입

docker pull ducksouplab/ubuntu-cuda-gstreamer:ubuntu22.04-cuda11.7.0-gstreamer1.22.0

docker run --gpus all -it ducksouplab/ubuntu-cuda-gstreamer:ubuntu22.04-cuda11.7.0-gstreamer1.22.0 /bin/bash


(2) opencv, opencv_contrib의 소스를 다운 받음

mkdir -p /opencv/src && cd /opencv/src

wget -O opencv.zip https://github.com/opencv/opencv/archive/4.7.0.zip

wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.7.0.zip

unzip opencv.zip && unzip opencv_contrib.zip


(3) build폴더 만듬

cd /opencv

rm -rf build

mkdir build && cd build


(4) PKG_CONFIG_PATH 초기화 (필수)

unset PKG_CONFIG_PATH


(5) cmake 구성

# 이대로 복사하면 실행 안됨. chatgpt에 넣고 다시 생성

# 당연히 src는 다 받아 놓은 상태여야

cmake -D CMAKE_BUILD_TYPE=Release \

  -D CMAKE_INSTALL_PREFIX=/usr/local \

  -D OPENCV_EXTRA_MODULES_PATH=../src/opencv_contrib-4.7.0/modules \

  -D WITH_GSTREAMER=ON \

  -D WITH_CUDA=ON \

  -D ENABLE_FAST_MATH=1 \

  -D CUDA_FAST_MATH=1 \

  -D WITH_CUBLAS=1 \

  -D WITH_V4L=ON \

  -D WITH_OPENGL=ON \

  -D BUILD_opencv_python3=ON \

  -D PYTHON3_EXECUTABLE=$(which python3) \

  -D PYTHON3_INCLUDE_DIR=$(python3 -c "from sysconfig import get_paths as gp; print(gp()['include'])") \

  -D PYTHON3_LIBRARY=$(python3 -c "from sysconfig import get_config_var; print(get_config_var('LIBDIR'))")/libpython3.10.so \

  -D BUILD_EXAMPLES=OFF ../src/opencv-4.7.0


(6) make 실행

make -j$(nproc)


(7) install 실행

make install

ldconfig


(8) 설치 확인 및 GStreamer 체크: gstreamer가 yes인지 체크

python3 -c "import cv2; print(cv2.__version__); print(cv2.getBuildInformation())"


(9) container를 이미지화

sudo docker ps -a

sudo docker commit 7b2450127c68 opencv-gst-cuda-v2:latest   # 여기서 만듬

sudo docker images

sudo docker run --gpus all -it opencv-gst-cuda-v2:latest /bin/bash


(10) Docker Hub 업로드

docker ps -a

sudo docker login -u 도커id  # 비번넣어야

sudo docker tag opencv-gst-cuda-v2:latest funmv/opencv-gst-cuda-v2:latest

sudo docker push funmv/opencv-gst-cuda-v2:latest



2025년 2월 13일 목요일

FSM (유한상태기계) 사용 해보기

transitions라는 pypi 라이브러리가 있어서 사용해 보았음. 계층 구조의 transition도 표현해주고 기능이 풍부함.

작성된 상태도를 그려보기 위해서는 pygraphviz설치가 필요한데, 아래 절차대로 설치한다:


windows환경에 graphviz와 pygraphviz 설치

1. 가상환경(py310)에 들어간다

2. graphviz 툴을 설치한다: https://pygraphviz.github.io/documentation/stable/install.html에 들어가서 다운 받아 설치하거나 또는 https://graphviz.org/download/#windows에가서 다운 받아 설치한다. 

설치할 때, 경로를 "사용자 모두" 또는 "현재 사용자"로 선택

3. graphviz를 설치했으면 pip install graphviz하면 설치됨

4. pygraphviz 설치를 위해서는 visual studio make 도구 설치가 필요함: https://visualstudio.microsoft.com/ko/visual-cpp-build-tools/에 들어가서 Build Tools를 다운로드 하고 설치한다. 7Gb 메모리 필요

5. 설치가 완료되면 재부팅을 한다

6. pygraphviz 설치: https://pygraphviz.github.io/documentation/stable/install.html에 설명된 명령을 참고하여, 

>> pip install --config-settings="--global-option=build_ext" --config-settings="--global-option=-IC:\Program Files\Graphviz\include" --config-settings="--global-option=-LC:\Program Files\Graphviz\lib" pygraphviz

이렇게 하여 설치를 완료 하였음



2025년 1월 7일 화요일

L2 regularization

 DNN학습할 때, 학습 샘플 수가 작을 경우가 많다. 이 때, 모델은 데이터에 과적합된다. 과적합을 피하기 위해 data augmentation이나, dropout등을 적용하면 학습 자체가 잘 되지 않는 일이 발생한다. 

이럴 때 해볼 수 있는 옵션 중에 L2 regularization이 있다. 

skorch기반으로 다변량 시계열 데이터에 대해 regression학습을 해보면 가중치의 제곱합(Weights Sum)값이 아래와 같다. 


valid_loss는 계속 줄고 있지만, 가중치합이 급격히 증가하고 있다. 즉, 모델이 과적합 되고 있다. 

이번에는 Loss항에 L2 regularization항을 포함시키고, 다시 학습을 시키면 다음과 같다.


W Sum항을 살펴보면 값이 줄고 있고, 범위 내에서 관리되고 있다. 즉, L2 Loss항과 MSE Loss항이 합쳐져서 train_loss값이 된다. 

이 때 L2 Loss의 가중치인 Ramda값의 크기를 잘 결정해 주어야 한다. 

- L2 regularization 적용 시, Weights Sum이 작아짐. 

- L2 loss의 크기가 최적화되었을 때의 train_loss나 valid_loss의 절반 이하가 되게 Weight_decay값을 선정

- 즉, L2 Loss가 원래 Loss의 감소에 영향을 주지 않을 정도로 Ramda값을 정해 준다.