얼른 개발자 세계에 던져지고 싶어서 지원한 ICT 인턴십...!

전공 12학점에 월급도 받을 수 있어서 정규학기도, 인턴생활도 하고 싶었던 나에게 꼭 필요한 프로그램이었다.

일반적으로 인턴 전형이 진행되는 기간을 생가하면 약 한달간 최대 세군데 회사에 지원할 수 있다는 점도 큰 장점인 것 같다.

 

지원 과정은 다음과 같다.

1. 7/5 - 7/14: 희망기업 서류 지원

2. 7/14 - 7/15: 코딩테스트 실시

3. 7/15 - 7/26: 기업별 서류 발표 및 면접 진행

4. 7/27 - 7/28: 인턴기업 확정 처리

(원래는 서류 지원이 13일까지였는데 마지막날 지원자가 모여서 서버가 마비되었는지 서류지원 마감날이랑 코딩테스트 시작 날짜가 14일로 하루씩 밀렸다.)

 

약 140여개 회사 중 아래 기준으로 지원하고 싶은 회사를 골랐다.

1. 내가 원하는 기술스택을 사용하는 회사인가?

2. 회사에서 만드는 서비스가 흥미롭게 느껴지는가?

3. 대중교통으로 90분 이내에 갈 수 있는가?

 

나는 수요가 많다는 이유로 스프링 공부를 해왔기 때문에 실무에서 스프링을 사용하는 이유를 직접 겪으며 이해하고 싶었다. 또한 내가 흥미를 가질만한 주제여야 4개월동안 열정을 갖고 즐겁게 참여할 수 있을거라고 생각했다.

그리고 복지(식대, 간식지원)가 많은 회사에 마음이 가버릴까봐 그 부분은 일부러 자세히 읽지 않았다... !

 

1번, 3번 기준을 만족하는 회사를 리스트업하니 8개 회사가 남았다. 회사가 어떤 서비스를 제공하는지는 회사 홈페이지와 회사 소개 파일에서 찾아봤고 2번 기준으로 3개 회사를 골랐다.

 

이력서, 자기소개서, 포트폴리오 총 3개 서류를 준비했다.

세 서류 모두 자체 양식을 만들었다. 포트폴리오는 선택사항이긴 하지만 내가 어떤 프로젝트를 했는지 잘 보여줄 수 있을 듯해 따로 만들었다. 셋 다 처음 작성해봐서 요령도 시간도 없었지만 주변 사람들의 도움으로 잘 마무리할 수 있었다. 나는 어떤 구성으로 써야할지 정말 막막했어서 부족하지만 조금이나마 도움이 되길 바라며 글을 남긴다..!

 

서류를 준비할 때 크게 두가지를 지키려 했다.

1. 쉽게 읽을 수 있는 서류를 만들자. (형식과 내용 모두)

이 서류만 슬쩍 보고도 내가 어떤 사람인지 감이 오게끔, 친절하고 쉽게 작성하는 것을 목표로 삼았다. 어떤 도메인을 가진 사람이든 이해할 수 있을만한 단어를 사용하고 문장구조를 단순하게 만들었다. 줄간격과 줄바꿈, 여백 배치, 폰트를 조절하며 보기 좋은 서류를 만들려고 했다.

2. 채용하는 사람이 궁금할만한 정보를 넣자.

목표는 이렇게 잡았지만 채용담당자가 무엇을 궁금해할지 잘 모르겠더라... 특히 ict 인턴십은 각 회사별로 지원자에게 궁금해하는게 다를 수도 있겠다는 생각이 들었다. 그래서 그냥 구글링으로 이력서 양식과 자기소개서 질문 항목, 포트폴리오 예시를 찾아보며 최대한 일반적인 양식을 만들려고 노력했다. 아래는 내가 작성한 서류 양식이다.

  • 이력서
    • 개인정보(이름, 생년월일, 전화번호, 이메일, 전공 및 전체평점, 주소)
    • 학력 및 경력사항
    • 수상내역 및 출판
    • 보유기술
    • 어학능력
    • 프로젝트 경험 요약
  • 자기소개서
    • 지원동기
    • 내가 지닌 강점
    • 입사 후(혹은 개발자로서의) 포부
  • 포트폴리오
    • 사용할 수 있는 스킬 요약
    • 대표 프로젝트 3개
      • 프로젝트 소개
      • 담당 역할
      • 느낀점
    • 내 성장에 영향을 준 경험 2개(동아리, 연구실)
      • 무엇을 했는가
      • 무엇을 얻었는가

해커랭크에서 코딩 테스트를 봤다.

내가 지원한 회사 중 두 곳은 코딩 테스트를 봤다. 해커랭크에서 12시간동안 5문제를 풀도록 안내받았고 sample test도 있어서 크게 적응이 어렵진 않다. sample case 결과를 보여준다는 점에서 백준보다는 프로그래머스와 유사한 플랫폼이라고 느꼈다. 난이도는 백준 실버4부터 골드5까지 골고루 나오는 것 같다. 코딩테스트 기간이 끝난 후 이틀 내로 결과 리포트가 메일로 왔다. 모범답안도 함께 오니까 참고해서 자신의 코드를 분석해봐도 좋을 것 같다.

 

운좋게도 세 곳에서 모두 면접을 볼 수 있었다.

면접준비만으로도 이론공부를 빡세게 할 수 있다고 생각해서 붙을 수 있을지 걱정하기보다 그냥 공부하는 마음으로 준비했다. 평소에 기초가 부족했는지 알아야 하는게 많더라..ㅎㅎ 이력서와 자기소개서, 포트폴리오를 보고 예상 질문을 작성하고 자바/스프링 면접 단골질문 리스트를 추가했다. 질문과 답변을 모두 적으니 8장정도 나왔던 것 같다. 세 회사 공통적으로 프로젝트를 진행할 때 갈등상황이 있었는지, 갈등을 어떻게 해결했는지와 이 회사에 지원하게 된 동기를 물었다.

  • A회사에서는 프로젝트에서 사용한 기술 위주로 왜 그렇게 했는지에 대한 질문을 많이 받았다. 일대일 대면으로 약 40분간 진행했다.
  • B회사에서는 단순 반복문부터 자바, 스프링, 데이터베이스 등 기술 질문과 팀 프로젝트 관련 질문도 받았다. 일대일 비대면으로 약 30분간 진행했다.
  • C회사는 내가 한 경험 위주로 질문하셨고 느낀점을 답하면 되어서 가장 편안했다. 일대일 대면으로 약 40분간 진행했다.

A, C 회사에서 면접합격 소식을 들었다.

나는 서류를 넣을 때 1순위, 2순위, 3순위 회사가 없었다. 두가지 이유가 있는데 첫번째 이유는 회사 순위를 매기는 기준에 따라서 순위가 계속 바뀌었고 무엇이 제일 나은 기준인지 헷갈렸기 때문이다. 두번째 이유는 1순위 회사를 정했는데 떨어지면 아쉬움이 더욱 클 것 같아서였다. 선택을 해야만하는 때가 와서 주변에 조언을 구했고 다들 우문에 핵심을 꿰뚫는 답변을 해주셨다. 일이 조금 힘들더라도 네가 가장 성장할 수 있을 것 같은 곳으로 가는 것이 좋다는 것이다. 이 이야기를 듣고 어느 회사를 가는게 좋을지 명료해졌고, 26일에서 27일 넘어가는 자정이 되자마자 바로 A회사 인턴확정 버튼을 눌렀다! 

 

마음은 후련하지만 새로 고민할 거리가 생겼다!

약 1년간 내 단기적인 목표는 인턴을 하는 것 그 자체였다. ict 인턴십에 지원하며 좋은 기회를 얻었고, 이제는 어떻게하면 4개월을 잘 보낼 수 있을지 고민해봐야겠다. 우선은 주기적으로 배운 것과 느낀 점을 쓰려 한다. 매일 한걸음 더 나아가는 사람이 되어야겠다!

DSC UOS에 2021 Spring Member로 합류했습니다.
ml 공부를 이어서 하자는 다짐에 paper review 팀에서 활동하는데, 용어부터 개념까지 쉬운 게 없네요.
교수님들께서 왜 용어 대부분을 영어로 말씀하시는지 백번 이해했습니다...
무엇을 잘 알아서 글을 쓴다기보다 얕은 지식이나마 잊지 않으려 게시글로 남깁니다.
개념 오류가 있다면 알려주시면 감사하겠습니다.

Real-Time Scene Text Detection with Differentiable Binarization이라는 논문을 리뷰했습니다.

관련 프로젝트를 준비하며 insight를 얻고자 본 논문을 선정했습니다.

text detection분야를 서치하면서 자주 보았던 TextBoxes와 Mask TextSpotter를 제안하셨던 분의 논문이더라고요.

text detection은 이미지에서 글씨가 있는 위치가 어디인지 감지하는 기술입니다. 오른쪽 이미지는 발표자료에서는 영상인데요, text tracking을 하는 모습입니다. detection과는 조금 다른 개념이지만 실시간성이 중요할 때가 있다는 것을 이야기하고자 첨부했습니다.

Segmentation-based method는 픽셀 단위 데이터를 다루므로 text detecting에 많이 쓰이는 기술입니다. 해당 기술은 기울어지거나 회전한 이미지에서도 detection에 강하므로 자주 쓰이는 기술이지만 post-processing이 복잡해 연산량이 많아진다는 단점이 있습니다. accuracy 향상을 위해 progressive scale expansion을 수행한 PSENet, Segmentation 결과에 pixel embedding을 하는 방법으로 픽셀 간 거리를 클러스터링 하는 방법 등이 text detection 분야의 SOTA로 꼽힌다고 논문에서는 언급합니다. 대부분의 기존 방법에서는 segmentation network를 binary image로 만들기 위해 fixed threshold를 사용해서 휴리스틱적 기법으로 픽셀을 그룹화했습니다.

이 논문은 binarization을 위한 threshold를 학습시키는 것을 목표로 둡니다. joint optimalization을 위해 binarization operation을 segmentation network에 삽입하는 것을 목표로 하는데 이렇게 adaptive 하게 optimize 하는 것에는 픽셀을 전경 및 후경과 완전히 구분할 수 있는 장점이 있습니다.

이 목표를 달성하려면 결국 standard binarization function(activate function)을 학습시켜야 하는데, 이 식은 특정 값 이상이면 1, 아니면 0으로 미분 불가능하기 때문에 Differentiable Binarization(DB)이라는 이진화 근사 함수를 사용합니다. 이 논문은 결과적으로 CNN에서 e2e로 binarizationbinarization 할 수 있는 미분 가능한 모듈을 제안했고 semantic segmentation에 대해 빠르게 text를 detectdetect 하는 방법을 제안했다는 점에서 의의를 가지는 것 같아 보입니다.

 

이 기술은 후술 할 5가지 데이터셋에서 좋은 성능을 보였고 Light-weight backbone이 잘 동작해 탐지 성능이 좋습니다. DB가 horizontal, multi-oriented and curved text에서도 robust한 binarization map을 제공하므로 post-processing을 단순화할 수 있어 속도가 빠릅니다.

related work에서는 text detecting을 위한 regression based, segmentation based method를 소개합니다. Regression-based는 text instance의 bounding box를 regressregress 하는 모델로, 일반적으로 non-maximum suppression과 같은 간단한 post-procession algorithm을 사용합니다. 그러나 휘어있는 글자 모양에도 accurate bounding boxes를 나타내게 하는 한계가 있습니다. Segmentation-based는 bounding box를 얻기 위해 pixel-level prediction과 post-processing을 결합한 방법입니다. detecting 속도를 높이기 위한 방법들은 curved와 같은 irregular shape를 다루지 못합니다. 연구들은 segmentation result를 post-processingpost-processing 해 추론 속도를 줄였으나 이 연구는 training 과정에 binarization을 포함해 정확성과 추론 속도를 높이는 것에 중점을 둔다고 소개합니다.

입력 이미지는 feature-pyramid backbone(FPB)으로 넣습니다. forward forward에서 추출된 의미 정보들을 top-down 과정에서 업샘플링하여 해상도를 올리고 forward forward에서 손실된 지역적인 정보들을 skip connection으로 보충해서 스케일 변화에 강하게(robust) 합니다. 또한 각 layer마다 prediction 과정을 넣어 pyramid feature는 동일한 scaleup-sampling, cascaded 되어되어 feature F를 생성합니다. feature F를 사용해 P와 T를 생성하고 대략적인 binary map을 계산하고 training시에는 P, T, B가 supervised 되며 text를 detection합니다.

ij는 좌표 지점이고 t는 predefined threshold, T는 adaptive threshold, K는 amplifying factor, B hat은 approximate binary map을 의미합니다. 기존에 사용하던 이진화 함수(standard binarization)는 미분 불가능하기 때문에 training 할 때에 넣어 optimizeoptimize 할 수 없습니다. 개선된 방법에서는 고정된 숫자에서 0과 1을 나누는 것이 아니라, 학습된 값을 기준으로 나뉘도록 differetiable binarization을 적용해줍니다. (SB와 DB를 그린 그래프가 논문에 있는데 두 그래프가 바뀐 게 아닌가 생각이 들어 넣지 않았습니다. 혹시 논문을 읽으신 분이 있다면 댓글 달아주시면 감사하겠습니다...)

(a)는 input image, (b)는 probability map, (c)는 thershold map without supervision, (d)는 threshold map with supervision을 뜻합니다. 논문에서는 text border처럼 생긴 threshold map이 최종 결과에 도움이 된다고 언급하며 border-like supervision을 적용할 것이라고 합니다. 이 모델은 또한 Deformable convolution network를 사용합니다. CNN은 인풋 이미지 종횡비가 획일적이라 extreme aspect 비율을 가진 이미지에 대처하기 어려우므로 뒤에 백본으로 사용될 resnet-18, resnet-50에서 deformable convolution을 사용합니다.

(with supervision without supervision 쪽이 잘 이해가 안 가서 멋진 선배님께 여쭤본 결과, 정보량을 많이 가진 쪽이 더 학습이 용이하고 성능이 잘 나오는 것으로 이해했습니다. 기회가 된다면 깃헙을 뜯어보아야겠어요..)

Label을 만드는 과정입니다. (R은 shrink ratio로 0.4)

1. Text image가 주어지면 segment의 set이 나온다.

2. Vertexes가 합쳐져 빨간색 G가 된다.

3. Gs는 폴리곤을 줄여서 파란색, Gd는 늘려서 초록색

4. 이 offset은 Vatti clipping algorithm을 사용한다.

5. Gs와 Gd gap을 텍스트 영역의 테두리로 본다.

각 map의 loss function을 최적화하는 수식입니다. 발표 중 질문을 주셨는데 바로 답변드리지 못해, 멋진 선배님께 여쭤보았습니다. text detection을 위한 모델에서는 해당 픽셀이 글자인지 아닌지에 대한 확률값을 표현해야 하므로 확률 모델링을 용이하게 해주는 binary cross entropy 계열 loss function을 사용한다고 합니다. 만약 확률을 예측하는 것이 아니라 박스 위치를 regression 하는 종류 task에서는 mse, l1, l2등의 loss function을 주로 사용합니다.

학습 과정입니다. 위에 서술한 바와 같이 모든 모델에 대해 SynthText로 1010만 회 반복 훈련합니다. batch 16, learning rate 0.07, power 0.9. weight decay 0.0001, momentum 0.9였고 data augmentation은 random rotation, random cropping, random flipping을 수행했습니다.

Differentiable binarization - Tab 1

-ResNet-18은 3.7%, 4.9% 정도의 성능 향상

-ResNet-50은 3.2%, 4.6% 정도의 성능 향상

Deformable convolution - Tab 1

-ResNet-18은 1.5%, 3.6% 정도의 성능 향상

-ResNet-50은 5.0%, 4.9% 정도의 성능 향상

 

앞서 언급했던 deformable convolution과 DB 모듈을 각각 사용하거나 사용하지 않았을 때 성능을 두 데이터셋에 대해 비교했습니다. 논문이 나온 후의 랭킹도 궁금해서 papers with code를 봤는데 MSRA-TD500은 2등, CTW1500은 자료는 없지만 5-6등 정도 할 것으로 예상했습니다.

 

Threshold에 supervision이 있을 때와 없을 때 MLT-2017 dataset에 대해 성능을 비교한 표입니다. Resnet-18은 0.7%, Resnet-50은 2.6 향상했습니다. supervision 여부에 따른 다른 데이터셋에서의 성능도 궁금해졌습니다. “Thr-Sup”는 threshold map에 supervision을 적용한 경우를 뜻합니다.

왼쪽 테이블은 Total-text dataset, 오른쪽 테이블은 CTW1500입니다. DB-ResNet50은 두 데이터셋에서 1.1%, 1.2% 높은 성능을 보였고 속도(FPS)에서도 이점이 있어 보입니다. "MTS"및 "PSE"는 Mask TextSpotter 및 PSENet의 약자입니다.

ICDAR 2015는 작고 해상도가 낮은 text instance가 많아서 multi-oriented text detection을 실험한 것이 아닌가 싶었습니다. DB-ResNet-50(1152)는 accuracy에서 sota를 달성했고 이전 sota였던 EAST와 비교해서 DB-ResNet-50(736)이 정확도가 높고 빠르게 실행되는 점을 확인할 수 있습니다.

멋진 선배님께 자문을 구했을 때, text detection은 text recognition과 이어지는 경우가 많습니다. 개발한 모델이 여러 언어에서도 잘 동작하는지 알 필요가 있기 때문에 다국어 데이터셋에 대해 모델을 테스트하는 것에 의의가 있다고 합니다. 해당 논문에서는 대표적인 다국어 데이터셋인 MSRA-TD500과 MLT-2017을 테스트했고 둘 다에서 DB-ResNet-50에서 정확성이 높았습니다.

이 모델의 단점을 꼽자면 텍스트 내부에 있는 텍스트를 detect 할 수 없다는 점입니다. 이 점은 segmentation based scene text detector의 일반적인 한계로 꼽힙니다.

이 논문은 arbitrary-shape를 커버하는 segmentation network에서 동작하는 differentiable binarization process를 제안합니다. 특히 lightweight backbone(ResNet-18)을 사용해도 real-time inference speed를 달성했다고 언급합니다.

'etc' 카테고리의 다른 글

2021 하반기 ICT 학점연계 인턴십 지원 후기  (0) 2021.08.01

+ Recent posts