이 문서는 컴퓨터비전이 사람이 설계한 feature에서 데이터로 학습한 feature로 확장되는 흐름을 정리한다. CNN은 convolution filter를 학습해 이미지의 지역 패턴을 추출하고, augmentation은 제한된 데이터에서 다양한 조건을 경험하게 해 일반화 성능을 높인다.
Object detection에서는 YOLO, anchor box, NMS, Faster R-CNN을 통해 class와 위치를 동시에 예측하는 원리를 다룬다. Semantic segmentation에서는 U-Net처럼 pixel 단위 예측을 수행하는 구조를 설명한다. ViT와 CLIP은 이미지를 patch sequence나 image-text embedding으로 확장해 foundation model 흐름과 연결된다. 로봇 관점에서는 detection과 segmentation 결과가 바로 명령이 아니라 depth, TF, MoveIt으로 이어질 perception 결과라는 점이 중요하다.
키워드: CNN, convolution layer, pooling, activation, dropout, learning rate, data augmentation, TTA, Vision Transformer, CLIP, object detection, YOLO, bounding box, confidence, anchor box, NMS, mAP, Faster R-CNN, RPN, semantic segmentation, U-Net, encoder-decoder, skip connection, mask, perception
CNN은 이미지의 공간 구조를 이용해 특징을 학습하는 대표적인 딥러닝 모델이다. 고전 영상처리에서는 사람이 edge filter나 texture filter를 설계했다면, CNN은 데이터로부터 필요한 filter를 학습한다. CV 수업에서 CNN을 배우는 이유는 이미지 분류뿐 아니라 detection, segmentation, feature extraction의 기반이 되기 때문이다.
Convolution layer는 작은 kernel을 이미지 위로 이동시키며 지역 패턴을 계산한다. 초기 layer는 edge, corner, color contrast 같은 낮은 수준의 특징을 학습하고, 깊은 layer로 갈수록 객체 부분이나 class와 관련된 추상 특징을 학습한다.
Kernel size는 한 번에 보는 지역 범위를 결정한다. 작은 kernel은 세밀한 패턴을 잡고, layer를 여러 개 쌓으면 넓은 receptive field를 얻는다. 큰 kernel은 한 번에 넓은 영역을 보지만 parameter 수와 계산량이 늘 수 있다.
Activation은 모델에 비선형성을 추가한다. ReLU 같은 activation이 없으면 여러 layer를 쌓아도 선형 변환의 조합에 가까워진다. Pooling은 feature map의 공간 크기를 줄이고, 작은 위치 변화에 대한 강인성을 높인다.
Pooling은 정보 손실도 동반한다. Classification에서는 위치 정보를 어느 정도 줄여도 되지만, segmentation처럼 픽셀 위치가 중요한 문제에서는 downsampling으로 사라지는 위치 정보를 복원하는 구조가 필요하다. 이 점이 U-Net의 skip connection과 연결된다.
Dropout은 학습 중 일부 뉴런을 무작위로 끊어 모델이 특정 feature에 과하게 의존하지 않도록 하는 regularization 기법이다. Dropout 비율이 너무 낮으면 과적합을 충분히 막지 못하고, 너무 높으면 학습 자체가 어려워질 수 있다.
Learning rate는 weight update 크기를 결정한다. 너무 크면 loss가 불안정하거나 발산할 수 있고, 너무 작으면 학습이 느리거나 수렴이 어려울 수 있다. 학습률 변경 실험은 optimization 조건이 모델 성능에 얼마나 중요한지 보여 준다.
CNN은 classification 모델에서 끝나지 않는다. YOLO, Faster R-CNN, U-Net 같은 모델도 convolution 기반 feature extractor를 사용하거나 CNN 구조에서 출발한다. 따라서 CNN을 이해하면 object detection과 semantic segmentation의 구조를 더 잘 이해할 수 있다.
CNN 실습에서는 conv 깊이, kernel size, dropout 비율, learning rate를 바꿔 보는 노트북들이 확인된다. 이 실험들의 핵심은 “CNN을 실행했다”가 아니라, 구조와 hyperparameter가 결과를 어떻게 바꾸는지 비교하는 것이다.
Conv 깊이를 늘리면 더 복잡한 특징 표현이 가능하지만 데이터가 부족하면 과적합이 생길 수 있다. Kernel size를 바꾸면 모델이 보는 지역 범위가 달라진다. Dropout은 일반화를 돕지만 과하면 성능이 떨어질 수 있다. Learning rate는 학습 안정성을 결정한다.
CV 실습 흐름은 CNN을 단순히 실행하는 것이 아니라 layer depth, kernel size, dropout, learning rate 같은 조건을 바꾸며 결과를 비교하는 방향으로 이어진다. CNN에서 convolution layer는 지역 패턴을 feature map으로 바꾸고, pooling이나 stride는 해상도와 계산량을 줄이며, fully connected 또는 classifier head는 feature를 class prediction으로 바꾼다.
Kernel size가 작으면 작은 지역 패턴을 세밀하게 보고, 여러 layer를 쌓으면 receptive field가 넓어져 더 큰 구조를 이해할 수 있다. Depth가 깊어질수록 low-level edge/texture에서 high-level object part로 feature가 추상화된다. 하지만 데이터가 충분하지 않거나 정규화가 부족하면 깊은 모델은 overfitting될 수 있다.
Dropout은 학습 중 일부 neuron을 임의로 끄면서 특정 feature 조합에 과하게 의존하는 것을 줄인다. Learning rate는 weight update 크기를 정한다. 너무 크면 loss가 불안정하게 흔들리고, 너무 작으면 학습이 느리거나 local pattern에 갇힐 수 있다. 실습에서 이 값을 바꾸는 이유는 CNN 성능이 architecture뿐 아니라 학습 조건에도 크게 의존한다는 점을 확인하기 위해서다.
CNN classifier는 image 전체가 무엇인지 분류하는 데서 시작하지만, 이후 object detection과 semantic segmentation의 backbone으로 확장된다. YOLO, Faster R-CNN, U-Net 같은 모델도 결국 convolutional feature extraction을 기반으로 객체 위치나 pixel mask를 예측한다. 그래서 CNN 실습은 단독 개념이 아니라 detection/segmentation으로 가기 위한 중간 기반이다.
CNN은 convolution filter를 학습해 이미지의 지역 패턴을 계층적으로 추출하며, classification, detection, segmentation의 기반이 되는 모델이다.
Data augmentation은 학습 데이터를 인위적으로 변형해 모델이 더 다양한 입력 조건을 경험하게 만드는 방법이다. 실제 환경에서는 조명, 각도, 거리, 배경, 위치, 크기, blur가 계속 변한다. 학습 데이터가 이런 변화를 충분히 포함하지 않으면 모델은 특정 조건에만 잘 맞고 새로운 환경에서 실패할 수 있다.
Augmentation의 목적은 단순히 데이터 수를 늘리는 것이 아니라, 모델이 입력 변화에 더 잘 일반화하도록 만드는 것이다.
이미지 augmentation에는 회전, 좌우 반전, 이동, crop, scale 변화, 밝기 변화, 색상 변화, noise 추가 등이 있다. 각 기법은 모델이 특정 변화에 둔감해지도록 돕는다.
예를 들어 좌우 반전은 객체 방향 변화에 대한 일반화를 돕고, 밝기 변화는 조명 변화에 대한 강인성을 높인다. Crop과 scale 변화는 객체가 이미지 안에서 다른 크기와 위치로 나타나는 상황을 학습하게 한다.
모델은 학습 데이터에서 본 패턴을 기준으로 판단한다. 학습 이미지가 항상 같은 조명, 같은 배경, 같은 거리에서 찍혔다면 모델은 물체 자체보다 그 촬영 조건에 과하게 맞춰질 수 있다. 이 상태에서는 실제 환경에서 조명이 바뀌거나 물체 위치가 바뀌면 성능이 떨어진다.
Augmentation은 학습 데이터에 실제 환경에서 일어날 수 있는 변화를 미리 넣어 주는 방식이다. 모델이 “이 정도 회전이나 밝기 변화가 있어도 같은 class”라는 경험을 하게 만들어, 특정 픽셀 배치보다 더 본질적인 특징을 보도록 유도한다.
Augmentation은 원래 label의 의미를 보존해야 한다. 고양이 이미지를 좌우 반전해도 고양이라는 label은 유지된다. 하지만 숫자 6을 180도 회전하면 9처럼 보일 수 있다. 의료 영상이나 방향성이 중요한 데이터에서는 단순 회전도 의미를 바꿀 수 있다.
따라서 augmentation은 무조건 많이 적용하는 것이 아니라, 문제의 의미를 유지하는 범위에서 설계해야 한다.
Augmentation 강도가 약하면 일반화 효과가 부족할 수 있다. 반대로 너무 강하면 원래 데이터 분포를 깨뜨려 학습을 방해할 수 있다. 실습에서 augmentation 유무, 기법별 비교, 강도 변경을 나누어 실험한 이유는 이 균형을 확인하기 위해서다.
TTA는 Test-Time Augmentation이다. 학습 때만 augmentation을 사용하는 것이 아니라, 추론할 때도 입력 이미지를 여러 방식으로 변형해 예측을 종합한다. 예를 들어 원본, 좌우 반전, crop 버전의 예측을 평균내면 특정 변환에 민감한 모델의 불안정성을 줄일 수 있다.
TTA는 성능을 안정화할 수 있지만 추론 시간이 늘어난다. 따라서 실시간 로봇 perception에서는 정확도와 속도 사이의 trade-off를 고려해야 한다.
Augmentation 실험에서는 단순히 accuracy가 올랐는지만 보면 부족하다. 어떤 변환이 실제 데이터의 변화와 맞았는지, 너무 강한 변환으로 class 의미가 깨지지 않았는지, train 성능과 validation 성능의 차이가 줄었는지 함께 봐야 한다. Augmentation이 과적합을 줄였다면 train accuracy는 조금 낮아져도 validation 성능이 더 안정될 수 있다.
로봇 카메라는 항상 같은 조건에서 이미지를 얻지 않는다. 물체가 멀거나 가까울 수 있고, 조명이 바뀌며, 배경이 달라지고, 로봇이나 물체가 움직이며 blur가 생긴다. Augmentation은 이런 현실 조건에 대비해 perception 모델이 더 robust해지도록 돕는다.
CV 실습 흐름에서 augmentation은 rotation, flip, crop, brightness/contrast change, noise, scale change처럼 입력 이미지를 변형해 학습 분포를 넓히는 단계다. 목적은 같은 객체가 실제 환경에서 다양한 조명, 방향, 위치, 크기로 보일 수 있다는 사실을 model이 학습하게 하는 것이다.
Classification에서는 좌우 flip이나 작은 rotation이 label을 유지하는 경우가 많다. 하지만 숫자, 방향성 표지, 비대칭 부품처럼 방향이 의미를 가지는 데이터에서는 같은 변형이 label을 깨뜨릴 수 있다. Object detection에서는 image를 crop하거나 scale할 때 bounding box 좌표도 함께 바뀌어야 한다. Segmentation에서는 mask에도 같은 geometric transform을 적용해야 한다.
Augmentation 강도가 약하면 실제 환경 변화에 대한 일반화 효과가 작다. 반대로 너무 강하면 학습 데이터가 실제 문제와 다른 분포가 되어 성능이 떨어질 수 있다. 로봇 perception에서는 조명 변화, 카메라 각도, motion blur, 가림, 배경 clutter가 실제로 자주 생기므로 augmentation을 문제 상황과 맞게 설계해야 한다.
YOLO fine-tuning에서는 augmentation이 특히 중요하다. 데이터 수가 적은 특정 작업물 detection 문제에서는 모델이 배경이나 촬영 구도에 과적합되기 쉽다. 밝기, scale, translation, mosaic 같은 augmentation은 같은 물체가 여러 조건에서 나타난 것처럼 학습시키지만, 너무 강하면 bounding box 품질이나 작은 객체 인식이 나빠질 수 있다. 따라서 augmentation은 “많이 넣기”보다 실제 배치 환경을 반영해 조절해야 한다.
Data augmentation은 입력 분포를 확장해 모델이 실제 환경 변화에 더 잘 일반화하도록 만드는 학습 전략이다.
CNN 실습에서 먼저 봐야 하는 것은 convolution layer가 이미지 전체를 한 번에 flatten하지 않고 작은 kernel을 이동시키며 local pattern을 학습한다는 점이다.
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(height, width, channels)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Flatten())
model.add(Dense(num_classes, activation='softmax'))
Conv2D는 edge, texture, part pattern 같은 지역 특징을 feature map으로 만들고, MaxPooling2D는 위치 변화에 조금 더 둔감한 표현을 만든다. Flatten 이후 Dense는 추출된 feature를 class score로 바꾼다. 이 구조를 이해해야 YOLO, Faster R-CNN, U-Net의 backbone이 왜 convolution feature extractor에서 출발하는지 설명할 수 있다.
Augmentation은 모델 구조가 아니라 dataset을 확장하는 학습 조건이다.
train_datagen = ImageDataGenerator(
rotation_range=20,
width_shift_range=0.1,
height_shift_range=0.1,
zoom_range=0.1,
horizontal_flip=True
)
이 코드는 같은 class의 이미지를 회전, 이동, 확대, 반전 조건에서 다시 보이게 한다. 목적은 단순히 데이터 수를 늘리는 것이 아니라 모델이 배경, 위치, 조명, 촬영 각도에 과적합되지 않게 하는 것이다. 다만 detection이나 segmentation에서는 image만 바꾸면 안 되고 bounding box나 mask도 같은 변환을 받아야 한다. 그래서 CNN 분류 실습의 augmentation 개념은 YOLO fine-tuning에서 annotation 품질 문제로 확장된다.
Vision Transformer는 이미지를 patch sequence로 나누고 Transformer 구조로 처리하는 모델이다. CNN은 convolution을 통해 지역 패턴을 쌓아 가지만, ViT는 이미지를 여러 patch로 잘라 token처럼 보고 self-attention으로 patch 간 관계를 학습한다.
Transformer는 원래 token sequence를 처리하는 구조다. 이미지는 그 자체로는 2D grid이기 때문에 Transformer에 넣으려면 sequence 형태로 바꿔야 한다. ViT는 이미지를 일정한 크기의 patch로 자르고, 각 patch를 펼쳐 embedding vector로 만든다. 이렇게 하면 이미지가 문장의 token처럼 처리될 수 있다.
Patch 크기는 정보 표현 방식에 영향을 준다. Patch가 크면 sequence 길이는 짧아져 계산량은 줄지만 세밀한 지역 정보가 줄어든다. Patch가 작으면 더 세밀한 정보를 담을 수 있지만 token 수가 늘어나 attention 계산량이 커진다.
ViT의 핵심 아이디어는 이미지도 문장처럼 sequence로 볼 수 있다는 것이다. 각 patch를 embedding으로 바꾸고, positional embedding을 더해 patch의 위치 정보를 제공한다. 이후 Transformer encoder가 patch들 사이의 관계를 attention으로 계산한다.
Positional embedding이 필요한 이유는 Transformer 자체가 입력 token의 순서를 직접 알지 못하기 때문이다. 이미지에서는 patch가 어디에 있었는지가 의미에 큰 영향을 준다. 같은 patch 내용이라도 왼쪽 위에 있는지, 중앙에 있는지에 따라 전체 장면 해석이 달라질 수 있다.
CNN은 지역적 inductive bias가 강하다. 가까운 픽셀 사이의 관계를 convolution으로 자연스럽게 학습한다. ViT는 attention을 통해 patch 간 관계를 직접 학습하지만, CNN보다 데이터와 pretraining 조건에 더 민감할 수 있다.
Self-attention은 각 patch가 다른 patch들과 어떤 관계를 가지는지 계산한다. CNN이 가까운 이웃 픽셀부터 차례로 정보를 넓혀 간다면, ViT는 attention을 통해 멀리 떨어진 patch 사이의 관계도 직접 볼 수 있다. 이 때문에 이미지 전체의 문맥을 보는 데 장점이 있다.
하지만 이미지에는 지역 구조가 강하게 존재한다. CNN은 이 구조를 convolution으로 자연스럽게 반영하지만, ViT는 patch embedding과 positional embedding, 충분한 학습 데이터를 통해 이를 배워야 한다. 그래서 ViT는 보통 대규모 pretraining과 함께 이해하는 것이 좋다.
ViT는 고전 영상처리와 CNN 이후의 최신 CV 흐름을 보여 준다. 이미지가 단순 pixel grid가 아니라 patch sequence로 표현될 수 있고, NLP에서 쓰이던 Transformer 구조가 vision에도 적용될 수 있다는 점을 이해하게 한다.
수업 흐름에서 ViT는 CNN 이후 “이미지를 보는 방식이 어떻게 확장되는가”를 보여 준다. CNN은 local convolution을 쌓아 전체 정보를 모으지만, ViT는 patch 사이의 관계를 attention으로 계산한다. 이 차이는 CLIP 같은 멀티모달 모델로 이어진다.
로봇 perception 관점에서 ViT는 장면 전체의 관계를 이해하는 데 유용할 수 있다. 물체 하나만 보는 것이 아니라 물체들 사이의 관계, 배경, context를 함께 고려하는 방향으로 확장될 수 있다.
ViT는 이미지를 patch들의 sequence로 바꾸고 attention으로 관계를 학습하는 Transformer 기반 CV 모델이다.
CLIP
CLIP은 이미지와 텍스트를 같은 임베딩 공간에 정렬하는 멀티모달 모델이다. Image encoder와 text encoder를 함께 학습해, 관련 있는 이미지와 텍스트가 가까운 벡터가 되도록 만든다.
이 구조 덕분에 CLIP은 별도의 classifier를 학습하지 않아도 텍스트 prompt를 이용한 zero-shot classification을 수행할 수 있다.
일반적인 이미지 분류 모델은 정해진 class label 안에서만 예측한다. 학습 때 cat, dog, car만 배웠다면 새로운 class를 텍스트로 지정해 바로 찾기 어렵다. CLIP은 이미지와 자연어 설명을 같은 공간에 놓기 때문에, class 이름이나 설명문을 prompt로 만들어 이미지와 비교할 수 있다.
이 구조는 인식 문제를 고정된 label classifier에서 이미지-텍스트 유사도 문제로 바꾼다. 그래서 학습하지 않은 class라도 텍스트로 의미를 설명할 수 있으면 zero-shot 방식으로 후보를 비교할 수 있다.
CLIP의 핵심은 이미지 인식이 고정된 클래스 목록에 갇히지 않는다는 점이다. 기존 classifier는 학습된 클래스 안에서만 예측할 수 있다. CLIP은 텍스트 prompt와 이미지의 유사도를 비교해 분류할 수 있다.
CLIP은 image encoder와 text encoder를 따로 두고, 이미지와 그에 대응되는 텍스트 설명이 같은 임베딩 공간에서 가까워지도록 학습한다. 이 구조 덕분에 “이 이미지는 어떤 class인가?”라는 문제를 “이 이미지 임베딩은 어떤 텍스트 임베딩과 가장 가까운가?”라는 문제로 바꿀 수 있다.
이 방식은 기존 classification과 다르다. 기존 모델은 마지막 layer가 정해진 class 개수에 맞춰져 있지만, CLIP은 텍스트 prompt를 바꾸면 새로운 class 후보를 만들 수 있다. 그래서 zero-shot 분류가 가능하다.
CLIP도 완전한 해결책은 아니다. Zero-shot 성능은 prompt 설계, 이미지 품질, 도메인 차이에 영향을 받는다. 실제 로봇 환경에서는 조명, occlusion, 카메라 각도, 물체 크기 변화가 크기 때문에 추가적인 fine-tuning이나 다른 perception 기법과 결합이 필요할 수 있다.
CLIP을 로봇과 연결하면 의미 기반 perception으로 확장된다. 사용자가 “빨간 컵을 찾아줘”라고 말했을 때, 로봇은 단순히 사전에 학습한 class id만 보는 것이 아니라 언어 의미와 이미지 특징을 연결해야 한다. CLIP은 이런 방향의 기초가 된다.
YOLO는 bounding box와 class를 빠르게 예측하는 detection 모델이다. CLIP은 이미지와 텍스트의 의미적 유사도를 비교하는 모델이다. 따라서 둘의 역할은 다르다. 로봇 시스템에서는 YOLO가 물체 후보 위치를 찾고, CLIP이 텍스트 지시와 후보 이미지의 의미적 관련성을 판단하는 식으로 결합될 수 있다.
이런 연결은 수업에서 다룬 YOLO/foundation model 비교 흐름과도 맞닿아 있다. 전통적인 supervised detector와 foundation model 기반 인식은 서로 다른 장단점을 가지며, 실제 perception 시스템에서는 문제에 따라 조합될 수 있다.
CLIP은 zero-shot이 가능하지만, 항상 로봇 작업에 바로 충분한 것은 아니다. Prompt 문장에 따라 결과가 달라질 수 있고, 카메라 각도나 조명, 도메인 차이에 영향을 받을 수 있다. 또한 CLIP은 기본적으로 위치를 직접 출력하는 detector가 아니므로, 로봇이 물체를 잡으려면 detection이나 segmentation, depth estimation과 결합해야 한다.
CLIP은 이미지와 텍스트를 같은 의미 공간에 정렬해 zero-shot 인식을 가능하게 하는 멀티모달 모델이다.
Object detection은 이미지 안에 어떤 객체가 있는지와 그 객체가 어디에 있는지를 동시에 예측하는 문제다. Classification은 이미지 전체의 class를 맞히지만, detection은 객체별 class와 위치를 함께 예측한다.
로봇 perception에서는 detection이 특히 중요하다. 로봇이 물체를 집거나 피하거나 접근하려면 물체가 무엇이고 이미지 안 어디에 있는지 알아야 한다.
Detection 결과는 보통 class label, confidence score, bounding box로 표현된다. Class label은 객체 종류, confidence score는 예측 확신도, bounding box는 객체 위치를 나타낸다.
Detection 평가에서는 IoU가 중요하다. IoU는 예측 box와 정답 box가 얼마나 겹치는지 나타낸다. Box가 객체를 정확히 감싸지 못하면 class가 맞아도 좋은 detection이라고 보기 어렵다.
Detection 모델은 크게 one-stage detector와 two-stage detector로 나눌 수 있다. YOLO 같은 one-stage detector는 후보 생성과 분류를 한 번에 처리해 빠르다. Faster R-CNN 같은 two-stage detector는 먼저 region proposal을 만들고, 그 후보를 분류/보정해 더 정밀한 결과를 얻는다.
로봇에서는 실시간성이 중요할 때 one-stage detector가 유리할 수 있다. 반면 정밀 검출이 더 중요하고 속도 여유가 있으면 two-stage detector도 고려할 수 있다.
객체는 다양한 크기와 비율로 나타난다. 서로 겹치거나 일부가 가려질 수 있고, 배경과 색이 비슷할 수도 있다. 작은 객체는 feature map에서 정보가 사라지기 쉽고, 비슷한 클래스는 구분하기 어렵다.
따라서 detection은 모델 구조뿐 아니라 데이터셋 구성, annotation 품질, augmentation, threshold, NMS 설정까지 함께 봐야 한다.
YOLO 기반 서랍 detection 프로젝트는 object detection의 실제 적용 흐름을 보여 준다. 특정 물체를 검출하기 위해 데이터셋을 구축하고, bounding box annotation을 준비하고, fine-tuning을 수행하고, 결과를 비교한다.
이 과정에서 detection은 단순히 모델을 불러오는 일이 아니라, 문제 정의와 데이터 품질, 평가 기준이 함께 작동하는 pipeline이라는 점을 이해하게 된다.
Detection 결과는 로봇이 행동할 대상 후보가 된다. 그러나 bounding box는 2D 이미지 좌표계 정보이므로, 실제 로봇 행동에는 depth와 TF 변환이 필요하다. Detection은 perception의 시작점이고, pose estimation과 motion planning으로 이어져야 한다.
Object detection은 이미지 안에 무엇이 있는지만 말하지 않고, 어디에 있는지도 함께 예측한다. 따라서 출력은 class label 하나가 아니라 bounding box, class score, confidence, 중복 후보 제거 결과로 구성된다. YOLO 실습 결과를 볼 때는 box가 물체를 얼마나 정확히 감싸는지, 작은 물체를 놓쳤는지, 배경을 물체로 잘못 봤는지, 중복 box가 남았는지를 함께 확인해야 한다.
Detection dataset에서는 annotation 품질이 모델 성능을 직접 좌우한다. Bounding box가 실제 물체보다 크게 그려지면 모델은 배경까지 객체의 일부로 학습하고, 너무 작게 그려지면 물체 일부만 보고 학습한다. 같은 객체 class 이름이 흔들리면 class probability가 불안정해진다. 그래서 fine-tuning 과제에서는 모델 구조보다 dataset 구축과 label 검토가 먼저다.
로봇이 물체를 집으려면 detection box 중심만으로는 부족하다. Box center pixel에 depth를 결합해 camera 좌표계의 3D point를 만들고, hand-eye calibration과 TF를 통해 robot base frame으로 바꿔야 한다. 이후 MoveIt이 접근 pose와 grasp pose를 계획한다. Detection은 작업 대상 후보를 찾는 단계이고, 실제 motion은 depth, calibration, planning과 연결되어야 한다.
Detection 실습 정리는 mAP나 성공 이미지 몇 장만으로 끝나면 부족하다. False positive, false negative, 중복 box, 가림, 조명 변화, 작은 객체, 비슷한 배경 texture에서 실패한 사례를 기록해야 한다. 로봇 시스템에서는 한 번의 오검출이 잘못된 pick target이나 충돌 위험으로 이어질 수 있기 때문이다.
Object detection은 객체의 class와 위치를 동시에 예측해 로봇이 주변 물체를 행동 대상으로 인식하게 하는 핵심 CV 기술이다.
YOLO는 실시간 object detection을 위해 널리 쓰이는 one-stage detector다. 로봇이 카메라로 주변 환경을 보고 물체를 찾으려면, 이미지 안에 무엇이 있고 어디에 있는지 빠르게 알아야 한다. YOLO는 class prediction과 bounding box regression을 한 번의 forward pass에서 함께 수행하기 때문에 실시간 perception과 잘 맞는다.
수업과 과제에서는 YOLO11 기반 서랍 detection, fine-tuning, foundation model 비교 흐름이 확인된다. 이 흐름은 YOLO를 단순 실행하는 것이 아니라, 데이터셋 구축, 학습, 평가, 결과 해석까지 detection pipeline 전체를 이해하는 방향이다.
Object detection은 classification과 localization이 결합된 문제다. Classification은 이미지나 객체가 어떤 class인지 맞히는 것이고, localization은 객체가 이미지 안의 어디에 있는지 bounding box로 표현하는 것이다. YOLO는 이 두 문제를 동시에 처리한다.
Detection 결과는 보통 class label, confidence score, bounding box로 표현된다. Confidence가 높다고 항상 좋은 detection은 아니다. Box 위치가 부정확하면 IoU가 낮을 수 있고, threshold 설정에 따라 false positive나 false negative가 달라진다.
YOLO는 이미지를 feature map 단위로 처리하고, 각 위치에서 객체 후보를 예측한다. 모델은 bounding box 좌표, objectness score, class probability를 출력한다. 이후 confidence threshold와 NMS를 통해 최종 detection 결과를 정리한다.
이 구조는 빠르다는 장점이 있지만, 작은 객체나 겹친 객체, 학습 데이터에 부족한 환경에서는 오류가 생길 수 있다. 그래서 데이터셋 품질과 annotation 품질이 매우 중요하다.
YOLO fine-tuning은 기존 pretrained model을 특정 detection task에 맞게 다시 학습시키는 과정이다. 서랍 detection처럼 특정 물체를 찾는 문제에서는 일반 객체 데이터만으로는 충분하지 않을 수 있다. 다양한 각도, 거리, 조명, 배경에서 서랍 이미지가 필요하고, bounding box annotation이 정확해야 한다.
Fine-tuning에서 중요한 것은 단순히 학습을 돌리는 것이 아니라 데이터 분포를 이해하는 것이다. 특정 각도나 배경에 치우친 데이터로 학습하면 모델은 그 조건에서는 잘 맞지만 새로운 환경에서는 실패할 수 있다.
YOLO 결과를 볼 때는 detection box가 정확히 객체를 감싸는지, confidence가 적절한지, 누락된 객체가 있는지, 중복 box가 많은지 확인해야 한다. 또한 NMS threshold와 confidence threshold가 결과에 미치는 영향도 봐야 한다.
서랍 detection 과제의 의미는 모델을 사용했다는 데 있지 않고, 특정 물체 인식 문제에서 데이터셋 구축과 fine-tuning, foundation model 비교를 통해 detection 성능을 해석했다는 데 있다.
YOLO 핵심 코드 인용
YOLO fine-tuning 실습은 pretrained detector를 불러오고, dataset yaml과 threshold를 명시한 뒤, 결과를 비교하는 흐름으로 읽어야 한다.
from ultralytics import YOLO
PUBLIC_WEIGHT = "yolo11n.pt"
MY_WEIGHT = "./checkpoint/yolo_v11/Dice/20260522/yolo11n_dr_di_v4.pt"
CONF_THR = 0.25
IOU_THR = 0.5
FOUNDATION_CONF_THR = 0.10
PUBLIC_WEIGHT는 일반 pretrained model이고, MY_WEIGHT는 과제 dataset에 맞게 fine-tuning한 weight다. 둘을 비교해야 “모델이 좋아졌다”가 아니라 “서랍 detection이라는 특정 문제에 맞게 무엇이 개선되었는지”를 볼 수 있다. CONF_THR는 낮은 confidence 후보를 버리는 기준이고, IOU_THR는 NMS에서 겹치는 box를 얼마나 강하게 제거할지 정한다.
Dataset 준비 코드에서는 image만이 아니라 data.yaml이 중요하다.
with zipfile.ZipFile(DATA_ZIP, "r") as zip_ref:
zip_ref.extractall(EXTRACT_DIR)
yaml_candidates = glob.glob(
os.path.join(EXTRACT_DIR, "**", "data.yaml"),
recursive=True
)
Detection dataset은 image folder만 있으면 충분하지 않다. data.yaml은 train/validation 경로와 class 이름을 연결하고, 각 image에는 bounding box annotation이 대응되어야 한다. Box가 물체보다 크거나 작으면 localization 기준이 흔들리고, class label이 틀리면 confidence와 confusion이 나빠진다.
YOLO 결과를 로봇에 연결할 때는 box가 끝이 아니라 시작이다.
results = model(image, conf=CONF_THR, iou=IOU_THR)
boxes = results[0].boxes
center_u = int((x1 + x2) / 2)
center_v = int((y1 + y2) / 2)
center_u, center_v는 image coordinate다. 로봇이 잡을 위치가 되려면 depth lookup으로 Z를 얻고, camera intrinsic으로 3D point를 만들고, TF로 robot base frame으로 변환해야 한다. 따라서 object detection은 perception pipeline의 출발점이지 pick pose 자체가 아니다.
Anchor Box와 NMS
Anchor box는 다양한 크기와 비율의 객체 후보를 표현하기 위한 사전 박스 구조다. NMS는 하나의 객체에 대해 여러 box가 예측되었을 때 중복 box를 제거해 최종 결과를 정리한다.
NMS threshold가 낮으면 겹치는 box가 많이 제거되어 중복은 줄지만 가까운 객체가 함께 사라질 수 있다. Threshold가 높으면 중복 box가 남을 수 있다. 따라서 YOLO 결과 해석에는 모델 출력뿐 아니라 후처리 기준도 포함된다.
YOLO는 로봇 perception에서 물체 후보를 찾는 출발점이 될 수 있다. 하지만 bounding box는 이미지 좌표계의 정보다. 로봇이 실제로 물체를 집으려면 bounding box 중심을 3D 위치로 바꾸고, camera frame에서 robot base frame으로 변환해야 한다. 이때 depth 정보, camera calibration, TF가 필요하다.
따라서 YOLO는 로봇 행동의 끝이 아니라 perception pipeline의 시작이다. YOLO가 “무엇이 어디쯤 보인다”를 알려 주면, 이후 pose estimation과 MoveIt planning을 통해 로봇이 실제 행동으로 옮길 수 있다.
YOLO와 Detection 실습 정리
YOLO 계열 실습은 모델이 이미지를 보고 class label만 맞히는 문제가 아니라 bounding box, confidence score, class probability를 함께 출력하는 문제다. 하나의 물체에 여러 후보 box가 생길 수 있고, 후처리 단계에서 confidence threshold와 NMS를 적용해 최종 detection을 만든다. 따라서 결과 이미지를 볼 때는 “맞았다/틀렸다”보다 box 위치, box 크기, 중복 box, 놓친 객체, 잘못된 class를 함께 봐야 한다.
YOLO fine-tuning 과제 흐름에서는 dataset이 핵심이다. Detection dataset은 image만 모으면 끝이 아니라 각 객체의 bounding box와 class label이 정확해야 한다. Box가 물체보다 지나치게 크거나 작으면 모델은 잘못된 위치 기준을 학습한다. Class label이 흔들리면 같은 시각 패턴을 다른 class로 학습해 confidence가 낮아진다.
YOLO는 grid 또는 feature map 위치마다 여러 candidate box를 예측하고, 후처리에서 NMS가 겹치는 box를 정리한다. NMS threshold가 낮으면 가까운 객체 중 하나가 사라질 수 있고, threshold가 높으면 중복 box가 남을 수 있다. Confidence threshold가 높으면 오검출은 줄지만 작은 객체나 흐린 객체를 놓칠 수 있다. 그래서 detection 결과 해석에는 모델 구조뿐 아니라 후처리 조건이 함께 들어가야 한다.
YOLO가 반환한 bounding box는 로봇에게 바로 pick pose가 되지 않는다. Box center pixel을 depth camera로 3D point로 바꾸고, camera calibration과 TF를 거쳐 robot base frame으로 변환해야 한다. 그 다음 MoveIt이 접근 pose와 grasp pose를 계획한다. 즉 YOLO는 “어디에 물체가 보이는가”를 알려 주고, depth/TF/MoveIt이 “로봇이 어디로 어떻게 움직일 것인가”를 완성한다.
YOLO 실습을 정리할 때는 model name이나 실행 명령만 적으면 부족하다. Dataset 구성, annotation 품질, train/validation 분리, augmentation, confidence threshold, NMS threshold, false positive/false negative 사례, 작은 객체 성능, 가림과 조명 변화에 대한 실패 사례까지 함께 적어야 한다. 그래야 detection이 단순 모델 호출이 아니라 perception pipeline이라는 점이 드러난다.
YOLO는 이미지에서 객체의 class와 bounding box를 빠르게 예측하는 one-stage detector이며, 로봇 perception에서 작업 대상 후보를 찾는 핵심 도구가 될 수 있다.
Object detection 모델의 결과는 단순히 “box 하나”가 아니다. 모델은 이미지의 여러 위치에서 여러 크기와 비율의 box 후보를 만들고, 각 후보에 대해 객체 여부와 class를 예측한다. 이 과정에서 후보를 어떻게 만들지와 중복 후보를 어떻게 정리할지가 detection 성능을 크게 바꾼다.
Anchor box는 후보를 만드는 방식이고, NMS는 후보를 정리하는 방식이다. YOLO 결과를 해석하려면 모델 구조뿐 아니라 이 두 후처리/후보 개념을 함께 이해해야 한다.
Anchor box는 object detection에서 다양한 크기와 비율의 객체를 예측하기 위한 사전 박스 구조다. 이미지 안의 객체는 작을 수도 크고, 가로로 길 수도 세로로 길 수도 있다. Anchor box는 이런 다양한 형태를 미리 가정한 후보 박스를 제공한다.
Anchor 기반 detector는 각 위치에서 여러 anchor box를 기준으로 실제 객체와의 차이를 예측한다. 모델은 박스를 처음부터 완전히 새로 만드는 것이 아니라, anchor box를 얼마나 이동하고 크기를 바꿀지 regression한다.
Anchor box를 이해하면 detection이 단순히 “객체 중심점 하나를 찍는 문제”가 아니라는 점이 보인다. 모델은 여러 위치와 여러 비율의 후보를 동시에 고려하고, 그중 실제 객체와 잘 맞는 후보를 조정한다. 작은 물체, 길쭉한 물체, 정사각형에 가까운 물체가 모두 같은 이미지 안에 있을 수 있기 때문에 anchor의 크기와 비율은 detection 성능에 영향을 준다.
YOLO 계열 모델을 해석할 때 anchor나 anchor-free 구조의 차이를 모두 깊게 구현할 필요는 없더라도, detection 모델이 다양한 객체 크기를 어떻게 다루는지 이해하는 것이 중요하다. 특히 서랍 detection처럼 특정 물체를 찾는 경우, 데이터셋 안 객체 크기와 비율이 학습 결과에 영향을 줄 수 있다.
NMS는 Non-Maximum Suppression의 약자로, 중복 detection 결과를 제거하는 후처리 과정이다. Detection 모델은 하나의 객체에 대해 여러 bounding box를 예측할 수 있다.
NMS는 confidence가 높은 박스를 먼저 선택하고, 그 박스와 IoU가 높은 다른 박스를 제거한다. 이 과정을 반복해 최종 박스 집합을 만든다.
NMS를 적용하지 않으면 하나의 객체 주변에 여러 개의 box가 남을 수 있다. 반대로 NMS가 너무 강하면 실제로는 가까이 붙어 있는 서로 다른 객체 중 하나가 지워질 수 있다. 그래서 NMS는 단순 정리 과정이 아니라 detection 결과 품질을 결정하는 중요한 후처리다.
NMS threshold는 결과에 큰 영향을 준다. Threshold가 낮으면 조금만 겹쳐도 박스가 제거되므로 중복은 줄지만 가까운 객체가 함께 사라질 수 있다. Threshold가 높으면 중복 박스가 많이 남을 수 있다.
Anchor와 NMS 실습 정리
Anchor box와 NMS를 이해하면 YOLO 결과에서 왜 박스가 여러 개 나오거나, 왜 어떤 객체가 사라지는지 설명할 수 있다. Detection은 모델 출력만으로 끝나지 않고 후보 생성과 후처리까지 포함하는 pipeline이다.
YOLO 결과를 볼 때 confidence가 높은 box만 확인하면 부족하다. 같은 객체에 여러 box가 겹쳐 있는지, 가까운 객체가 NMS 때문에 하나로 합쳐졌는지, 작은 객체의 box가 안정적으로 남는지 함께 봐야 한다. 이 해석 능력이 있어야 detection 결과를 로봇 perception에 사용할 수 있다.
로봇에서 NMS 결과는 실제 행동 대상 선택으로 이어질 수 있다. 잘못된 중복 제거로 목표 물체가 사라지면 로봇은 잡아야 할 물체를 놓칠 수 있고, 중복 box가 남으면 같은 물체를 여러 대상으로 착각할 수 있다.
Anchor box는 후보 박스를 만들고, NMS는 중복 박스를 제거해 detection 결과를 정리한다.
Faster R-CNN은 two-stage object detector다. 첫 번째 단계에서는 Region Proposal Network가 객체가 있을 만한 후보 영역을 만든다. 두 번째 단계에서는 각 후보 영역을 분류하고 bounding box를 보정한다.
이 구조는 YOLO 같은 one-stage detector보다 느릴 수 있지만, 후보 영역을 정교하게 다루기 때문에 높은 정확도를 기대할 수 있다.
Object detection은 “어디에 객체가 있을 가능성이 있는가”와 “그 객체가 무엇인가”라는 두 질문을 동시에 풀어야 한다. Faster R-CNN은 이 두 질문을 명시적으로 나눈다. RPN은 이미지 전체에서 객체 후보 영역을 찾고, detection head는 그 후보를 class로 분류하고 box를 보정한다.
이렇게 나누면 모델은 모든 위치와 모든 class를 한 번에 직접 맞히기보다, 먼저 objectness가 높은 영역에 집중할 수 있다. 후보 영역을 바탕으로 더 세밀한 feature를 뽑아 분류하므로 정밀한 detection에 유리하다.
Faster R-CNN의 핵심은 region proposal을 모델 안으로 통합했다는 점이다. 이전의 R-CNN 계열은 외부 알고리즘으로 후보 영역을 만들었지만, Faster R-CNN은 RPN을 통해 후보 생성도 학습 가능한 구조로 만들었다.
RPN은 feature map 위에서 anchor를 기준으로 objectness와 box regression을 예측한다.
RPN의 objectness는 “이 anchor 주변에 객체가 있을 가능성이 있는가”를 의미한다. Box regression은 anchor를 실제 객체 위치에 더 맞게 이동하고 크기를 조정하는 과정이다. 이렇게 만들어진 proposal은 다음 단계에서 RoI 단위 feature로 변환되어 class prediction과 box refinement에 사용된다.
YOLO는 빠른 실시간 detection에 강하고, Faster R-CNN은 후보 영역을 더 정밀하게 다루는 방향에 가깝다. 로봇 시스템에서는 실시간성이 중요하면 YOLO 계열이 유리할 수 있고, 정밀 검출이 더 중요하면 two-stage detector를 고려할 수 있다.
Faster R-CNN은 object detection을 두 단계로 나누어 생각하게 해 준다. 첫 단계는 “어디에 객체가 있을 가능성이 높은가”를 찾는 것이고, 두 번째 단계는 “그 후보가 어떤 객체이며 box를 어떻게 보정해야 하는가”를 판단하는 것이다. 이 구조를 이해하면 detection이 단순 classification이 아니라 위치 후보 생성과 class 예측, box regression이 결합된 문제라는 점이 분명해진다.
YOLO를 주로 실습했더라도 Faster R-CNN을 함께 정리하는 이유는 detection 모델의 설계 철학을 비교하기 위해서다. YOLO는 속도를 위해 한 번에 예측하고, Faster R-CNN은 후보를 먼저 만들고 정밀하게 다듬는다. 이 차이는 실제 프로젝트에서 모델 선택 기준이 된다.
Faster R-CNN을 직접 구현하지 않았더라도, YOLO 실험 결과를 해석할 때 two-stage detector와 비교하면 모델 선택 기준이 분명해진다. 서랍 detection처럼 특정 물체를 빠르게 찾아야 하는 문제에서는 YOLO의 속도가 장점이 된다. 반면 작은 객체나 겹친 객체를 더 정밀하게 찾는 문제가 중심이라면 후보 영역 기반 접근이 왜 등장했는지 이해할 수 있다.
Faster R-CNN은 후보 영역 생성과 분류/보정을 나누어 정밀한 객체 검출을 수행하는 two-stage detector다.
Semantic segmentation은 이미지의 각 픽셀에 클래스 라벨을 부여하는 문제다. Object detection이 객체를 bounding box로 감싸는 것이라면, semantic segmentation은 객체의 영역을 픽셀 단위로 분리한다.
예를 들어 이미지의 각 픽셀이 사람, 도로, 벽, 물체, 배경 중 무엇인지 예측한다.
Bounding box는 객체가 있는 대략적인 위치를 알려 주지만, 객체의 실제 모양을 알려 주지는 않는다. Box 안에는 배경 픽셀도 포함될 수 있고, 객체가 비정형 모양이면 box 표현은 더 거칠어진다. Semantic segmentation은 각 픽셀의 class를 예측하므로 물체의 윤곽과 영역을 더 정확하게 표현할 수 있다.
로봇이 물체를 잡거나 장애물을 피할 때는 대략적인 사각형보다 실제 점유 영역이 더 유용한 경우가 많다. 특히 테이블 위 여러 물체가 붙어 있거나, 얇고 긴 물체처럼 box가 많은 배경을 포함하는 경우 segmentation mask가 더 직접적인 정보를 준다.
Semantic segmentation은 위치 정보가 매우 중요하다. Classification에서는 이미지 전체가 어떤 클래스인지 맞히면 되지만, segmentation에서는 각 픽셀의 클래스가 맞아야 한다.
따라서 downsampling으로 얻은 추상적 의미 정보와 원래 이미지의 세밀한 위치 정보를 함께 보존해야 한다.
Segmentation 모델은 문맥과 위치를 동시에 다뤄야 한다. 큰 문맥을 보려면 receptive field가 넓어져야 하고, 그러려면 downsampling이 필요하다. 하지만 downsampling은 경계와 작은 객체 정보를 흐리게 만든다. 그래서 segmentation 모델은 의미 정보를 얻는 encoder와 해상도를 복원하는 decoder, 또는 skip connection 같은 구조를 사용한다.
Segmentation 결과는 로봇 perception에서 유용하다. Bounding box는 객체의 대략적인 위치를 알려 주지만, segmentation mask는 객체의 실제 영역과 모양을 더 잘 나타낸다.
Grasping, obstacle avoidance, scene understanding에서는 픽셀 단위 영역 정보가 중요할 수 있다.
Object detection은 객체를 사각형 box로 표현한다. 이 방식은 빠르고 간단하지만, 객체의 정확한 윤곽을 알 수 없다. 반면 semantic segmentation은 각 픽셀의 class를 예측하므로 객체의 실제 영역을 더 세밀하게 표현한다.
예를 들어 로봇이 물체를 잡아야 하는 상황에서 bounding box만 있으면 box 안의 배경도 함께 포함될 수 있다. Segmentation mask가 있으면 실제 물체 영역을 더 정확히 알 수 있어 grasp point 추정이나 장애물 영역 계산에 유리하다.
Semantic segmentation에서는 해상도 복원이 중요하다. CNN처럼 downsampling을 반복하면 의미 정보는 풍부해지지만 위치 정보가 줄어든다. U-Net은 encoder-decoder 구조와 skip connection을 통해 이 문제를 해결하려고 한다. 따라서 semantic segmentation을 이해하면 U-Net 구조가 왜 필요한지도 자연스럽게 이해할 수 있다.
Segmentation 결과는 accuracy 하나로만 판단하기 어렵다. 객체 경계가 얼마나 잘 맞는지, 작은 객체가 사라지지 않았는지, 배경과 전경이 섞이지 않았는지, mask에 구멍이나 잡음이 남아 있는지 봐야 한다. 고전 segmentation 실습에서 thresholding, hole filling, morphology를 함께 다룬 이유도 이런 후처리 문제가 픽셀 단위 예측에서 계속 등장하기 때문이다.
Semantic segmentation은 이미지의 각 픽셀을 의미 있는 클래스로 분류해 객체의 실제 영역을 파악하는 기술이다.
U-Net은 semantic segmentation에서 널리 사용되는 encoder-decoder 구조의 네트워크다. Encoder는 이미지를 점점 작게 만들며 추상적인 feature를 추출하고, decoder는 feature를 다시 원래 해상도에 가깝게 복원해 픽셀 단위 예측을 만든다.
U-Net이라는 이름은 encoder가 해상도를 줄이며 내려가고, decoder가 해상도를 다시 올리며 올라가는 구조가 U자 형태를 가지기 때문에 붙었다. 왼쪽 경로는 feature를 압축하고 의미 정보를 얻는 역할을 하고, 오른쪽 경로는 압축된 정보를 다시 픽셀 위치에 맞게 복원하는 역할을 한다.
Segmentation은 classification과 달리 최종적으로 원본 이미지와 같은 공간 해상도의 mask를 만들어야 한다. 그래서 단순히 feature를 압축해 class 하나를 예측하는 구조로는 부족하고, 압축된 정보를 다시 이미지 공간으로 펼치는 decoder가 필요하다.
Encoder는 pooling이나 stride convolution을 통해 공간 해상도를 줄이고 더 추상적인 feature를 얻는다. Decoder는 upsampling을 통해 해상도를 복원한다. 이 구조는 의미 정보와 위치 정보를 함께 다루기 위한 기본 틀이다.
Encoder가 깊어질수록 모델은 더 넓은 문맥을 본다. 예를 들어 특정 픽셀이 물체인지 배경인지 판단하려면 주변의 큰 형태와 문맥이 필요할 수 있다. Decoder는 이 의미 정보를 다시 픽셀 단위 예측으로 바꾸는데, 이때 위치 정보가 충분하지 않으면 mask 경계가 흐려질 수 있다.
U-Net의 핵심은 skip connection이다. Encoder의 각 단계에서 얻은 feature를 decoder의 대응 단계로 전달한다. 이를 통해 decoder는 깊은 layer의 의미 정보뿐 아니라 얕은 layer의 위치 정보를 함께 사용할 수 있다.
Segmentation에서는 객체가 무엇인지뿐 아니라 정확히 어디에 있는지가 중요하므로 skip connection이 큰 역할을 한다.
U-Net은 의료 영상 segmentation에서 유명해졌지만, 구조 자체는 다양한 pixel-wise prediction 문제에 응용된다. 로봇에서는 물체 영역 분리, 작업 공간 segmentation, 장애물 mask 생성, graspable region 추정 등에 연결될 수 있다.
Encoder는 이미지를 압축하면서 더 넓은 문맥과 의미 정보를 얻는다. 하지만 pooling이나 stride로 해상도가 줄어들면 작은 물체의 위치나 경계 정보가 사라질 수 있다. Decoder가 단독으로 해상도를 복원하면 의미는 알지만 경계가 흐릿한 mask가 나올 수 있다.
Skip connection은 encoder의 얕은 단계에서 보존된 위치 정보를 decoder로 직접 전달한다. 그래서 U-Net은 “무엇인지”를 판단하는 깊은 feature와 “어디에 있는지”를 알려주는 얕은 feature를 함께 사용한다.
U-Net 실습 정리: 이해할 점
U-Net을 단순히 segmentation 모델 이름으로 외우면 부족하다. 중요한 것은 segmentation이 classification과 다르게 픽셀 단위 위치 정보를 요구한다는 점이다. Downsampling으로 의미를 얻고, upsampling으로 위치를 복원하며, skip connection으로 경계를 살리는 구조를 이해해야 한다.
U-Net을 볼 때는 각 단계의 feature map 크기가 어떻게 변하는지 따라가면 구조가 이해된다. Encoder에서 해상도는 줄고 채널 수는 늘어난다. Decoder에서는 해상도가 다시 커지고, skip connection으로 encoder의 feature가 결합된다. 최종 layer는 각 픽셀에 대해 class score를 출력한다.
U-Net 핵심 코드 인용
Semantic segmentation 실습에서 U-Net을 볼 때는 encoder가 해상도를 줄이며 의미 정보를 만들고, decoder가 해상도를 되살리며 pixel 단위 출력을 만든다는 점을 코드 구조로 읽어야 한다.
inputs = Input(shape=(height, width, channels))
c1 = Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)
p1 = MaxPooling2D((2, 2))(c1)
c2 = Conv2D(128, (3, 3), activation='relu', padding='same')(p1)
p2 = MaxPooling2D((2, 2))(c2)
u3 = Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(p2)
u3 = concatenate([u3, c1])
outputs = Conv2D(num_classes, (1, 1), activation='softmax')(u3)
MaxPooling2D는 feature map의 해상도를 줄이고 receptive field를 키운다. 이 과정에서 위치 정보가 일부 손실되므로, decoder에서 Conv2DTranspose로 해상도를 키울 때 encoder feature를 concatenate로 다시 붙인다. 이것이 skip connection이다.
마지막 Conv2D(num_classes, (1, 1), activation='softmax')는 각 pixel마다 class score를 만든다. Classification은 이미지 전체에 label 하나를 붙이지만, semantic segmentation은 모든 pixel에 label을 붙인다. 로봇에서는 이 mask가 작업 영역, 장애물 영역, 잡을 물체 영역을 나누는 데 쓰이고, depth와 결합하면 mask 내부의 3D point 후보를 만들 수 있다.
U-Net은 encoder-decoder와 skip connection으로 의미 정보와 위치 정보를 함께 보존하는 segmentation 모델이다.