Flashback을 지원하지 않는 메인보드를 수리했던 경험을 공유한다.

 

BIOS Flashback 기능 없이 BIOS가 망가졌을 때(BIOS Corrupted)는 어떻게 수리할까?

보통 시중에 판매하는 5천원짜리 롬 찝개(?)와 CH341A 프로그래머, 더 필요하다면 3.3V to 1.8V 레귤레이터만 있으면 가능하다.

근데 문제는 요즘 ITX 보드가 작은 곳에 왕창 뭔가를 다 때려박는 것에 모자라 PCI-E 걸쇠 밑에 BIOS IC를 넣어버린다.... ㅡㅡ

그럼 롬 찝개가 들어갈 공간도 안나오고, 걸쇠를 썰어버리자니 아깝고, 미치고 팔짝 뛸 노릇이다.

(이런 보드는 업체 들고 가도 환대받지는 못한다.. 열풍기를 쏴서 떼자니 플라스틱 걸쇠가 녹는다.)

 

그래서 생각해 낸 것은 Intel PCH의 SPI 인터페이스를 활용하는 방법이다.

MSI Z690 UNIFY Block Diagram

OC3D에 게재된 그림을 들고와봤다. 밑에 보면 PCH가 SPI 인터페이스를 통해 TPM과 Flash를 연결하는 것을 볼 수 있다.

 

바로 MSI 홈페이지에 pdf를 하나 보고 JSPI1 port pinout과 롬라이터 pinout을 매치시켜줬다.

상당한 삽질의 흔적...

문제는 CS 부분에 FET가 있어 Chip이 select 되었다는 것을 알려줘야 했는데, 이건 쉽게 그냥 벌서는 것 처럼 칩에 직접 핀을 그대로 매치 시키니 인식에도 별 문제가 없었다. ㅎㅎ

 

저 악랄한 칩의 위치가 보이는가

인식시키고 나니 실제 플래시 시간은 4분 40초대면 모두 다 쓸 수 있었다. 확실히 프로그래머가 저속 I/O를 사용하고 있기 때문인지 Flashback이나 BIOS Flash 유틸보다 훨 느렸다.

 

결론은 성공이다. 작동에 전혀 지장없고 잘 돌아준다.

'Research & Development > Hack' 카테고리의 다른 글

SKT NUGU Candle 분석  (8) 2020.01.07

[그림 1] Raft Consensus Algorithm Operation


Cloud/Infra 분야에서 필연적으로 알아야 할 알고리즘인 Raft Consensus Algorithm에 대해 알아보자.


이 알고리즘은 매우 중요하다. 다수의 노드를 클러스터링 하는 데에 대부분 이 알고리즘이 쓰인다는 점에서이다.

Container Orchestration하는 Docker Swarm과 kubernetes에서도 이 알고리즘을 이용하여 노드를 관리한다.


Raft Consensus Algorithm은 2개의 Phase로 이루어져 있고, Leader(Master) node의 상태에 따라 Leader Election부터 다시 시작한다.

1. Leader Election (리더 선출)

2. Log Replication (로그 복제 / 나머지 노드에 데이터 반영)


첫 번째 Phase인 Leader Election을 설명하기 전에 반드시 알아야 할 내용에 대해 설명한다.


Clustering을 위해서는 마스터 노드와 마스터 노드에 의해 컨트롤되는 슬레이브 노드가 있어야 한다.

직접 정해주기도 하지만 마스터 노드에 문제가 발생하는 경우, 슬레이브 노드가 마스터 노드가 되어 서비스 요청을 정상적으로 처리해야 한다.

이 때, 필요한 것이 Distributed Consensus이다.


Distributed Consensus (분산 합의)

여러 노드 가운데에서 Leader(Master) 노드를 선출하는 합의 방식이다.


어디에서 활용되는가?

굉장히 많은 분야에서 활용된다.

대표적으로 블록체인이 있고, Hadoop / Message Queue / ZooKeeper / Kafka / Redis 등 다수 노드의 운영이 요구되는 환경에서 쓰인다.


왜 쓰는가?

쉽게 설명하자면, 모든 노드가 하나의 목적을 달성하기 위해 Consensus를 하는 것이라고 생각하면 된다.


(이 사이에 예시를 들어보았으나 부적절해 보여서 일단 지웠다.)


여러 노드가 존재하는 Distributed environment은 아래와 같은 특징을 지닌다.

Concurrency of processes: 모든 작업이 동시성을 띤다; 노드들은 서로의 일을 동시에 진행할 수 있다.

Lack of a global clock: 모든 노드들을 위한 하나의 Clock이 없다; 노드들은 서로 간 스스로 동기화되지 않는다.

Faulty processes: 작업의 오류가 발생할 수 있다; 모든 노드는 오류(고장, 데이터 손실 등)가 발생하지 않을 확률이 0%이다.

Message passing: 메시지를 전달한다; 노드들은 서로 HTTP, RPC 등을 통해 Sync/Async 로 통신한다.


이 4개의 특징을 고려해 최종적으로 노드들이 하나의 input에 대해 모두 동일한 output을 갖도록 하는 것이 Distributed Consensus의 존재 의의이다.


설명이 부족하지만...ㅜㅜ

Distributed Consensus에 대해 이 정도의 이해만 하고, Raft Consensus Algorithm에 대해 이어서 설명한다.


Phase 1: Leader Election


Leader Election은 Elect, Vote, Decide 형태로 진행된다.


[그림 2] Waiting an Election Timeout - Three nodes have a different timeouts to become a candidate of Leader


세 노드가 있다고 가정을 해보자.


이 세 노드는 150ms ~ 300ms 정도의 서로 다른 Timeout을 가지고 있다.

이 Timeout이 끝나는 노드는 자신이 Leader가 되겠음을 투표받기 위해 나머지 노드에게 알리게 된다.


[그림 3] Elect - Node C asks for a vote to the other nodes


Node C가 제일 먼저 Timeout 됐으므로, 아직 Timeout이 끝나지 않은 Node A와 B에게 Vote할 것을 Request한다.


[그림 4] Vote - Node C is waiting for being voted


Node A와 B는 Vote request를 받고 Election timeout을 리셋한다.

그리고 Node C가 Leader node가 되도록 Node A와 B는, Node C에게 Vote를 응답한다.


[그림 5] Decide - Node C has became a leader node


정상 노드의 수 - 1 만큼 Vote response를 받거나 과반수 이상의 Vote Response를 받은 노드 즉, Node C는 Leader node가 된다.

여기까지가 Leader Election 과정이다.


만약, 노드의 개수가 짝수개일 경우 발생 가능한 문제점이 존재한다.

Election timeout이 만료된 2개의 노드(Candidate)가 서로 동일하게 또 다른 2개의 노드로부터 Vote를 요청하는 경우이다.

이 경우 Candidate들은 동일한 Vote 수를 받게 되며, 이를 해결하기 위해 backoff를 가지고 다시 Vote를 요청하게 된다.

네트워크의 상태에 따라 길어야 몇 초 안에 이루어지는 Leader Election 이지만, real-time service의 경우에는 치명적일 수 있다.


이것을 Majority(대부분성; 다수결의 원칙)를 유지하기 위함이라고 이야기한다.

그렇기에, 짝수 개의 노드가 허용되더라도 인프라에 종사하는 사람들은 항상 노드를 홀수 개로 유지할 것을 권장한다.


Phase 2: Log Replication

[그림 6] Completed Log Replication process of Raft Consensus Algorithm


Election 이후 Leader node는 각 node에게 heartbeat를 통해 Append entries를 보내며, 다른 노드가 candidate될 때 까지 계속 heartbeat를 보낸다.


이 heartbeat에는 Client의 요청으로 인해 변경되는 데이터 또한 함께 담겨있어,

다른 node들이 Leader node와 동일한 상태로 동기화되어서 클러스터의 데이터 일관성(Consistency)을 유지하도록 한다.

동기화가 완료되면, Client에게 Response를 한다.


Node C가 아닌 다른 노드가 candidate 되는 조건은 Node C에 fault가 있어서 heartbeat를 보내지 못하거나,

네트워크 문제로 인해 Node A와 B가 heartbeat를 받지 못하는 경우가 있다.

만일 Node A와 B의 Heartbeat timeout이 만료될 때 까지 heartbeat를 받지 못하면, Leader election 과정의 처음부터 다시 시작된다.


제약사항

Raft Consensus Algorithm이 동작하려면, 3개 이상의 node가 필요하다. (Majority의 최소 조건이기 때문)


References

https://www.preethikasireddy.com/post/lets-take-a-crack-at-understanding-distributed-consensus

http://thesecretlivesofdata.com/raft/

https://raft.github.io/raft.pdf


nugu candle의 하드웨어 스펙이다.


 

모델명

비고 

 ap

Samsung Exynos 7570


 ram

Spectek SS256M32V01MD1LPF-107BT PB047

 

 nand

Samsung KLM4G1FETE-B041(eMMC5.1 32Gb based)1.0

 

 rom

Winbond 25q16fw 

uboot ?


분석에 앞서 펌웨어 취득을 위해 adb 및 root permission이 enabled된 recovery image를 fastboot로 live upload하려 했지만...

zimage magic error로 aarch64, arm, armhf 이미지 모두 업로드 실패하고 뱉어서 포기했다.


AI스피커 대상 UART 포트가 대부분 살아 있는 특징을 이용해보았다.

기가지니나 누구는 외형으로 드러나 있고 클로바와 카카오는 네이밍이 따로 되어있지 않아 찾아야 한다ㅜㅜ


uboot의 mmc 명령어를 활용하면 파티션 테이블을 활용한 파티션 레이아웃을 얻을 수 있다.


---

ESPRESSO7570 # mmc part


Partition Map for MMC device 0  --   Partition Type: EFI


Part    Start LBA       End LBA         Partition_Size(MB)      Name

        Attributes

        Type GUID

        Partition GUID


  1     0x              22      0x           32021      100     "fat"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   a2a0d0eb-e5b9-3344-87c0-68b6b72699c7

  2     0x           32022      0x          226021      1000    "system"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4

  3     0x          226022      0x          514001      1501    "userdata"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4

  4     0x          514022      0x          640021      600     "cache"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4

  5     0x          640022      0x          672021      100     "modem"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4

  6     0x          672022      0x          67c021      20      "efs"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4

  7     0x          67c022      0x          6ae021      100     "recovery"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4

  8     0x          6ae022      0x          6e0021      100     "misc"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4


Total partition size     : 3729 MB

Available capacity       : 208 MB


숨겨진 파티션의 경우 이미지 자체에 하드코딩 되어 있어서 펌웨어를 뜯기 전에는 모른다.

uboot에서 fastboot 돌리면 파티션정보가 주르륵 튀어나오긴 한다. 오프셋이 없어서 그렇지ㅜㅜ


펌웨어 취득은 uboot의 mmc dump x y를 통해서 진행할 수 있는데 uart로 4gb 뽑아 내는 데에 상당한 시간이 소요된다 ㅜㅜ

115200baud인데도 start/stop비트 + ascii 전달 + space 값 + offset 필드 때문에 실질적으로 4kbps정도밖에 안나오기 때문이다.

도구 만들어서 뽑았다. FTDI로 넉넉잡아 21일 정도 걸렸던걸로...


---

기기가 한대 더 생겨서...



신기하게 이 친구는 실드가 따로 없다. 보통은 차폐랑 열때문에 실드가 있던데 말이다.

chip-off하면 붙히기 어려울수 있으니 어찌저찌 와이어링 해보고 싶었으나... 실패해서 그냥 chip-off로 이미지 획득했다.

crc 떠보니 uart를 통한 dump값은 서로 동일하다.



GUID partition table에 기술된 파티션 목록이다.

일반적인 android 파티션과 동일하다.


self-signed ca 넣어서 덮어봤는데 자꾸 벽돌이 되길래...

순정 이미지를 fastboot로 밀어넣어도 벽돌이 되는 기이한 현상을 보았다 ㅜㅜ


벽돌은 아예 안켜지는게 아니라 bootup은 되는데 shell에서 hang이 걸리는 현상이다. (surfaceflinger segfault)

logcat이랑 dmesg찍어보니 system파티션 라이브러리에서 심볼을 못찾는다고 한다.

근데 심지어 찾는 심볼이 있는 파일은 문제가 없는 기기에도 없다 (?!)

* 이때 첨 알았는데 요 제품은 root permission이 기본이다.

nu110****이라고 디바이스 컨트롤(fastboot bootup, led 제어 등)하는 바이너리가 있는데 요놈이 루트를 요구한다 ㅡ.ㅡ


그래서 아예 새제품 뜯어서 바로 chip-off하고 죽은 기기 낸드에 펌웨어 덮어씌우고 rework해보았는데 잘 된다.

뭔가 exynos7570에 탑재된 fastboot가 내가 아는 fastboot가 아닌거 같다고 할 정도로ㅜㅜ

fastboot 켜고 erase -> flash 도 해보고 format -> flash 도 해보았지만 음.. 여전히 똑같은 결과...


시간이 없어서 chip-off하고 데이터 넣은 담에 볼납가지고 rework 했다.


CA injection하고 떠보니 네이버 클로바 인젝션 할 때와 똑같은 현상이다.

certification pinning 때문에 ssl encryption된게 보이지 않는 모양이다.


롬을 뜯어보고 싶긴 한데 요놈 분석은 이정도로 마무리지으려 한다. 머리가 아파오는 기기야...

AlexNet (8-layer)

Top-5 error: 15.4%

이후 Layer를 쌓는 시도가 증가

VGG (19-layer)

7.3%

GoogleNet (22-layer)

6.67%


새로운 의문점...

Q. 과연 Layer를 많이 쌓는 것이 좋은 결과를 가져오는가?

A. ㄴㄴ. ResNet Depth-152짜리가 ResNet Depth-20짜리보다 CIFAR-10에 대해 에러율이 더 안좋게 나옴

    더 높은 training error를 발생시킨 꼴

    이유: backpropagation되는 gradient가 점점 약해져서 소멸되는 문제 (Gradient vanishing)


단순히 깊게 쌓는 것이 좋은게 아님. 어떻게 이러한 문제를 해결해야 되는가..?


1. 넓게 쌓는다. (추후 설명)

2. Residual Unit(일종의 지름길)을 사용한다.


ResNet (152-layer)

3.6%

Residual unit을 사용해 Layer를 쌓아서 Backpropagation 문제를 해결


Residual Unit


Residual unit의 개념을 알아차린 사람들은 이런 과감한 시도를 함.




R-CNN (Region-based CNN)


 이미지에서 region을 추출하고 CNN함


Q. Region 추출은 어떻게 하는가? bruteforce는 cost가 너무 크지 않나?

A. CNN 이전에 개발된 Segmentation을 사용해서 쪼개보자.


그래서 나온 것이 Fast R-CNN


Fast R-CNN


  RoI (Region of Interest)를 projection시켜서 convolution network에 집어넣어 버림



파레이돌리아 (Pareidolia)


  사람이 보기에도 얼핏 대상이 아니지만 비슷하게 생겼다고 느끼는 현상

이게 NN에서도 동일하게 나타남, Alt-text generator (캡션 만들어 주는 도구)가 잘못된 Caption 생성하는 경우가 있음



Becoming fully convolutional

  하나만 Convolution하는 것은 1x1의 배열을 주욱 늘어놓은 모양새




  이를 H x W의 사이즈 인풋으로 1x1이 아닌 H/32 x W/32의 크기로 Multiple output을 낼 수 있도록 모양을 변경


-> YOLOv3의 Object detection과 같은 쾌거를 낳음



Upsampling with transposed convolution

    stride 값을 더 크게 줘서 더 넓은 output을 만들 수 있음


Output feature map


  좌측 상단부터 합쳐진 값에 따라 output feature map 작성 (stride와 kernel size에 유의)

stride값은 original size를 벌려놓는 값 (1이 가장 붙어있고, 2가 한칸 떨어짐)

kernel은 읽어오는 단위


Q. 이렇게 만든 이미지의 품질은 어떤가?

A. Grid effect가 발생함 (전에 배운 Fourier transform에서 edge가 강화되는 문제)


    이는 Low frequency영역을 날려버리면 그러한 아티팩트가 제거됨

Propagation

Forward propagation


  순차적으로 Divide and conquor형식을 따라 값을 구해나감. 역산이 쉬워짐.


Chain rule


  수학 시간에 배운 내용, 미분 결과를 짬뽕해서 최종적으로 필요한 값을 구하는 방법

Backpropagation을 구하기 위해 필요함  


Backpropagation


  역으로 전파하는것, 값을 역으로 구함. (https://youtu.be/573EZkzfnZ0?t=341)



1. Forward로 계산되어 있는 값을 이용하되, 주어진 식을 미리 최종적으로 구할 x, w에 해당하는 미분방정식으로 구해놓음



2. Chain rule을 이용해 각 미분값을 구함



3. 미분값으로부터 Chain rule을 사용하면 w와 x값을 구할 수 있음


Example) Sigmoid


  이러한 Sigmoid형태는 애써서 미분할 필요가 없다.


Graph로 그려보기


가장 오른쪽 perceptron에 해당하는 1/x의 미분값만 알면 됨.

나머지는 계속 Chain rule에 의해서 계속 곱하고 곱하고 곱하고해서 사라져버림. 결국 최종적으로 dz/dg값을 구할 수 있음

(https://youtu.be/573EZkzfnZ0?t=926)




그래서 Tensorflow에서는 모든 것이 그래프로써 그려진다.



Pattern of Backward flow

ADD(+) gate

  Gradient distributor (Gradient를 분배함)


MUL(*) gate

  Gradient switcher (선택된 곳만 Update)


MAX(최대값) gate

  Gradient router (한 쪽만 반영)


Loss Function

현재의 Classifer가 주어진 Dataset에 대하여 얼마나 좋은지 나타내는 함수



예시) Linear classifier

3개의 training example, 3개의 class


이전에도 설명했듯이, f(x, W) = xW + b (b = bias, W = weight of parameters)



prob\GT    cat    car    frog

cat            3.2    1.3     2.2

car            5.1    4.9     2.5

frog         -1.7    2.0    -3.1


GT들은 각각 3.2, 4.9, -3.1이다.



Multiclass SVM Loss 구하기


각각 개별에 대한 Loss 구하는 방법

foreach true_negative in true_negatives:

  max = max(0, true_negative - GT + 1)


cat-cat의 loss는 2.9


전체에 대한 Loss 구하는 방법

  구해진 Loss들의 합에서 N을 나눈 값: Loss over Full dataset (Average)



Q. Loss가 0인 Weight값을 찾았다면, W는 유니크한 값인가?

A. Unique하지 않다. 2W도 Loss가 0이다.


Car에 대한 Loss가 0인것으로부터 생각할 수 있음


Softmax Classifier


초기에 주어진 Unnormalized log probability가


cat

cat          3.2

car          5.1

frog        -1.7


일 때, 각 probability에 exponential을 취해서 unnormalized probability를 생성


cat        e^X

cat          3.2        24.5    

car          5.1        164.0

frog        -1.7        0.18


각 e^X 값의 비중이 얼마나 차지하는지 계산하여 probability 생성


cat        e^X        probability

cat          3.2        24.5        0.13

car          5.1        164.0       0.87

frog        -1.7        0.18        0.00


실제 probability는 -log(probability)을 취함으로써 얻어짐


cat        e^X        probability        real_probabliity

cat          3.2        24.5        0.13                    0.89

car          5.1        164.0       0.87

frog        -1.7        0.18        0.00


Q. 왜 이렇게 하는가?

A. Cost function의 미분값을 convex하게 만들어주기 위해서


Softmax vs SVM


Hinge loss 를 제거하여 0-확률 문제를 제거함



Optimization

Gradient descent

  

epoch와 Learning rate에 관계에 중요한 역할을 가짐


Convex function에 최적의 값을 찾아주는 것을 보장 (Non-convex할 경우 Local minimum에 빠짐)

대부분의 vision problem이 non-convex임


Stochastic Gradient Descent

Q. Gradient descent를 적용하기에는 데이터셋이 너무 큰 경우가 존재하는데 어떻게 하는가?

A. Mini-batch를 사용해서 Gradient descent를 수행함.

    단, minibatch는 랜덤하게 뽑고, shuffle된 값이기 때문에 weight를 정해주어야 함.


Mini-batch를 수행하는 주기를 Epoch라고 함. (pytorch에서는 DataLoader 함수를 사용하고, iteration 시킴)


Learning rate를 설정하는 방법


Gradient descent oscillations

높을 수록 Curve를 잘 타서 Local minimum에서 빠져나올 수 있음.

단, 높은 LR은 변화에 민감해서 Loss의 최소값과 최대값 사이를 크게 진동하는 경향을 보임.

낮을 수록 안정적으로 수렴, Epoch에 따라서 LR을 조절해줄 필요가 있음 (점점 낮게, 보통 이니셜은 0.1에서 점차 줄임)


적절하게 LR을 조절하면, 최종적으로 Loss가 어느 정도에 수렴하게 됨 (좋은 알고리즘의 경우 Loss가 거의 0에 수렴)



How to set the Hyperparameter

1. Dataset(전체를 Training set으로 퉁침)에 맞는 hyperparameter를 찾는다 (문제: Training data에 대해서만 완벽함)

2. Dataset을 training set과 test set으로 구별하고, hyperparameter를 찾는다.

    (과제 했던 것 처럼 trainloader와 testloader를 따로 두는 방법, 문제: 새로운 데이터의 결과가 어떻게 나올지 모름)

3. dataset을 training set, validation set, test set으로 구별하고, validation set의 결과가 좋은 hyperparameter를 찾는다.

    (Training과 Validating을 분리하는 것이 중점. 이 때, Validation set은 Train에 사용될 수 없음.)

4. Dataset을 잘개 쪼개서 Fold로 만들고 각각의 Fold에 대해 Validation set으로 삼음, 3번과 동일하게 Hyperparameter를 찾는다.

    (작은 데이터셋에 유용하지만 딥러닝에서는 잘 안쓰임)


Machine Learning의 한계

  세상에 존재하는 데이터셋들을 모두 총괄하는 Learning algorithm은 존재하지 않음 (No free lunch for supervised learning)

그러나, 문제에 알맞는 특성을 통해 알고리즘을 개발하면 성능을 극적으로 끌어올릴 수 있음.


Curse of Dimensionality


  n개의 binary variable -> 시간복잡도 O(2^d)

차원이 높아질수록 위치의 가능성이 기하급수적으로 증가하게 됨


Q. 이를 어떻게 해결하는가?

A. End-to-End learning을 통해 이미지를 전처리하고, Feature extraction을 하고... classifying을 하고...



Neural Network

Perceptron


  perceptron은 wx + b의 형태로 이루어져 있음. 여기서 w는 weight, b는 bias를 뜻함.


예시) 28x28사이즈의 input image가 들어오는 경우, x는 1 x 784로 표현될 수 있음 (Binary 형태의 1차원 배열)

이 때, w는 vector의 weight이 되므로 784 x 1로 표현될 수 있음.

wx + b의 결과로 1*784 + 784*1 + b = 1 * 1 + b


How about Multiclass?

  multiclass의 경우에는 perceptron을 추가하여 구현할 수 있음.


예시) 10개의 perceptron이라면, wx + b의 w는 Matrix of weights for each pixel로 취급됨

그러므로 W = 10 * 784 (10개의 perceptron, 10-class classification)

Result of wx + b = 1*784 + 10*784 + b


Bias를 perceptron에 변수로써 추가(fake feature)해서 bias convenience를 구성할 수 있음


Composition


  이렇게 구성된 perceptron들은 Matrix를 구성하는 일부가 되며, 이를 Layer라고 부름.


Activation Function

 해당 neural network를 Activation시킬 지 정하는 함수(perceptron). Sigmoid, ReLU등이 있음.

예시) Linear classifier에 활용


Multi-Layer Perceptron (MLP)

non-linear한 activation function들이 서로 연결된 형태

Feed-forward network라고 부르기도 함


SVM(Support vector machine)과 Perceptron의 관계

  SVM은 Class별의 margin을 극대화시키는 support vector를 알아내는 것

  근데 Perceptron은 아님, perceptron과 SVM이 classifying한다는 점은 동일함.

  

Activation Function: ReLU (Rectified Linear Unit)


f(x) = max(0, x)의 형태, ReLU를 거친 데이터는 음의 값을 가질 수 없음 (음의 데이터를 가진 NN을 deactivation함)


많은 Layer가 필요한 이유


  Low level parts에서 바퀴를 검출하고, mid-level part에서는 바퀴를 포함한 프레임을 검출하는 등

High level part에서는 이 물체가 무엇인지 prediction하도록 하려면 Multiple layer가 필요하게 됨


Q. 그럼 대체 몇개가 필요한가?

A. 그것을 정하는 것이 바로 hyperparameter이다. (NN의 넓고 깊음의 최적화 필요)


Convolution Neural Network (CNN)

CNN의 간단한 비유


  여러 가지의 경우의 수를 고려하고, 최종적으로 Decision making에 반영하는 형태.

여러 가지 경우의 수 내에도 또 다른 여러가지의 경우의 수가 존재함.


NN에 이미지를 넣으면...



  매우 많은 수의 parameter가 생성됨으로써 공간의 낭비가 심함.


Q. 이를 해결하기 위해서는 어떻게 해야하는가?

A. 1. Receptive field를 이용하기 (local neighborhood만을 찾기, Local에서 global로 expansion하는 layer가 필요함)

    2. Parameter sharing을 통해서 NN내에 존재하는 perceptron들이 사용할 weight을 동일하게 함


Convolution (합성곱)


  여러개의 필터(local perceptron = kernel)를 배우고, 합성곱을 통해 필요한 데이터만을 NN에서 취급하게 함.

hyperparameter로는 stride(얼마나 shift할 것인지), kernel size(NxN kernel)등이 있음



Convolution layer output size

(N - F) / stride + 1

Pooling Layer


  Pooling은 downscaling과 비슷한 개념으로 이해하면 됨.

Pooling에는 대표적으로 Max pooling과 average pooling이 있음


Average pooling

  stride수 만큼 shift하면서 Convolution filter(kernel)크기 내에 있는 값을 평균내어 receptive field 생성

Max pooling

  stride수 만큼 shift하면서 Convlution filter(kernel)크기 내에 있는 값 중 가장 큰 값을 통해 receptive field 생성


Receptive field의 크기

filter size (K x K), Stride (S), Pool size (K)

patch size: (P+K-S) * (P+K-S)



Overfitting problem



dropout(Layer에 포함된 일부 weight중 일부만 참여시키는 것)으로 해결



Architecture for Classification


  1. Convolution -> Local contract normalization -> Max pooling

  2. Convolution + Max pooling

  3. Fully connected layers


Recognition


인식


scene understanding의 한계와 극복

한 scene에 각각의 어떠한 장소를 대표하는 사물이 여러개 있을 경우, 잘못된 결과를 가져올 수 있음

단, 그러한 abnormal에 대해 상세하게 specify해줌으로써 올바른 recognition 결과를 얻을 수 있음


도로변만 봤을때 Urban, 도로변 뒷쪽에 성만 봤을때 Castle로써 해당 장면을 해석하기 어려움.

이때 scene이 Urban 과 Castle 그리고 몇가지 feature를 더 포함하여 학습시키면 정상적으로 recognition 가능


Sliding window approach

  recognition을 위한 window를 순차적으로 sliding하면서 찾는 것


Q. 32x32 window를 사용하면 64x64나 16x16은 못 찾지 않나?

A. 못찾는다. 그래서 Image pyramid를 사용해서 작은 사이즈부터 큰 사이즈까지 detection을 진행해야 모두 찾아낼 수 있다.


*face unlock처럼 특수 목적이 있는 애플리케이션들은 작은 window로부터 진행하며 recognition을 진행함

1개만 찾아 낸 이후로부터는 보통 크기나 큰 크기의 window를 사용할 필요가 없어지기 때문임


Image pyramid를 사용한 recognition

  32x32 -> 64x64 -> 128x128 순으로 Sliding window의 Image pyramid를 구성하고, 작은 것 부터 큰 것까지 recognition하게 되면 scene내의 검출 가능한 모든 얼굴 등을 찾아낼 수 있다.


Recognition models

1. Parts-and-shape model

  Parts만을 사용하면 shape 정보가 없어서 실제와는 다르게 recognition 할 수 있음. 그래서 shape 정보 또한 혼합형 모델로써 사용.

예시) 머리카락, 눈, 코, 입의 배치 관계 (shape)


2. Constellation model

  삼각측량법을 이용해 중요한 3파트만 이용해 분류하고 recognition함



Bag of Words

  이미지에 등장하는 Feature의 모음


Histogram에서의 Bag of words


  그림처럼, Quantization을 통해 패턴을 생성(Bag of words)하고 이들이 input image에서 얼마나 반복되는지를 recognition함

sliding window of quickpoint (얼마나 패턴이 자주 등장하는지 counting, 의미 있는 patch 만드는 것이 중요)


Patch (words)를 생성하는 방법

  K-means clustering (local patch)



Bag of words를 통한 recognition을 위해서는 Visual words를 잘 구성하기, 의미있는 patch만드는 것이 중요


Regular grid vs interest regions

  Regular grid: stride(shift)를 통해 모든 이미지를 스캔해서 feature extraction하는 것: 정보량이 많으나 느리고 Occlusion에 약함

  Interest regions: quickpoint, 특정 코너에서만 뽑기 때문에 정보를 잃을 수 있으나 Occlusion에 강함



Precision and Recall

Precision: true positive / true + false positive (아닌데 맞다고 한거)

Recall: true positive / false negatives (원래 맞는데 아니라고 한거)