GhostNet: More Features from Cheap Operations


본 글은 CVPR 2020에서 발표한 GhostNet에 대한 코드와 함께 보는 논문 리뷰입니다

간단 요약

  • Ghostnet에서는 전통적인 CNN에서 나타나는 특징인 중복된 Feature(중요한 Feature)에 중점을 두고 이를 효율적으로 만들어 내는 방법에 대하여 작성된 논문입니다.
  • 기존에 뽑아둔 Feature를 일반적인 Convolution 연산보다 적은 resource를 가지는 Linear Transfer연산을 통하여 조금씩 변형하여 중복된 Feature를 만드는 것에 초점이 잡혀있습니다

GhostNet : Idea

아래의 그림은 Resnet 50의 일부 Feature 맵을 시각화 한 사진인데, 여기서 보면 일부 비슷한 모습을 가지는 Feature Map을 볼 수 있습니다. 이를 본 논문에서는 이러한 겹치는 Feature를 Ghost Feature라고 서술하였습니다.

Ghostnet에서는 이러한 Ghost Feature map을 convolution 연산을 통해 자연스럽게 나오는게 아닌 Linear Transfer를 이용하여 기존의 뽑아낸 Feature를 조금씩 변형하여 만든 Feature맵으로 유도하여 적은 Parameter와 Flops를 가진 모델을 만드는 것을 목표로 합니다.

Ghost Module

기존의 CNN Block Module은 아래의 첫번째 그림과 같이 연산이 됩니다. 이 경우 필요한 Parameter의 수는 다음과 같습니다.

$c$ : channel수
$kernel$ : kernel size

$$
parameters = c_{in} \times c_{out} \times kernel
$$

두번째 그림에서 보여주는 Ghost Module은 다음과 같은 연산과정을 통하여 이루어집니다

  • Input을 Convolution연산을 통하여 Feature를 추출
  • 추출된 Feature에 Linear transformation을 통하여 기존의 Feature들과 유사한 Ghost Feature를 생성
  • Feature와 Ghost Feature를 Concat을 통하여 하나로 합침

실제 구현에서는 Linear Transfer 연산으로 Mobilenet에서 사용되었던 Depthwise Convolution 연산을 사용하였습니다.
input이 80이고 output이 100인 연산을 convolution으로 만 진행할 경우 필요한 Parameters는 아래와 같지만
$$ 80 \times 100 \times kernel_{conv}$$
이를 Ghost Block으로 진행 할 경우 다음과 같이 Parameter가 줄게 됩니다.

  • 기존 Feature와 Ghost Feature의 1:1 인 경우
    $$
    80 \times 50 \times kernel_{conv}+ 50 \times kernel_{dwconv}
    $$
  • torch의 Conv2d Layer는 group을 이용하여 depthwise Convolution 연산을 진행 할 수 있습니다.
  • group이 output사이즈와 같을경우 depthwise 연산을 진행
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class GhostModule(nn.Module):
def __init__(self, inp, oup, kernel_size=1, ratio=2, dw_size=3, stride=1, relu=True):
super(GhostModule, self).__init__()
self.oup = oup
init_channels = math.ceil(oup / ratio)
new_channels = init_channels*(ratio-1)

self.primary_conv = nn.Sequential(
nn.Conv2d(inp, init_channels, kernel_size, stride, kernel_size//2, bias=False),
nn.BatchNorm2d(init_channels),
nn.ReLU(inplace=True) if relu else nn.Sequential(),
)

self.cheap_operation = nn.Sequential(
nn.Conv2d(init_channels, new_channels, dw_size, 1, dw_size//2, groups=init_channels, bias=False),
nn.BatchNorm2d(new_channels),
nn.ReLU(inplace=True) if relu else nn.Sequential(),
)

def forward(self, x):
x1 = self.primary_conv(x)
x2 = self.cheap_operation(x1) # depthwise convolution 연산
out = torch.cat([x1,x2], dim=1) # identity 결합
return out[:,:self.oup,:,:]

코드 출처 : huawei-noah/Efficient-AI-Backbones

Ghostnet은 CNN 중복된 Feature 특징 통하여 딥러닝 모델에서의 Feature가 서로 상관관계가 있고, 이를 기존 Feature를 통해 생성하면서 좋은 결과를 보여주었습니다.

데모

Colab 데모 페이지

GhostNet은 pytorch hub를 통하여 손쉽게 Classification 모델로 사용할 수 있습니다.

  1. 모델 Load
1
2
3
import torch
model = torch.hub.load('huawei-noah/ghostnet', 'ghostnet_1x', pretrained=True)
model.eval()
  1. Classification
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from PIL import Image
from torchvision import transforms
input_image = Image.open(filename)
preprocess = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
input_tensor = preprocess(input_image)
input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model

# move the input and model to GPU for speed if available
if torch.cuda.is_available():
input_batch = input_batch.to('cuda')
model.to('cuda')

with torch.no_grad():
output = model(input_batch)
# Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes
print(output[0])
# The output has unnormalized scores. To get probabilities, you can run a softmax on it.
probabilities = torch.nn.functional.softmax(output[0], dim=0)
print(probabilities)

Meta Learning


학습하는 과정을 학습하는 법

Meta Learning

Few Shot Learning

빅데이터를 지탱하는 기술 (1)


부캠에서 추천받은 빅데이터를 지탱하는 기술을 읽고 정리하는 글입니다.
책 링크

빅데이터란?

2012년에 걸쳐 많은 기업들이 데이터 분산처리 시스템을 도입하기 시작했을때 부터 수면위로 떠오른 단어. 많은 양의 데이터를 의미하며 이것을 처리하는데에 수고와 시간이 소요된다는 특징이 존재한다.
데이터의 양이 늘어나면서 전통적인 TDB로는 취급할 수 없을 만큼의 대량의 데이터가 쌓이게 되었고, 이를 처리하기 위해 새로운 기술들이 필요했다.


대표적인 빅데이터 기술

Hadoop

‘다수의 컴퓨터에서 대량의 데이터를 처리’하기 위한 시스템

  • 수백 수천대의 컴퓨터가 동시에 처리를하는 구조가 필요하였고 이를 관리하기 위하여 만들어진 시스템
  • 구글에서 개발된 분산처리 프레임워크인 MapReduce를 참고하여 제작됨
  • Hive가 개발되면서 Haddop에서도 SQL과 같은 쿼리언어를 사용할 수 있게 되었다.
  • 전통적인 데이터 처리를 위한 데이터 웨어하우스와 비교하여 확장성이 뛰어나 빠르게 늘어나는 데이터 처리를 담당한다
    • 일부 중요한 데이터, 작은데이터는 데이터 웨어하우스에서 처리

      NoSQL

      RDB의 제약을 제거하는 것을 목표로 한 데이터베이스의 총칭. 다양한 종류가 있다
  • Document store : Json 과 같은 복잡한 데이터 구조를 저장하는 DB
    • MongoDB
  • Key value store : 다수의 키와 값을 관련지어 저장하는 DB
    • Redis
  • Wide column store : 여러 키를 사용하여 높은 확장성을 제공하는 DB
    • Cassandra

방대하게 증가하는 데이터에 대하여 현실적인 비용으로 데이터를 처리할 수 있게 하는 위의 두 기술을 조합하면서 NoSQL에 기록하고 Hadoop으로 처리하는것이 현재 빅데이터 처리 방법이다.

클라우드 처리를 위한 데이터 기술

클라우드 보급으로 인하여 빅데이터 처리를 위한 환경을 구축하는 것이 매우 쉬워졌다
아래에는 클라우드 기반의 서비스 리스트이다

서비스 특징
Amazon Elastic MapReduce 클라우드 Hadoop
구글 BigQuery 데이터 웨어하우스
Azure HDInsight 클라우드 Hadoop
Amazon Redshift 데이터 웨어하우스

빅데이터 관련 단어

데이터 파이프라인

데이터를 수집하고, 처리하는 데이터의 모든 흐름을 지칭한다

데이터 수집

데이터 파이프라인의 첫부분. 말 그대로 데이터를 수집하는 것을 지칭한다
데이터 수집방식은 크게 벌크(Bulk)형, 스트리밍(Streaming)형 두가지가 존재한다

  • Bulk
    • 전통적으로 과거에서 부터 축적된 데이터나 기존의 DB에서 데이터를 추출하는 방식
    • 규모가 크거나 높은 신뢰성이 요구될 때 사용된다.
    • ETL을 이용
    • 데이터 웨어하우스에서의 처리 방식
  • Streaming
    • 모바일 어플리케이션이나, 임베디드 장비등을 이용하여 계속해서 데이터를 생성하여 수집하는 형태
    • IoT같은 장치에서 많이 사용된다.
    • 네트워크를 통하여 수집되기 때문에 통신의 오버헤드가 커 Message Broker를 사용하여 저장

Stream & Batch 처리

기존의 데이터 웨어하우스를 통하여 처리하는 경우 Bulk 형태의 수집과 동시에 데이터를 처리했지만, 빅데이터의 세계에서는 스트리밍형 방식으로 데이터를 수집하는것이 주가 되었고 이를 실시간으로 처리하기 위한 방법들이 만들어지기 시작했다

  • Stream 처리
    • 실시간으로 데이터를 처리하는 방식
    • 데이터가 시스템에 도착할때마다 바로바로 처리를 해준다
    • 장치 모니터링, 고장탐지 등
  • Batch 처리
    • 일정 기간단위의 데이터를 분석, 처리하는 방식
    • 특정시간 단위로 대량의 데이터를 한번에 분산처리를 수행한다
    • 주간 단위 추천시스템 등

분산 스토리지

여러 컴퓨터와 디스크로 부터 구성된 스토리지 시스템

  • 오브젝트 기반 스토리지
  • 파일 기반 스토리지 (구형)

분산 데이터 처리

분산된 스토리지에 저장된 데이터를 처리하는것

  • 쿼리 엔진 : Hive 등
  • ETL 프로세스 (데이터 웨어하우스를 경유)

Workflow 관리

매일 정해진 시간에 배치 처리를 스케줄 대로 실행하고, 오류가 발생할 경우 관리자에게 알리는 등의 목적을 가진 기술


데이터 파이프라인

데이터 파이프라인에서는 다음과 같이 크게 3가지의 데이터가 모이는 장소가 존재한다

데이터 웨어하우스

  • Data + WareHouse(창고). 말그대로 데이터를 모아두는 창고이다.
  • 대량의 데이터를 장기 보존하는 것에 최적화 되어있다.
  • 서버와 같은 곳에서 추출하여 필요에 따라 가공한 데이터들이 저장된다
  • 소량의 데이터를 자주 읽고 쓰는데는 적합하지 않다
  • 데이터 웨어하우스는 전체 프로세스에서 중요한 처리에 사용되기 때문에 분석과 같은 목적인 경우 필요한 데이터를 추출하여 데이터 마켓으로 넘겨 분석한다

데이터 레이크

빅데이터 시대에 모든 데이터가 웨어하우스에 들어가는것의 가정해서 만들어지지 않기 때문에 호환되지 않는 데이터가 존재하여 이를 커버하기 위해 고안된 데이터 저장소

  • 모든 데이터를 원래의 형태로 저장해두고 필요에 따라 가공하는 구조를 구현하기 위해 존재한다.
  • 임의의 데이터를 저장할 수 있는 분산스토리지가 이용된다.
  • 대부분 CSV나 JSON 등의 범용적인 텍스트형식을 사용한다

데이터 마트

  • 가공된 데이터들을 모아서 데이터 분석을 진행하는 장소

Walrus 연산자


이 글은 파이썬 코딩의 기술(브렛 슬라킨 지음)을 읽고 정리하는 글입니다.

Walurs 연산자란?

대입식 이라고 하며 파이썬의 고질적인 코드중복 문제를 해결하기 위해 3.8에 새로 도입된 구문이다. 아래와 같이 사용한다.

1
a := b

바다코끼리를 연상시켜서 walrus라고 한다. :=

기능

일반 대입문이 사용되지 못하는 위치에서 변수에 값을 대입할 수 있다.

  • while, if문의 조건식
    이를 통하여 코드의 길이를 줄이고 가독성을 높여 두마리 토끼를 잡을 수 있다

예시

일반적인 while break 문

1
2
3
4
5
6
while True:
flag = get_flag()
if flag:
break
else:
# Task 코드

walrus를 사용한 while문

1
2
while flag := get_flag():
# Task 코드

reference

cudatoolkit 버전별로 관리하기


Anaconda를 이용한 환경별 Cuda Version 관리

  1. conda-forge 채널을 추가
    • nvidia 에서도 받을수 있지만 다운로드 속도 이슈가 존재하여 conda-forge가 안정적임
1
conda config --append channels conda-forge
  1. cudatoolkit 설치
    • 원하는 버전의 cudotoolkit 설치
1
conda install cudatoolkit=[Version] -c conda-forge
  1. cudatoolkit-dev 설치
  • cuda Version에 따른 사용 채널 명
    • 11.x : conda-forge
    • 10.2 : trenta3
1
conda install cudatoolkit-dev=[Version] -c [Channel]

여기까지 진행하면 conda에서 설정되지 않았던 nvcc가 동작한다.
추가적으로 환경별로 다른버전의 cuda Version을 사용할 수 있다.

부스트 캠프 ai tech 13~14주 OCR - 1


OCR

  • Text라는 단일 Class에 대하여 예측을 하는 Task
  • 위치를 검출하는 Text Detection과 내용을 인식하는 Text Recognization으로 나뉠 수 있다

일반적인 Object Detection Task와의 차이

Text Image Data의 특성상 일반적인 Object Detection과는 아래과 같은 차이를 가진다

  • Object의 높은 밀도
    • Data 특성 상 연속적인 Line에 여러가지 word가 존재하고 그 line이 붙어서 반복하기 때문에 일반적인 Object Detection에 비해 매우 높은 밀도를 가진다
  • 극단적인 Ratio
    • 언어에 따라서 띄어쓰기가 아에 존재하지 않거나 긴 단어들이 존재하기 때문에 Ratio가 극단적이다
  • 특이한 모양
    • 구겨짐
      • 글자들이 종이같은 평면에 존재하는 경우가 많고, 휘어지거나 구겨지는 경우도 다수 존재하기 때문에 object의 영역도 구겨지면서 특이한 모양을 가진다
    • 휘어짐
      • 간판등 디자인적 부분으로 인하여 휘어진 영역을 가지는 경우도 존재한다
    • 세로 쓰기
  • 객체의 특징
    • 같은 글자라도 큰 크기편차가 존재할 가능성이 높음
    • 객체 영역이 모호함

OCR 모델은 위의 특징들을 고려하여 만들어 져야 한다

OCR Model

Base Model

OCR 모델은 크게 2가지 방법으로 글자 영역을 예측한다

  1. Regression-based
    • 이미지를 입력받아서 글자영역 표현값을 출력하는 단순한 방식
    • 사각형으로 출력하기 때문에 불필요한 영역을 포함하고, 정확도가 떨어지는 한계가 존재
    • Anchor Box의 범위를 벗어나는 영역에 경우 측정 정확도가 떨어진다
      • 글자 객체가 가지는 극단적인 Ratio를 제대로 반영하지 못하는 경우가 많음
  2. Segmentation-based
    • 이미지를 입력받아서 화소단위로 정보를 뽑고 후처리를 통하여 글자 영역의 표현값을 확보
    • Post-processing과 후처리가 필요하기 때문에 Regression-based에 비하여 연산량이 많다
    • 서로 간섭이 있거나 인접한 개체간의 구분이 어렵다
  3. Hybrid 방식
    • 위의 두가지 방법을 혼합하여 예측하는 방식
    • Regression을 통하여 대략적인 영역을 탐색하고, Segmentation-based로 화소정보를 추출하여 세부적인 영역을 결정하는 방식을 취한다
    • MaskTextSpotter

Task Based

  1. Character-Based
    • Charater 단위로 검출
  2. Word-Based
    • Word 단위로 검출

reference

Week13 - Day 4 Review


오늘 한 일

  • batchsize에 따른 모델 성능변화 실험
    • Batch normalize가 존재해서 batchsize에 영향을 받을 것이라고 생각
    • 실제로 좋은 결과는 나오지 않았다
  • 알고리즘 1문제 풀기

2. 피어세션에서 한 것

  • Augmentation 선택에 관하여 팀원들과 회의

3. 하루 느낀점

  • 이번에는 신박한 결과를 찾으면 좋겠다

4. 앞으로 해야 하는 일

  • 삶의지도 작성
  • 이력서 초안 완성하기!! (5월 1일 전까지)
  • 카카오 인턴 대비 코테 공부 다시 시작하기
  • 해야하는일 우선순위를 정해서 정리해보기

Week13 - Day 1~3 Review


1~3일 동안 한 일

  • 대회 준비
  • WarmUpMultiScale lr Scheduler 코드 작성
  • 공개데이터셋 수집
  • East 모델 개요 학습
  • 라벨링 70장정도 한 것 같음

2. 피어세션에서 한 것

  • 내일 대회 준비를 위한 사전 회의

3. 하루 느낀점

  • 이번에도 Data Centric 하게 한번 놀아보자
  • 다양한 방식을 시도해 보고싶다.

4. 앞으로 해야 하는 일

  • 삶의지도 작성
  • 이력서 초안 완성하기!! (5월 1일 전까지)
  • 카카오 인턴 대비 코테 공부 다시 시작하기
  • 해야하는일 우선순위를 정해서 정리해보기

Week12 - Day 4 Review


오늘 한 일

  • 대회 마무리
  • github 코드 정리
  • 작업한 내용 정리 및 글 작성

2. 피어세션에서 한 것

  • 마지막 제출을 앞두고 정리

3. 하루 느낀점

  • 아쉽게 4등으로 끝났다
  • 다음 대회에서는 더 좋은 성적을 거두고 싶다
  • 적당히 작은 모델로 학습을 진행했지만 그래도 시간이 많이 걸렸기 때문에 완전히 작은모델 + image size를 줄여서 빠른 학습을 시키고 학습시간을 줄이는 전략으로 수정할 생각이다