2018년 10월 25일 목요일

[요약] 밑바닥부터 시작하는 딥러닝 (Deep Learning from Scratch)

Deep-learning 기반의 face detection & recognition 개발을 위해 deep-learning 기술의 기본이 되는 용어 및 관련 내용을 우선 정리하도록 합니다.


1. Python 설치

Python을 설치하는 다양한 방법이 있지만, 일반적으로 Anaconda 배포판 이용을 권장한다. 본인은 가장 최신의 Anaconda 버전을 설치했다.



2. 퍼셉트론(Perceptron)

퍼셉트론은 다수의 신호를 입력받아 하나의 신호를 출력하는 것을 의미한다. 그림 2-1은 입력 2개의 신호를 받는 퍼셉트론의 예이다. 그림 2-1의 원을 뉴런 또는 노드라고 부른다.


x1, x2는 입력신호, y는 출력신호, 그리고 w1, w2는 가중치를 뜻한다. 퍼셉트론에서 가중치의 설정은 사람에 의해서 수동으로 설정해야 한다.


3. 신경망(Neural Network)

신경망은 그림 3-1과 같이 표현할 수 있다. 퍼셉트론과 비슷하지만, 가중치 매개변수의 값을 입력 데이터로부터 자동으로 학습하는 능력이 있다.


그림 3-1에서 가장 왼쪽 줄을 입력층, 맨 오른쪽 줄을 출력층, 중간 줄을 은닉칭(hidden layer)라고 한다.  은닉층의 뉴런은 사람의 눈에는 띄지 않는다.


3.1 활성화 함수(Activation Function)

입력신호의 총합을 출력신호로 변환해주는 함수를 의미한다. "활성화"라는 이름이 의미하듯 활성화 함수는 입력신호의 총합이 활성화를 일으키는지를 정하는 역할을 한다.




3.2 시그모이드(Sigmoid) 함수

신경망에서 가장 많이 사용하는 활성화 함수이다. 식과 그래프는 아래와 같다.




3.3 ReLU(Rectified Linear Unit) 함수

최근에는 ReLU 함수를 활성화 함수로 주로 이용한다. ReLU는 아래 그림과 같이 입력이 0을 넘으면 그 입력을 그대로 출력하고, 0 이하면 0을 출력하는 함수이다.



3.4 출력층 설계

3.4.1 항등(Identity) 함수

회귀에서 사용하는 함수로 입력과 출력이 항상 같다는 뜻의 항등이다. 그래서 아래 그림과 같이 출력층에서 항등 함수를 사용하면 입력신호가 그대로 출력신호가 된다.

3.4.2 소프트맥스(Softmax) 함수

분류에서 주로 사용하는 함수로 그림과 같이 출력층의 각 뉴런은 모든 입력신호에 영향을 받는다. 특히, 소프트맥스의 출력은 0에서 1사이 실수를 가지며 확률로 해석할 수 있다.



3.5 배치 처리(Batch Process)

다수의 입력을 하나로 묶은 데이터를 배치(batch)라고 합니다. 배치 처리는 큰 배열로 이뤄진 계산을 수행하는데, 컴퓨터에서는 큰 배열을 한번에 계산하는 것이 작은 배열을 여러번 계산하는 것보다 효율적입니다.



4. 신경망 학습

신경망의 특징은 데이터를 보고 학습할 수 있다는 것이다. 데이터에서 학습한다는 것은 가중치 매개변수의 값을 데이터를 보고 자동으로 결정한다는 것을 의미한다.

4.1 훈련 데이터와 시험 데이터

기계학습 문제는 데이터를 훈련 데이터시험 데이터로 나누어서 학습과 실험을 수행한다. 우선, 훈련 데이터만 사용하여 학습하면서 최적의 매개 변수를 찾고, 그 다음 시험 데이터를 사용하여 훈련된 모델의 성능을 평가한다.

*오버피팅(Overfitting) 하나의 데이터 셋에만 지나치게 최적화된 상태를 의미한다. 오버피팅 피하기는 기계학습의 중요한 과제이다.


4.2 손실함수(Loss Function)

신경망 학습에서는 현재 상태를 하나의 지표로 표현한다. 그리고 그 지표를 가장 좋게 만들어주는 가중치 매개변수의 값을 탐색하는 것이다. 신경망 학습에서는 손실함수를 사용하며, 일반적으로 평균 제곱 오차교차 엔트로피 오차를 사용한다.


*미니배치(mini-batch) 학습 신경망 학습 시, 데이터 전체가 아닌 일부를 추려 근사치로 이용하여 학습을 수행하는 것을 의미한다.


*매개변수 갱신 미니배치의 손실함수 크기를 줄이기 위해 각 가중치 매개변수의 기울기(즉, 수치미분)를 계산하고, 손실함수의 크기를 작게 하는 방향으로 가중치 매개 변수를 조금씩 갱신한다. (ex., SGD, 모멘텀, AdaGrad, Adam)


*오차역전법(back-propagation) 가중치 매개변수의 기울기를 효율적으로 계산하는 방법


*가중치 초기값 초기값을 무작위로 설정하는 것이 필요하다. Xavier, He(ReLU에 특화된 초기값) 등을 사용한다.


*배치 정규화(Batch Normalization) 신경망의 각 층이 활성화를 적당히 퍼뜨리도록 강제하는 방법으로, 학습 속도가 빠르고 초기값에 크게 의존하지 않으며 오버피팅을 억제하는 것이 특징이다.


*드롭아웃(Dropout) 오버피팅을 억제하기 위해 뉴런을 임의로 삭제하면서 학습하는 방식으로 앙상블 학습과 비슷한 효과를 나타낸다.




5. 합성곱 신경망(Convolutional Neural Network, CNN)

CNN은 이미지 인식과 음성 인식 등 다양한 곳에서 사용된다. 특히, 이미지 인식 분야에서는 딥러닝을 활용한 기법은 대부분 CNN을 기초로 한다.
CNN의 네트워크는 기존 신경망 구조와 비슷하지만, 합성곱 계층(convolutional layer)과 풀링 계층(pooling layer)이 새롭게 등장한다.


5.1 합성곱 연산

영상처리에서 말하는 필터 연산을 의미한다. 종종, 필터는 커널이라고도 한다.
합성곱 연산은 필터의 윈도우를 일정 간격으로 이동하면서 입력 데이터에 적용하여 입력과 필터에서 대응하는 원소끼리 곱한 후 그 총합을 계산한다. (그림 7-3 참조)




5.2 패딩(Padding)

합성곱 연산을 수행하기 전 입력 데이터 주변에 특정 값으로 채우는 것을 의미한다. 주로 출력의 크기를 조정할 목적으로 사용한다.




5.3 스트라이드(Stride)

필터를 적용하는 위치의 간격을 의미한다. 예를 들어, 스트라이드를 2로 하면 필터를 적용하는 윈도우가 두 칸씩 이동한다. (그림 참조)



5.4 3차원 데이터의 합성곱 연산

일반적으로 영상은 [가로x세로x채널]의 3차원 데이터이다. 아래 그림과 같이 채널쪽으로 특징 맵이 여러 개 있다면 입력 데이터와 필터의 합성곱 연산을 채널마다 수행하고, 그 결과를 더해서 하나의 출력은 얻는다.




5.5 풀링 계층

풀링은 가로, 세로 방향의 공간을 줄이는 연산이다. 아래 그림과 같이 2x2영역을 원소 하나로 집약하여 공간 크기를 줄인다. 일반적으로 풀링의 윈도우 크기와 스트라이드는 같은 값으로 설정한다.




2018년 10월 18일 목요일

WinUSB Tryout

WinUSB 장치 Descriptor 설정


선행조건

  • Windows 7+
    • WinUSB 장치 설정은 Windows 7 부터 지원이 가능하다. (참고)
    • 다만 Windows 10에서와 같이 driver 설치 없이 사용하지 못할 수도 있다. 그렇다고 하더라도 기존과 같이 driver(inf 파일만 필요) 를 작성하여 쓸 수 있으니 걱정할 필요는 없다.
  • USB 2.1+
    • USB 2.1을 지원하지 않는 환경에서는 사용에 제한이 발생할 수 있다.
      • USB 2.0의 경우 MS OS Descriptor v1.0을 사용해 장치를 설치할 수는 있으나, 알수 없는 장치로 표시된다.
      • 장치 클레스를 인식할 수 있도록 도와주는 BOS (Binary Object Store) Descriptor는 USB 2.1 이후에서 지원되기 때문이다.

개발 방법 (Cypress EZ-USB 기준)

  • EZ-USB FX2LP를 사용해 구현이 가능하므로 이를 이용해 개발환경을 만들어보자.
  • 준비물
    • EZ-USB Suite (EZ-USB FX3 SDK에 포함됨 - 링크)
    • SDCC compiler (링크)
      • SDCC 버전이 호환성에 영향을 줄 수 있다. FX2LP 칩셋에서 테스트에 성공한 버전은 3.0.0이다. 오래된 버전들은 32bit 버전만 있으므로 참고.
    • Cygwin
      • 사실상 필수요소는 아니지만 Makefile 작성 및 빌드 시에 발생하는 자질구레한 문제들을 피할 수 있는 가장 쉬운 방법이다.
    • Cypress EVK 또는 호환 보드
  • Workflow (USB enumeration) 의 이해
    • USB 장치가 연결되면 통상 다음과 같은 절차를 거쳐 장치가 인식된다.
      1. Get Device Descriptor (80 06 00 01 00 00 FF 00)
      2. Set Address (00 05 25 00 00 00 00 00)
      3. Get Device Descriptor (80 06 00 01 00 00 {length} 00)
      4. Get Configuration Descriptor (80 06 00 02 00 00 FF 00)
      5. Get String Descriptor (80 06 EE 03 00 00 12 00): "MSFT100"
      6. Get String Descriptor(s) (80 06 {index} 03 00 00 FF 00): [0] = language, [1~], Device Descriptor 또는 interface descriptor에서 참조하고 있는 string index만큼
      7. Set Configuration (00 09 01 00 00 00 00 00)
    • Device Descriptor에서 USB 2.1을 지원한다고 보고하게 되면 4번 단계에서 'Get BOS Descriptor'를 수행한다.
      • 1~3
      • Get BOS Descriptor (80 06 00 0F 00 00 FF 00)
      • 5~7
      • Get MS Extended Compat ID OS Feature Descriptor(C0 21 00 00 04 00 10 00): header를 읽어옴
      • Get MS Extended Compat ID OS Feature Descriptor(C0 21 00 00 04 00 {length} 00)
      • Get String Descriptor(s) [1~]
      • Get Device Status
    • 참고: 
  • Enumeration 단계에서 알 수 있듯, BOS 및 MS Extended Compat ID Feature Descriptor 등은 USB 2.1 연결에서만 획득할 수 있다.
    • BOS (Binary Object Store) Descriptor
      • 여러가지 기능을 구현하는데 사용할 수 있겠지만, 여기에서 관심있는 것은 device capability 항목이다.
      • Device capability는 연결된 장치에서 어떤 일을 할 수 있는지를 알아내기 위한 것인데, Windows XP SP2에서부터 사용되어 왔다.
      • 5 가지 capability가 정의되어 있는데 다음과 같다.
        1. Wireless
        2. USB 2.0
        3. Super speed (3.0)
        4. Container ID
        5. Microsoft OS 2.0 descriptor (Windows 8.1 이상에서만 지원)
      • Container ID 및 MS OS 2.0 descriptor를 이용해 연결된 장치에 사용될 드라이버를 Windows에서 결정하도록 할 수 있다.
        • Windows 개발자 센터(링크)에서도 간단히 설명이 되어있지만, 큰 기대는 하지 말자.
        • Microsoft OS Descriptors Overview(링크) 문서에 더 자세한 내용이 나와있지만, USB Complete 5th edition과 같은 참고자료가 훨씬 도움이 된다.
        • Microsoft OS descriptor는 driver (.inf) 파일에 정의되어 있는 내용들을 장치에서 직접 제공할 수 있도록 고안된 표준이다. 1.0에서 다소 제한적이었던 것을 2.0에서 개선하여 composit device의 경우에도 별도 설치 과정이 완전히 제거되도록 했다.
    • Extended Compat ID
      • 장치가 어떤 인터페이스로 연결 가능한지를 정의한다. 예를 들어 WinUSB의 GUID는 (.inf ClassGuid 항목과 같음)  {88BAE032-5A81-49f0-BC3D-A4FF138216D6}로 정해져 있는데, BOS descriptor 내의 Platform Capability descriptor에 정의해 WinUSB 드라이버가 자동으로 선택되도록 할 수 있다.
      • USB 2.0의 경우 Container ID (bDevCapability = 4)에 같은 값을 입력해도 비슷한 효과를 볼 수 있는데, 알수 없는 장치로 표시된다. (확인 필요)
    • Microsoft OS 2.0 Descriptor
      • 다중 인터페이스 환경에서 장치의 인터페이스를 획득하는데 사용할 수 있는 "DeviceInterfaceGUIDs" 항목을 포함하는 복잡한 구성도 가능하지만 (arduino WebUSB project 참조), 아래와 같은 단순한 구성도 가능하다. (사실, MS OS 2.0 descriptor 대부분의 내용이 UniCode 문자열로 구성되어 있어 프로그램 용량이 지나치게 커지는 문제가 있다)
    MSExtDscr:
    ; Microsoft OS 2.0 compatible ID descriptor (table 13)
    .db 0x28, 0x00, 0x00, 0x00 ; dwLength: 40
    .db 0x00, 0x01 ; bcdVersion: 0x0100 (Version 1.0)
    .db 0x04, 0x00 ; wIndex: 4 (Extended compat ID descriptor)
    .db 0x01 ; bCount
    .db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; reserved
    .db 0x00 ; bFirstInterfaceNumber
    .db 0x00 ; reserved
    .db 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00 ; "WINUSB"
    .db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    .db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    MSExtDscr_End:
    

2018년 10월 13일 토요일

Arduino MKR Vidor 4000 - Getting Started

Arduino MKR Vidor 4000 Getting Started


Arduino 측에서 꽤 친절한 소개(링크)를 해주고 있지만 뭔가를 처음 해보려고 할 때 정작 중요한 몇 가지 절차는 설명하고 있지 않다.
아마도 보드 소프트웨어가 안정되기 전에는 이런 조치들이 임시방편이기 때문일거라 짐작해 본다.
  1. 현상 1: 스케치 업로드가 계속 실패한다.
    • 처음 Vidor 보드를 연결하면 (또는 리셋 스위치를 더블클릭)HDMI포트로 아두이노 로고가 출력된다.
    • 이렇게 예제를 로드하지 않아도 HDMI화면으로 나타나는 로고는 프로그래밍을 시작하기 위한 상태로 진입했음을 나타낸다. 붉은색 LED가 4~5초 주기로 디밍된다.
    • 예제를 업로드했음에도 불구하고 원하는 결과가 나오지 않는 경우가 많아 무척 당황스러울 수 있는데, 보드의 부팅 모드가 두 가지(프로그래밍/실행 모드)로 나뉘어 있음을 알고 있었다면 전혀 이상할 것이 없다. (설명이 잘 되어있었다면 이렇게 까지 혼란스러울 일도 없었겠건만...)
  2. 현상 2: 샘플 업로드가 성공하게 되면 돌연 시리얼 포트를 사용할 수 없다는 오류들이 발생한다.
    • 이는 보드 상태가 프로그래밍 모드에서 실행 모드로 전환되었음을 보여주는 현상이다. 통상은 실행 모드로 진입하면 붉은색 LED가 꺼진다.
    • 이 모드에서는 프로그래밍이 불가하며 스케치를 업로드하면 오류가 발생하게된다. (프로그래밍 모드로 전환되면서 시리얼 포트 번호가 바뀌는데, IDE에서 이를 처리하지 못해 이런 현상이 발생한다.)
  3. 현상 3: 샘플 업로드도 성공하고 모드 전환도 제대로 되었는데, 여전히 원하는 동작(예: VidorEnableCam 예제를 실행하면 HDMI 화면으로 카메라 영상이 출력)이 이루어지지 않는다.
    • 여기에서 제대로 된 결과를 보기 위해서는 또 하나의 트릭이 필요하다. 업로드된 스케치는 '자동'으로 실행되지 않는다.
    • 동작 모드에서 프로그램이 실행하기 위해서는 트리거가 입력되어야 한다. 이해하기 힘들지만(버그인 듯), 시리얼통신이 수립되는 것을 신호로 프로그램이 시작되는 것으로 보인다.
      • 가장 간단한 방법으로 스케치를 성공적으로 업로드 한 뒤에 Arduino IDE에서 Serial monitor를 오픈하는 것으로 트리거를 줄 수 있다.
하루 빨리 소프트웨어가 안정되고 FPGA 프로그래밍이 가능해지길 기다려본다.

2018년 10월 12일 금요일

STM32F40x study

F/W 문제로 부팅이 되지 않거나 기기가 벽돌이 된 경우 아래 내용을 참고해보자. BOOT1/BOOT0핀을 0/1 상태로 세팅하면 flash 부팅을 이용하지 않기 때문에 디버거를 사용할 수 있을 것 같다. (Core205R 보드의 경우 아래(⑤)와 같이 BOOT CONFIG 스위치(BOOT0 제어)가 제공되는데, 바꿔봐야 소용 없다 ㅡ.ㅡ)



RM0090 Reference Manual p.69 참조

2.4 Boot configuration

  • Due to its fixed memory map, the code area starts from address 0x0000 0000 (accessed through the ICode/DCode buses) while the data area (SRAM) starts from address 0x2000 0000 (accessed through the system bus). The Cortex®-M4 with FPU CPU always fetches the reset vector on the ICode bus, which implies to have the boot space available only in the code area (typically, Flash memory). STM32F4xx microcontrollers implement a special mechanism to be able to boot from other memories (like the internal SRAM).
  • In the STM32F4xx, three different boot modes can be selected through the BOOT[1:0] pins as shown in Table 2.

Table 2. Boot modes

Boot mode selection pins Boot mode Aliasing
BOOT1 BOOT0
x 0 Main Flash memory Main Flash memory is selected as the boot space
0 1 System memory System memory is selected as the boot space
1 1 Embedded SRAM SRAM is selected as the boot space


[Scrap] Zero to Hero: Guide to Object Detection using Deep Learning: Faster R-CNN,YOLO,SSD

Zero to Hero: Guide to Object Detection using Deep Learning: Faster R-CNN,YOLO,SSD https://cv-tricks.com/object-detection/faster-r-cnn-yo...