読者です 読者をやめる 読者になる 読者になる

Take’s diary

Macとマイコンに関すること--ワクワクの製作日記

NVIDIA Jetson TX1 のOSをバージョンアップしたら実行すること

f:id:TAKEsan:20160724140822j:plain

変なソフトをインストールして、

OSが起動しなくなり、OS再インストールついでに、今回はインストール手順を再確認してみました。今までは結構勘違いがあったので、見つけ出しては前のブログを更新していたのですが、あまりにもめんどくさいのと今後の自分のために、OSバージョンアップ又は再インストールしたら実行すべき内容を書いてみました。

今回は現時点の最新版「JetpackL4T 2.2.1(2016/07/22)64bit版」のインストールが完了しているものとします。

Embedded Download Center | NVIDIA Developer

これはJetpak2.2をバージョンアップしたもので、TX1に直接影響はないみたいです。

少なくともOpenCV、SimpleCV、WebCamera、が問題なく使えて、Caffe、Torchがすんなりインストールできる環境作りを目指しています。

※その後Jetpack2.3になって、格段に性能が向上(私も!!)してます。Torchが正常にインストールできないようですが興味のある方はどうぞ。

takesan.hatenablog.com

 

手順と注意点

OpenCV4Tegraは、どうしても正常にWebCameraの実行ができない(Cでコンパイルしたものはエラーが出るものの画像表示できるとか、Python関連の画像表示できないとか)のでOpenCV2.4.13でのCUDA実行環境をインストールすることにしました。

JetpackL4T 2.2.1はOpenCV4Tegraがプレインストールされていない様なのでちょうどいいかも。一応

sudo apt-get purge libopencv4tegra

sudo apt-get purge libopencv4tegra-devubuntu

を実行してOpenCV4Tegraを削除する。プレインストールされていなかったらメッセージが出る。OpenCV4Tegraを入れたければ~/home/OpenCV4Tegraに入って sudo ./ocv.sh を実行。そうすると、現状でWebCameraは使えない。

 日本語環境にしないこと。apt-get updateにエラーが出て、修正が大変だったり、最悪Xwindowが頻繁にフリーズしたりします。

まず依存ソフト

sudo apt-get install nano Unity-tweak-tool nautilus-open-terminal  <--お好みにより

 

sudo apt-get purge python-pip

wget https://bootstrap.pypa.io/get-pip.py

sudo python get-pip.py

 

sudo add-apt-repository universe

sudo apt-get update

sudo apt-get install cmake git aptitude screen g++ libboost-all-dev \

libgflags-dev libgoogle-glog-dev protobuf-compiler libprotobuf-dev \

bc libblas-dev libatlas-dev libhdf5-dev libleveldb-dev liblmdb-dev \

libsnappy-dev libatlas-base-dev python-numpy libgflags-dev \

libgoogle-glog-dev python-skimage python-protobuf python-pandas \

libopencv-dev

OpenCV2.4.13

OpenCV3.0以降でも良いかもしれないが、これだとSimpleCVが動かないので2.4.13にした(OpenCV4Tegraと同バージョンの模様)。SimpleCVが必要なければ3.0以上でOK。ただしcmakeオプションは違うと思うので確認必要。

以下の記事を参考。依存ファイルがダブっているところがあるが、インストーラが無視してくれるのでそのまま。

http://elinux.org/Jetson/Installing_OpenCV

 

sudo apt-get -y install build-essential make cmake cmake-curses-gui g++

sudo apt-get -y install libavformat-dev libavutil-dev libswscale-dev

sudo apt-get -y install libv4l-dev

sudo apt-get -y install libeigen3-dev

sudo apt-get -y install libglew1.6-dev

sudo apt-get -y install libgtk2.0-dev

ここからOpenCVインストール先は私はSDカードにしましたが、どこでもOK

wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.13/opencv-2.4.13.zip

unzip opencv-2.4.13.zip

cd opencv-2.4.13

mkdir build

cd build

cmake -DWITH_CUDA=ON -DCUDA_ARCH_BIN="5.3" -DCUDA_ARCH_PTX="" -DENABLE_FAST_MATH=1 -DCUDA_FAST_MATH=1 -DWITH_CUBLAS=1 -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF ..

sudo make install

一応CUDA関連を追加(GPUオプション)、コンパイルがすごく長い(約1H 。特に50%以降のNVCCコンパイル部分)。CPUを複数使ったMakeではメモリーオーバーになるので-jオプション無し。PythonOpenCVライブラリも同時にインストールされるのでpython-opencvのpipインストールは必要無し。最後にパスを.bashrcに追加

echo "# Use OpenCV and other custom-built libraries." >> ~/.bashrc

echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/" >> ~/.bashrc

source ~/.bashrc

最後にリブート。

SimpleCV関連

sudo apt-get install python-pygame

sudo pip install https://github.com/ingenuitas/SimpleCV/zipball/master

sudo pip install ipython[notebook]

Python関連

sudo pip install flask

sudo apt-get install python-smbus                                        <---i2cのpythonライブラリ

 https://github.com/derekstavis/python-sysfs-gpio  <---ここからGPIOライブラリのインストール

 

Caffe

git clone https://github.com/BVLC/caffe.git

cd caffe

cp Makefile.config.example Makefile.config

nano Makefile.config

以下入れ替え(赤書き部分)

## Refer to http://caffe.berkeleyvision.org/installation.html

# Contributions simplifying and improving our build system are welcome!

 

# cuDNN acceleration switch (uncomment to build with cuDNN).

USE_CUDNN := 1

 

# CPU-only switch (uncomment to build without GPU support).

# CPU_ONLY := 1

 

# uncomment to disable IO dependencies and corresponding data layers

# USE_OPENCV := 0

# USE_LEVELDB := 0

# USE_LMDB := 0

 

# uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary)

# You should not set this flag if you will be reading LMDBs with any

# possibility of simultaneous read and write

# ALLOW_LMDB_NOLOCK := 1

 

# Uncomment if you're using OpenCV 3

# OPENCV_VERSION := 3

 

# To customize your choice of compiler, uncomment and set the following.

# N.B. the default for Linux is g++ and the default for OSX is clang++

CUSTOM_CXX := g++-4.8

 

# CUDA directory contains bin/ and lib/ directories that we need.

CUDA_DIR := /usr/local/cuda

# On Ubuntu 14.04, if cuda tools are installed via

# "sudo apt-get install nvidia-cuda-toolkit" then use this instead:

# CUDA_DIR := /usr

 

# CUDA architecture setting: going with all of them.

# For CUDA < 6.0, comment the *_50 lines for compatibility.

CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \

-gencode arch=compute_20,code=sm_21 \

-gencode arch=compute_30,code=sm_30 \

-gencode arch=compute_35,code=sm_35 \

-gencode arch=compute_50,code=sm_50 \

-gencode arch=compute_53,code=sm_53 \

-gencode arch=compute_53,code=compute_53

 

# BLAS choice:

# atlas for ATLAS (default)

# mkl for MKL

# open for OpenBlas

BLAS := atlas

# Custom (MKL/ATLAS/OpenBLAS) include and lib directories.

# Leave commented to accept the defaults for your choice of BLAS

# (which should work)!

# BLAS_INCLUDE := /path/to/your/blas

# BLAS_LIB := /path/to/your/blas

 

# Homebrew puts openblas in a directory that is not on the standard search path

# BLAS_INCLUDE := $(shell brew --prefix openblas)/include

# BLAS_LIB := $(shell brew --prefix openblas)/lib

 

# This is required only if you will compile the matlab interface.

# MATLAB directory should contain the mex binary in /bin.

# MATLAB_DIR := /usr/local

# MATLAB_DIR := /Applications/MATLAB_R2012b.app

 

# NOTE: this is required only if you will compile the python interface.

# We need to be able to find Python.h and numpy/arrayobject.h.

PYTHON_INCLUDE := /usr/include/python2.7 \

/usr/lib/python2.7/dist-packages/numpy/core/include

# Anaconda Python distribution is quite popular. Include path:

# Verify anaconda location, sometimes it's in root.

# ANACONDA_HOME := $(HOME)/anaconda

# PYTHON_INCLUDE := $(ANACONDA_HOME)/include \

# $(ANACONDA_HOME)/include/python2.7 \

# $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \

 

# Uncomment to use Python 3 (default is Python 2)

# PYTHON_LIBRARIES := boost_python3 python3.5m

# PYTHON_INCLUDE := /usr/include/python3.5m \

#                 /usr/lib/python3.5/dist-packages/numpy/core/include

 

# We need to be able to find libpythonX.X.so or .dylib.

PYTHON_LIB := /usr/lib

# PYTHON_LIB := $(ANACONDA_HOME)/lib

 

# Homebrew installs numpy in a non standard path (keg only)

# PYTHON_INCLUDE += $(dir $(shell python -c 'import numpy.core; print(numpy.core.__file__)'))/include

# PYTHON_LIB += $(shell brew --prefix numpy)/lib

 

# Uncomment to support layers written in Python (will link against Python libs)

WITH_PYTHON_LAYER := 1

 

# Whatever else you find you need goes here.

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include  /usr/include/hdf5/serial/

LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib

 

# If Homebrew is installed at a non standard location (for example your home directory) and you use it for general dependencies

# INCLUDE_DIRS += $(shell brew --prefix)/include

# LIBRARY_DIRS += $(shell brew --prefix)/lib

 

# Uncomment to use `pkg-config` to specify OpenCV library paths.

# (Usually not necessary -- OpenCV libraries are normally installed in one of the above $LIBRARY_DIRS.)

# USE_PKG_CONFIG := 1

 

# N.B. both build and distribute dirs are cleared on `make clean`

BUILD_DIR := build

DISTRIBUTE_DIR := distribute

 

# Uncomment for debugging. Does not work on OSX due to https://github.com/BVLC/caffe/issues/171

# DEBUG := 1

 

# The ID of the GPU that 'make runtest' will use to run unit tests.

TEST_GPUID := 0

 

# enable pretty build (comment to see full commands)

Q ?= @

 

make all -j4

make test -j4

make runtest

コンパイルからruntestまでTX1では1時間以上必要。実行スピードは早い。make all -j4 実行中ワーニングが全く出ない。runtestはしなくてもエラーなし。(時間のある方はどーぞ。

pycaffeのインストール

上記makeが終了したら、pycaffeをインストール。これも最初に依存ファイルをインストールしているが、前とダブっていれば無視してくれるので、気にせずにこのまま実行。

cd python

for req in $(cat requirements.txt); do sudo pip install $req; done 

sudo apt-get install python-dev python-numpy python-skimage

cd ..

make pycaffe

 

nano ~/.bashrc

以下1行を最後に付け加える。

export PYTHONPATH=~/caffe/python:$PYTHONPATH

上記~/は自分のインストール環境による。

Torch

curl -sk https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash

git clone https://github.com/torch/distro.git ~/torch --recursive

cd ~/torch; ./install.sh

これもコンパイル時間が長い。ワーニングがたくさん出る。

nano ~/.bashrc

以下2行を最後に付け加える。

export PATH=~/torch/bin:$PATH;

export LD_LIBRARY_PATH=~/torch/lib:$LD_LIBRARY_PATH;

以下が無かったら付け足す

. ~/torch/install/bin/torch-activate

上記~/は自分のインストール環境による。

この辺りでちゃんとライブラリがインストールできているか確認

テスト前にシステムリブート。

Torchは端末からからthと打ち込んでTorch画面が表示されればOK。

特に注意するのは、SimpleCVとpycaffe。この2つは依存ライブラリが多く、正常にライブラリがインストールされていないとエラー表示となる。また、OpenCV2.4.13インストールで実現できているはずのOpenCV Pythonライブラリがインストールできているか確認(cv2はpip listで確認できないため)。

Pythonを起動して、

python

import cv2

import caffe

import SimpleCV

th、caffeにエラーが出る場合は、.bashrcにパスを記入していない場合が多い。

SimpleCVでライブラリ不足の場合は、エラーメッセージに従いライブラリを再インストール。TegraCVや、OpenCV3.0以降のPythonライブラリをインストールした場合は、 SimpleCVインストールは不可。

実行環境確認ソースと実行方法

OpenCV確認

WebCameraを使うソースは、ソース中のカメラディバイスを 1又は/dev/video1に変更又は実行ファイルに1を明確に指定(ソースによる。以下laplaceは1に指定する)。何もしないとエラー。

 今回OpenCVのCmakeオプションにSampleコンパイルを指定していないので、もしすべてのサンプルをコンパイルしたい場合は OpenCVフォルダ/samples に入って

cmake .

sudo make -j4

で c,cpp,gpu サンプルソースが全部コンパイルされる。以下個別にコンパイルする場合。

cppソース 

画像を表示するプログラムなので、以下SSH接続したパソコンからは実行できません。

OpenCV2.4.13フォルダに入って

cd /samples/cpp

g++ edge.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -o edge

(Or for OpenCV 3.0: g++ edge.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs -o edge)

./edge

f:id:TAKEsan:20160724140355j:plain

           フォルダに入っている画像を使ったcppサンプル

こちらはWebCameraをUSBに接続してから。

g++ laplace.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_calib3d -lopencv_contrib -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_video -lopencv_videostab -o laplace

./laplace 1

f:id:TAKEsan:20160724140354j:plain

                                            WebCameraを使ったcppサンプル

gpuソース

cd ../gpu

g++ houghlines.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_calib3d -lopencv_contrib -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_video -lopencv_videostab -o houghlines

./houghlines ../cpp/logo_in_clutter.png

f:id:TAKEsan:20160724140353j:plain

フォルダに入っている画像を使ったGPUサンプル。CPUとGPU実行スピード比較 1ライン認識にGPUが2.5倍ほど高速。ただしGPUクロックスピードを上げると19倍!!。嘘だと思ったが何度やってもそうなる。早い。

GPU版顔認識ソースコンパイル方法は上記参照。実行は事前にカメラを接続して、

./cascadeclassifier --camera 1 --cascade ../../data/haarcascades_GPU/haarcascade_frontalface_alt.xml

一括コンパイルをした場合は

./gpu-example-cascadeclassifier --camera 1 --cascade ../../data/haarcascades_GPU/haarcascade_frontalface_alt.xml

これは、640X320の白黒画面。GPU動作させても下記SimpleCV320X240と同程度の認識スピード。画面そのものの大きさが違うのは理解できるが、SimpleCVテストはインタプリタであること、フルカラーでインターネット経由であることを差し引くと、同程度の速さは納得できない。TX1の画像表示ルーチンが怪しい。OpenCVのhaarcascade関数自体が遅いのかもしれない。

Python ソース

cd ../python

nanoで camera.py を開き capture = cv.CaptureFromCAM(1) と変更(0はダメ)

python camera.py

 

 

f:id:TAKEsan:20160724140823j:plain

 WebCameraを使ったPythonサンプル。GPUクロックスピードを上げると、表示スピードが上がる。こうなるとカメラ表示に関してはPythonで十分。

NVIDIA_CUDA_7.0_Samples

OSをインストールするとHOMEに入っているが、そのままではライブラリのパスが通ってないので、エラーが出て実行形式ファイルが作れない。

.bashrcに

export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:

を追加。

コンパイル方法は、各サンプルフォルダに入ってmakeとタイプするだけ。

Python Simplecv

直接画面出力可能だが、ここではMjpeg配信サンプル確認。

ssh接続したPCから実行可能。ユーザー名はtgra-ubuntuと仮定。先行してUSBにWebCameraを接続しておくこと。

別のPCまたはスマートフォンからWebを開き、tegra-ubuntu.local:8090 入力。

以下 mjpeg画像配信のみ。 xxxx.py として保存 実行は python xxx.py

from SimpleCV import *

import time

import commands

c=Camera(1, { "width":320, "height":240 },True)

js = JpegStreamer("tegra-ubuntu.local:8090")

while(1):

  img=c.getImage()

  img.save(js)

  time.sleep(0.02)

以下 リアルタイム顔認識。(顔を認識すると顔を四角で囲む)yyy.py として保存 実行は python yyy.py こちらはかなり複雑な処理をしているはずだが、これだけ。320X240程度の表示であれば、スピードもほぼ問題なし。

from SimpleCV import Camera, Display,JpegStreamer,Color

import pygame,time

c=Camera(1, { "width":320, "height":240 })

js = JpegStreamer("tegra-ubuntu.local:8090")

xxx=pygame.Surface([500,250]) 

while True:

    img = c.getImage()

    img.drawText("Test!!", 0, 0, fontsize=40,color=Color().getRandom())

    faces = img.findHaarFeatures('face')

    print(faces)

    if faces is not None:

        faces = faces.sortArea() 

        bigFace = faces[-1]

        bigFace.draw()

    img.save(js)

 

Caffe、Torch動作確認

 以下記事参照。

takesan.hatenablog.com

takesan.hatenablog.com

 注意

Linux普段使いをしている方には説明不要と思いますが、.bashrcにライブラリリンクを書き込んでもリブートしないと設定が反映されません。すぐに反映したい場合は、直接コマンド入力すればOK。コピペで済むのでこれが一番簡単です。

 起動時にBlueToothをONにしたい時

.bashrc に

rfkill unblock bluetooth

を追加する。

Pi3よりかなりましだが、起動時認識がMacの様にスムーズでは無いので、入力ディバイスBluetoothオンリーというわけにはいかない。ディバイス側に節電モードが働いていると復帰できない場合あり。メイン入力ディバイスは有線または一般的な無線接続が無難。linuxでのBlueTooth接続はスピーカー、他のコンピュータ接続専用に割り切る必要あり。が、Xwindow上で簡単につながる。

GPUクロックスピードを上げる

NVIDIAのフォーラムに書いてありました。以下の内容でspeed.shで保存(名称はご自由に)実行は sudo sh speed.sh

#!/bin/bash
echo "Set Tegra CPUs to max freq"
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo userspace > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
echo userspace > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor
echo userspace > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq
cat /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq
cat /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq > /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq
echo "Disable Tegra CPUs quite and set current gov to runnable"
echo 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable
echo runnable > /sys/devices/system/cpu/cpuquiet/current_governor
echo "Set Max GPU rate"
echo 844800000 > /sys/kernel/debug/clock/override.gbus/rate
echo 1 > /sys/kernel/debug/clock/override.gbus/state
# burst EMC freq to top
echo "Set Max EMC rate"
echo 1 > /sys/kernel/debug/clock/override.emc/state
cat /sys/kernel/debug/clock/emc/max > /sys/kernel/debug/clock/override.emc/rate
echo 120 > /sys/kernel/debug/tegra_fan/target_pwm

ついでにファンも半分の回転数で強制的に回してます。GPUクロック変更を実行すると画面表示のレスポンスが時間とともに低下するので注意。表示上遅く(カクカクする又は画像が飛ぶ感じ)感じますが、CPUクロックが低下しているわけではないので、内部では早くなっています。したがって画像直接よりmjpeg配信した方が動作が早い場合あり。

TX1は、特にGPUスピードを上げなくても、徐々に画面のレスポンスが悪くなります。今は気にしないで、Jetpackの次期バージョンに期待しましょう。

 

                                        以上