Apple Detection(Edge AI) - Compare

류창훈·2024년 3월 20일
0

딥러닝

목록 보기
7/9
post-thumbnail

저번 글에 이어서 쭉 가겠습니다.



사실 안드로이드 어플 하나 만들어서 Test Results 비교 결과도 같이 봐볼까 했는데, 파이썬 만으로는 딥러닝 탑재 어플 만들기에는 어느정도 한계가 있어서

그냥 parameter 측면에서 비교 하겠습니다.


def inception_module(x, filter_config):
    (filters_1x1, filters_3x3_reduce, filters_3x3, filters_5x5_reduce, filters_5x5, filters_pool_proj) = filter_config

    path1 = layers.Conv2D(filters_1x1, (1, 1), padding='same', activation='relu')(x) 

    path2 = layers.Conv2D(filters_3x3_reduce, (1, 1), padding='same', activation='relu')(x) 
    path2 = layers.Conv2D(filters_3x3, (3, 3), padding='same', activation='relu')(path2) 

    path3 = layers.Conv2D(filters_5x5_reduce, (1, 1), padding='same', activation='relu')(x) 
    path3 = layers.Conv2D(filters_5x5, (5, 5), padding='same', activation='relu')(path3) 

    path4 = layers.MaxPooling2D((3, 3), strides=(1, 1), padding='same')(x) 
    path4 = layers.Conv2D(filters_pool_proj, (1, 1), padding='same', activation='relu')(path4) 

    return layers.concatenate([path1, path2, path3, path4], axis=-1)




input_shape = (28, 28, 3)
input_layer = layers.Input(shape=input_shape)

x = inception_module(input_layer, filter_config=(64, 96, 128, 16, 32, 32))

x = layers.MaxPooling2D(pool_size=(2, 2))(x)

x = layers.Flatten()(x)


x = layers.Dense(64, activation='relu')(x)
x = layers.Dense(2, activation='softmax')(x)

이게 제가 짠 계층입니다.

TensorFlow 라이브러리를 사용했고, GoogleNet을 착안했습니다.

Inception 모듈이랑 같이 GoogleNet 살짝 따옴. 아주 살짝


Conv계층과 Dense 계층 두가지 계층을 나눠서 parameter 계산을 해보도록 하겠습니다.





Conv계층


Conv 계층 parameter 계산은

parameter 수 = (Filter Height x Filter Width x input channel 개수 + 1) x Filter 개수


이런식으로 계산을 할 수 있습니다.


그러면 차근차근 계산을 해보자면...

path1: (1 x 1 x C_in + 1) x 64
path2: ((1 x 1 x C_in + 1) x 96) + ((3 x 3 x 96 + 1) x 128
path3: ((1 x 1 x C_in + 1) x 16) + ((5 x 5 x 16 + 1) x 32
path4: ((1 x 1 x C_in + 1) x 32


여기서 C_in은 입력 채널 수를 말하고, RGB 채널이기 때문에 3 입니다.


그래서 쭉 계산기 뚜들기며, 곱하기 더하기 반복하면 총 124384의 parameter가 나옵니다.





Dense계층


Dense 계층 parameter 계산식은

parameter = (입력 유닛 수 + 1) x 출력 유닛 수

이렇게 구성이 됩니다.


여기서 또 봐보면, 총 두개의 Dense 계층을 가지고 있는데,

Dense1: (Flatten 유닛 수 + 1) x 64
Dense2: (64 + 1) x 2

요런식으로 구성되게 됩니다.

총 위의 출력 계층이 64이어서 저렇게 넣고,

MaxPooling 계층에서 절반 사이즈로 줄어든다는 가정 하에, 28 x 28 크기의 이미지에서 14 x 14 사이즈로 reduce.

Flatten 하면 14 x 14 x 256 = 50176


그러므로,

Dense1: (50176 + 1) x 64
Dense2: 동일하게 (64 + 1) x 2



쭉 다 합하면,

124384 + (50177 x 64) + (65 x 2) = 3335842

총 parameter 값은 3335842이 됩니다.



저 논문에서는 YOLOv3-Tiny를 사용했는데, 이게 대략적으로 8.5백만 개의 parameter 값을 갖고 있다고 합니다.

parameter 측면에서는 매우 간소화 됐다고 할 수 있습니다.





Qualitative 적인 증명을 포함해서 좀 더 제대로된 증명을 하고 싶었는데,
현재 단계에서는 공부가 좀 부족해서 그런지 이런 체계적인 증명이 어려운 것 같습니다.


경량화 파트는 참 어려운 길이구나 싶으면서 이쪽 분야로 공부를 제대로 하고 싶다는 생각도 같이 듭니다.

다음에는 공부 더 해서 좀 더 제대로된 증명으로 찾아뵙겠습니다.




감사합니당 ~ 🦾




https://github.com/Ryuchanghoon/app-practice-Python
profile
Linear AI Developer입니다.

0개의 댓글

관련 채용 정보