# Selective search
- region proposal 방식으로, 영역을 추정하는 방식으로 원본 이미지 내의 컬러, 무늬, 크기, 형태에 따라 유사한 Region을 그룹핑
- over segmentation된 이미지를 여러번 반복하여 유사한 region끼리 그룹핑을 진행한 뒤 bounding box를 그림

[selective search 사용]
import selectivesearch
img = imread('path')
'''
scale = Higher means larger clusters in felzenszwalb segmentation.
sigma = Width of Gaussian kernel for felzenszwalb segmentation.
min_size = Minimum component size for felzenszwalb segmentation.
return img, regions
img : ndarray
image with region label
region label is stored in the 4th value of each pixel [r,g,b,(region)]
regions : array of dict
[
{
'rect': (left, top, width, height),
'labels': [...],
'size': component_size
},
...
]
'''
img_lbl, regions = selectivesearch.selective_search(
img, scale=200, sigma=0.9, min_size=10)
selective_search(img, scale, sigma, min_size)의 함수를 파보면,
1) img = _generate_segments(im_orig, scale, sigma, min_size)
img를 _generate_segments 함수안에 im_mask 변수가 있는데
im_mask 변수에 Felzenswalb와 Huttenlocher가 제안한 방법인 가장 작은 지역들로 세그먼트를 담음, 여기가 oversegmentation이 진행되는 부분
그리고 im_mask를 기존 이미지에 +1채널로 붙여줌 그럼 이미지는 rgb에 마스크 채널이 생겨서 4채널이 됨
2) R = _extract_regions(img)
이미지에서 영역을 추출하고 각 영역에 대한 통계를 계산함
색상, 채도, 밝기를 표현하는 hsv로 이미지 채널을 바꿔서 픽셀 그룹의 갯수를 구하고 각 그룹별 bbox만들어준 다음,
컬러와 텍스처 히스토그램 구해서 각 그룹에 맞게 딕셔너리 형태로 넣어줌
3) neighbours = _extract_neighbours(R)
이웃 정보를 추출한다고 되어있는데 위에 구한 R 마지막 채널에서 a 그룹이 있을때 바로 옆 b그룹이 있으면 그 두개를 비교해서 교차지점을 찾는 부분
3)
S = {}
for (ai, ar), (bi, br) in neighbours:
S[(ai, bi)] = _calc_sim(ar, br, imsize)
neighbours가 (a,b) 형태로 리턴되는데 a와 b가 유사한지 보는 코드
4)
while S != {}:
# get highest similarity
i, j = sorted(S.items(), key=lambda i: i[1])[-1][0]
# merge corresponding regions
t = max(R.keys()) + 1.0
R[t] = _merge_regions(R[i], R[j])
# mark similarities for regions to be removed
key_to_delete = []
for k, v in list(S.items()):
if (i in k) or (j in k):
key_to_delete.append(k)
# remove old similarities of related regions
for k in key_to_delete:
del S[k]
# calculate similarity set with the new region
for k in [a for a in key_to_delete if a != (i, j)]:
n = k[1] if k[0] in (i, j) else k[0]
S[(t, n)] = _calc_sim(R[t], R[n], imsize)
가장 높은 유사도를 찾아서 지역을 합쳐주고 합쳐진 지역(공통된 부분)을 지워 준다음, 만들어진 지역에 대해 계속 유사도를 찾아 합치고 지우고를 반복함
5)
regions = []
for k, r in list(R.items()):
regions.append({
'rect': (
r['min_x'], r['min_y'],
r['max_x'] - r['min_x'], r['max_y'] - r['min_y']),
'size': r['size'],
'labels': r['labels']
})
최종으로 만들어진 지역, R을 regions으로 옮겨담아서 리턴 해줌
{'rect': (0, 0, 86, 25), 'size': 1509, 'labels': [0.0]},
{'rect': (0, 0, 97, 36), 'size': 1071, 'labels': [1.0]},
{'rect': (0, 0, 136, 47), 'size': 1762, 'labels': [2.0]},
{'rect': (0, 0, 831, 911), 'size': 384423, 'labels': [3.0]},
위의 형태로 내꺼 이미지엔 980개가 나왔음, 다볼 필요는 없고 해당 라이브러리에서 제외한 기준으로 확인해봤음(같은 박스를 가지거나 크기가 2000픽셀이 넘거나 박스가 찌그러진 경우는 제외)
# RCNN
- image classification을 수행하는 cnn과 localization을 위한 region proposal알고리즘을 연결한 모델
RCNN process
- 이미지 입력 > selective search 알고리즘으로 regional proposal output 추출 > region proposal output을 모두 동일한 input size로 wrap해줌>cnn모델에 넣음(alexnet 구조 땀)>linear svm으로 classifiaction진행
cons)
- selective search로 2000개의 region proposal을 뽑고 각 영역마다 cnn 수행해서 cnn*2000의 시간이 듦
- cnn, svm, bounding box regression 3개 모델이 한번에 학습 안함, region proposal에서 conv net forward pass를 할때 연산을 공유하지 않아서 end-to-end로 학습 못함

# fast-RCNN
- 1장의 이미지를 입력받고 region proposals의 크기를 wrap필요없이 roi pooling을 통해 고정된 크기의 feature vector를 fc layer에 전달, 또한 multi-task-loss를 사용해 모델을 개별적으로 학습시킬 필요없이 한 번에 학습 시킴
1. roi pooling
- 원본이미지 -> (동시) cnn(=vgg)통과 시켜 피쳐맵 얻음
-> (동시) selective search로 region proposal 얻음
-> 피쳐맵에 region proposal 해당 부분 추출함( how to? 피처맵의 사이즈가 원본보다 작아진 상태인데 region proposal의 크기와 중심 좌표를 sub sampling ratio에 맞게 변경시켜서 피쳐맵에 맵핑하고 해당 부분 추출함)
-> 추출한 roi feature map을 sub window 크기에 맞게 grid로 나눔
-> grid의 각 셀에 대해 max pooling을 수행해서 고정된 크기의 feature map을 얻음
2. multi-task loss
- multi-task loss를 사용해서 classifier와 bounding box regressor 동시에 학습
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)
L(p,u,tu,v): classification loss와 localization loss 결합
Lcls(p,u): 모델이 예측한 클래스 확률 p와 실제 클래스 u사이의 차이 측정
Lloc(tu,v): 실제 객체의 위치 v와 모델이 예측한 객체 위치 t사이의 차이 측정
람다: classification loss와 localization loss 균형 맞추기 위한 가중치
[u≥1]: 실제 객체가 존재하면 localization loss를 계산하고 배경에는 local loss를 계산하지 않음
3. hierarchical sampling
- SGD mini batch를 구성할 때 n개의 이미지를 샘플링, r개의 리젼 프로포절을 사용한다고 할때 r/n개의 리전 프로포절을 샘플링하는 방식 => 그러면 하나의 이미지에서 여러개의 region proposal이 추출되고 추출된 region proposal은 forward, backward propagation때 연산과 메모리를 공유할 수 있음
4. truncated svd
- 이해 안됨 svd :https://www.youtube.com/watch?v=TxB96QVlgXk
- https://angeloyeo.github.io/2019/08/01/SVD.html

위의 박스들이 행렬이고 A=UΣVT 이러한 수식을 만족한다고 했을 때

특이값 p개만 이용해 A행렬로 부분 복원이 가능하단 것
fast rcnn 모델은 fc layer에서 시간을 많이 먹으니 fc layer를 위의 svd를 통해 압축한다는 것임, 대략 30% 시간 감소
https://herbwood.tistory.com/8
# Faster-RCNN
- selective search가 cpu에서 동작하니까 병목현상이 발생해서 RPN(region proposal network)를 도입
- 그리드 나눠서 그리드 셀을 바운딩 박스로 간주, 근데 다양한 크기의 객체를 고려하려고 지정한 위치에서 다른 크기(스케일)과 aspec ratio(가로세로비율)을 가지는 박스! 앵커 박스를 도입

-즉, RPN+fast RCNN -> 두개 네트워크가 gpu에서 동작하니 병목현상이 없어서 얼마나 좋게요~end to end!!
Faster RCNN process
-> 원본 이미지를 사전학습된 cnn 모델에 입력해서 feature map을 얻음
-> 피쳐맵이 rpn에 전달되서 적절한 region proposals을 산출
-> region proposal과 피쳐맵을 roi pooling을 수행해서 고정된 크기의 피쳐맵을 얻음
-> 고정된 피쳐맵 입력해서 classification과 bounding box regression을 수행
1. 앵커박스
- 위에 설명

2. RPN
- 원본 이미지에서 앵커 박스를 생성하면 수많은 region proposals가 만들어지고 rpn은 region proposals에 대해 class score를 매기고 바운딩 박스 코이피션트를 출력하는 기능을 함
-> vgg 통과한 피쳐맵에 3*3conv 연산하고(이때 크기 유지하려고 padding함)
-> 클래스 점수를 주려고 1*1conv연산함, 출력 채널수는 2*9인데 2(객채 있니없니 여부)*9(각 그리드 셀마다 앵커박스 9개)여서
-> 바운딩박스 regressor를 얻기위해 피처맵에 1*1컨브 연산하는데 출력은 4*9임, 4(bounding box regressor) * 9(anchor box 9개)
링크:https://herbwood.tistory.com/10
# Mask-RCNN
- mask R-CNN의 구조는 Faster RCNN의 각 ROI에 대해 픽셀 단위 segmentation mask를 예측하는 브랜치 추가
- mask branch는 classification, bounding box regression branch와 독립적이며 small FCN
* mask rcnn과 Faster rcnn 차이 => RoIAlign
- faster rcnn은 픽셀 단위의 segmentation을 위해 설계되지 않았음
- 이를 해결하기 위해 RoIAlign이라는 간단하고 정확한 공간 정보를 보존하는 레이어를 제안
- 클래스에 대한 binary mask를 독립적으로 예측하고 네트워크의 Roi의 classification branch에 의존하여 class 예측함으로써 FCN보다 정확한 instance segmentatiion을 할 수 있음
(1) Mask R-CNN 구조
- stage 1 : RPN (Region Proposal Network)
- stage 2 : Predict the class, box offset and a binary mask for each ROI
-roi align 이해 안됨, 링크: https://velog.io/@oooops/RoIPool%EA%B3%BC-RoIAlign-%EC%B0%A8%EC%9D%B4%EB%8A%94
링크: https://ropiens.tistory.com/76
# YOLOv1,2,3,4
YOLOv1
- single convolutional network로 이미지를 입력받아 여러 개의 bounding box와 각 box의 class를 예측, 그리고 non-max suppression을 통해 최종 bounding box 선정
장점
- 빠르다, 이미지에 한번 네트워크를 통과 시키면 되니까
- background error가 적다, selective search는 이미지를 쪼개서 색상이런걸 가지고 박스를 탐지하는데 이게 배경을 좀 많이 인식함(벽지에 그림자 있으면 주변과 다르다고 그룹화 시켜서 박스를 침, 그래서 배경에 객체있다고 함) 근데 욜로는 이미지를 쪼개지 않고 전체를 한번에 넣어버리니 배경을 객체로 인식하는 실수가 줄어듦
- 이미지 전체를 학습해서 새로운 도메인에 잘 적응함
yolov1 process

- 입력 이미지 S*S grid로 분할, 위 이미지는 7*7임
- 객체의 중심이 grid cell에 맞으면 grid는 객체를 탐지했다고 표기함
- 각 grid cell은 B개의 Bounding box와 각 Bounding box에 대한 confidence score를 예측
* confidence score: pr(object)*IOUtrhthpred
- 각 grid cell은 bounding box외에도 class 확률을 예측
- non-max suppression을 거쳐 최종 bounding box를 선정
* non-max suppression
threshold를 가지고 conficence score가 threshold보다 낮으면 제거하여 bbox를 필터링 하는 것
모든 output prediction은 [P, bx,by,bh,bw] 형태의 array 일 것입니다.
- Cell마다 P<0.6인 박스를 버립니다.
- 남아있는 것 중에서 P가 가장 큰 값을 고릅니다.
- 선택한 박스와 IOU>0.5인 다른 bounding 박스를 모두 제거합니다.
- 이 과정을 다시 반복합니다. (그 다음으로 P가 높은 박스를 고름
NMS 단점
- object 겹치면 다른 object에 대한 bbox가 날라감 => 그래서 anchor box나옴
*anchor box
- 탐지하려는 객체의 모양을 정해놓고 객체 탐지되었을 때 어떤 앵커 박스와 유사한지 판단해서 벡터값을 할당하는 방법
YOLOv2 Better, Faster, Stronger
- Better: 정확도 올림
- Faster: detection 속도를 향상시키기 위한 방법
- Stronger: 더 많은 범위의 class를 예측하기 위한 방법
1. Better
- batch normalization: 모든 컨브레이어 뒤에 배치놈 추가, MAP 2% 향상, overfitting없이 정규화 방법이나 drop out을 제거가능
- High resolution classifier: yolov1은 사전 학습 이미지 사이즈 224*224, 디텍션 시 448*448, yolov2는 사전 학습 때부터 448*448로 학습 MAP 4% 상승
- Convolutional with anchor boxes: 네트워크를 수정 했는데 conv layer의 output이 더 높은 해상도를 가지도록 pooling layer 제거하고 네트워크를 줄여서 416*416 크기의 입력이미지를 사용함, 그 이유는 최종 feature map 크기가 홀수가 되서 중심 셀이 존재하게 만들려고! 객체가 크면 이미지 내에서 중심을 차지하기 때문에 하나의 중심 셀이 있으면 잘 포착할 수 있음(참고로 이미지넷, pascal voc는 아이코닉한 데이터임 그게 이미지내에 객체가 중심에 위치한다는 뜻, 코코는 다양하긴 한데 비율상 사람 라벨이 많음)
- Dimension Clusters: 기존은 anchor box의 크기와 aspect ratio를 사전에 미리 정의 했지만 K-means clustering을 통해 최적의 prior를 탐색하는 방법 제시, 데이터셋에 있는 모든 ground truth box의 width, height 값을 사용해 k_means clustering수행, 클러스터링을 하기위해 새로운 distance metric을 사용함 box와 centroid의 iou값이 클수록 겹치는 영역이 크기 때문에 거리가 가깝다고 할 수 있고 다양한 수의 K에 대해 K means clustering을 진행하였고, k=5일 때 모델의 복잡도와 recall 값이 적절한 트레이드 오프를 보여줌
- Direct location prediction: 기존 yolo가 그리드 중심점을 예측했다면, yolov2에서는 left top 꼭지점으로부터 얼만큼 이동하는지 예측함
- Fine-grained features: 13*13크기의 feature map을 출력함, 피쳐맵의 크기가 작은 경우 큰 객체를 예측하기 용이한 반면 작은 객체는 예측하기 어려움=> 그래서 마지막 풀링을 수행하기 전에 피처맵을 추출해서 26*26크기의 피쳐맵을 얻어서 4개로 분할하고 concat하여 13*13 피처맵에 추가함
- Multi-scale training: 10 배치마다 입력 이미지의 크기를 앤덤하게 선택하여 학습하도록 설계함, 모델은 이미지를 1/32 다운샘플시키기 때문에 입력 이미지 크기를 32배수 중에서 선택하도록 함, 이를 통해 네트워크가 다양한 크기의 이미지를 입력 받을 수 있고 속도와 정확도 사이의 트레이드 오프를 제공함
2. Faster
- Darknet-19: 다크넷 19라는 독자적인 classifiaction 모델을 백본 네트워크로 사용하고 마지막 레이어에 global average pooling을 사용하여 fc layer를 제거하여 파라미터 수를 감소시키고 detection 속도를 향상 시킴
- Training for classification: 아웃풋 채널수를 클래스 갯수에 맞춤, 이미지넷 1000개면 아웃풋을 1000개로
- Training for detection: 마지막 컨브 제거 후 3*3 conv layer대체 후 1*1 컨브를 추가함, 그리고 각 그리드 셀마다 5개의 bbox랑 각각의 박스마다 (confidence score, x, y, w, h)의 값을 가지고 파스칼로 학습해서 파스칼의 클래스 수량이 20개이기 때문에 1*1 컨브를 통과한 채널 수 가 125가 됨(= 5*(5+20))
3. Stronger
- Hierarchical classification: 물리적 객체를 루트 노드로 두고, 하위 범주는 자식 노드가 되고 자식 노드의 하위 범주는 자식 노드가 되서 점차 뻗어나감, 이런 트리에서 특정 범주에 속할 확률은 루트 노드로부터 해당 범주의 노드까지의 조건부 확률의 곱으로 표현할 수 있음


링크: https://herbwood.tistory.com/17
YOLOv3
- FPN을 사용하여 multi-scale에서 feature을 추출하고, shortcut connection을 활용한 Dartnet-53, class 예측 시에 softmax 대신 개별 클래스 별로 logistic regression을 사용
-Bounding box prediction: yolo3에서 바운딩 박스를 예측하는 방법은 yolov2와 동일
- Class prediction: 각 박스는 바운딩 박스의 클래스를 예측합니다. softmax를 사용하지 않는 대신에 binary cross-entroypy loss를 사용한 독립적인 classifier를 사용, 이방법이 복잡한 데이터셋을 학습하는데 도움이 됨
- prediction across scales: 3개의 다른 scale이 사용되고 FPN과 같이 특징은 feature pyramid에서 추출됨, 3개의 scale이 사용되므로 3개의 pyramid의 레벨에서 특징을 추출한다는 의미가 됨
- Feature extractor: yolov3은 backbone network로 darknet-53을 사용하는데 darknet-53은 53개의 convolutional layer로 이루어져있고, resnet에서 제안된 shortcut connection을 사용함
YOLOv4
- 실시간 object detector를 만들기 위해, 병렬 처리 환경에서 최적화를 빠르게 수행할 수 있는 모델을 개발하는 일을 목표로 함
- Bag of Freebies: object detector의 추론 비용을 증가하지 않으며 오로지 예측 성능만 올리기 위해 사용되는 기법들
1) data augmentation(cutmix, mosaic data augmentation, dropblock regularization, class label smoothing)
2) semantic distribution에 편향을 해결하는 방식, focal loss for dense object 방식을 제안해서 data imbalance를 해결
3) bag of freebies 방식은 bbox regression의 목적함수인 IOU loss
- Bag of specials: plugin module과 post-processing 방식중에 추론 비용을 조금 늘리지만 object detector의 성능을 상당히 올리는 방식을 bag of specials라고 부름, plugin module은 모델의 특성을 강화하는 방식으로 receptive field 확장, attention 기법 활용, post processing은 모델의 예측 결과를 screening(검사)하는 방식
*receptive field를 강화하는 방식으로 spp, aspp, rfb가 있음

# FPN(Feature Pyramid Networks)
링크: https://herbwood.tistory.com/18
# SSD
- one stage 모델
- 핵심 아이디어: multi scale feature layer, default box(=anchor box)
Multi scale feature layer
- 여러번의 컨볼루션을 적용해 나온 여러 개의 피쳐 맵을 객체 탐지를 수행시키는 것
Default box
-각각의 컨볼루션을 통해 나온 각각의 피쳐맵의 포인트마다 여러개의 앵커 박스를 씌우고 GT와 비교를 하면서 학습 진행
- 컨볼루션 과정을 더 거친 feature map일 수록 이미지의 중심이되는 객체를 탐지하고
컨볼루션 과정의 초반 피쳐맵일수록 이미지의 서브 객체를 잘 탐지함
이런 과정으로 SSD는 이미지 속에 존재하는 여러가지 객체를 잘 탐지 할 수 있게됨
- 객체를 탐지하기 위해 많은 후보 bbox가 생겨났는데 gt와 가장 iou가 높은 bounding box들만 남기기 위해 NMS 기법 사용
SSD loss function

위의 수식은 localize loss 인데 default box의 중심 좌표(cx, cy)와 너비와 높이를 사용해 smooth l1 loss를 통해 구함
l은 예측 박스의 좌표, g는 gt박스의 좌표 x는 는 번째 default box와 class가 인 번째 ground truth box와의 매칭 여부를 알려주는 indicator parameter로, 매칭될 경우 1, 그렇지 않을 경우 0을 가짐
Lconf(x,c)=−∑i∈Posxpijlog(c^pi)−∑i∈Neglog(c^0i)
위의 수식은 focal loss이고 pos는 긍정 예제, Neg는 부정 예제이고 x는 i번째 실제 객체와 j번째 예측 객체가 일치하는지 나타내는 지표이고 cpi와 c0i는 각각 긍정 클래스 p와 배경 클래스(0)에 대한 예측 확률
cpi는 소프트맥스값을 취한 것임
# EfficientDet
1. Efficient multi scale feature fusion
- 기존에 많은 피쳐들을 fusion할때 가로세로사이즈만 맞추고 합산한는데 서로다른 feature들을 해상도가 다르기때문에 그것들을 연산해서 아웃풋을 만들어 낼때 단순히 sum처리하는 것은 부족함
2. model scaling
- efficientnet에서 했던 것 처럼 resolution, depth, width중 하나만 키우는게 아닌 동시에 compound scaling을 진행해야 좋은 성능을 나타낼 수 있을 것 같다고 함
=> Weightes bidirectional feature network(BiFPN)와 객체 인식에 Compound scaling을 적용하는 방식을 제안
(결과) one stage 계열의 detector인데 높은 정확도를 성능향상을 보임

기존 (a) FPN은 탑다운 방식으로 하이레졸루션 피처를 리사이즈해서 로우 레졸루션 피처에 더하는 방식으로 진행됨
(d) BiFPN은 탑다운과 바텀업 방식을 사용하고(Bidiretional) 동일 레벨(흰색 노드)의 인풋 피쳐를 더해줌

# Detection Transformer(DETR)
- CNN backbone + transformer + FFN(Feed Forward Network)로 구성되어있음

1. 이분 매칭 손실 함수(bipartite matching loss)
- 객체 탐지는 set prediction problem이라고 할 수 있는데 이를 이분매칭을 사용해서 직접적으로 해결
- 학습 과정에서 이분 매칭을 수행함으로써 인스턴스가 중복되지 않도록 유도함
- output dimension을 n으로 할당해서 전체 N개 만큼만 객체 인스턴스가 존재한다고 고정하면 이분 매치을 통해서 직접벅으로 set prediction problem을 해결할 수 있음
2. Transformer
1) transformer
- 어텐션을 통해 전체 이미지의 문맥정보를 이해
- 이미지 내 각 인스턴스의 상호작용 파악 용이
- 큰 bounding box에서의 거리가 먼 픽셀간의 연관성 파악 용이
2) encoder
- 이미지의 특징 정보를 포함하고 있는 각 픽셀 위치 데이터를 입력받아 인코딩 수행
- 인코더는 d * HW 크기의 연속성을 띠는 feature map을 입력으로 받음
3) decoder
- N개의 object query를 초기 입력으로 받으며 인코딩된 정보를 활용
- 각 object query는 이미지 내 서로 다른 고유한 인스턴스를 구별
- 인코더가 global attention을 통해 인스턴스를 분리한 뒤에 디코더는 각 인스턴스의 클래스와 경계선을 추출함
단점: 큰오브젝트에 장점을 보이고 작은 객체에 대해선 성능이 낮음
# Deformable DETR
- Deformable convolution에서 아이디어를 얻어 transformer 구조에 적용
- convolution filter의 커널 위치를 학습시켜 광범위하고 변형 가능한 리셉티브 필드를 가지게 하였음
- 이는 기준 픽셀의 offset을 FC layer로 학습 시켰음
- conv filter의 offset을 deformable DETR에서는 encoder내의 attention 입력인 Key의 offset으로 대체하여 사용
# Fully convolutional network(FCN)
- 기존 이미지 분류 모델들은 기본적으로 출력층이 fully-connected layer로 구성되어있다
- 이 FC layer의 단점은 이미지의 위치 정보가 사라진다
- 세그멘테이션의 목적은 원본 이미지의 각 픽셀에 대해 클래스를 구분하고 인스턴스 및 배경을 분할하는 것으로 위치 정보가 매우 중요하다
- 그래서 세그멘테이션에서는 fc-layer를 conv layer로 대체 하였다
# DeepLab
- FCN의 진화된 버전
- Atrous conv를 사용

- 이렇게 하면 레이어를 더 딥하게 쌓거나 컨볼루션 커널 사이즈를 키우지 않더라도 리셉티브 필드가 커지는 효과를 누림
- 풀링 레이어 없이도 피처의 레졸루션을 줄이지 않고도 리셉티브 필드 크기를 키울 수 있는 장점이 있음
- CRF(fully connected conditional random field)
- CRF는 확률적 그래픽 모델로 조건부 확률을 모델링 하는데 사용됨
- Fully connected CRF는 이러한 CRF 중 하나로 모든 노드 간에 연결된 그래프를 갖는데 이는 각 노드가 모든 노드와 연결됨을 의미함
링크: https://kangbk0120.github.io/articles/2022-02/deeplab-series
# DeConvNet

- CNN의 역순 버전
- cnn의 출력을 통해 입력 이미지의 픽셀 수준 재구성을 시도
- 이를 통해 네트워크의 어떤 부분이 입력 이미지의 어떤 부분에 대응하는지 이해할 수 있음
# Unet
- unet은 U 모양의 아키텍처를 가지고 있으며 인코더와 디코더 부분으로 구성됩니다.
- 인코더는 입력 이미지를 저해상도 특성 맵으로 인코딩하고 디코더는 이러한 특성 맵을 높은 해상도의 세그멘테이션 맵으로 디코딩함
- 인코더는 다운 샘플링 단계를 거치고 각 단계에서는 컨볼루션 및 풀링과 같은 연산을 통해 입력 이미지를 점차적으로 다운 샘플링하여 저해상도의 특성 맵을 생성합니다 이로 인해 이미지의 고수준 특징을 추출합니다
- 디코더는 인코더의 아웃풋 특성 맵을 다시 업샘플링하여 입력 이미지와 같은 해상도의 세그멘테이션 맵을 생성합니다
- 디코더는 인코더의 각 단계에서 추출된 특성을 사용하여 세그멘테이션 맵을 생성하는 데 도움을 받습니다
- 이 과정을 통해 특성 맵을 화장하고 업샘플링 및 특성 결합을 통해 고해상도 세그멘테이션 맵을 생성합니다
- unet은 인코더와 디코더 사이에 스킵커넥션을 사용하여 인코더의 각 단계에서 생성된 특성 맵을 디코더의 해당 단계에 바로 전달합니다

'Study 공부할레나' 카테고리의 다른 글
| [내돈내산/수강후기] 패스트캠퍼스 - 컴퓨터비전 정주행 kit (4) | 2024.11.01 |
|---|---|
| [컴퓨터비전 정주행 Kit] Part2 ch04 표현학습 (2) | 2024.01.27 |
| [컴퓨터비전 정주행 Kit] Part2 ch03 (0) | 2023.12.23 |
| [컴퓨터비전 정주행 Kit] Part2 ch02 (1) | 2023.12.18 |
| [컴퓨터비전 정주행 Kit] Part2 ch01 (0) | 2023.12.16 |