変なソフトをインストールして、
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が正常にインストールできないようですが興味のある方はどうぞ。
手順と注意点
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オプション無し。Python用OpenCVライブラリも同時にインストールされるので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を起動して、
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
フォルダに入っている画像を使った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
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
フォルダに入っている画像を使った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
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")
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動作確認
以下記事参照。
注意
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の次期バージョンに期待しましょう。
以上