Jetson Xavier + ZEDのセットアップ

概要と動機

1年近く前に購入したJetsonを長らく放置していたましたが、使用しなければならない都合が出来たのでセットアップしました。
nVIDIAのJetson Xavier にStereo STEREO LABS の ZEDをセットアップした時に、Web検索しても日本語での説明がほぼなかった事に加えて、自分自身がLinuxに慣れていないため、大変だったので同じように悩んでいる人向けの記事です。
慣れている人にとっては、なんということはない作業だと思いますが。。。

Jetson Xavierの準備


Jetson AGX Xavier Developer Kitを使用。
nVIDIAのJetPackダウンロードサイトからインストーラーを仕入れてJetson XavierにJetson Jetpack4.2.1をインストールした直後の状態。
Downloadをするためには、nVidiaのDeveloperに登録する必要があります。その後メールアドレス及びパスワードが必要です。
・・・今はJetsonはAmazonでも購入することが出来るんですね。

ZEDの準備

f:id:chihayaChitose:20190813234817p:plain
ZEDの注意点として、『ハブ経由することなく』他の機器と『USB3.0』で接続しなければならないという制約があります。
ここが結構重要です。
JetsonにはUSB3.1のtype-C×2とUSB3.0のtype-A×1があるので、Type-C⇔USBメスの変換アダプタでZEDのUSB差し込み口を作りましょう。
・・・ハブ経由するとZEDは動作しないので、必ず変換アダプタを利用して接続してください。
私は、エレコム USB-C変換ケーブル C-Aメス ブラック USB3-AFCM01BKで上手いこと認識できました。
マウス・キーボード・カードリーダ用のUSBハブをJetsonに接続する必要があるので、どのみち付属の変換アダプタだけでは足りないので購入する必要があります。。。

ZED SDKの準備

WindowsPCでもLinuxPCでも構いませんが、下記からZED SDKをDownloadしてください。
www.stereolabs.com


これも詰まるポイントですが、Ubuntu用のZED SDK (ZED SDK of Ubuntu)ではなく、必ずJetson用の(ZED SDK for Jetpack)を利用してください。
また、CUDAのバージョンによって導入するSDKが異なることもありますが、Jetson導入時のJetpackで最新版を導入していれば、失敗することはないと思います。
f:id:chihayaChitose:20190813235937p:plain


心配なようでしたら、CUDAのバージョンを確認してください。
chihay.hatenablog.com


Download出来たら、手近にあるメモリカード等に保存してください。

Jetson+ZEDのセットアップ

先ほど保存したZED SDK実行ファイル入りのメモリカード等をJetsonに接続して、Jetsonの分かりやすい場所に保存しましょう。
私の場合は、/home/jetson/Downloadsのディレクトリに保存しました。
・・・私のJetsonのユーザー名がjetsonなのでDownloadsの上位ディレクトリがjetsonになっています。お使いの環境により変わる可能性がありますので、ご自身の環境に読み変えてください。


f:id:chihayaChitose:20190814001613p:plain
このように、保存先へ

cd /home/jetson/Downloads

のように移動し、

./ZED_SDK_***.run

を実行してください。
この時、『sudo ./ZED_SDK_***.run』とroot権限で実行するとエラーになって、実行できません。これも詰まるポイントだと思います。


f:id:chihayaChitose:20190814001356p:plain
このようにセットアップが完了します。
このように完了すれば、ZEDで試せると思いきや色々と足りません。。。


f:id:chihayaChitose:20190814002420p:plain
まず、ZED Explorerを実行しようとするとエラーが発生。
Linuxの環境に慣れていない私は、原因がわかりませんでした。エラーメッセージにNo such file or directoryとなっているので、ファイル名が違うんだろうと四苦八苦。。。
そもそも、ZEDの実行ファイルにスペースが入っているのも、混乱を誘発する原因!!もう少し考えてネーミングしてほしいものです。
ですが、このメッセージはlibGLEWが入っていませんよ。と言う感じのエラーです。
・・・このへん、分かりにくいですよね。
なお、スペース入りのファイル(たとえ、ZED Explorer)を実行する場合は

./ZED\Explorer

もしくは、

./'ZED Explorer'

のように記述します。


私の環境で足りなかったものは、

sudo apt -y install libglew-dev

・・・スクショ撮り忘れました。
f:id:chihayaChitose:20190814003506p:plain
f:id:chihayaChitose:20190814003537p:plain
f:id:chihayaChitose:20190814003646p:plain
で、こんな感じでapt-getしてください。
libGLEWだけは『-y』を付けます。


すべて、apt-getした後、
f:id:chihayaChitose:20190814004054p:plain
このように、

./'ZED Explorer'

と入力すれば、ZED Explorerは起動すると思います。
f:id:chihayaChitose:20190814004229p:plain
こんな感じですね。


ZED Depth Viewerの場合は、

./'ZED Depth Viewer'

と入力すれば、
f:id:chihayaChitose:20190814004433p:plain
このように起動すると思います。


それでは、よいJetson+ZED Lifeを!

pycharmのインストール

概要と動機

windows7
python3.6
pycharm2018.1
の環境を使用していましたが、仕事で強化学習に取り組むことになり、会社での環境と自宅での環境が異なると面倒だという思いから、自宅の環境を更新しました。
更新後
windows7
python3.7
pycharm2019.1
・・・使用感に変化はないのですが。

アンインストール手順

 ※以前にpycharm、pythonを使用していた場合のみ
1.以前使用していたpycharmをプログラムファイルからアンインストールします。
2.pythonもアップデートする場合は、ここでアンインストールしておきます。
3.もし、python3.6等以前使用していたバージョンのフォルダが残っている場合は手動で削除する。

インストール手順

pythonのインストール】
1.インストーラーを本家サイトから入手します。
www.python.org
windowsインストーラPython Release Python 3.7.3 | Python.orgここにあります。

f:id:chihayaChitose:20190623174611p:plain
インストーラの入手

2.上記Downloadしたexeファイルを管理者権限で実行してインストールになりますが、インストールフォルダは『C:\Python37』のようにCドライブ直下がいいと思います。

【pycharmのインストール】
3.pycharmのダウンロード
JetBrainのPycharmのサイトから入手します。
www.jetbrains.com
リンク先はWindows版になるので、使用環境のものを選択してください。
また、pycharmには無料のcommunity版と有料のProfessional版がありますが、自宅で使う分にはcommunity版で事足りると思います。

4.上記Downloadしたexeファイルを管理者権限でインストールします。

Pycharmの日本語化

まず、Pleiadisの日本語プラグインを入手します。
mergedoc.osdn.jp
その際、欲しいのは、日本語化のプラグインなので、
f:id:chihayaChitose:20190623193231p:plain
↑↑↑これではなく、

f:id:chihayaChitose:20190623193037p:plain
↑↑↑これを入手しましょう。


【方法1:ファイルコピーで手動設定】
Pycharmを起動し、
Configuration > Edit Custom VM Options...を開いて、

-Xverify:none
-javaagent:(ディレクトリのフルパス)/jp.sourceforge.mergedoc.pleiades/pleiades.jar

を追記します。
f:id:chihayaChitose:20190623194446p:plain
このようになっていると思います。
※おそらく大丈夫だと思いますが、勘違いするとハマる注意点として、
ここで言うディレクトリのフルパスとは、使用ユーザーのパスであり、pycharmのインストールディレクトリのフルパスではありません。

次に、
先ほどダウンロードしてきたファイルを解凍します。
解凍時に名前が長すぎる場合は、エラーが発生するので注意しましょう。
f:id:chihayaChitose:20190623193735p:plain
解凍するとこのようなファイルが出来ているので、このPluginを
f:id:chihayaChitose:20190623194043p:plain
このように、
『C:\Users\(ユーザー名)\.PyCharmCE2019.1\config』にコピーします。
これで次にpycharmを起動すると、日本語化されています。


【方法2:Pleiadisインストーラで自動設定】
先ほどダウンロードしてきたファイルを解凍します。(方法1と同様)
f:id:chihayaChitose:20190623195455p:plain
次に、解凍フォルダ『pleiades-win』の中にある『setup.exe』を起動します。
f:id:chihayaChitose:20190623195624p:plain
この日本語化するアプリケーションに
『C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.3\bin\pycharm64.exe』
を指定します。※install時の設定によりpycharm64.exeの場所は変わります。
これで次にpycharmを起動すると、日本語化されています。

なお、日本語化に失敗すると起動すらしなくなります。
失敗した場合は、アンインストールしてから、再度日本語化手続きを行いましょう。
その際は、Cashやsettingも削除しましょう。
f:id:chihayaChitose:20190623192300p:plain


Pandas.DataFrameの備忘録

概要と動機

個別に書いていくと散らかっていくのでは?と思い、
Pandas.DataFrameについて、追記しながら備忘録を作っていきます。

DataFrameの呼出

import pandas as pd
pd.DataFrame

or

import pandas.DataFrame as df

or

from pandas import DataFrame

DataFrameの作成

df = pd.DataFrame([[1,2,3,4,5,6,7,8,9],
                   [11,22,33,44,55,66,77,88,99],
                   [111,222,333,444,555,666,777,888,999],
                   [1111,2222,3333,4444,5555,6666,7777,8888,9999]],
                  index=['row_0', 'row_1', 'row_2', 'row_3'],
                  columns=['column_0', 'column_1', 'column_2', 'column_3', 'column_4', 'column_5', 'column_6', 'column_7', 'column_8'])

indexは行のインデックス
columnsは列のインデックス

DataFrameのixによる参照

☆ある行を参照したい場合

df.ix["row_2",:]

結果

column_0    11
column_1    22
column_2    33
column_3    44
column_4    55
column_5    66
column_6    77
column_7    88
column_8    99
Name: row_2, dtype: int64


☆ある行を参照したい場合(複数行)

df.ix[["row_1","row_3"],:]

結果

       column_0  column_1  column_2    ...     column_6  column_7  column_8
row_1        11        22        33    ...           77        88        99
row_3      1111      2222      3333    ...         7777      8888      9999
[2 rows x 9 columns]


☆ある行~ある行を参照したい場合(複数行)

df.ix["row_1":"row_3", :]

結果

       column_0  column_1  column_2    ...     column_6  column_7  column_8
row_1        11        22        33    ...           77        88        99
row_2       111       222       333    ...          777       888       999
row_3      1111      2222      3333    ...         7777      8888      9999
[3 rows x 9 columns]


☆ある列~ある列を参照したい場合(複数行)
列に関しても、行と同様に記述できる。

df.ix[:,'column_2':'column_5']

結果

       column_2  column_3  column_4  column_5
row_0         3         4         5         6
row_1        33        44        55        66
row_2       333       444       555       666
row_3      3333      4444      5555      6666
row_4     33333     44444     55555     66666


☆ある行とある列の組み合わせで参照したい場合(複数行)
行に関する記述と、列に関する記述を組み合わせて、必要な行と列を取り出すことが出来る。

df.ix[["row_1","row_3"],'column_2':'column_6']

結果

       column_2  column_3  column_4  column_5  column_6
row_1        33        44        55        66        77
row_3      3333      4444      5555      6666      7777

Pandas.DataFrameのCSV出力

概要と動機

IPython.displayを使えば Jupyter notebookで表示されるのだが、IPythonを使用していない環境でもPandas.DataFrameを綺麗に表示させたい。
今回の方法は、pd.DataFrame.to_csv()を使用したCSVファイルに出力してから、Excel等で出力結果を確認する方法です。

環境

Python3.6
Pandas0.23.0
mglearn
Pythonではじめる機械学習で用意されているデータセット等のモジュール)

出力する方法

以下、書籍『Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎』で用意されているデータセットを用いています。

import os
import pandas as pd
import mglearn


adult_path = os.path.join(mglearn.datasets.DATA_PATH, "adult.data")
data = pd.read_csv(
    adult_path, header=None, index_col=False,
    names=["age", "workclass", "fnlwgt", "education", "education-num",
           "marital_status", "occupation", "relationship", "race", "gender",
           "capital-gain", "capital-loss", "hours-per-week", "native-county", "income"])
data.to_csv('to_csv_out.csv')
data.head(10).to_csv('to_csv_out_head.csv')

ここでcsv出力に関係しているのは、

data.to_csv('to_csv_out.csv')
data.head(10).to_csv('to_csv_out_head.csv')

の部分。それ以外の個所はpandasでのデータの準備をしています。
pandasでのデータを出力するには、とあるpandas形式のdataに.to_csvとするだけです。
初めの10行だけ出力してあげたい場合は、上記のように.head(10)と付けてから、.to_csvと記述します。

matplotlib.pyplotのsubplotsの目盛について

概要と動機

Pythonではじめる機械学習の中でたびたび出てくるmatplotlib.pyplot.subplotsの使い方の中でも、なるほどと思ったので書き留めておくことにする。


サブプロットの使い方

まずsubplotsの使い方はよく知られているように、

import matplotlib.pyplot as plt
from sklearn.datasets import fetch_lfw_people


people = fetch_lfw_people(min_faces_per_person=20, resize=.7)
image_shape = people.images[0].shape

fix, axes = plt.subplots(3, 4, figsize=(9,9),subplot_kw=({"xticks":(), "yticks":()}))
for target, image, axis in zip(people.target, people.images, axes.ravel()):
    axis.imshow(image)
    axis.set_title(people.target_names[target])
plt.show()

のように使用します。

ここでデータセットはLabeled Faced in the Wildの顔画像を使用しており、下記のようにモジュールを定義して読み込みます。

from sklearn.datasets import fetch_lfw_people
people = fetch_lfw_people(min_faces_per_person=20, resize=.7)

本題の目盛

fix, axes = plt.subplots(3, 4, figsize=(9,9),subplot_kw=({"xticks":(), "yticks":()}))

subplotsの関数の中に、見慣れないsubplot_kw=({"xticks":(), "yticks":()})という引数が紛れています。
初めの引数3は3行、次の引数4は4列のサブプロット作成し、
次のfigsizeは(9,9)サイズのfigsizieでsubplotsを描画し、
subplot_kw??これはなんだ??
となりました。
そこで、このsubplot_kwのありなしを比較してみましょう。
まず、subplot_kw=({"xticks":(), "yticks":()})ありの場合、
f:id:chihayaChitose:20180930223150p:plain

では、subplot_kw=({"xticks":(), "yticks":()})なしの場合、
f:id:chihayaChitose:20180930223209p:plain

ぱっと見違いがわかりませんが、上記画像ではサブプロットの画像に目盛がありませんが、下記画像では目盛がありますね。
subplot_kwはこのように目盛を制御することが出来ます。


蛇足

import matplotlib.pyplot as plt
from sklearn.datasets import fetch_lfw_people


people = fetch_lfw_people(min_faces_per_person=20, resize=.7)
image_shape = people.images[0].shape

fix, axes = plt.subplots(3, 4, figsize=(9,9))
for target, image, axis in zip(people.target, people.images, axes.ravel()):
    axis.imshow(image)
    axis.set_title(people.target_names[target])
plt.xticks()
plt.yticks()
plt.show()

蛇足ですが、
上記のようにsubplot_kw=({'xticks':(), "yticks":()})ではなく、

plt.xticks()
plt.yticks()

を用いると、
f:id:chihayaChitose:20180930224311p:plain
このようになり、subplotsのそれぞれの画像の目盛には影響を与えません。
当然ですよね、plt.xticks()やplt.yticks()はsubplotsの制御ではなく、pltの制御なのですから。

scikit-learnの決定木を表示させる方法

概要と動機

Pythonではじめる機械学習の中で出てくる決定木の解析(sklearn.datasetsのcancerデータ)でツリー表示の可視化をしたい。
だが、Ipythonを使用していないpython3.6の環境下で、scikit-learnを使って決定木を可視化しようとして、つまづいた。

使用した環境

もともとあった環境

  • python3.6
  • numpy
  • scikit-learn

今回インストールした環境

  • graphviz (pip installの後、msiにてインストール)
  • ydotplus (pip install)

Ipython・Jupyter環境下以外では

下記のコードを見てみるとgraphvizモジュールが必要で、graphvizはdot言語で書かれているようでpydotplusというモジュールも必要とのことなので、

pip install graphviz
pip install pydotplus

と、graphvizとpydotplusをpipインストールをした後、実行したスクリプトは、

file_name = "./tree.dot"
export_graphviz(tree, out_file=file_name, class_names=["malignant", "benign"],
                feature_names=cancer.feature_names, impurity=False, filled=True)
with open(file_name) as f:
    dot_graph = f.read()
graphviz.Source(dot_graph)

・・・チーン、何も表示されないし、と思っていると、Ipthon・Jupyterじゃないもんねと気がつく。
そこで、

file_name = "./tree.dot"
export_graphviz(tree, out_file=file_name, class_names=["malignant", "benign"],
                feature_names=cancer.feature_names, impurity=False, filled=True)
graph = pydotplus.graph_from_dot_file(file_name)
graph.write_png("tree.png")

のように変えたところ、

Traceback (most recent call last):
(中略)
pydotplus.graphviz.InvocationException: GraphViz's executables not found

のように、GraphViz's executable not found(GraphVizの実行ファイルが見つからないですよ)
エラーが出て動きません。

エラー対策

Python3でscikit-learnの決定木を日本語フォントで画像出力する方法のまとめ | 自調自考の旅
ここに対策が書いてあったので、これを参考に、graphviz.pyのfind_graphviz関数を下記のように書き換えます。

def find_graphviz():
    """Locate Graphviz's executables in the system.

    Tries three methods:

    First: Windows Registry (Windows only)
    This requires Mark Hammond's pywin32 is installed.

    Secondly: Search the path
    It will look for 'dot', 'twopi' and 'neato' in all the directories
    specified in the PATH environment variable.

    Thirdly: Default install location (Windows only)
    It will look for 'dot', 'twopi' and 'neato' in the default install
    location under the "Program Files" directory.

    It will return a dictionary containing the program names as keys
    and their paths as values.

    If this fails, it returns None.
    """
    #dot.exe等の実行ファイルがあるパスをハードコーディングする。
    return __find_executables("C:\\Program Files (x86)\\Graphviz2.38\\bin")

これで、エラーがが出なくなりました。が・・・あれ、描画されない??

表示方法

明示的に表示していないので、表示されるわけがないですよね。
とにかく表示したい場合は、PILのImage関数を使って

img =Image.open("ファイル名")
img.show()

と書けばいい。

最終コードと結果

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
import pydotplus
from PIL import Image

dot_file_name = "./tree.dot"
png_file_name = "./tree.png"
export_graphviz(tree, out_file=dot_file_name, class_names=["malignant", "benign"],
                feature_names=cancer.feature_names, impurity=False, filled=True)
graph = pydotplus.graph_from_dot_file(dot_file_name)
graph.write_png(png_file_name)
img =Image.open(png_file_name)
img.show()

f:id:chihayaChitose:20180917170607p:plain


PATHを通す

import graphviz 

glaph = graphviz .Digraph(format="png")
(中略)
G.render("graphs")

上記で解決したと思いきや、上記のコードを実行しようとすると、下記エラーが発生します。
ExecutableNotFound: failed to execute ['dot', '-Tpng'],make sure the Graphviz executables are on your systems ' PATH
どうしたものかと悩んでいると、
Graphviz をインストールする
には、とどのつまりPATHを通さないとダメですよと書いてありました。
環境変数の変数:PATH に 値:C:\Program Files (x86)\Graphviz2.38\bin と通してあげることでrenderの問題も解決しました。
値は環境によって変わりますので、適宜変更してください。Graphvizをインストールしたフォルダにある『bin』フォルダのPathとなります。