[카테고리:] 생활코딩

  • ffmpeg으로 VOB를 MP4로 인코딩하기

    아래 사이트에서 참조.
    https://www.internalpointers.com/post/convert-vob-files-mkv-ffmpeg

    ffmpeg \
      -analyzeduration 100M -probesize 100M \
      -i output.vob \
      -map 0:1 -map 0:3 -map 0:4 -map 0:5 -map 0:6 \
      -metadata:s:a:0 language=ita -metadata:s:a:0 title="Italian stereo" \
      -metadata:s:a:1 language=eng -metadata:s:a:1 title="English stereo" \
      -metadata:s:s:0 language=ita -metadata:s:s:0 title="Italian" \
      -metadata:s:s:1 language=eng -metadata:s:s:1 title="English" \
      -codec:v libx264 -crf 21 \
      -codec:a libmp3lame -qscale:a 2 \
      -codec:s copy \
      output.mkv

    Let me dissect it:

    • -analyzeduration 100M -probesize 100M — keep this one so that FFmpeg is able to find hidden streams;
    • -i output.vob — the input file;
    • -map 0:1 -map 0:3 -map 0:4 -map 0:5 -map 0:6 — here I’m mapping the streams, namely I’m telling FFmpeg to keep Stream 0:1, Stream 0:3, Stream 0:4, Stream 0:5, Stream 0:6 and put them in the output file in that specific order;
    • -metadata[…] — this is used to give streams a title and other additional information, specifically to audio tracks (s:a:0 and s:a:1 where a stands for audio) and subtitles (s:s:0 and s:s:1 where s stands for subtitles);
    • -codec:v libx264 -crf 21 — defines the video codec in use and the constant rate factor (crf), namely the quality level. This method allows the encoder to keep a constant quality level, regardless the output file size: 0 is lossless, 23 is default, and 51 is worst possible. The sane range is between 18 and 28;
    • -codec:a libmp3lame -qscale:a 2 — defines the audio codec in use and the quality level: 0-3 will produce transparent results, 4 (default) should be close to perceptual transparency, 6-9 produces an “acceptable” quality. Using numbers from 0 to 9 means that the audio track will be encoded in variable bitrate (vbr) mode: smaller files, better quality;
    • -codec:s copy — s stands for subtitles: copy them as they are;
      output.mkv — the output file.

    Bonus point: if your machine supports it, add the flag -threads N to enable multi-threading and give the encoding a boost. Replace N with the number of your CPU cores.

  • gtx 1060 6gb+tensorflow gpu 버전 세팅 후기

    gtx 1060 6gb+tensorflow gpu 버전 세팅 후기

    Tensorflow, CUDA toolkit, cuDNN 버전.

    이것 설치한다고 이틀을 날렸다. 메뉴얼을 제대로 안 읽은 내탓도 있지만, Nvidia가 별다를 설명없이 기존 버전을 숨겨버린 탓도 있다. 멀쩡한 OS도 한번 날리고.

    Tensorflow 인스톨 사이트에 아래와 같이 써있다.

    NVIDIA requirements to run TensorFlow with GPU support

    If you are installing TensorFlow with GPU support using one of the mechanisms described in this guide, then the following NVIDIA software must be installed on your system:

    • CUDA® Toolkit 8.0. For details, see NVIDIA’s documentation. Ensure that you append the relevant Cuda pathnames to the LD_LIBRARY_PATH environment variable as described in the NVIDIA documentation.
    • The NVIDIA drivers associated with CUDA Toolkit 8.0.
    • cuDNN v6. For details, see NVIDIA’s documentation. Ensure that you create the CUDA_HOME environment variable as described in the NVIDIA documentation.

    CUDA toolkit : 필히 8.0!! Nvidia 다운로드 사이트에 가면 9.0이 딱 있다. 8.0을 찾을수가 없다. 8.0은 여기에..

    cuDNN도 CUDA toolkit 8.0에 맞는 버전을 설치한다.

    나는 그래픽 드라이버를 384.81 버전을 설치했다. Nvidia 사이트에 최신 드라이버가 있는데, 그 버전 사용하려다 OS를 다시 설치했다. 저장소를 추가하고,  sudo apt-get install 이렇게 쉽게 드라이버를 인스톨하면 된다. CUDA toolkit이 드라이버를 업데이트 한다.

    비교!

    CPU 버전으로 5,000[초/횟수]에 걸쳐하는 작업이, GPU를 사용하면 500[초/횟수]로 0이 하나 줄었다!!

     

     

    GPU 선정.

    싼 GTX 1060 6gb를 사기로 했다. 3gb 메모리 제품이 더 싼데, 사용하는데 문제 된다고 한다. 초심자에겐 값싼 gtx 1060이 최고다.

    게다가 PC 케이스가 작아, 1070 이후 제품을 넣으려면 케이스를 뜯어내야 한다. 1060 길이가 260mm인데, 자로 한번 케이스를 재어 보니 좀 여유있게 들어 갈 수 있어 보인다.

    겨우 넣었다. 간섭으로 대각선 삽입!!.

    메인보드
    description: Motherboard
    product: GA-MA785GT-UD3H
    vendor: Gigabyte Technology Co., Ltd.
    pciE 2.0 * 16 지원

    메인보드를 한 8년 사용하는데, pciE 2.0과 3.0 차이가 없다고 보고, 그냥 사용하기로 했다.
    GTX 1060 6gb와 호환 가능

    후기.

    8년전 PC 살 때, 리누스가 Nvidia에 뽀큐를 날렸다는 말을 듣고, AMD 그래픽 카드를 샀는데….AMD 병신 카드였다. 제품을 만들었으면 드라이버도 좀 신경을 써야 하는데, 영 신경을 안쓴다. 윈도우에서도 그닥이고..내 인생에 다시 AMD 제품을 구매할 일이 없다. Gtx 7이나 8시리즈만 되었어도 그냥 썼을텐데..쩝..

    CUDA 9.0 + tensorflow 1.5 + ubuntu 16.04 + kernel 4.13

    망할..tensorflow 1.5로 업그레이드 하고, cuda 9.0을 쓰려니 망했다. cuda 9.0을 설치하니 화면이 나갔다.

    • cuda 9.0은 드라이버 387부터 지원.
    • 커널 4.13에 cuda 9.0을 사용하려면 드라이버 390 이상 필요.

    이 두 개가 문제였다. 4시간의 삽질 끝에, cuda를 network 버전으로 설치해야 한다고 알아냈다.  업그레이드 할 때마다 난리를 쳐야되니. 역시 최신 버전만 지원하는 nvidia..9.1만 보인다고 설치하면 9.0으로 다시 설치해야 한다.

  • Lego MindStorm EV3 제어기

    Lego MindStorm EV3 제어기

    조종기 다음으로 Lego 마인드스톰으로 모터 제어기를 만들었다.

    기본개념이 아래 그림에 표시되어 있다.

    조종기의 역할

    • 서버.
    • 휴대폰 기울기를 확인하여, 공을 기울기 방향으로 이동.
    • 공이 화면 구석으로 이동하면, 기울기가 공 위치를 변경하지 않음
    • 공 위치를 135도 회전 후, 수평 이동시켜
      “Left;…, Right:…” 형식으로 소켓으로 전송

    Lego Mindstorm의 역할
    (전에 만들었던 부분을 재활용 하여, 지저분함.)

    • 클라이언트.
    • 링 버퍼를 만든 후, Left, Right 이동 위치를 버퍼에 저장.
    • Thread가 Socket으로 안드로이드 폰에 connect, receive, close.
    • 이 과정을 반복
    • 수신 데이터(“Left:….,Right:….”)에서
      “Left:”, “,Right:”의 위치를 찾음.
    • 숫자를 추출, trim 후 integer로 변경.
    • 변경된 integer만큼, Left, Right 모터를 이동.

    EV3를 lejos 베타 버전을 사용해서인지, socket의 utf-8로 데이터가 전송되지 않았다. ascii로 변경, 전송하여 시간 좀 걸렸다.

    중요한 사실이

    • 내가 생각한 만큼 잘 움직이지 않는다.
      차량 바퀴를 4개로 만들다 보니, Left 모터를 -방향, Right 모터를 +방향으로 돌리면, 확 돌아야 되는데, 지 몸체에 걸려 안돈다!!!
      또한 제품이 무거워서인지, 바퀴가 헛도는 경우가 많다.
    • 실행 순서에 따라, NullPointException이 너무 많다.
      try, throw로 도배를 해야 할 듯한데, 시간이 또 한없이 갈 듯하다.
    • 안드로이드 폰의 좌표 설정 문제.
      화면의 공이 디스플레이 중앙에 있는데, EV3이 후진한다.
      보정을 해야 하는데, 귀찮다.
    • 안드로이드 폰 화면이 꺼지면, 동작이 멈춰야 하는데 그렇지 않다. 링 버퍼에서 다 사용하면, 0으로 이동이 맞아 보이는데..계속 움직인다.

    더 중요한 사실이,

    • 애가 별로 재미없어 한다!!
      차가 빨랑 빨랑 움직여야 하는데, 지정 위치로 가다 보니, 너무 느리다. 파워로 수정하려니 귀찮고.

    누가 소켓을 잘 정리하여 인터넷에 올렸다.
    여기여기.
    DataInputStream을 그냥 사용했는데, 별 목적이 없으면 사용하지 않는게 맞아 보인다.
    DataInputStream으로 안드로이드 폰과 EV3이 통신이 되지 않는다.
    누가 이미 작성한 코드를 쓰다 보니, socket을 어떻게 쓰는지 정리되지 않아는데, 위 사이트가 정리하는데 도움을 줬다.

  • 원격 조종기 만들기

    집에서 놀고 있는 안드로이드 폰으로, LEGO EV3을 조종하는 리모콘을 만들어 보려고 한다.

    갤럭시 노트1 조종기 개념

    화면에 포켓 몬스터 볼을 표시한다. 사용자가 휴대폰을 기울이면, 공이 그 방향으로 이동한다.
    이 공의 좌표가 레고를 전진/후진, 좌회전/우회전 등으로 움직인다.

    좌표 설정의 문제점

    처음에는 아래와 같이 그리면, 멋지게 움직인다고 생각했다!!
    그림의 x,y 좌표가 휴대폰 디스플레이의 시스템이다.

    • 1번: 레고가 전진한다. 끝에 있을 수록 세게 간다.
    • 5번: 후진
    • 2번: 약한 우회전. 왼쪽 바퀴가 오른쪽 바퀴보다 더 돈다.
    • 3번: 강한 우회전. 왼쪽이 2번보다 더 많이 돈다.
    • 4번: ??그림의 (0,0) 기준으로 3번->4번으로 가면, 두 바퀴가 모두 거꾸로 돌아야 된다.후진으로 강한 우회전을 한다.
      L/R 값이 (4,1) -> (-4,-1)로 변경되고, 변화되는 값이 크다. 그림이 어느 영역을 넘어가면 바퀴가 급격히 변하게 되면 좀 이상할 듯 하다.

    위 표를 그려는데, L/R 바퀴가 방향이 항상 같다. 단순한 움직임만 구현될 듯 하다.

    좌표 설정 제안

    디스플레이 좌표(X,Y)를 135도 반시계 방향으로 돌려, L/R 축으로 표시했다. 아래 그림과 같이 표시 가능하다.

    직진->적은 우회전->많은 우회전->적은 우회전->후진 이렇게 된다.
    값으로 표시하면..(R,L).

    • 직진: (+10,+10)
    • 적은 우회전: L값이 0선을 닿으면 (0,MaxL)
    • 많은 우회전: L값이 0선을 넘어가면 (-1,MaxL), R이 거꾸로 돌면서 더 회전
    • 적은 우회전: L이 줄면서 R이 – 방향으로 증가(-5,MeanL)

    원점을 수정하여 rotation 하려면, 여기를 참조한다.
    여기를 참조하여 새로운 좌표계를 아래와 같이 설정했다.


    디스플레이의 X, Y 좌표가 오른손 좌표가 아니기 때문에, 임의로 Y,X로 변경한 다음, L/R을 설정했다.
    아래 동영상이 기울기에 따른 L,R 값이다.

    이제, 레고에서 받는 부분을 만들기로 하고, 이건 접어야겠다.

  • 텐서플로우 컴파일 설치하기

    텐서플로우 GPU 버전을 설치하면 최고인데, CPU 버전만 사용해야 한다. CPU 버전을 쓰면 아래와 같이 메세지가 나온다.

    (tensorflow) now0930@:cifar10$ python cifar10_testv1.py 
    Using TensorFlow backend.
    Couldn't import dot_parser, loading of dot files will not be possible.
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    conv2d_1 (Conv2D)            (None, 32, 32, 32)        896       
    _________________________________________________________________
    dropout_1 (Dropout)          (None, 32, 32, 32)        0         
    _________________________________________________________________
    conv2d_2 (Conv2D)            (None, 32, 32, 32)        9248      
    _________________________________________________________________
    max_pooling2d_1 (MaxPooling2 (None, 32, 16, 16)        0         
    _________________________________________________________________
    flatten_1 (Flatten)          (None, 8192)              0         
    _________________________________________________________________
    dense_1 (Dense)              (None, 512)               4194816   
    _________________________________________________________________
    dropout_2 (Dropout)          (None, 512)               0         
    _________________________________________________________________
    dense_2 (Dense)              (None, 10)                5130      
    =================================================================
    Total params: 4,210,090
    Trainable params: 4,210,090
    Non-trainable params: 0
    _________________________________________________________________
    None
    Train on 50000 samples, validate on 10000 samples
    Epoch 1/25
    2017-06-17 08:55:41.662236: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
    2017-06-17 08:55:41.663359: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
    2017-06-17 08:55:41.663384: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
      288/50000 [..............................] - ETA: 707s - loss: 2.3271 - acc: 0.1076

    연산 시간이 CPU 최신 기술로 줄어든다는데, 전에 해보렸으나 적당한 tutorial이 없어 못했다. 그러던 중, 아래 사이트를 찾았다.
    텐서플로우, 직접 소스코드 빌디하여 설치하기

    정리하면..

    1. Git에서 clone으로 다운로드
      $ git clone https://github.com/tensorflow/tensorflow
      $ cd tensorflow
      $ git checkout r1.2  #r은 release..적용 버전이 1.2
    2. tensorflow을 컴파일하기 위한 Bazel 설치
      세가지 방법으로 Bazel 설치 가능하다. 나는 debian을 사용하므로, compile 했다.

      1. Install required Package
        apt-get install pkg-config zip g++ zlib1g-dev unzip
      2. Download..
      3. 실행 권한을 주고 run
      4. bazel 경로를 PATH 변수에 추가
        export PATH="$PATH:$HOME/bin"
    3. tensorflow 컴파일 옵션 설정..configure..
      #아까 다운로드 받은 tensorflow 디렉토리에서..
      ./configure
    4. Bazel로 빌드하기
      bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package

      –config=opt 옵션이 아까 경고 부분을 해결한다.

    5. Pip 설치용 whl 만들기
      $./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

      bazel-bin이 링크다. 경로를 잘 확인한다. 패키지 파일을 /tmp 디렉토리에 넣어야 되는지 모르겠다.

    6. conda 가상 환경 활성화..
    7. 기존 tensorflow 설치버전 무시하고 설치
      (tensorflow)$ pip install --ignore-installed --upgrade tfBinaryURL

      tfBinaryURL이 아까 만든 /tmp/tensorflow_pkg의 whl 경로이다.

    설치 후, python을 다시 실행하면 해당 메세지가 없어졌다.

    (tensorflow) now0930@:cifar10$ python cifar10_testv1.py 
    Using TensorFlow backend.
    Couldn't import dot_parser, loading of dot files will not be possible.
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    conv2d_1 (Conv2D)            (None, 32, 32, 32)        896       
    _________________________________________________________________
    dropout_1 (Dropout)          (None, 32, 32, 32)        0         
    _________________________________________________________________
    conv2d_2 (Conv2D)            (None, 32, 32, 32)        9248      
    _________________________________________________________________
    max_pooling2d_1 (MaxPooling2 (None, 32, 16, 16)        0         
    _________________________________________________________________
    flatten_1 (Flatten)          (None, 8192)              0         
    _________________________________________________________________
    dense_1 (Dense)              (None, 512)               4194816   
    _________________________________________________________________
    dropout_2 (Dropout)          (None, 512)               0         
    _________________________________________________________________
    dense_2 (Dense)              (None, 10)                5130      
    =================================================================
    Total params: 4,210,090
    Trainable params: 4,210,090
    Non-trainable params: 0
    _________________________________________________________________
    None
    Train on 50000 samples, validate on 10000 samples
    Epoch 1/25
    

    설치하기 전에는 속도가 많이 빨라질 것이라 기대 했으나..별 차이 없어보인다.