경진대회
Trash Annotations for Sementic Segmentation
metric
mIOU
Semantic Segmetation과 다른분야 비교
Semantic Segmetation 활용분야
Semantic Segmetation history
COCO Data set의 각각의 image의 annotation 값은 “train.json” 파일에 존재
COCO Format - info
“Info”에는 data set에 대한 high-level의 정보가 포함되어 있음
COCO Format – licenses“licenses”에는 image의 license 목록이 포함되어 있음
COCO Format – images“images”에 data set의 image 목록 및 각각의 width,heigh,file_name,id(image_id)등을포함
COCO Format – categories
“categories”에는 class에 해당하는 id, name 및 supercategory가 포함돼 있음
COCO Format – annotations – segmentation
“segmentation”에는 각 class에 해당되는 pixel의 x, y 좌표들이 포함되어 있음
Segmentation에서 필요한 image 및 target에 대한 이해
• Shape of Images : (batch, 3, height, width)
• Shape of targets : (batch, height, width)
get_item
coco.getImgIds : index로 이미지 아이디 얻음
coco.loadImgs(img id) : img id를 입력으로 넣어 image info 얻음
cv2 imread, cvtcolor로 이미지 불러옴
coco.getAnnIds, loadAnns -> annotation정보
coco.getCatIds, loadCats -> category 정보
mask : size가 (height, value)인 2D arr, 각 pixel에는 category id 할당, background = 0 /
segmentation 영역 기준 내림차순 sort 하여 저장
transform
mode=train : images, mask ToTensor
mode=test : image, image_info ToTensor
paper-paper bag
plastic-plastic bag 유사한 class 주의
plastic, plastic bag은 plastic으로 라벨린
4.1 torchvision.models.segmentation.fcn_resnet50
torchvision 모델 불러오고
마지막 classifier class 갯수 맞춰주기
4.2 loss / optimizer 설정
loss - softmax + cross entropy loss
optimizer = Adam
4.3 train / validation 함수 정의
4.4 학습 시키기
앞에서 선언된 변수 및 모델을 활용하여 학습 진행
4.5 best model 불러오기
miou 기준 beat모델 저장, 불러오기
4.6 test
각 class 별로 잘 inference하고 있는지 EDA
// Battery, Clothing 잘 분류 안됨
Ref
특징
1. VGG 네트워크 백본을 사용 (Backbone : feature extracting network) - VGG,Alex,Res, Efficient
2. VGG 네트워크의 FC Layer (nn.Linear)를 Convolution 으로 대체
3. Transposed Convolution을 이용해서 Pixel Wise prediction을 수행
미리 학습된(성능이 좋은) 가중치 사용 가능
FC-> conaolution으로 바꾼것의 의미 -> 1.2
FCN은 flatten이후에 fc layer를 적용하므로 위치정보 해침
1x1 Convolution을 사용할 경우, 임의의 입력값에 대해서도 상관 없는 이유
-> Convolution은 kernel의 파라미터에 의해 영향을 받고, 이미지 혹은 레이어의 크기에 대해서는 상관 없음
7x7 로 줄어든 image를 다시 224x224 크기로 늘려줘야 함 -> UpSampling -> Transposed Convolution
2x2 inpu과 kernel을 곱해 더 큰 output 만듬겹치는 부분은 그냥 더해줌
5x5 output을 만들고 싶다면 stride = 2stride 2, padding 1 넣어주면 최종 결과는 내부의 3x3만 남게됨
Transposed Convolution?
2d 로 했을때와 동일한 결과 나옴마찬가지로 동일한 결과
하지만 input의 값과 동일하지는 않음. 따라서 엄밀히 말하면 DeConvolution이라는 이름보다는 Transposed Convolution이라는 이름이 맞음. 하지만 혼용해서 사용. 둘 다 학습 가능한 파라미터를 통해서 이미지를 다시 키우는 convolution을 의미함.
Conv1~Conv5까지 Conv layer 로 채널 수 증가
Pooling layer 로 각 layer 마다 이미지 사이즈 1/2씩 감소
Fc6, FC7 -> Conv
Score -> prediction을 channel수 만큼으로 반환하는 Conv 연산
Up Score -> ConvTransposed2d에 kernel_size = 64, stride = 32, padding=16으로 이미지 사이트 32배 늘림
너무 한번에 늘리면 디테일한 부분의 정보 사라짐
최종 prediction feature map을 2배 키우고, 4번 layer의 feature map(입력의 1/16)과 더해준 후 이를 다시 16배 키우는 DeConv를 진행
이를 통해 1. MaxPooling에 의해서 잃어버린 정보를 복원해주는 작업을 진행
2. Upsampled Size를 줄여주기에 좀 더 효율적인 이미지 복원이 가능함.
summation을 위해서는 resolution과 channel수가 맞아야 하기 때문에
4번째 layer output에 1x1 conv를 통해 channel을 class 갯수로 줄임, + 마지막 feature map(그림에서 Score부분)의 resolution은 입력의 1/32이기 때문에 한번의 Decont 연산으로 이미지 크기 2배로 만들어줌
논문에서는 마지막에 8배만큼 이미지를 키우는 FCN-8s 도 제안하는데 다음과 같다.
32s보다 8s가 UpSamplig결과가 더 좋은 것을 확인 할 수 있다.
Pixel Accuracy
Mead IoU
1x1 을 7x7 convolution으로 바꿀때 발생하는 문제
1. 입력 이미지크기가 달라지는 문제
16s, 8s 도 마찬가지로 마지막에 crop 해서 크기 맞춤
Further Reading
FCN
대회 관련 계획
강의 듣는 것에 집중하기