영상처리를 공부할 때 히스토그램·침식·SIFT를 외운 뒤 곧바로 CNN·YOLO·ViT로 넘어가면 개념이 서로 끊긴다. 그러나 모두 같은 질문을 다룬다. 픽셀에서 필요한 신호를 어떻게 뽑고, 그 신호로 무엇을 판단할 것인가? 이 흐름을 잡으면 전통 영상처리와 딥러닝 시각 모델을 서로 대체 관계가 아닌 도구 상자로 볼 수 있다.
공장 카메라에서 안전모를 찾는다고 하자. 밝기 보정과 노이즈 제거는 입력을 안정시키고, 에지와 특징점은 형태를 수치로 바꾼다. CNN은 학습 데이터에서 필요한 특징을 직접 배우고, 검출 모델은 사람과 안전모의 위치를 낸다. ViT는 이미지를 패치 묶음으로 바꿔 멀리 떨어진 영역의 관계까지 본다.

같은 카메라 장면이 전처리·특징 추출·학습 모델·업무 판단으로 바뀌는 과정
1. 픽셀과 전처리: 모델보다 입력을 먼저 본다
디지털 이미지는 좌표마다 밝기나 색상 값이 놓인 배열이다. 그레이스케일은 보통 한 채널, 컬러 이미지는 여러 채널을 가진다. 해상도를 낮추면 계산은 줄지만 작은 물체의 정보도 사라진다. 샘플링 간격이 장면의 세밀한 변화보다 거칠면 계단 모양과 무늬 왜곡인 앨리어싱이 생길 수 있다.
히스토그램은 ‘어디’가 아니라 ‘얼마나’를 본다
히스토그램은 각 밝기 값의 픽셀 수를 세므로 이미지 전체의 명암 분포를 빠르게 파악할 수 있다. 하지만 픽셀 위치 정보는 잃는다. 히스토그램 평활화는 분포를 넓혀 대비를 키울 수 있지만, 조명이 고르지 않거나 노이즈가 많은 이미지에서는 원하지 않는 부분까지 강조할 수 있다.
임계값과 Otsu는 전경·배경을 나누는 출발점이다
이진화는 픽셀 값을 기준보다 크거나 작은 두 집합으로 나눈다. Otsu 방법은 두 집단의 분산이 잘 나뉘는 임계값을 자동으로 찾는다. 배경과 전경의 밝기 분포가 뚜렷할 때 유용하지만, 그림자와 반사가 섞인 현장에서는 적응형 임계값이나 조명 보정이 더 적절할 수 있다.
| 기법 | 무엇을 바꾸나 | 잘 맞는 상황 | 대표 실수 |
|---|---|---|---|
| 평균·가우시안 필터 | 주변 픽셀을 섞어 잡음을 줄임 | 센서 노이즈, 후속 에지 검출 안정화 | 커널을 키워 경계까지 흐림 |
| 중앙값 필터 | 이웃의 중앙값으로 교체 | 소금·후추 모양의 돌발 잡음 | 모든 잡음에 최적이라고 단정 |
| 침식·팽창 | 밝은 전경 영역을 줄이거나 키움 | 작은 잡음 제거, 끊어진 영역 연결 | 전경 색과 커널 크기를 확인하지 않음 |
| 열림·닫힘 | 침식·팽창 순서를 조합 | 작은 점 제거, 작은 구멍 채우기 | 두 연산의 순서를 반대로 기억 |
열림은 침식 후 팽창으로 작은 밝은 잡음을 없애는 데 쓰고, 닫힘은 팽창 후 침식으로 전경 내부의 작은 구멍이나 끊김을 메우는 데 쓴다.
2. 지역 특징: 규칙으로 위치와 모양을 수치화한다
미분 필터는 픽셀 값이 급하게 변하는 경계를 강조한다. 에지는 물체의 윤곽 후보지만, 에지만으로 물체 종류가 결정되지는 않는다. 코너나 특징점은 여러 방향으로 밝기가 크게 바뀌어 다시 찾기 쉬운 지점이다. 서로 다른 사진에서 같은 지점을 연결하려면 검출기 → 기술자 → 매칭을 구분해야 한다.
- 검출기: 비교하기 좋은 위치를 찾는다.
- 기술자: 그 위치 주변의 모양을 벡터로 표현한다.
- 매칭: 두 이미지의 기술자 거리를 비교해 대응점을 만든다.
SIFT는 크기와 회전 변화에 강한 특징을 만들고, ORB는 이진 기술자를 사용해 비교적 빠르게 매칭한다. “SURF가 언제나 SIFT보다 빠르고 정확하다”처럼 한 줄로 외우면 위험하다. 이미지 크기, 장면 변화, 목표 장치, 라이선스, 매칭 정확도를 같은 조건에서 측정해야 한다.
import cv2
image = cv2.imread("panel.jpg", cv2.IMREAD_GRAYSCALE)
if image is None:
raise FileNotFoundError("panel.jpg")
blurred = cv2.GaussianBlur(image, (5, 5), 0)
threshold, binary = cv2.threshold(
blurred, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU
)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
cleaned = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
orb = cv2.ORB_create(nfeatures=500)
keypoints, descriptors = orb.detectAndCompute(cleaned, None)
print(f"임계값={threshold:.1f}, 특징점={len(keypoints)}")이 코드는 정답 파이프라인이 아니라 관찰 도구다. 원본·이진화·형태학 결과를 각각 저장해 어떤 단계에서 정보가 사라지는지 확인한다. 특징점 개수가 많다고 좋은 것도 아니다. 다른 시점에서도 같은 위치가 반복 검출되고 올바르게 매칭되는지가 중요하다.
3. CNN: 사람이 만든 특징 대신 필터를 학습한다
합성곱 층은 작은 커널을 이미지 전체에 공유해 적용한다. 같은 필터를 여러 위치에 쓰기 때문에 물체가 조금 이동해도 비슷한 반응을 얻는 이동 등변성을 갖는다. 풀링이나 스트라이드는 특징 맵 크기를 줄이지만 위치 정보를 일부 버린다. 따라서 “CNN은 이동에 완전히 불변”이라고 외우기보다 어떤 연산에서 위치 민감도가 줄어드는지 봐야 한다.
입력 안정화 특징점·매칭
지역 대응 CNN
특징 학습 검출·분할
위치와 영역 ViT
패치 관계

입력 표현과 출력 목표를 함께 보는 컴퓨터 비전 학습 지도
VGG는 같은 크기의 작은 합성곱을 깊게 쌓는 설계를 보여 줬고, GoogLeNet은 여러 크기의 연산을 병렬로 묶었다. ResNet은 입력을 뒤쪽 층에 더하는 잔차 연결로 매우 깊은 네트워크의 최적화를 쉽게 만들었다. 이름과 연도보다 각 구조가 어떤 병목을 줄이려 했는지 기억하는 편이 오래간다.
특징 추출부와 출력 헤드를 나눠 본다
앞쪽 합성곱 블록은 에지·질감·형태처럼 공간적인 특징 맵을 만들고, 뒤쪽 헤드는 그 특징을 실제 출력으로 바꾼다. 고전적인 분류 CNN은 특징 맵을 펼친 뒤 완전 연결층에 넣었지만, 펼치는 순간 위치 축이 사라지고 입력 크기와 매개변수 수에 민감해질 수 있다. Global Average Pooling은 채널별 공간 평균을 내어 훨씬 작은 벡터로 만들기 때문에 분류 헤드의 매개변수를 줄이는 선택지다.
| 구성 | 역할 | 장점 | 주의점 |
|---|---|---|---|
| 합성곱 특징 추출부 | 지역 패턴을 특징 맵으로 변환 | 필터 공유로 공간 구조 활용 | 다운샘플링이 작은 물체 정보를 잃을 수 있음 |
| Flatten + 완전 연결층 | 모든 위치 특징을 한 벡터로 연결해 분류 | 위치별 조합을 직접 학습 | 매개변수가 커지고 입력 크기에 묶이기 쉬움 |
| Global Average Pooling | 채널별 공간 평균으로 분류 벡터 생성 | 매개변수와 과적합 위험 감소 | 정확한 위치 정보가 중요한 출력에는 단독 사용 부적합 |
| 검출·분할 헤드 | 박스·클래스·마스크 출력 | 공간 특징을 유지해 위치를 예측 | 다중 해상도 특징과 후처리까지 함께 검증 |
과적합과 전이학습을 함께 이해한다
훈련 성능은 높지만 새 이미지 성능이 떨어지면 과적합을 의심한다. 데이터 증강, 가중치 감쇠, 드롭아웃, 조기 종료를 기계적으로 모두 넣기보다 검증 데이터가 실제 배포 환경을 대표하는지 먼저 본다. 전이학습은 큰 데이터에서 배운 가중치를 가져와 새 문제에 맞게 일부 또는 전체 층을 조정한다. 데이터가 적을수록 유용할 수 있지만 원본 도메인과 현장 이미지의 차이가 크면 별도 검증이 필요하다.
4. 분류·검출·분할: 모델보다 출력 문제를 먼저 고른다
| 문제 | 출력 | 예시 | 주요 평가 |
|---|---|---|---|
| 분류 | 이미지 전체의 클래스 | 불량품인가? | 정확도, 클래스별 정밀도·재현율 |
| 객체 검출 | 클래스와 경계 상자 | 안전모가 어디에 있는가? | IoU 기준 AP·mAP, 지연시간 |
| 의미 분할 | 픽셀마다 클래스 | 작업 가능 구역은 어디인가? | 클래스별 IoU, Dice |
| 인스턴스 분할 | 개별 객체별 마스크 | 사람마다 영역을 나눌 수 있는가? | 마스크 AP, 작은 객체 오류 |
정확도 하나만 보면 불균형 데이터에서 착시가 생긴다. 안전모 미착용이 1%뿐이라면 모두 정상이라고 답해도 99% 정확도가 나온다. 놓치면 위험한 문제는 미착용 클래스의 재현율과 오탐 사례를 함께 보고, 검출은 어떤 IoU 기준의 mAP인지 적는다.
두 단계 검출은 후보 영역을 만든 뒤 분류·박스 보정을 수행하고, 한 단계 검출은 촘촘한 위치에서 바로 예측한다. 실제 선택은 모델 이름보다 목표 하드웨어의 지연시간, 작은 객체 성능, 현장 오류 비용으로 결정한다.
5. ViT: 이미지를 패치 시퀀스로 바꿔 관계를 본다
Vision Transformer는 이미지를 일정한 크기의 패치로 나누고 각 패치를 벡터 토큰으로 바꾼다. 위치 정보를 더한 뒤 Self-Attention으로 패치 사이 관계를 계산한다. CNN이 지역 커널과 계층 구조라는 강한 가정을 활용한다면, ViT는 넓은 관계를 직접 학습할 여지가 크다.
그렇다고 ViT가 모든 CNN을 자동으로 대체하는 것은 아니다. 원 논문도 대규모 사전학습과 전이를 중요한 조건으로 다룬다. 데이터 양, 메모리, 추론 지연, 입력 해상도, 배포 장치를 확인한 뒤 CNN과 같은 평가 세트에서 비교한다.
같은 이미지 20장으로 전처리 전후를 저장하고, ORB 대응점의 오매칭을 확인한 뒤, 사전학습 CNN의 분류 오류를 모은다. 마지막에 검출 또는 분할처럼 실제로 필요한 출력으로 문제를 바꾼다. 매 단계에서 잘된 화면보다 실패 이미지를 남기면 다음 모델 선택의 근거가 된다.
6. 외운 개념을 판단으로 바꾸는 진단 문제
문제 1. 작은 흰 점 잡음만 제거하고 큰 전경 형태는 유지하려면?
열림 연산을 먼저 검토한다. 침식으로 작은 밝은 점을 없앤 뒤 팽창으로 큰 전경 크기를 복원한다. 커널이 너무 크면 필요한 작은 물체도 사라진다.
문제 2. 히스토그램만 같은 두 이미지는 같은 장면인가?
아니다. 히스토그램은 밝기별 개수를 보지만 픽셀 위치를 보존하지 않는다. 전혀 다른 배치의 이미지도 같은 히스토그램을 가질 수 있다.
문제 3. 특징점 2천 개가 5백 개보다 항상 좋은가?
아니다. 반복 검출성, 올바른 대응점 비율, 처리 시간, 최종 포즈 추정 오차가 더 중요하다.
문제 4. 분류 정확도 99%면 안전모 감지가 충분한가?
데이터 분포와 미착용 클래스 재현율을 확인하기 전에는 판단할 수 없다. 위치가 필요하면 분류가 아니라 검출 문제로 설계해야 한다.
문제 5. 패딩은 왜 사용하는가?
합성곱 뒤 특징 맵 크기를 제어하고 경계 픽셀의 정보 손실을 줄이기 위해 사용한다. 패딩 방식에 따라 경계 인공물이 생길 수 있다.
문제 6. ResNet의 핵심은 층을 무조건 늘리는 것인가?
핵심은 잔차 함수를 학습하도록 입력을 더하는 연결이다. 깊은 네트워크의 최적화를 쉽게 만드는 것이 목적이다.
문제 7. 전이학습이면 현장 데이터가 없어도 되는가?
아니다. 사전학습 가중치는 출발점을 제공할 뿐이다. 실제 조명·카메라·객체 분포를 반영한 검증 데이터가 필요하다.
문제 8. ViT는 픽셀 하나씩 Attention을 계산하는가?
대표적인 ViT는 이미지를 패치로 나누고 패치 임베딩을 토큰처럼 처리한다. 패치 크기는 정보 해상도와 계산량을 함께 바꾼다.
문제 9. 완전 연결층은 CNN의 특징 추출부인가?
보통 합성곱 블록이 공간 특징을 추출하고 완전 연결층은 펼친 특징을 최종 클래스 점수로 바꾸는 출력 헤드에 가깝다. 최근 구조는 Global Average Pooling이나 과제별 검출·분할 헤드를 사용할 수 있다.
- 전처리는 보기 좋은 이미지를 만드는 일이 아니라 필요한 신호를 안정시키는 일이다.
- 특징점은 검출·기술·매칭으로 나누고, 개수보다 반복성과 최종 오차를 본다.
- CNN은 공유 합성곱 필터를 학습하고, ResNet은 잔차 연결로 깊은 모델의 최적화를 돕는다.
- 분류·검출·분할은 출력부터 다르며 지표도 달라야 한다.
- ViT는 패치 관계를 학습하지만 데이터와 계산 조건을 확인해 CNN과 비교한다.
참고한 공식 자료와 원 논문
- OpenCV: 이미지 임계값과 Otsu 이진화
- OpenCV: 침식과 팽창
- OpenCV: SIFT 특징 소개
- Deep Residual Learning for Image Recognition
- An Image is Worth 16x16 Words
확인 기준일: 2026년 7월 28일. 원문 81·82·86·90~93의 CNN 특징 추출, 완전 연결층, 분류·검출·분할, ViT 개념과 객관식 문제를 한 학습 흐름과 9개 진단 문제로 재구성했다.
'실전 개발 노트 > 개발 가이드' 카테고리의 다른 글
| 개발자 이력서·포트폴리오 작성법: 프로젝트 경험을 증거로 바꾸는 방법 (1) | 2026.07.31 |
|---|---|
| 객체 검출 완전정리: OpenCV 에지·템플릿 매칭부터 YOLO·Faster R-CNN까지 (0) | 2026.07.30 |
| 개발팀 기술 논쟁 줄이는 법: 코드 리뷰·ADR·작은 실험으로 결정하기 (0) | 2026.07.30 |
| RNN·LSTM·GRU·Transformer 차이: 어텐션 Q·K·V까지 (0) | 2026.07.30 |
| AI 시대 개발팀 운영법: DESIGN.md·테스트·알림을 하나의 검증 흐름으로 (0) | 2026.07.29 |