2024. 12. 2. 10:15ㆍ미니 프로젝트
Deeplsd: Line segment detection and refinement with deep image gradients
1. 연구 배경
- 선 세그먼트 검출(line segment detection)은 컴퓨터 비전에서 필수적인 문제로, 이미지 처리, AR/VR, 로봇 공학, 건축 모델링 등 다양한 응용 분야에서 사용됩니다.
- 기존 선 검출 방법은 대부분 기하학적 특징이나 전통적인 알고리즘(예: 허프 변환)에 의존하여 정밀도가 떨어지거나 노이즈에 민감한 문제가 있었습니다.
2. 제안된 접근 방식
- **Deeplsd(Deep Line Segment Detection)**는 심층 학습 기반의 새로운 선 검출 및 정제 프레임워크를 제안합니다.
- 네트워크는 **딥 이미지 그라디언트(Deep Image Gradients)**를 활용하여 선 검출 과정을 보다 강건하게 만듭니다.
- 이 모델은 데이터셋에 명시적으로 제공되지 않은 경우에도 선의 기하학적 구조를 학습할 수 있습니다.
3. 주요 구성 요소
- 입력 처리: 이미지의 고차원 특징을 추출하여 선 후보를 생성합니다.
- 정제(refinement): 추출된 선 후보를 심층 특징 기반으로 정제하여 정확한 위치와 방향성을 보장합니다.
- 지도 학습(Supervised Learning): 네트워크는 선 세그먼트를 식별하는 과정을 학습하며, 고품질의 출력 결과를 생성합니다.
4. 혁신적 요소
- 기존 방법과는 달리, 이 모델은 선분의 정확한 끝점과 세그먼트의 연속성을 효과적으로 처리합니다.
- 딥러닝을 통해 기존의 알고리즘적 접근 방식에서 발생하는 한계를 극복합니다.
- 주어진 이미지의 복잡한 조명 조건과 노이즈에도 강건한 성능을 보여줍니다.
5. 결과 및 성능 평가
- 데이터셋 및 비교 실험:
- 여러 벤치마크 데이터셋에서 기존의 선 검출 알고리즘(예: LSD, EDLines 등)보다 우수한 성능을 기록했습니다.
- 특히, 정밀도(precision), 재현율(recall), F1 점수 등에서 탁월한 결과를 보였습니다.
- 응용 사례:
- 증강현실(AR) 장면에서 구조적 특징을 정확히 검출.
- 로봇의 비전 시스템에서 복잡한 환경에서의 강건한 인지 기능 제공.
6. 한계점 및 향후 연구
- 학습 데이터의 다양성과 양에 따라 모델의 성능이 좌우될 수 있습니다.
- 확장성을 고려한 경량화 모델 설계 및 실시간 성능 개선이 필요한 분야로 지적되었습니다.
7. 설치
https://github.com/cvg/DeepLSD?tab=readme-ov-file
위 깃허브를 참고해 실습해보았다.
기본 환경 자체가 python3.7, CUDA11이었기 때문에 docker 가상환경을 통해 실습하였다(nvidia/cuda:11.6.1-devel-buntu20.04 ).
git 레포지토리를 다운받기 위해서 git을 설치해준다.
apt-get update
apt-get install -y git
그 다음 중요한 python3.7버전을 다운받아준다.
apt install -y software-properties-common
add-apt-repository ppa:deadsnakes/ppa
apt update
apt install -y python3.7 python3.7-venv python3.7-dev
#버전확인
python3.7 --version
#출력예시
Python 3.7.17
레포지토리를 git해서 다운받아준다
git clone --recurse-submodules https://github.com/cvg/DeepLSD.git
cd DeepLSD
실행시키기 위해 python3.7에 맞는 버전인 pip도 설치해주었다.
apt update
apt install -y python3.7 python3.7-venv python3.7-dev curl
curl https://bootstrap.pypa.io/pip/3.7/get-pip.py -o get-pip.py
python3.7 get-pip.py
그리고 지금은 간단한 테스트만 해볼 것이기 때문에 quick install을 해주었다.
bash quickstart_install.sh
그랬더니 아래와 같은 오류가 떴다.
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
/tmp/ipykernel_14918/2487856379.py in <module>
1 import os
2 import numpy as np
----> 3 import cv2
4 import matplotlib
5 import matplotlib.pyplot as plt
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
ImportError: libGL.so.1: cannot open shared object file: No such file or directory는 OpenCV가 시스템에 필요한 **OpenGL 라이브러리(libGL)**를 찾지 못해 발생하는 오류였다. 그래서 이것도 설치해주었다.
sudo apt update
sudo apt install -y libgl1-mesa-glx
그런데 또 오류가 발생하였다. 내용은 deeplsd 모듈을 찾지 못한다는 말이었다.
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
/tmp/ipykernel_14918/2487856379.py in <module>
8 import h5py
9
---> 10 from deeplsd.utils.tensor import batch_to_device
11 from deeplsd.models.deeplsd_inference import DeepLSD
12 from deeplsd.geometry.viz_2d import plot_images, plot_lines
ModuleNotFoundError: No module named 'deeplsd'
이럴때는 환경변수 오류일 때가 많아서 다시 환경변수를 설정하고 몇 번이나 시도해보았지만 같은 결과가 나와서
그냥 가상환경을 만들어서 하기로 하였다.(확실히 웬만하면 가상환경을 만들어서 하는 것이 최고인 것 같다.)
pip install virtualenv
가상환경을 만들기 위해 virtualenv를 다운받아주고 버전 설정 후 가상환경을 생성해주었다.
그리고 활성화도 해주었다.
#가상환경 생성
virtualenv lsd --python=python3.7.17
#가상환경 활성화
source lsd/bin/activate
그리고 다시 설치해주었다.
bash quickstart_install.sh
설치가 완료되고 오류도 해결되어서 차근차근 실행시키던 중 모델이 필요한 것을 알게되었다.
mkdir weights
wget https://cvg-data.inf.ethz.ch/DeepLSD/deeplsd_md.tar -O weights/deeplsd_md.tar
wget을 사용하기 위해서 wget도 설치해주었다.
apt update
apt install -y wget
이랬더니 오류없이 예제가 실행이 되었다.
8. 코드 분석
import os
import numpy as np
import cv2
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap as lsc
import torch
import h5py
from deeplsd.utils.tensor import batch_to_device
from deeplsd.models.deeplsd_inference import DeepLSD
from deeplsd.geometry.viz_2d import plot_images, plot_lines
deeplsd에 필요한 여러 모듈들을 임포트해주는 부분이다.
1. 이미지 로드 및 전처리
img = cv2.imread('../assets/images/example.jpg')[:, :, ::-1]
gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
설명
- cv2.imread():
- OpenCV를 사용해 이미지 파일을 읽어옵니다.
- OpenCV는 기본적으로 이미지를 BGR(Blue-Green-Red) 형식으로 읽습니다.
- [:, :, ::-1]:
- BGR → RGB 변환입니다.
- OpenCV는 BGR로 이미지를 다루지만, 모델과 matplotlib 같은 라이브러리는 일반적으로 RGB 형식을 사용합니다.
- [:, :, ::-1]는 numpy 슬라이싱으로 마지막 차원(컬러 채널)을 뒤집습니다.
- cv2.cvtColor():
- 이미지를 그레이스케일로 변환합니다.
- RGB → GRAY로 변환되며, 입력은 img이고 출력은 **gray_img**입니다.
- 그레이스케일 이미지는 1채널로 라인 감지 알고리즘이 더 효율적으로 작동할 수 있습니다.
2. 모델 실행 장치 설정
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
설명
- torch.cuda.is_available():
- 시스템에 CUDA가 설치된 GPU가 있는지 확인합니다.
- True: GPU를 사용할 수 있음 → cuda.
- False: GPU가 없거나 CUDA 설정이 안됨 → cpu.
- torch.device():
- PyTorch가 모델과 텐서를 실행할 장치를 설정합니다.
- device에는 cuda 또는 cpu 값이 들어갑니다.
3. 모델 설정 (Config 설정)
conf = {
'detect_lines': True, # Whether to detect lines or only DF/AF
'line_detection_params': {
'merge': False, # Whether to merge close-by lines
'filtering': True, # Filter out lines based on DF/AF
'grad_thresh': 3,
'grad_nfa': True, # Use gradient and NFA thresholding for easy images
}
}
설명
- detect_lines:
- True: 라인을 감지합니다.
- False: 라인 대신 DF(Distance Field) 또는 AF(Angle Field)만을 출력합니다.
- line_detection_params:
라인 감지를 위한 하이퍼파라미터 설정입니다.- merge:
- True: 가까운 라인들을 병합합니다.
- False: 병합하지 않고 모든 라인을 개별적으로 유지합니다.
- filtering:
- 감지된 라인을 필터링합니다. DF/AF를 사용해 정확하지 않은 라인을 제거합니다.
- grad_thresh:
- 이미지 그라디언트의 임계값입니다.
- 이 값보다 작은 그라디언트의 라인들은 무시됩니다.
- grad_nfa:
- Gradient와 NFA(Number of False Alarms)를 사용해 라인을 더 엄격하게 필터링합니다.
- True: 깨끗한 이미지(낮, 고품질)에 사용.
- False: 도전적인 이미지(밤, 흐림)에 사용하지 않는 것을 권장.
- merge:
4. 모델 불러오기
ckpt = '../weights/deeplsd_md.tar'
ckpt = torch.load(str(ckpt), map_location='cuda')
설명
- 모델 체크포인트 파일 경로:
- '../weights/deeplsd_md.tar'는 사전 학습된 모델의 체크포인트 파일입니다.
- 이 파일은 DeepLSD가 학습된 네트워크의 **가중치(Weights)**를 저장한 파일입니다.
- torch.load():
- PyTorch의 체크포인트 파일을 불러오는 함수입니다.
- map_location='cuda'는 가중치를 GPU로 로드하도록 지시합니다.
- 만약 GPU가 없다면, device='cpu'로 로드해야 합니다.
5. DeepLSD 모델 인스턴스 생성 및 가중치 로드
net = DeepLSD(conf)
net.load_state_dict(ckpt['model'])
net = net.to(device).eval()
설명
- DeepLSD(conf):
- 설정값(conf)을 사용해 DeepLSD 모델 인스턴스를 생성합니다.
- 이 모델은 라인 감지를 위해 사전 정의된 네트워크 구조를 가지고 있습니다.
- load_state_dict():
- 사전 학습된 모델 가중치(ckpt['model'])를 모델에 불러옵니다.
- 가중치는 네트워크 아키텍처에 맞게 로드됩니다.
- net.to(device):
- 모델을 device(cuda 또는 cpu)로 이동시킵니다.
- GPU가 사용 가능하면 모델이 GPU 메모리에 로드됩니다.
- CPU에서는 CPU 메모리에 로드됩니다.
- eval():
- 모델을 추론 모드로 설정합니다.
- 드롭아웃이나 배치 정규화와 같은 학습 전용 레이어가 비활성화됩니다.
요약
- 이미지 전처리: OpenCV를 사용해 이미지를 로드하고 RGB 및 그레이스케일로 변환.
- 장치 설정: CUDA 지원 여부에 따라 모델 실행 장치를 cuda 또는 **cpu**로 설정.
- 모델 설정: 라인 감지 및 필터링을 위한 하이퍼파라미터(conf) 설정.
- 모델 불러오기: 체크포인트 파일(.tar)에서 사전 학습된 가중치를 불러오고 모델에 적용.
- 모델 준비: 모델을 GPU/CPU에 올리고 추론 모드로 전환.
이제 모델은 라인 감지 추론을 위한 준비가 완료된 상태입니다. 😊
'미니 프로젝트' 카테고리의 다른 글
파이썬으로 달력 만들기 (0) | 2022.12.06 |
---|---|
뉴스기사 3줄 요약하기 (0) | 2022.12.01 |