Wednesday, July 18, 2018

Windows 10 High DPI 에서 Java application의 Font 조절

  • Summarize
    • 1) Find java.exe you installed. 
    • 2) Right click -> Properties
    • 3) Go to Compatibility tab
    • 4) Check Override high DPI scaling behavior.
    • 5) Choose System for Scaling performed by:
* Do the same to javaw.exe.

Tuesday, October 24, 2017

SNP 3120 네트워크 카메라 설정하기

SNP 3120 Network Camera @Ubuntu 16.04

장치 초기화

  • 기존 설정된 네트워크 카메라의 IP주소를 모르기 때문에, 장치 초기화(Reset) 필요. 
    • 하단부의 버튼을 10초 정도 누르고 있으면, 초록색 LED가 빠르게 깜빡이면서, 뭔가 재작동 하는 듯한 동작을 한다. 
    • 초기 암호
      • admin: 4321
    • 초기 IP주소
      • 192.168.1.100

네트워크 환경 설정

  • 해당 카메라와의 네트워크 통신을 위해, 클라이언트의 IP 환경 바꾸기
$ sudo ifconfig enp0s31f6 192.168.1.200 netmask 255.255.255.0 broadcast 192.168.1.1
$ ping 192.168.1.100
  • 웹브라우저에서 캡처 영상을 보거나 카메라 설정을 위한 관리 페이지 접근을 위해서, Micorsoft Silverlight 설치 필요. 
    • 하지만, MS Silverlight 가 더이상 개발 중단되면서 우분투 OS 자체를 지원하지 않음. 이에 대한 대안으로 pipelight라는 패키지를 설치해서 호환성을 이용하도록 함.
$ sudo add-apt-repository ppa:pipelight/stable
$ apt-get update
$ sudo apt-get install --install-recommends pipelight-multi
$ sudo pipelight-plugin --update
$ pipelight-plugin --enable silverlight
    • Plugin silverlight5.1 is now enabled
    • (혹시 5.0 버전을 사용한다면) $ pipelight-plugin --disable silverlight --enable silverlight5.0
      • 현재 시점에서 크롬 및 파이어폭스 최신 버전에서 더이상 Silverlight를 지원하지 않는다. 
        • 즉, 최신 버전의 브라우저에서는 User Agent Overrrider 또는 Switcher 플러그인 모두 소용 없음. 해결 방안으로는 Firefox v52 ESR 버전을 다운로드 받아서 강제 실행해야 한다. 
        • 이제, 브라우저 주소창에 다음 명령을 입력하여 설치된 플러그인 목록을 확인해 보자. 
          • about:plugins
        • Firefox를 구동하여, Silverlight의 동작을 확인할 수 있는 TEST 페이지 방문.
        • http://192.168.1.100 접근시 카메라 설정 가능함.

      RTSP 스트림 확인

        • RTSP 환경으로 스트림 영상 받아보기
          • VLC Media Player로, 네트워크 카메라로부터의 스트림 영상을 확인해 볼 수 도 있다.
            • rtsp://admin:4321@192.168.1.100/profile1/media.smp
          • python 환경에서 받아보기 위해서는, OpenCV 라이브러리 설치가 필요함.
            • 일단, python에서 다음의 명령으로 현재 설치된 OpenCV가 지원하는 라이브러리를 확인해 본다.
              • import cv2
              • print(cv2.getBuildInformation())
            • $ sudo apt-get install ffmpeg libavresample-dev libavutil-dev libavcodec-dev libavformat-dev libswscale-dev
            • 그러나, conda의 opencv, conda menpo 채널의 opencv3, apt-get을 통한 libopencv 라이브러리 설치 모두 OpenCV에 연동된 FFmpeg이 같이 컴파일되어 있지 않아 실시간 영상을 받아오거나 화면에 뿌릴 수 없음. 이에 OpenCV 소스를 직접 다운로드 받아 빌드한 뒤 cv2.so 파일을 만들어서 이용해야 함.

        Monday, October 23, 2017

        분산 파일 시스템 다루기 @CentOS

        배경

        • CentOS 환경에서 복수의 하드디스크로 DFS(분산 파일 시스템) 환경 구성하기

        HDD 설정

        • HDD 확인
          • $ vi /proc/partitions
            • 가용한 모든 파티션을 확인
          • $ df -T
            • 현재 마운트된 파티션 및 종류 확인
          • $ ls /dev/disk/by-id/
            • 가용한 모든 디스크 확인
          • $ sudo fdisk -l
            • 현재 디스크 상태 확인
            • 또는 $ sudo fdisk -l /dev/sdb
        • partitioning 
          • 2TB 이상 디스크는 fdisk에서 파티셔닝 불가; parted 사용 필요
          • $ yum install parted
            • parted 설치
          • $ parted -l
            • 현재 파티션 정보 확인
          • $ parted /dev/sdb
            • 파티션 설정
            • $$ mklabel
              • gpt
            • $$ print
            • $$ unit TB
            • $$ mkpart primary 0.0TB 4.0TB
            • $$ print
            • $$ quit
        • 디스크 타입 포맷
          • $ sudo mkfs.ext4 /dev/sdb
            • mkfs.ext4는 root 권한에서(sudo -i 또는 /sbin을 path에 설정하여) 수행 가능.
        • 포맷된 디스크를 리눅스 특정 위치(=mounting point)에 마운트
          • 디스크를 마운트 시킬 때 noatime, nodirtime 방식으로 처리하는 것이 성능 개선.
            • 파일 access가 발생하는 시간(atime)을 매번 기록하면 성능 저하되므로.
          • $ cd /
          • $ sudo mkdir -p data/1
          • $ sudo mount /dev/sdb /data/1
          • $ sudo mkdir -p /data/1/dfs/dn
          • $ sudo chown -R ksb:ksb /data/1/dfs/dn
          • $ df -kh
            • 마운트된 상태 및 사용량 확인
          • (부팅 시 자동 로딩) $ blkid 
            • (디스크 확인) $ ls -l /dev/disk/by-uuid
        • 최종 결과 확인
          • $ cat /etc/fstab
            • 마운트된 상태 확인
              • 마운트가 되어있지 않다면 UUID 확인해서 추가해야함.
          • $ reboot

          참고

          • 파일시스템
            • ex3
              • Red Hat Enterprise Linux 5 기본 파일 시스템
              • 2.3TB 이상을 지원하지 않음.
              • 서브 디렉토리 최대 개수 32,000
            • ex4
              • Red Hat Enterprise Linux 6 기본 파일 시스템
              • 최대 16TB 지원
            • xfs
              • 16TB 이상의 파일도 지원
          • 여러개 디스크 하나로 묶기
            • LVM(Local Volumn Management)
              • 각 디스크별로 LVM 물리 볼륨 설정한 뒤
              • 볼륨 그룹 생성해서 LVM 물리 볼륨 선택
              • LVM 논리 볼륨 생성한 뒤 마운트 지점 설정
          • Hadoop
            • 64MB 블록 단위로 파일 보관
            • HDFS2.0부터는 Active-Standby 지원
            • Name Node의 경우, 자체적인 3배수 복제를 통해 고가용성 지원 --> 물리적 Disk 백업 불필요
            • 리눅스의 LVM 사용 금지
            • JBOD (just bunch of disks) vs RAID
            • RAID 구성
              • Name Node는 RAID 5 (또는 여유가 된다면 10)
              • Data Node는 JBOD >> RAID 0
          • RAID
            • 0 = Striping
              • 단점: 한쪽 디스크가 깨지면, 전체 데이터를 사용하지 못하게 됨. 
              • 참고 블로그1
              • $ mdadm -C /dev/md0 -l 0 -n 2 /dev/sdb /dev/sdc
                • 2개의 하드 디스크를 raid level 0으로 md0이라는 이름으로 생성.
              • (확인) $ mdadm -D /dev/md0
                • (RAID 비활성화) $ madam -S /dev/md0
              • (포맷) $ mkfs.ext4 /dev/md0
              • (마운트) $ mkdir /mp | mount /dev/md0 /mp
              • (적절한 접근 권한 설정) $ sudo chmod -R 755 /media/New/hdfs/data
              • (적절한 접근 권한 설정) $ sudo chown -R user:user /media/New/hdfs/data
              • (부팅시 자동 마운트) $ mdadm -D -s /dev/md0 > /etc/mdadm.conf
              • (fstab에 정보 추가) $ vi /etc/fstab
          • 하둡에 새로운 하드 디스크 추가시
            • hdfs-site.xml 파일에 dfs.data.dir 부분에 새로운 마운트를 콤마로 구분하여 입력하기.
              • 예: /data/1/dfs/dn, /data/2/dfs/dn
            • 특정 data node만 사용하는 하드디스크라면 해당 data node 만 재시작. 만약, 전체 클러스터가 공유하는 하드디스크라면, dfs 자체를 재시작.

          Friday, October 20, 2017

          Narrowband-IoT (NB-IoT) 개념

          NB-IoT

          • 개념
            • = Narrowband-IoT = 협대역 사물인터넷
              • 한번 충전해서 몇 년 정도는 꾸준히 데이터를 보내줄 수 있도록.
              • (이미, GSM/LTE 망에서 수백 kbps 이하의 데이터 전송 속도와 10km 이상의 광역 서비스를 지원하지만) 더 넓은 지역을 더 오래 커버하기 위해.
            • 기존 이동통신망을 통해 저전력 광역망(Low Power Wide Area Network, LPWAN)을 지원하는 협대역 사물 인터넷 표준
          • 특징
            • 에릭슨에 따르면, NB-IoT는 단 200kHz 대역폭으로 IoT 기기 20만 대를 지원.
            • 기존 통신망의 틈새 대역으로도 충분하니 통신망 가용/충돌 걱정 필요 적음.
            • 배터리 교환 없이 최대 10년간 작동하는 IoT 모듈을 만들 수 있다고 함.
            • 유사 경쟁 기술에 비해 장점: 2016년 표준 제정 완료.
              • 저전력 IoT 기술은 NB-IoT 외에도 LoRaWAN, 시그폭스(Sigfox) 등이 있지만 이들은 호환성이나 표준 인증 관련해서 논란에 휩싸여 있음.
            • 통신업체 상용화 움직임 시작.
              • 미국 버라이즌과 T모바일, AT&T 등이 NB-IoT를 지원하는 것으로 알려져 있음.
          • 응용
            • 기존 네트워크를 활용해 넓은 지역을 커버하고 전력 소비가 적기 때문에 수도 검침, 위치 추적용 기기 등 넓은 지역에 걸쳐 다수의 기기를 설치하는 초저전력 IoT 사업 모델에 적합.
              • 스마트 주차 미터기나 이동수단 트래킹, 스마트 도둑 알리미 서비스
          • 저전력 장거리(LPWA) 네트워크 기술 비교
            • NB-IoT (3GPP)
              • 전파도달 15km; 면허대역; 150kbps; 배터리 10년
              • KT, LG유플러스
            • LoRa (비표준)
              • 전파도달 11km; 비면허대역; 10kbps; 배터리 10년
              • SKT
            • Wi-SUN (IEEE 802.15)
              • 전파도달 8~10km; 비면허대역; 300kbps; 배터리 15년
              • 짧은 시간내에, 데이터 전송량이 많고 측정 주기가 짧은 경우(예: 검침 분야)에 유용
              • 지자체 자가망 구축에 유리.
            • Sigfox

          Monday, August 21, 2017

          Docker 다루기

          Docker

          개념

          • Immutable Infrastructure
            • 호스트OS와 서비스 운영환경(서버 프로그램, 소스 코드, 컴파일된 바이너리)을 분리하고, 한번 설정한 운영 환경은 변경하지 않는다.
          • docker 이미지(실행파일) 자체는 변하지 않는다.
            • cf. 하이퍼바이저 기반 가상머신(Virtual Machine)의 이미지는 계속 변화한다.
          • docker 컨테이너를 또 다른 이미지로 만들 수도 있다.

          설치 및 삭제

          Editions

          • EE
            • 2017년 3월 2일 Docker Enterprise Edition이 announce됨
              • Basic
              • Standard, Advanced: advanced 컨테이너 관리 및 Security Scanning 기능 추가
          • CE
            • 종래 오픈소스 Docker는 Community Edition으로.
              • 매달 release: Edge 버전
              • 분기별 release: Stable 버전

          Versions

          • YY.MM 방식으로.

          How to Install @ Ubuntu 16.04 (Xenial)

          • 방안1. repository 구축
          • 방안2. 패키지(.deb) 다운로드
            • 업그레이드 필요시, 다시 다운로드 받아서 설치 필요.
            • pool/stable/ 폴더에서 amd64 선택 후 원하는 버전 선택.
              • amd64 = x64 = x86-64
              • docker-ce-17.06.1 (2017.08.18)
          • 방안3. Script 구동.

          How to uninstall

          • 패키지 삭제
            • $ sudo apt-get purge docker-ce
          • 이미지, 컨테이너, 설정파일 모두 삭제
            • $ sudo rm -rf /var/lib/docker

          사용법

          • 현재 user를 docker group에 추가
            • Docker daemon connect permission denied 문제 해결 방법
              • $ sudo usermod -a -G docker $USER
              • reboot 또는 {log out 후 다시 log in}
          • 설치 확인
            • $ docker version
          • 이미지 불러오기
            • $ docker images
            • $ docker search Ubuntu
            • $ docker pull xxxx
          • 이미지(실행파일) 실행 후 컨테이너(프로세스) 수행
            • $ docker run –it Ubuntu:14.04 /bin/bash (실행하고 그 안으로 들어감)
              • -i : 입출력 보여주도록
              • -t : 가상 터미널 환경 이용
          • 컨테이너 관리
            • $ docker ps (실행 중인 컨테이너만 보여줌)
            • $ docker ps –a (이미 종료된 것도 보여줌)
            • $ docker start (실행만 하고 들어가지 않음)
            • $ docker attach (실행한 컨테이너 안으로 들어갈 때)
            • ctrl + p + q : 실행중인 컨테이너에서 빠져나오기.
            • $ docker rm -f xxx (실행 중인 컨테이너 지우기)
            • $ docker rmi xxx (이미지 자체를 완전히 지우기)
          • 도커 내에서 GUI 이용하는 프로그램 구동하려면, (예: eclipse)
            • $ docker run 의 인자로 다음을 추가
              • -e DISPLAY=$DISPLAY \
              • -v /tmp/.X11-unix:/tmp/.X11-unix \

          참고

          Scale-invariant feature transform (SIFT) 개념

          Scale-invariant feature transform

          • computer vision에 있어, 이미지의 local feature를 식별;묘사하는 알고리즘
            • 1999년 David Lowe가 특허 출원.
              • Distinctive image features from scale-invariant keypoints (Lowe, 2004)
            • low-level feature 기반 영상 비교에 활용됨
              • 이미지 밝기(intensity) 정보의 low-level gradient가 scale-space에서 어느 방향으로 향하는 것인가만을 살펴보는 방식
              • 즉, gradient 방향성에 대한 히스토그램 특성을 128차원 벡터로 표현
          • 이미지를 feature vector 집합으로 transform.
            • each of which is invariant to image translation, scaling, and rotation, partially invariant to illumination changes and robust to local geometric distortion
          • 다음 4개 step을 통해, 특정 object에 대한 descriptor를 생성
            • Scale-space extrema를 찾기
              • difference of gaussian (DoG)를 이용하여, 의미없는 잡음을 걸러내어 강인한 feature(=extrema)을 찾아냄; 이후 이미지의 scale을 바꿔가면서 동일한 작업을 수행.
              • 즉, 입력 이미지의 scale이 달라지더라도 동일하게 코너점(코너성이 로컬하게 극대이면서 임계값 이상인)으로 검출되는 점을 찾기. -< image pyramid에서 Laplacian(2차 미분값의 합)을 이용하여 급격한 밝기 변화가 일어나는 곳을 찾아냄.
            • Key-point localization & filtering
              • 의미있는 정보들만을 추출.
            • Orientation 할당
              • gradient 방향에 따른 histogram 이용.
            • Descriptor 생성
          • 단점
            • 경계값의 연결, 물체의 일부분이나 전체에 대한 mid/high-level feature에 대해서는 식별할 수 없음.
            • 속도가 느림
            • 원래의 SIFT는 흑백 영상에만 적용 가능; 이후 HSV-SIFT, OpponentSIFT, HueSIFT, W-SIFT, rgSIFT 등이 제안됨.

          Other

            Saturday, August 19, 2017

            Variational Autoencoder 개념

            Variational Autoencoder

            Paper

            Original paper

            Tutorial paper

              References and tutorials

              • Manifold hypothesis
                • Generative model 및 deep learning 자체가 기반하고 있는 개념; 즉, 고차원의 실제 데이터($X$)를 저차원의 표현(representation, $Z$)으로 나타낼 수 있음.
              • Auto Encoder
                • encode: Input -> Hidden
                  • 입력 데이터가 적은 수의 뉴런으로 압축(encoding, dimensionality reduction)된다고 간주되며, 의미있는 특징을 뽑아내는 과정으로 이해됨.
                  • (PCA가 선형적인 한계를 가지는 반면,) AE는 non-linearity 및 뛰어난 차원 축소 능력을 가진다.
                • decode: Hidden -> Output
                • label이 필요없이, 입력 데이터 만으로 파라미터 값을 결정하는 un-supervised learning.
                • hidden layer가 여러 계층 누적된 구조를 stacked autoencoder라고 부름.
                  • 누적 계층을 인해 capacity가 늘어나면서, 훨씬 다양한 함수 표현이 가능하다고 함. 또한, 해당 구조를 학습하기 위해서, greedy layer-wise training(각 계층별로 단계적으로 탐욕스럽게 학습)을 수행함.
              • Variational Inference
                • 복잡한 densities를 단순하게 근사하는(approximating) 기법 
              • Kullback Leibler (KL) divergence
                • 두 개의 분포, P와 Q가 일치할 때가 zero이고, 일치하지 않으면 항상 양수(non-negative).
              $$D_{KL}(P||Q) = \int p(x)log\frac{p(x)}{q(x)}$$

              Concept

              • X에 대한 Z의 연산식에 확률 $P_{\theta}(X|Z)$을 추가 적용해 보자! 즉, X와 Z를 random variable로 다루자.
                • 즉, 종래의 Auto Encoder가 단순히 Linear Regression에 의해 X를 구했다면, VAE는 Probability를 함께 이용해보자는 것임.
                  • 이러한 확률 모델을 기반으로, confidence bounds를 이용할 수 있음
              • 이제 MLE를 활용해서 각 Z에 대한 X를 잘 찾아내보려고 하는데(즉, $p_{\theta}(x)$를 극대화하기 위해), 다음 식에서처럼 intractable posterior를 구하기 어렵다.
              $$ \arg\max_\theta \left [ p_{\theta}(x) = \int_{z}p_{\theta}(x, z) = \int_{z}p_{\theta}(x|z)p_{\theta}(z) \right ] $$
              • 이제 variational inference를 이용하여 복잡한 확률분포를 단순한 확률분포로 근사치를 계산하자.
              $$q_{\phi}(z|x) \approx $ p_{\phi}(z|x)$$
              • log MLE에 대한 식을 풀어보면 다음과 같다(논문의 식1, 식2). 따라서, evidence $p_{\theta}(x)$의 lower bound를 구할 수 있으며, 이제는 ELBO를 최대화한다. 이 때, 제일 아래 식의 $q_{\phi}(z|x)$에 관한 monte carlo sampling에 의해 estimation을 구할 수 있다고 함. 한걸음 더 나아가면, 논문의 식3을 통해 ELBO에서 KL-divergence term을 한번 더 분리해 냄으로써, 보다 variance를 줄일 수 있다고 함.

              Tuesday, August 15, 2017

              Gradient, Jacobian, Hessian, Laplacian, eigenvector, eigenvalue 개념

              요약

              • Gradient : (다변수 함수 f에 대한) 각 변수에 대한 1차 미분
              • Jacobian : 1차 미분
              • Hessian : 2차 미분
              • Laplacian: 2차 편미분값의 합

              Gradient

              • (다변수 스칼라 함수 f에 대한) 1차 미분을 통해, 함수 f의 값이 가장 가파르게 변하는 방향 및 크기(=기울기)를 표현
                • 어떤 함수를 local하게 linear approximation할 경우
                • gradient descent 방식으로 최소값(또는 최대값) peak를 찾을 경우
                • 영상 입력의 edge 및 edge 방향을 찾을 경우.

              Jacobian

              • Jacobian matrix: the matrix of all first-order partial derivatives of a vector-valued function (= 다변수 벡터 함수에서의 1차 미분값을 나타내는 행렬
                • 미분 기울기를 구할 때, $\Delta x$ 후의 $y$값을 선형 근사하여 예측하는 것과 비슷한 원리
                • 복잡하게 얽혀있는 식을 (미분을 통해 linear approximation시킴으로써) 간단한 근사 선형식으로 만들어주는 것
                • 비선형 연립방정식의 해를 구할 때도 활용됨.
              • Gradient는 단일 변수 함수의 1차 미분을 다변수 함수로 확장한 개념이라면, Jacobian은 이를 다시 다변수 벡터 함수로 확장 적용한 개념임.
              • 벡터 함수 vs 스칼라 함수
                • 벡터 함수: 결과값이 다차원인 함수
                • 스칼라 함수: 결과값이 1차원 값인 함수
                  • 스칼라 = 크기만 있고 방향을 가지지 않는 양

              Hessian

              • 함수의 곡률(curvature)를 나타내는 행렬
                • 2차 편미분값의 행렬
                • symmetric matrix(=편미분의 순서가 바뀌어도 결과 동일)이므로, 항상 고유값 분해가 가능; 서로 수직인 n개의 고유벡터를 가짐.
              • 함수의 1차 미분값이 0이 되는 지점(=critical point=stationary point=peak)의 종류가 {saddle point, 극대점, 극소점} 중 어떤 종류인지를 구별하기 위해, 2차 미분값을 구하여 계산할 수 있음
                • critical point에서 계산한 Hessian matrix의 고유벡터(eigenvector)는 함수의 곡률이 큰 방향 벡터를 나타냄
                • critical point에서 계산한 Hessian matrix의 고유값(eigenvalue)은 함수의 곡률(2차미분값)을 나타냄
                  • 모든 고유값이 positive = 극소점
                  • 모든 고유값이 negative = 극대점
                  • 고유값에 posive & negative 포함 = saddle point(안장점) 
              • 영상 입력에 대한 Hessian은 픽셀의 밝기를 나타내는 함수로 활용됨.

              Laplacian

              • 각 변수로의 2차 편미분 값의 합
              • 영상 입력에서의 픽셀 밝기를 나타내는 함수로 활용됨
                • +, - 값을 0~255 사이의 값으로 scale하면 급격한 이미지 밝기 변화를 찾는 필터 효과.
              • vs Gradient
                • Gradient의 크기값은 영상의 밝기 변화가 급격할 수록 큰 값을 나타냄
                • Laplacian의 크기값은 {영상 밝기 변화}의 변화가 급격할 수록 큰 값을 나타냄. 즉, 밝기 변화의 속도가 일정하다면, 작은(0에 가까운) 값을 가짐. 
                  • 영상의 밝기 변화가 평면형(planar)를 이룰 때 최소값을 가지며, 극대/극소점에서 처럼 모든 방향으로의 밝기 변화가 심할 때 최대값을 가짐 -> blob이나 corner point 를 찾는 용도로 활용 가능.

              Other

              • 영상 특징점 추출방법 (2014.04)
              • Image scale 다루기 (2014.05)
                • 영상 입력에서의 개체 특징을 계산함에 있어 다중의 크기(multi-scale)를 고려하여 분석하기
                  • 방법1) image pyramid: 이미지를 단계적으로(예: 1.05배 또는 1.1배씩) 축소시켜 생성된 이미지들의 집합에 대해 (고정 크기의) sliding window(=filter=kernel)을 이용하여 특정 개체 존재 여부를 판단하는 기법
                  • 방법2) scale space: 대상이 가질 수 있는 다양한 스케일의 범위를 한꺼번에 활용하고자, Gaussian blurring으로 smoothing된 이미지들을 이용. ->  scale parameter(=sigma) 값이 높아질 수록 blur 정도가 높아져서 흐릿한 이미지가 생성됨. -> 이미지의 blur 정도가 높아지면 세부적인 detail이 사라지고, 보다 큰 scale에서의 이미지 구조를 파악할 수 있다고 함.
                  • 기타 방법) Gaussian Pyramid: bluring과 sub-sampling을 반복하여 입력을 1/2씩 축소하여 피라미드를 생성하는 방식. -> scale 변화가 매우 coarse하게 sampling하는 방식이므로 연산 비용 및 시간 단축되나, 개체 비교/매칭이 다소 어려워진다고 함. 
              • eigenvalue, eigenvector (2013.10)
                • eigenvector : (n x n정방행렬 = 선형 변환) $A$에 의한 변환 결과가 자기 자신의 (0이 아닌) 상수배가 되는 벡터 $v$
                  • 이 때의 상수배 값을 eigenvalue(고유값)이라고 정의함.
                  • $Av = \lambda v$ ($\lambda \neq 0$)
                  • 결국, 주어진 선형 변환에 의해 방향이 보존되는 방향 벡터를 의미함 (예를 들어, 지구의 자전운동에 해당하는 회전변환의 경우, 회전변환에 의해 변화하지 않는 회전축을 고유벡터로 간주될 수 있음)
                    • 선형변환이 일어나더라도 방향이 변하지 않는 벡터.
                  • 예를 들어, 그림을 선형변환 시켰을 때, 변화하지 않는 축 방향의 벡터로 볼 수 잇음.
                • eigendecomposition (고유값 분해)
                  • $AP=P\Lambda$ -> $A=P\Lambda P^{-1}$ 
                  • 정방 행렬 $A$를 eigenvector 행렬($P$)와 eigenvector 행렬($\Lambda$)을 이용한 행렬 곱으로 대각화 분해하는 기법.
                  • 고유값분해를 이용할 경우, A의 행렬식(determinant=선형변환의 scale 및 방향), A 거듭제곱, 역행렬, 대각합(trace), 행렬 다항식을 손쉽게 계산할 수 있다고 한다.
                • eigenvector 개념에 대해서 가장 잘 설명한 블로그

              Wednesday, August 9, 2017

              Kalman Filter (칼만필터) 개념

              Kalman filter

              • linear quadratic estimation (LQE)
              • (잡음 또는 불확실성이 암묵적으로 포함된 환경에서) 측정된 데이터를 기반으로 통계적 예측을 수행하는 알고리즘. optimal recursive processing algorithm.
                • 예) 자율 주행차의 경우, 차량 및 보행자의 미래 위치를 예측하는 데 활용.
                • 예) 시스템의 상태를 추적하거나 추정하는 데 활용.
                • 따라서, (가우시안 에러를 고려하여) 예측하고자 하는 값의 평균과 분산을 고려한 예측치를 도출하고 있음.
                • 바로 직전 시점에서 추정된 상태와 현재의 측정값을 바탕으로 현재 상태를 예측하는 방식
              • 현재 상태 예측 + 업데이트(현재 상태에서 관측된 측정까지 포함한 값을 통한 예측)
                • prediction/motion updates: convolution 수행
                • measurement updates: 베이즈 규칙을 활용하여, prior 업데이트. 즉, 가우시안의 평균값과 분산값을 업데이트.
              • 측정값에 포함된 (확률에 기반한다고 전제된) 잡음을 제거함으로써 원하는 신호나 정보를 골라내고자 함. 
                • (통계적인 잡음이 포함된) 시계열로 측정된 값에, Baysian inference를 적용하여 변수들의 joint 확률 분포를 추정하는 방법 
                • 비행기, 우주선, 로봇, 미사일의 운항 및 제어에 주로 활용됨.
                • 과거와 현재값을 가지고, recursive 연산을 통해, 다음의 순간에 대한 최적 예측값을 추정하는 것.
                • 수학적으로는 linear system(선형 시스템)의 상태를 예측해서 발생할 수 있는 오류를 최소화하면서 예측을 하는 방식
                  • linear system: 시스템을 모델한 수식이 linear operator로 표현이 가능한 시스템
              • 관련 자료
              • Kalman gain = 새로운 측정값을 얼마나 반영하여 추정값 업데이트에 활용할 지를 결정하는 계수. 값이 1에 가깝다면, 측정값이 정확하다는 것을 의미하는 대신, 추정값이 unstable함을 나타냄. 즉, 새롭게 측정되는 값에 의해서, 예측값이 크게 변동한다는 것임. 반대로, 값이 0에 가깝다면, 추정값이 안정적이며, 새롭게 측정되는 값을 상대적으로 적게 반영해서 예측하겠다는 것임. 궁극적으로는 K 값이 작은 상태로 수렴해야, 예측값이 안정적으로 나올 수 있음을 의미함.
                • 상태 변화에 대해서는 State Covariance 및 Measurement Covariance Matrix가 이용됨.
                • 선형(LKF)보다는 비선형에 대한 EKF(Extented) 또는 UKF(Unscented)가 많이 활용됨.

              Wednesday, August 2, 2017

              Coherence, Cross Spectrum, Random Process 개념

              Cross power spectrum

              • Wiki
                • Cross spectral density (CSD) = cross power spectrum = cross-correlation 함수의 fourier transform 
                  • 따라서, PSD는 CSD의 특수한 경우($x(t)=y(t)$)라고도 볼 수 있음.
                • 연관된 개념: Total signal power, $R(0)$ = PSD 아래의 면적 = zero lag에서의 autocorrelation = 신호를 구성하는 데이터의 variance.
              • 의미
                • 두 개의 신호가 있을 때, (각 주파수 별로) 한 쪽 신호가 다른 쪽 신호에게 얼마나 많은 linear information을 전달하는 지에 대한 지표를 나타냄

              Coherence

              • Wiki
                • Spectral coherence: 두 개의 신호(또는 데이터 집합) 사이의 관계를 나타내는 통계치; 0에서 1사이의 값으로 표현됨.
                  • 즉, 두 개의 신호가 존재할 때, (주파수 차원에서) 한쪽 신호의 변화가 다른쪽 신호의 변화에 '선형적으로' 얼마나 영향을 미치는 지 판단할 수 있음; 선형 시스템에서 외부 잡음이 없다면, 해당 값은 1이 될 것임.
                  • 만약 값이 0이라면, 두 신호는 전혀 관련되어 있지 않은 것을 나타냄.
                  • 다음의 coherence 식은 때때로 magnitude-squared coherence (MSC)라고도 불림 (MathWorks 설명 참조). 한편, MSC를 계산할 때, 모든 주파수에서 1로 동일한 값을 얻는 상황을 방지하기 위해, averaged MSC estimator을 사용해야 한다고 함 (예: WOSA). 
              $$ C_{xy}(f) = \frac{\left |G_{xy}(f)  \right |^2}{G_{xx}(f)G_{yy}(f)} $$
                • 의미
                  • 선형 시스템에서 Input과 output 간의 power transfer 추정에 사용되어 왔음. 
                  • Ergodic 신호에 대해서라면, Input과 output 간의 인과관계 추정도 가능함.
                  • 그러나, 두 신호의 관계가 선형적이지 않을 경우의 coherence 값은 erroneous 하게 됨.
                  • 또한, Input/output 의 causal 관계 해석에 있어 혼동될 여지가 있을 수 있음을 주의할 필요.
                  • 다른 한편, 어느 주파수 대역에서 두 신호가 가장 선형적인 관계가 되는 지 찾아볼 수도 있음.
                  • 수식으로 살펴보자면, coherence는 각 신호의 spectrum을 이용한 "normalized" cross spectrum으로 볼 수 있음.

                Random processes

                • Random process > Wide-sense Stationary > Stationary > Ergodic
                • 주요 개념
                  • Random process (= stochastic process)
                    • 무한히 많은 random variables의 집합; 일반적으로는 random variables을 시간 함수로 확장한 것을 의미함(확률 변수가 시간적으로 전개되는 과정).
                  • WSS Random process
                    • 어느 시점에 구하던지, 평균(1차 평균)과 자기 상관함수(2차 평균)이 일정한 경우
                  • Stationary process
                    • 시간에 따라 통계적 특성이 변하지 않는 random process; N차 통계에 대해 모두 시간 축의 이동에 무관할 경우 Strictly Stationary.
                  • Ergodic process
                    • 어떤 함수에 대해서도 앙상블 평균(시간을 고정시켜놓고 무한 개의 샘플함수로 계산한 것)이 시간 평균(임의의 샘플 함수를 선택해서 무한대의 시간에서의 구한 경우)과 같은 경우의 random process
                • 참고 블로그

                Tuesday, June 20, 2017

                MySQL on Ubuntu 16.04

                우분투 16.04에 MySQL 최신버전 설치하기

                • 참고 사이트: https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-16-04
                • 설치 방법:
                $ sudo apt-get update
                $ sudo apt-get install mysql-server
                $ sudo mysql_secure_installation

                • 설치 확인(MySQL은 설치되면 자동으로 시작된다.)
                  • 방법1: 
                $ systemctl status mysql.service
                  • 방법2:
                $ /etc/init.d/mysql status
                $ mysql -uroot -p -e'show databases'

                • 삭제방법
                (optional) $ sudo apt-get remove dbconfig-mysql
                $ sudo apt-get purge mysql*
                $ sudo apt-get autoremove
                $ sudo apt-get autoclean
                • lightweight GUI client
                  • emma @ Ubuntu Software center
                    • cf. HeidiSQL(Windows), Sequel Pro(MAC)

                Tuesday, June 13, 2017

                Variational Inference 개념

                VAE 논문을 읽다가 해당 개념을 찾아보게 되었다.
                • 목적: 
                  • to approximate an intractable probability distribution, $p$, with a tractable(다루기 쉬운) one, $q$, in a way that makes them as ‘close’ as possible.
                    • 복잡한 분포(distribution)을 조금 더 간단한 형태의 분포로 근사하여 쉽게 풀어보자는 것.
                  • observation data가 주어져 있을 때 hypothesis에 대한 latent variable을 찾아야 하는 통계적 추론 문제(statistical inference problem)를 최적화 문제(optimization problem)로 re-write할 수 있다는 의미가 있음.
                    • DL과의 연계성 측면: 대량 데이터의 다차원 공간에 대해 (경사 하강법 등 이용해서) 최적화 문제를 잘 풀 수 있다.
                • 이름의 어원: 
                  • posterior(사후 확률 분포)를 가장 잘 설명하는 특정 분포를 찾아나가는(calculus of variations) 과정.
                • 참고: Quora Answer (by S. Wang, 2015 Mar.)
                  • {세미나 시간에 질문자가 던진 꽤 어려운 질문이 있을 때, 발표자가 해당 질문을 손쉽게 conveniently reframe함으로써, 원래의 어려운 질문을 직접 대답하는 대신 reformulated question에 정확한 답을 주는 상황}을 떠올려 보자.
                • 참고: Variational Methods 소개(by E. Jang, 2016 Aug.)
                  • 수식 표기가 정확하고, 개념적으로 친절하게 설명되어 있음
                  • 고양이 이미지 분류 예시를 통해 posterior, likelihood 설명함.
                • 참고자료: 확률에 대한 개념 요약
                  • 기계학습에 확률 $p(x)$을 도입하기 위해서는 실수 벡터를 입력으로 받아서 실수값을 출력하는 '함수'로 간주하면 조금 더 이해가 편할 것으로 생각됨; 따라서 distribution 또한 어떠한 파라미터를 가진 확률 함수 $p(x;\theta)$로 볼 수 있을 듯. 
                통계/수학 문제에서 posterior를 직접 계산하기 어려운 경우가 많다. (because the normalization constant is intractable.) 즉, $X$가 observation 집합, $Z$가 latent variable 집합을 나타낸다고 하면, posterior $P(Z|X)$를 구하고 싶지만, 다음 식의 분모(denominator) 부분을 직접 계산하기 어려울 때가 많다.
                $$P(Z|X)=\frac{P(Z,X)}{\int_{Z}P(Z,X)}$$
                • 접근 방안 1: MCMC를 이용해서 샘플링을 하는 방식; 만약 샘플링을 해야하는 parameter 개수가 많아질 경우, convergence가 매우 느려진다(slow to converge).
                  • Markov chain Monte Carlo
                • 접근 방안 2: true posterior $P(Z|X)$를 approximate함으로써 손쉽게 계산한다. 이때, $V$를 approximate variational distribution의 parameter라고 하면 다음의 식으로 표현된다.
                  • Bayesian model의 posterior distribution에 variational inference를 적용하는 것을 variational Bayes (VB)라고 부르기도 한단다.
                    • a family of techniques for approximating intractable integrals arising in Bayesian inference and machine learning
                $$P(Z|X)\approx Q(Z|V)=\prod_{i}Q(Z_{i}|V_{i})$$
                • 여기에서, (실제로 latent variables $Z$는 $X$와 independent하지 않을 수도 있지만,) 'mean field' approximation(평균 장 어림법, 평균 장 점근법)을 전제한다면(to restrict the family of variational distributions to a distribution that factorizes over each variable in $Z$), 문제를 더욱 쉽게 계산할 수 있다. 
                  • $Z$가 서로 겹치지 않는(independent) 부분 집합 ${Z_1, \dots, Z_M}$으로 구성되어 있을 때, 전체 $Q(Z)$ 또한 각 부분집합의 $Q(Z_i)$으로 factorization 된다는 가정
                $$Q(Z|V)=\prod_{i=1}^{M}Q(Z_i|V_i)$$
                이제, Kullback Leibler (KL) divergence를 이용해서, $Q(Z|V)$가 최대한 $P(Z|X)$에 가까워지는 $V_{i}$를 계산할 수 있다.

                $$\begin{eqnarray*}
                V^{*} &=& arg\min_V D_{KL}(Q(Z|V)||P(Z|X)) \\
                &=& arg \min_V \sum Q(Z|V)log\frac{Q(Z|V)}{P(Z|X)}
                \end{eqnarray*} $$

                따라서, estimation 문제가 최소값을 찾아야하는 optimization 문제로 바뀌었고, $V^{*}$를 찾게되면, $Q(Z|V^{*})$를 posterior에 대한 best guess로 사용하도록 한다.
                $$ \begin{eqnarray*}
                D_{KL}(Q||P) &\equiv& \int Q(Z)log\frac{Q(Z)}{P(Z|X)} = \mathbb{E}_Q(log\frac{Q(Z)}{P(Z|X)})\\
                &=& \int Q(Z)log\frac{Q(Z)}{P(Z,X)} +\int Q(Z)log(P(X)) \\
                &=& \int Q(Z)log\frac{Q(Z)}{P(Z,X)} + log(P(X))
                \end{eqnarray*}$$
                • $log(P(X))$를 중심으로 decompose하면 다음과 같다.
                $$\begin{eqnarray*}
                log (P(X)) &=& log\frac{P(Z,X)}{P(Z|X)} \\
                &=& log\frac{Q(Z)}{P(Z|X)}+log\frac{P(Z,X)}{Q(Z)}
                \end{eqnarray*}$$

                $$\mathbb{E}_Q(log (P(X))) = \mathbb{E}_Q(log\frac{Q(Z)}{P(Z|X)}+log\frac{P(Z,X)}{Q(Z)})$$
                • $log(P(X))$는 Q(Z)에 대해서 constant 하므로 다음과 같이 표현된다. 또한, $D_{KL}$은 nonnegative이므로, 두번째 항이 $log(P(X))$의 lower bound 또는 ELBO (evidence lower bound) $\mathcal{L}$라고 불린다. 그리고, 첫번째 항을 최소화하기 위해서는 결국 두번째 항을 최대화할 필요가 있다.
                $$\begin{eqnarray*}
                log (P(X)) &=& D_{KL}(Q||P) + \mathbb{E}_Q(log\frac{P(Z,X)}{Q(Z)}) \\
                &=& D_{KL}(Q||P) + \mathcal{L}
                \end{eqnarray*}$$

                • 이제, ELBO $\mathcal{L}$은 다음과 같이 전개된다.

                $$\begin{eqnarray*}
                \mathcal{L} &=& \mathbb{E}_Q ( \log{P(Z,X)} -\log{Q(Z)}) ) \\
                &=& \mathbb{E}_Q ( \log{P(X|Z)} + \log{P(Z)} -\log{Q(Z)}) ) \\
                &=& \mathbb{E}_Q ( \log{P(X|Z)} + \log{\frac{P(Z)}{Q(Z)}} ) \\
                &=& \mathbb{E}_Q ( \log{P(X|Z)} ) + \int Q(Z)log\frac{P(Z)}{Q(Z)}
                \end{eqnarray*}$$

                Tuesday, March 14, 2017

                apt remove vs purge (to delete a Ubuntu package)

                In order to remove and re-install a package

                • $ sudo apt remove --purge {package}
                  • or $ sudo apt purge {package}
                • $ sudo apt clean
                • $ sudo apt install {package}

                Difference betweeb remove and purge

                • Reference
                  • http://askubuntu.com/questions/231562/what-is-the-difference-between-apt-get-purge-and-apt-get-remove
                • remove: Packages installed are removed (Does NOT include configuration files)
                • purge:  Identical to remove except that any configuration files are deleted too.
                  • However, any configuration files inside the user's home folder(/home) will not be touched. Only the files under /etc will be deleted by using purge

                Removing ppa

                • Reference
                  • https://websetnet.com/ko/remove-ppa-ubuntu-linux/
                • $ sudo apt-add-repository --remove ppa:{ppa information}

                Sunday, April 19, 2015

                Node.js 다루기

                $ sudo apt-get update
                $ sudo apt-get install nodejs npm

                만약 node라는 명령어를 인식하지 못한다면, 다음 파일 수정해서 PATH 설정
                >> /etc/environment

                oracle jdk 설치
                eclipse J2EE 설치
                eclipse 플러그인: Aptana Studio 3 plugin 설치

                대표적 npm 확장 모듈
                - nodemon: 노드 실행 파일 변경시 노드 애플리케이션을 재시작. node 대신 nodemon으로 실행하면 된다.
                - forever: 노드 실행 프로세스 유지. 잘못된 요청이나 실행 도중 오류 때문에 중지되더라도 재시작됨
                - expresso: TDD 지원 프레임워크
                - express: (경량화) 웹 개발 프레임워크. "express [프로젝트 디렉토리]"로 프로젝트 생성. 다음과 같은 명령어로 의존모듈 설치 가능
                >> $ cd [프로젝트 디렉토리] && (sudo) npm install
                - Jade: 뷰 템플릿 엔진. indenting을 통해 계층 구조 표현.
                - Socket.IO: 실시간 웹 앱 개발
                >> sudo npm install socket.io -g
                - commander: 노드 명령줄 도구 개발
                - Vows: BDD 지원 프레임워크
                - node-inspector: 디버깅 지원 도구. node-jscoverage 포함(코드 커버리지 확장 모듈 포함)
                - everyauth: 다양한 인증 서비스 지원
                - 압축관련: node-zip, UglifyJS
                - 로그와 성능 분석: log.io, Nodetime

                * nohub: 리눅스에서 백그라운드 실행시키는 명령. hang-up signal이 발생해도 스크립트 동작이 멈추지 않음
                >> nohub node ./server.js &

                JxCore : js 패키징/배포/실행

                $ sudo npm install [모듈명] (-g)
                $ npm list (-g)
                $ npm update [모듈명]
                $ npm uninstall [모듈명]

                npm registry 사이트: npmjs.org

                데이터 다루기
                - NoSQL 다루기: mongoose, mongolian
                - SQL 다루기: node-mysql
                - redis 다루기: redis (hiredis: 비동기 빠른 모듈)

                * 오픈소스 자바스크립트 코드/텍스트 에디터 프로젝트
                - ACE: ace.ajax.org
                - CodeMirror: codemirror.net

                Saturday, February 28, 2015

                C에서 C++ 호출하기

                참고: http://ospace.tistory.com/215

                • 파일 구성: 3개
                  • Counter.h
                    • C++헤더파일이자 멤버함수가 정의됨
                  • counter_c.h
                    • C에서 사용할 헤더파일
                    • 이 파일은 Counter.h에 포함되어도 됩니다.
                  • counter_c.cpp
                    • counter_c.h에 있는 내용을 구현한 부분.
                    • 주의할 것은 cpp로 C++로 컴파일됩니다. Counter.h의 cpp파일이 있다면 같이 포함해도 되며, 분리해도 됩니다.

                위의 구현은 C++ 구현부와 C 호출부를 분리를 했습니다.
                그래서 기존 라이브러리가 아닌 별도로 구성하여 관리할 수 있게 했습니다.



                • 컴파일 방법

                # g++ -c counter_c.cpp

                # gcc main.c counter_c.o –lstdc++

                Windows 10 High DPI 에서 Java application의 Font 조절

                Reference:  How do I run Java apps upscaled on a high-DPI display?  @superuser.com Summarize 1) Find java.exe you installed.  2) Righ...