ヘッダーナビゲーション

2018年7月14日土曜日

Macでのpython-pclのインストール方法

Mac OS X 10.12.6にPCLのPythonバインディングであるpython-pclをインストールをしようとして少し嵌ったので解決法を書いておきます。

環境

今回用いた環境はこんな感じです
・Mac OS X 10.12.6
・Python 3.6.0 :: Anaconda custom (64-bit), anaconda3-4.3.0
・pcl: stable 1.8.1, brewでインストールされたもの

手順

  1. brewを入れる
  2. brewを使ってpclをインストールする
    1. brew install pcl  を実行
  3. python-pclをインストールする
    1. git clone https://github.com/strawlab/python-pcl.git を実行しpython-pclをcloneする
    2. python-pcl下にある、travis/pcl-2d-1.8.pcというファイルを/usr/local/lib/pkgconfigにコピーする
    3. setup.py中のhttps://github.com/strawlab/python-pcl/blob/ba8627a7d8ac30513d12e9a8b8a69db041c71ffc/setup.py#L584 の辺りに、 ext_args['extra_compile_args'].append("-stdlib=libc++")を追記
    4. ダウンロードしたディレクトリ中で、python setup.py installを実行する
以上でpython-pclがインストールできるはずです。
使うときはPython上でimport pclと書くとimportできて使えるはずです。
手順中の3.3が分かりにくい場合は、3.1の代わりに3.3の変更を加えたあとのhttps://github.com/kushanon/python-pcl.gitをcloneして使ってもらえれば3.3は省くことができます。

2018年7月8日日曜日

Pythonのimportの挙動

Pythonのimportはsys.pathにリストとして入ってるディレクトリを検索します
sys.pathは以下のディレクトリ で初期化されています。
  • 該当スクリプトが含まれるディレクトリ
  • 環境変数であるPYTHONPATHに含まれるディレクトリ
  • インストールに依存するデフォルトのディレクトリ

一時的に追加するときは、
import sys
sys.path.append("importできるようにしたいディレクトリ")
また、sys.pathに含まれるディレクトリ下にある場合でも、配下のディレクトリに "__init__.py"ファイルが含まれていないとimportすることはできない。"__init__.py"には何も書いてなくても良く、あることが重要・

例えば、example_package下のhoge.pyを実行したい時、
example_package/
    hoge.py
    __init__.py
上記のようにhoge.pyに内容を書き__init__.pyを書き、PYTHONPATHなりをexample_packageディレクトリに通した状態で、
from example_package import hoge
のようにすると適切にhoge.pyを読み込むことができます。example_package配下に更にファイルがある場合も同様で、各下位ディレクトリに__init__.pyが必要です。
__init__.pyは何も書いてなくても良いのですが、そのディレクトリ下のファイルで共通して行う必要がある処理などあればここに書いておけばまとめて実行してくれるので便利です。
また、from example_package import *のように書きたい場合は、__init__.pyの中で
__all__ = ["hoge"]
のように書くと、__all__のリストに設定されたスクリプトを"from example_package import *"と書くことで一括でimportすることができます。
※ * を多用するのは、productionコードでは望ましくないことと言われていますが

参考: https://docs.python.org/3.8/tutorial/modules.html#packages

2018年6月25日月曜日

DockerでOpenGLを動かす方法

これを使えば、DockerでOpenGLを動かせます。
https://hub.docker.com/r/nvidia/opengl/
実行にはnvidia-docker2が必要で、--runtime=nvidiaみたいな感じでオプションを与えてあげる必要があります。
他にも、.Xauthority、.X11-unix、docker.sockとかを共有して、DISPLAYの環境変数も共有させる必要があります。
一応1.0-glvnd-runtime-ubuntu14.04でglxgearsが動くのは確認できました。
ただ、Officialにサポートされてるわけでは無いので、今後どうなるか怪しいですね。

参考: https://github.com/kushanon/openrave-on-docker

2018年6月24日日曜日

Taskonomy: Disentangling Task Transfer Learningがおもしろい

26種類のCV系のタスクにおいて特定タスクで学習したモデルがどれだけ他のタスクに対する転移学習で使えるかを定量的に分析した論文
Taskonomy: Disentangling Task Transfer Learning

CVPR2018でBest paperを取ったようです。
論文中の図1に示したものが各タスク間の転移学習のしやすさを示したものです。
例えば、3D edgeを検出するモデルや法線を予測するモデルをpre trainedモデルとして使うことでreshadingやpoint matchingを予測するためのネットワークが少数の学習データから訓練可能であることが示されました。
3D edgeやNormalsからエッジが多く出ていますが、それらはRGBセンサとDepthセンサのアラインメントを取れば容易に取得可能(欠損をへらすには工夫が必要だと思いますが)。一方、Point MatchingやReshadingといったタスクに対するアノテーションはかなり面倒くさいかと思います。そこで、例えばReshadingタスクを解きたいときに、大量のデータでNormalタスク向けに訓練して、少数のアノテーションデータでReshadingタスク向けに訓練します。そうすると、比較的少ないアノテーションコストでReshading問題が解けてしまう!、精度の底上げが可能ということに嬉しさがあるのかなと思います。(ちゃんと読んでないので、間違ってたら言ってくださいw)

また、Transfer learningに使いやすいということは、共有して活用できる中間特徴があるはずなので、Multi task learningにも使えそうですね。
例えば、これもCVPR2018ですが
Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics
では、Semantic Segmentation、Instance Segmentation、Depth regressionを同時に解き適応的に各タスク間の重みを学習することで、個別に学習した性能を凌駕したことが示されてます。こんな感じでTransferしやすいタスク同士を予測対象として組み込むことで、性能向上を図れるのではないかなーと思います。

2018年5月15日火曜日

違うバージョンのROS間で、MarkerArrayの可視化をrvizで行う

ROS Indigo上でPublishするMarkerArrayを、ROS Kinetic上のrvizで可視化するのにはまったので、解決法を書いておきます。
異なるバージョンのMakerArrayをSubscribeするとrvizがエラーを吐き可視化できません。バージョンの違いを検出する仕組みとしては、/opt/ros/*version*/include/visualization_msgs/MarkerArray.hに直書きされてるmd5値を照合しています。
今回の場合は、

  1. ROS Indigoの/opt/ros/indigo/include/visualization_msgs/MarkerArray.hに書いてあるmd5値をコピー、
  2. ROS Kineticの/opt/ros/indigo/include/visualization_msgs/MarkerArray.hに書いてあるmd5値をIndigoのものと同じになるよう変更
  3. rvizのソースをダウンロード
  4. コンパイルしてパスを通す
  5. rosrun rviz rvizで実行
みたいな感じで、同一のmd5値にしてあげることでエラーを回避できます。

Makerの場合も多分同様の方法で解決可能だと思います。(maker.hにもmd5値が書いてあるのは確認した)