Home 딥러닝 영상처리
Post
Cancel

딥러닝 영상처리

To-do:

  • Yann LeCun LeNet-5 논문 읽어보기

    권고 도서

  • 대니얼 콴 생각에 대한 생각
  • 인공지능 교과서: 스튜어트 러셀의 인공지능 1: 현대적 접근방식(AI: Modern Approach)
  • 정통파: 비숍의 패턴인식과 머신러닝(Pattern Recognition and Machine Learning)

  • 오바마의 디지털 참모: 신호와 소음

    NeurIPS 2019에서 소개된 System 1, System 2

  • NeurIPS 2019에서 소개된 “System 1”과 “System 2”의 개념은 인지 심리학의 이론을 인공지능에 적용한 것
  • 이 이론은 다니엘 카너먼의 저서 “생각에 관한 생각(Thinking, Fast and Slow)”에서 비롯되었는데, 여기서 그는 인간의 사고 과정을 두 가지 시스템으로 나눈다
  1. System 1 (시스템 1):
    • 이는 빠르고 직관적인 사고를 담당
    • 자동적이고 무의식적인 반응과 결정을 포함하며, 일상적인 상황에서 빠른 판단이나 간단한 문제 해결에 활용
  2. System 2 (시스템 2):
    • 느리고 논리적인 사고 과정
    • 의식적이고 주의를 요하는 작업, 복잡한 계산, 논리적 추론, 비판적 사고 등에 관여

NeurIPS 2019에서는 이러한 개념을 인공지능에 적용하여, 시스템 1과 같은 빠르고 직관적인 결정을 내리는 알고리즘과, 시스템 2처럼 더 복잡하고 계산이 많이 필요한 문제를 해결하는 알고리즘을 연구하고 개발하는 데 초점을 맞췄습니다. 이는 인공지능이 인간처럼 다양한 유형의 문제를 해결하고, 더 복잡하고 유연한 방식으로 사고할 수 있게 하는 데 목적을 두고 있습니다.

이러한 접근 방식은 인공지능이 단순히 데이터와 알고리즘에 의존하는 것을 넘어서, 인간의 사고 방식을 모방하여 더욱 직관적이고 창의적인 해결책을 제시할 수 있게 돕습니다.

LeNet-5

  • 1998년 Lecun
  • 특징: 레이어가 많지 않기 때문에 Relu activation function을 안써도 문제가 생기지 않음

Code:

keras:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from keras.models import Sequential

from keras.layers import Conv2D, AveragePooling2D, Flatten, Dense

#Instantiate an empty model

model = Sequential()

# C1 Convolutional Layer
model.add(Conv2D(6, kernel_size=(5, 5), strides=(1, 1), activation='tanh', input_shape=input_shape, padding='same'))

# S2 Pooling Layer
model.add(AveragePooling2D(pool_size=(2, 2), strides=2, padding='valid'))

# C3 Convolutional Layer
model.add(Conv2D(16, kernel_size=(5, 5), strides=(1, 1), activation='tanh', padding='valid'))

# S4 Pooling Layer
model.add(AveragePooling2D(pool_size=(2, 2), strides=2, padding='valid'))

# C5 Fully Connected Convolutional Layer
model.add(Conv2D(120, kernel_size=(5, 5), strides=(1, 1), activation='tanh', padding='valid'))

#Flatten the CNN output so that we can connect it with fully connected layers
model.add(Flatten())

# FC6 Fully Connected Layer
model.add(Dense(84, activation='tanh'))

# Output Layer with softmax activation
model.add(Dense(10, activation='softmax'))

# print the model summary
model.summary()

torch:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import torch
import torch.nn as nn
import torch.nn.functional as F

class MyCNN(nn.Module):
    def __init__(self):
        super(MyCNN, self).__init__()
        # C1 Convolutional Layer
        self.conv1 = nn.Conv2d(1, 6, kernel_size=5, stride=1, padding='same')
        # S2 Pooling Layer
        self.pool1 = nn.AvgPool2d(kernel_size=2, stride=2)
        # C3 Convolutional Layer
        self.conv2 = nn.Conv2d(6, 16, kernel_size=5, stride=1, padding='valid')
        # S4 Pooling Layer
        self.pool2 = nn.AvgPool2d(kernel_size=2, stride=2)
        # C5 Fully Connected Convolutional Layer
        self.conv3 = nn.Conv2d(16, 120, kernel_size=5, stride=1, padding='valid')
        # FC6 Fully Connected Layer
        self.fc1 = nn.Linear(120, 84)
        # Output Layer
        self.fc2 = nn.Linear(84, 10)

    def forward(self, x):
        x = F.tanh(self.conv1(x))
        x = self.pool1(x)
        x = F.tanh(self.conv2(x))
        x = self.pool2(x)
        x = F.tanh(self.conv3(x))
        # Flatten the output for the fully connected layer
        x = torch.flatten(x, 1)
        x = F.tanh(self.fc1(x))
        x = self.fc2(x)
        return F.softmax(x, dim=1)

# Create the model instance
model = MyCNN()

# Print the model summary (You'll need to provide a sample input size for this)
from torchsummary import summary
summary(model, (1, 28, 28))  # Assuming input shape is (1, 28, 28) for MNIST dataset

AlexNet

  • winner of ILSVRC 2012

Novel features of AlexNet

  • RELU activation function
  • dropout layer
  • data augmentation
  • training on multiple GPUS
    • GTX580 with 3G MEmeory

AlexNet 병렬 처리:

TOP-1, TOP-5 error

  • class percentage 중 탑 1에 들어가는지, 탑5에 들어가는지
1
2
3
4
5
6
1 Cat: 70%
2 Dog: 20%
3 Horse: 5%
4 Motorcycle: 4%
5 Car: 0.6%
6 Plane: 0.4%

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# Instantiate an empty sequential model

model = Sequential(name="Alexnet")

# 1st layer (conv + pool + batchnorm)

model.add(Conv2D(filters= 96, kernel_size= (11,11), strides=(4,4), padding='valid', kernel_regularizer=l2(0.0005),

input_shape = (227,227,3)))

model.add(Activation('relu')) #<---- activation function can be added on its own layer or within the Conv2D function

model.add(MaxPool2D(pool_size=(3,3), strides= (2,2), padding='valid'))

model.add(BatchNormalization())

# 2nd layer (conv + pool + batchnorm)

model.add(Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), padding='same', kernel_regularizer=l2(0.0005)))

model.add(Activation('relu'))

model.add(MaxPool2D(pool_size=(3,3), strides=(2,2), padding='valid'))

model.add(BatchNormalization())

# layer 3 (conv + batchnorm) <--- note that the authors did not add a POOL layer here

model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='same', kernel_regularizer=l2(0.0005)))

model.add(Activation('relu'))

model.add(BatchNormalization())

# layer 4 (conv + batchnorm) <--- similar to layer 3

model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='same', kernel_regularizer=l2(0.0005)))

model.add(Activation('relu'))

model.add(BatchNormalization())

# layer 5 (conv + batchnorm)

model.add(Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), padding='same', kernel_regularizer=l2(0.0005)))

model.add(Activation('relu'))

model.add(BatchNormalization())

model.add(MaxPool2D(pool_size=(3,3), strides=(2,2), padding='valid'))

  

# Flatten the CNN output to feed it with fully connected layers

model.add(Flatten())

  

# layer 6 (Dense layer + dropout)

model.add(Dense(units = 4096, activation = 'relu'))

model.add(Dropout(0.5))

  

# layer 7 (Dense layers)

model.add(Dense(units = 4096, activation = 'relu'))

model.add(Dropout(0.5))

# layer 8 (softmax output layer)

model.add(Dense(units = 1000, activation = 'softmax'))

  

# print the model summary

model.summary()


VGGNet

  • 2014년 옥스퍼드 대학의 Visual Geometry Group이 만듬
  • 구성:
    • 16 weight layers
    • 13 convolutional layers
    • 3 fully connected layers
    • Convolutional layers
      • 3 x 3 kernel-sized filters
      • 1 stride
      • 1 padding value
    • Pooling layers
  • 바닐라 CNN와 가장 비슷한 구조

RCNN

This post is licensed under CC BY 4.0 by the author.

Docker 실습

Men in Black readme file