2/09/2019

Python OpenCV 예제들

1.  Python 기반으로 OpenCV 관련 예제 

Python을 가지고 OpenCV를  사용했을 때 참조했던 예제들이며, 예제구성과 설명이 너무 잘 되어있어 괜찮아서 이를 기반으로 구현 했으며, 많이 참조하였다.

필독 (readthedoc 기반구성)


  • Historgram 보기 및 Historgram Equalzation  
이때 나의 주의 관심사는 Histrogram과 Historgram Equalzation이였으며, 이를 쉽게 분석가능
  https://opencv-python.readthedocs.io/en/latest/doc/19.imageHistograms/imageHistograms.html#mask
  https://opencv-python.readthedocs.io/en/latest/doc/20.imageHistogramEqualization/imageHistogramEqualization.html

2/07/2019

Deep Learning 의 기초자료 수집 (CNN)

1. Deep Learning 부분 자료 수집 

오늘 Meetup의 Data Science 모임을 다녀와서 Deep Learning에 관련된 용어 및 관련구조 흐름을 파악하고, 관련된 부분을 정리한다.
최근에, Machine / Deep Learning에 대해 알기 위해서 자료수집을 비롯하여, 관련내용들을 정리하기로 하였다. 

  • CNN(convolutional neural network)
Deep Learning하게 되면 꼭 듣게되는 CNN 설명이며, Wiki 설명이 잘되어있다. 

합성곱(Convolution)을 좀 더 이해하고자 하면, 동작원리를 알면, 쉽게 상위 CNN부분도 이해가 간다.
구지, Deep Learning 이 아니여도, DSP에서도 Audio/Video에서도 사용되는 것이므로, 반드시 기본개념은 이해해야한다.
아래의 그림예제가 있으니, 쉽게 이해가 갈 것이라고 생각되어진다. 

  • Tensorflow Colab 기반으로 실습 및 설명
최근에 다시 찾은 것으로 설명 및 실습이 너무 잘되어있다. 


  • 2D Convolutions 의 기본동작 
Convolutions 의 동작을 보면 아래와 같이 좌측 Input 과 Filter 역할을 하는 Kernel 과 최종 Output로 볼 수 있다. 
좀 확대해서 생각하면 Filter 개념으로도 생각해도 될꺼 같다. 

https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1

  1. Input 5x5 Matrix (청색)
  2. Kernel 3x3 Matrix  
  3. Output 3x3 Matrix  (Weight의 합으로 특징을 추출, 녹색)

좌측청색은 Input 이며, Kernel(Weight)이 합성곱(Convolution)을 이용하여, 슬라이드로 움직이면서 Output(Weight 합) 추출 

Kernel 
0 1 2
2 2 0
0 1 2

  • 2D Convolution 의 Padding (확장)
2D Convolution 기본동작시 Kerenl을 Input의 양끝까지 적용하여 사용하려고 하면 Padding 문제가 생기는 것으로 보인다. 
  1. Input 5x5 Matrix
  2. Kernel 3x3 Matrix
  3. Output  5x5 Matrix 
결과적으로 Output 즉 특징을 3x3 -> 5x5로 확장하고자 할때 사용하는 것으로 보인다
Kernel을 순차적으로 움직이면, Kernel 과 동일한 Output은 3x3이지만, Padding하여, 확장한다. 
아래를 보면 Input 과 Output Matrix가 동일하다. 
물론 Input의 Padding으로 양끝의 오차는 발생할 것이며, 이를 감수하고 사용할 것 같다.  

https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1

  • 2D Convolution 의 Striding (축소)
상위기본에서 Output 즉 특징을 3x3에서 2x2로 축소하고자 할때 사용하는 것으로 보인다. 
원래대로 하면, Output은 Kernel과 동일한 3x3 으로 나와야 하지만,한 번 건너 뛰어서, 이를 축소한다. (3x3->2x2)
  1. Input 5x5 Matrix
  2. Kernel 3x3 Matrix
  3. Output  2x2 Matrix 


  • 영상에서 특징추출
상위 자료를 보면서 이전에 Camera의 Bayer Pattern 이 기억이 나면서 각 그림들이 쉽게 이해가 간다. 
재미있는 것은 아래와 같이 Edge도 추출도 하고,  추출된 Feature들을  Visualzation도 가능하다고 하는데, 그 부분이 많이 흥미로웠다.

  1. 좌측 Input 
  2. 중간 kernel 
  3. 우측 Output

Convolution 의 이해 내용출처 

  • CNN의 사용되는 구조 및 용어파악
MNIST의 CNN(Convolutional Neural Network)의 구조인 것으로 보이며, 상위 사이트 설명과 많은 부분이 중복되지만, 쉽게 설명이 되어있어 쉽게 CNN을 이해했다. 

Batch Size 부터 각 용어들을 설명해주어 쉽게파악 
AI에 관련된 기술 및 관련내용이 많다고 해서 가입하고 관련내용들을 보고 있다. 
  https://www.kaggle.com/
  https://developers.ascentnet.co.jp/2017/11/24/kaggle-process-review/
  https://en.wikipedia.org/wiki/Kaggle
  https://www.kaggle.com/c/titanic/kernels


  • Data Pipeline 의 구조 (BigData)
Cloud 기반으로 BigData를 수집하고 이를 Piple Line형태로 연결하여 빠르게 데이타를 연결하고 Deep Learning를 학습한다.
  https://www.dativa.com/best-practice-data-pipeline-architecture-in-2018/
  https://docs.aws.amazon.com/ko_kr/datapipeline/latest/DeveloperGuide/what-is-datapipeline.html
  https://cloud.google.com/solutions/big-data/?hl=ko

  • AWS/Azure/Google  DATA  Pipe line
  https://aws.amazon.com/ko/datapipeline/
  https://docs.microsoft.com/ko-kr/azure/hdinsight/spark/apache-spark-creating-ml-pipelines
  http://www.ciokorea.com/news/39248
  https://cloud.google.com/data-science/?hl=ko
  https://aws.amazon.com/ko/blogs/korea/get-started-with-deep-learning-using-the-aws-deep-learning-ami/

  • DATA Pipeline 한글자료
  https://www.slideshare.net/deview/236-67609108
  http://slides.com/openstack/sktechx11th#/

  • xgboost
다른 한 외국 친구가 아래 것을 자꾸 언급하면서 최적화 및 관련사항을 문의하고 하는데,  이해하지 못해 아래와 같이 관련자료만 수집한다.
  https://brunch.co.kr/@snobberys/137
  https://xgboost.readthedocs.io/en/latest/

  • Bigdata 의 Data Visualization
처음 visualization이 OpenCV이나 이런 Vision 관련부분을 처리하는 기능의 의미하는 줄 알았는데, 관련모임에서 만난 친절한 다른 외국인이 자세히 설명해주어 이해하기가 쉬었다.
일단, Deep Learning System Training 혹은 Inference를 하게 되면, 이를  확인 및 검증을 위해서 수치화 및 통계 자료가 필요한데, 
이를 쉽게 그래프 및 다양한 차트로 이를 보여주는 기능이다.

Tensorflow에서 Data Visualization 하면 Tensorboard라고 생각하면 될 것 같다.
  https://en.wikipedia.org/wiki/Data_visualization

  • Data Visualization에서 많이 사용되어지는 Zepplein
제플린은 Android에서도 많이 들어보고, Spark에서도 들어보고, 여러군데에서 사용이 되어지는것 같은데, 
Data Visualization을 위해서 많이 사용되어지는 것 같으며, 나중에 설치해서 한번 이용해보자.


오래전에 자료 모은 것 과 같이 어떤 구조로 동작이 되는지 어떻게 임베디드에 적용이 되는지를 확인을 해야 겠다.
현재 파악된 것은 상위 Data pipe line을 가진 Server에서 AI모델을 Training을 하며, 생성을 하는데, 
이때 많은 데이타를 이용하기위해서 배우는 것이 Big data 이며, 이런 Data들의 흐름을 연결하는 것이 Pipeline이다. 
내가 Server가 있다면, 각각 아래와 같이 구성을 해야 할 것 같으며, 마지막에 Jupyter로 연결하여 구성하면 될 것 같다. 

  • Bigdata
  1.   Hadoop
  2.   Apache Spark
  3.   Apache Zeppelin
  4.   https://jupyter.org/

일단 라즈베리파이에서 소스를 Download하여 구성을 해보자.
골치아픈 딥러닝
 https://github.com/tensorflow/tensorflow
 https://gitlab.com/inverseai/tensorflow/tensorflow

Getting Started with TensorFlow for Raspberry Pi
 https://www.youtube.com/watch?v=ukkNek46h_8

How to Set Up TensorFlow Object Detection on the Raspberry Pi
 https://www.youtube.com/watch?v=npZ-8Nj1YwY

Detect ANY Object with Raspberry Pi and TensorFlow
 https://www.youtube.com/watch?v=zqIBce4LKx8


  • Gitlab의 다중화자 음성합성 엔지 소스 및 관련자료 
Tensorflow로 구성이 되어있는데, 지금 나의 실력으로는 이해를 하지 못하겠다. 
추후 음성을 Text로 변경해야할일 있을때 다시 보도록 하자. 
  https://git.quendi.moe/public-archive/multi-speaker-tacotron-tensorflow

  • Machin Learning 기본학습자료 
처음 기초부터 각 모델에 대한 설명을 비롯하여 잘 설명해주고 있어서 좋다. 

  • Colab
Google에서 무료로 제공해주는 Jupyter로 간단하게 테스트하고 사용하기가 쉽다
  https://colab.research.google.com/notebooks/welcome.ipynb

  • Jupyter notebook
  https://dataninja.me/ipds-kr/python-setup/
  https://jupyter.org/
  https://datascienceschool.net/view-notebook/f9d9fddb7cc7494a9e4be99f0e137be0/

2/05/2019

MNIST 관련자료

1. MNIST 의 기본이해 


가장 기본이되는 Neural Network로 MNIST는 Tensorflow를 가던, Keras를 가던 가장 기본이되는 학습이며,  Hello World 처럼 이 구조를 이해를 해야, 
CNN이든 다른 구조를 이해하기가 쉽다.

  • 기본동작
  1. 28 픽셀 의 정사각형으로 데이타 입력  28x28 = 784  Pixel로 구성 
  2. 이 정사각형에 입력된 데이타를 각 단계를 걸쳐 최종 각 0~9의 숫자로 인식 

1의 경우 아래의 28x28 =784 Pixel 로 표시되며 이는 Matrix로 보면 다음과 같다. 



  • 전제조건
칼라가 아닌 흑백이며 명암구분됨 (Gray Scale)

  • MNIST의 모델 구조  및 동작 
  1. Input Layer는 상위 Matrix와 일치 (총 784 Pixel 구성)
  2. Hidden Layer1(renu)는 128 Node로 구성 (Hidden Layer의 Node구성 변경가능)
  3. Hidden Layer2(renu)는 64 Node로 구성  (Hidden Layer의 Node구성 변경가능)
  4. Output Layer(softmax) 10 Node로 classfication 구성되며, 이곳에서 숫자선택됨 (다중 선택도 가능)
  5. 상위 선택된 10개 중 다시 최종 확률이 높은 것으로 결정 

아래의 구조를 MLP(MultiLayer Peceptron)이라고 하며 이는 CNN의 기초라고 하는데, 각 함수들을 이해하도록 해야겠다. 
동작방식은 각 Layer를 걸쳐 특징을 추출하여, 이를 최종선택되는 구조이다. 
최종 선택시 사용되는 것이 Activation Function 이며, 아래와 같이 각 ( Softmax/Sigmoid/Relu) 사용되어진다. 

  • Activation Function
Weight, Bias를 적용되어진 상태에서 어느 기준에서 On/Off를 하는 것이라고 생각하면 될꺼 같다. 
그러므로, 각 함수의 특징을 어느 정도는 인지를 하고 있어야 할 것으로 보인다. 
쉽게 생각하면,  Threshold 를 어디에 어떻게 적용하는 역할이 될 꺼 이기 때문인 걸로 생각되어진다. 


  • 기본 MNIST 모델 구성확인 
Activation 함수로 Sigmoid 대신 ReLu를 사용했으며, 변경해서 사용해도 된다. 
https://mxnet.apache.org/versions/1.3.1/tutorials/python/mnist.html


세부설명 및 참조 


1.1  Weight 의 Matrix 구성방법

각 Layer를 연결할때 필요한 것이 Weight 와 Bias 이며, 이를 Matrix 형태로 구성하여 Feature를 추출한다고 한다. 
Input 과 Weight Matrix를 구성하는 방법이며, 쉽게 생각하면 행렬(Matrix)를 어떻게 해서 Faeture를 추출할지를 구성하는 방법이다. 


  • Weight 의 Matrix 의 구성방식
  1. Feature를  Column 로 구성 
  2. Feature를  Row로 구성 

  • Feature as Column 방식 
  1. Column: Feature ( Weight 곱)
  2. Row: Sample 의 갯수 (각 Node)
상위 X들은 Sample 즉 각 Node의 갯수 



  • Feature as Row 방식 
  1. Column: Sample의 갯수 (각 Node)
  2. Row: Feature



  • Matrix의 기본동작과 구성방식 
  1. Feature as Column 방식  :  X * W  + B 
  2. Feature as Row 방식       : W * X  + B
Feature의 위치에 따라 상위와 같이 Weight의 위치가 변경이 되어진다. 


  • Matrix 로 Weight 와 Bias 결합
각 Layer는 Weight의 합으로 연결되어  Activation 함수를 걸쳐 최종 Output Activate를 결정함
Activation 함수: Sigmoid /ReLu 등 다양함



1.2  Feature as Column 방식 Matrix 예제 


각 Layer 구성이 다음과 같이 구성이 되어있다고 생각하고, 각 Layer0 과 Layer1을 Matrix로 연결해보자. 




  • 2개의 Layer Feature as Column 방식으로 연결 
  1. Layer0:  4 Node  
  2. Layer1:  6  Node  

Layer0의 Input Node 4 와 Weight는 반드시 동일 

Layer1 의 Output Node 이므로, Output Node 6개는 Bias와 동일하게 맞춤

최종 Layer 0 과 1의 구성되는 Matrix 
이곳에 최종 Activation 함수만 적용하면된다.
 


상위 각 Matix의 구성 살펴보자 (Red: X , Blue: W , Green:B/Y)




상위그림을 보고 쉽게 이해하자.

Weight/Bias 의 Matrix 의 이해 


1.3 MNIST의 의 Matrix 구성과 Bias 의 필요성

상위 맨위의 MNIST를 각 Layer 중 Input Layer 와 Hidden Layer1을 Matrix로 구성을 보도록하자.

  • MNIST의 Input Layer와 Hidden Layer1 연결 
  1. Input Layer:  784 Node
  2. Hidden Layer1: 128 Node
구성으로 될 것이며, 이를 상위와 같이 Matrix를 구성하면 상위를 참조하여 구성한 후 ReLu로 최종 Activation을 하면된다. 

  • Bias 의 필요성
처음 Bias의 필요성에 대해서 왜 사용하는지 몰랐으나, 지금까지 이해한 것으로는 단지 offset이 아닌 Activation의 최종 Threshold를 조절하기 위해서 보정값으로 봐야 할 것 같다. 

  • Activation 함수들 과 Bias
더불어 Activation 함수들이 많은데,  왜 이 많은 함수들을 사용하는지 완벽히 이해하지 못했지만, 짐작으로 보면,  
각 Activation 함수의 각 동작의 조건이 달라지기 때문으로 보인다. 
예를들면, 각 x의 range에 따라 y의 range 범위의 변경이 되던가 혹은 함수마다 range, 범위가 다른것이 존재하여 이를 목적에 맞게 사용하는 것으로 보인다. 
더불어 bias는 이곳에 offset으로 범위(range)의 위치를 변경하여, 최종 Threshold 값을 결정하여 on/off를 결정하는 것으로 보인다. 
 
  • Weight 와 Bias 와 Activation 
  1. Weight: 각 Neuron에는 Weight , 즉 가중치값이 존재하며, 이는 각 특징을 추출
  2. Bias:  일종의 최종 offset 이며, Activation 값에 영향을 미쳐 변경 
  3. Activation:  Machin Learning에서 On / OFF 를 결정하는 함수로 각 특성이 있음
    1. Sigmoid
    2. ReLu
    3. Softmax 등 다양함 

  • Matrix 구성으로 본 Weight와 Bias 
  1. Input Layer:  784 Node
  2. Hidden Layer1: 128 Node

상위 예제로 간단하게 Matrix를 구성해보도록 하고 Weight 와 Bias를 넣어보자.
  1. W:  Weight                     784x128구성 
  2. X:  Input Node (Sample)    784 구성하지만, 옆으로 구성 
  3. B:   Bias                         128 구성 (Output과 항상 동일)
  4. Y:  Output Node (Result)   128 구성되며 최종 Activation 함수 적용(ReLu)



Matrix Input/Output 구성방법 
Layer간에 Input /Output Node의 갯수의 구성을 맞추기 위해서 Matrix를 수정 


두 Layer 간의 구성 
  1. Weight 와 Input 적용          (W1 * X1 + W2* X2 + ... W64 * X64)
  2. Bias 적용                          (W1 * X1 + W2* X2 + ... W64 * X64) + B1
  3. Activation 적용         Active( (W1 * X1 + W2* X2 + ... W64 * X64) + B1 )

Weight 와 Bias를 넣은 후 최종 Softmax 연산 



각 Activation 함수들 특징들은 아래 링크 참조 

ReLU
Activation Function으로 일정값 이상이면, On이 되어 동작 

Softmax

Softmax vs Sigmoid 


  • Get started with TensorFlow's High-Level APIs (Google I/O '18)
Colab에 대해서 나오며, 설명을 보면 MNIST 관련부분과 CNN 설명해주고 있다. 
  https://www.youtube.com/watch?v=tjsHSIG8I08

  • Tensorflow의 MNIST 설명 
기본 MNIST

CNN을 이용한 MNIST