可変ブログ

色々メモとか。とりあえず自分が分かるように。その後、なるべく人が見て分かるように。可変。

Pythonの周辺環境について整理しながらUbuntuに仮想環境を整える(pipとかvirtualenvとかvenvとか)

Pythonを使おうと思って環境を整えようと思ったのですが、どうも仮想環境というのを導入したほうがいいらしいです。
Pythonはバージョンが2系と3系があり、互換性がないため使い分ける必要があります。
ただ、そのまま何も考えずにPython2とか3を使おうとすると、プロジェクトによって使うモジュールを分けられなかったり、
場合によっては環境を壊してしまう恐れもあるらしいです。(自分はよくわかってないのですが、システムPythonで sudo pip install とかしちゃいけないらしいです。)
そこでPythonの仮想環境というものを作り、それぞれの仮想環境の中でPythonのバージョンや入れるモジュールを構築してやることで、
安全にうまいこと使い分けるができるみたいです。

※後述のバグの為、この記事の通りに進めてもうまくいかないことがあります。
仮想環境作成でエラーが出る人は最初に、『ensurepipが入ってないバグについて』を見てください。


※2018/08/03 追記。
pipenvなるものが登場しました。pipとvenvをいっしょくたにしたようなモジュールのようです。
python自体のバージョンを変えた仮想環境が作れたり、仮想環境の移行がしやすいようになってたりするらしいです。
ですが、さらっとしか見ていないのですが、現状あえてpipenvを使う必要はなさそうな気がします。
Docker file のように構築する環境を記載できるようです。これはいいですね。
詳細は以下。



目次

  • 環境
  • 仮想環境ツールについて
  • Pythonについて
  • pipについて
  • 仮想環境構築
  • ensurepipが入ってないバグについて



環境

  • Ubuntu16.04



仮想環境ツールについて

【どの仮想環境ツールを使うか】

これを見ても分かる通り、仮想環境ツールはたくさんある上に名前がどれも似たり寄ったりでどれを使っていいか全くわかりませんでした。

そこで上も含めここらをざっと調べてみると、virtualenvとvenvと言うのがデファクトスタンダードになっているみたいなのでこれを使っていこうと思います。



【virtualenvとvenvの違い】

virtualenvとvenvの違いについては、上に挙げた記事を見てもらうとなんとなくわかると思いますが、私の理解としてはこんな感じです。

  • virtualenv

仮想環境構築用の『パッケージ』です。apt-get、もしくはpipでインストールできます。
Python2系、3系どちらでも仮想環境を構築できるっぽいです。

  • venv

virtualenvを公式にPython標準『モジュール』として取り入れたものです。Python3.3から導入されました。
そのため機能はvirturalenvとほとんど同じらしいですが、Python2系への切替ができないらしいです。


以上から、2系で使うならvirtualenv、3系で使うならvenvが良いかと思います。
3系もvirtualenvを使えば面倒がない気もしますが、venvが公式なので今後のことも考えこっちを使っておけば間違いないだろうという考えです。


Pythonについて

python python-devのパッケージの違い】

ほとんどの場合Python本体は既にインストールされていると思いますが、
自分でインストールする方法を探してみると、結構いろいろパッケージがあってそれぞれ違いがはっきりしていなかったので調べてみました。
python-devとpython3-devを入れれば事足りそうですね。

sudo apt-get install python          # Python2系最新の本体
sudo apt-get install python-dev      # Python2系最新のヘッダとかライブラリとか(Python2本体に依存、Python2も一緒にインストールされる?)
sudo apt-get install python2         # 存在しない
sudo apt-get install python2-dev     # 存在しない
sudo apt-get install python2.7       # Python2.7本体
sudo apt-get install python2.7-dev   # Python2.7のヘッダとかライブラリとか(Python2本体に依存、Python2も一緒にインストールされる?)
sudo apt-get install python3         # Python3系最新の本体
sudo apt-get install python3-dev     # Python3系最新のヘッダとかライブラリとか(Python3本体に依存、Python3も一緒にインストールされる?)
sudo apt-get install python3.5       # Python3.5本体
sudo apt-get install python3.5-dev   # Python3.5のヘッダとかライブラリとか(Python3本体に依存、Python3も一緒にインストールされる?)

ちなみに2系3系どちらも入れたときに各コマンドで実行されるPythonのバージョンはこのようになっています。

python       # 2.7
python2      # 2.7
python2.7    # 2.7
python3      # 3.5
python3.5    # 3.5

【参考】



pipについて

pipはPython関係のパッケージやモジュールを管理するツールです。
Pythonのバージョンによってそのあり方や、インストール方法が結構変わるので注意してください。

【2系:Python 2.7.8まで、 3系:Python3.3まで】

これらの古めのバージョンではpipはパッケージとして取得するようになっています。
何かの事情がない限り、古いバージョンのPythonをあえて使う人もいないと思うのでこの項目は読み飛ばしていいと思います。
【参考URL】


インストールの方法は2通りあるみたいです。

Python2系

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

Python3系

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

インストールされるpipはスクリプトを実行するPythonのバージョンに依存するみたいです。

  • 【apt-getでインストールする方法。】
sudo apt-get install python-pip    #Python2系用pip
sudo apt-get install python-pip3   #Python3系用pip


pip公式からインストールしたほうが最新が手に入るみたいですが、apt-getで管理できた方が個人的には気持ちいいです。
まぁ古いバージョンのPythonを使うことはないのでほとんど関係ないですけどね。
使い方は、

pip install hogehoge    #Python2系
pip3 install hogehoge   #Python3系



【2系:Python 2.7.9、 3系:Python3.4以降】

これら新しめのバージョンでは、pipはPythonに同梱されたモジュールとして提供されています。
(だがモジュールとしてインストールされているはずなのに、なぜか普通にpipコマンドとしても使える。謎。)
厳密に言うと同梱されているのではなく、Python3.4から標準モジュールとして追加されたensurepipによって
Pythonインストール時にpipモジュールもインストールされるようになっています。
ですので、Pythonをインストールした段階で一緒にインストールされているので、自分でインストールする必要はないはずです。
が、何か事情があって自分でインストールしたい場合は、

python -m ensurepip

『--upgrade』オプションでpipのバージョンアップもできます。

python -m ensurepip --upgrade


【ensurepipについて参考】


pipモジュールの使い方は

python -m pip install hogehoge     #Python2系
python3 -m pip install hogehoge    #Python3系



仮想環境構築

【virtualenv】

仮想環境の構築方法です。
Python2系の場合はvirtualenvを使います。
【参考】


apt-getでインストールする場合

sudo apt-get install python-virtualenv

pipでインストールする場合

python -m pip install virtualenv


hogehogeディレクトリに仮想環境を構築する場合、

virtualenv hogehoge 
    • system-site-packagesオプションを付けると、グローバルのPython(仮想環境ではないPython)のモジュールを引き継ぎます。


構築した仮想環境に切り替える場合は、

source hogehoge/bin/activate


仮想環境から元に戻るには

deactivate


仮想環境にモジュールを追加する場合は、仮想環境に切り替えた状態でpipを使うだけでOKです。


【venv】

venvはPython3.3以降なら標準で導入されていますのでインストールの必要はないはずです。
使い方は基本的にvirtualenvと同じです。
【参考】


hogehogeディレクトリに仮想環境を構築する場合、

python3 -m venv hogehoge 
    • system-site-packagesオプションを付けると、グローバルのPython(仮想環境ではないPython)のモジュールを引き継ぎます。


構築した仮想環境に切り替える場合は、

source hogehoge/bin/activate


仮想環境から元に戻るには

deactivate


仮想環境にモジュールを追加する場合は、仮想環境に切り替えた状態でpipを使うだけでOKです。

なお、virtualenvもvenvも仮想環境構築時に最新のPythonを入れれば、
ensurepipによってpipモジュールも一緒に仮想環境内にインストールされます。



この仮想環境周辺を図解するとこんな感じでしょうか。

最新Python2でvirtualenvを使った場合。
f:id:shibafu3:20170918120058p:plain



最新Python3でvenvを使った場合。
f:id:shibafu3:20170918115107p:plain


ensurepipが入ってないバグについて

ここまで言っといてなんなんですけど、
Python3.5なのにensurepip標準で入ってねーじゃん!!!
どういうことなの・・・と思ってちょっと調べると、ここに書いてある問題がちょっと近いですかね?
14.04 - pyvenv-3.4 error: returned non-zero exit status 1 - Ask Ubuntu
16.04 - ensurepip is disabled in Debian/Ubuntu for the system python - Ask Ubuntu
Error creating virtualenv with python3.6 · Issue #1059 · pypa/virtualenv · GitHub
んーどうもdebian/ubuntuのバグっぽいですね。Ubuntu14のころからあるみたいなのに直ってないってどういうことですか。

sudo apt-get install python3-venv

とした後に仮想環境を構築すれば、仮想環境内にはensurepipがはいるっぽいですね。
ですが、システムPythonで『python3 -m ensurepip』としてもensurepipがありませんと言われてしまいます。
システムPythonでensurepipが使えないので、pipモジュールもインストールされませんが、
仮想環境を構築するならシステムPythonにpipはいらないのかもしれませんね。
どうしてもインストールしたい場合はapt-getかget-pip.pyでインストールするしかないみたいです。
Pythonモジュールとしてすべてきれいに管理できるのが最新Pythonのイイトコロというか思想なんじゃないかと思ってたのですが・・・
python3-venvやpipだけapt-getで管理ってちょっと気持ち悪いですね。
もっとスマートな方法がありそうなものです。

最後に、このバグの対処法として『sudo apt-get python3-pip』を入れてみてくださいという書き込みも見つけましたが、
これでインストールされるのはpip『パッケージ』であり、公式では推奨されていない(と思う)ものです。
その上ensurepipが入らないので根本解決にはならないと思うので、気を付けてください。
(仮想環境内でもモジュールのpipではなくパッケージのpipを使うのならこれでもいいのかもしれません。正直もうなにがなんだかわからなくなってきました。すべてはensurepipが標準で入っていないせいだ!)



また、別の対処法を発見してしまった。こちらの15ページ目。
パッケージングを支える技術 pyconjp2016
pipはインストールされないものとして、仮想環境構築時に『--without-pip』オプションでpip無しの仮想環境を作ってから、get-pip.pyでpipを仮想環境にインストールするというもの。

もうどれが正解かわからんね。正解とかないのかもね。



Pythonドキュメント

YOLOv2を使って自前のデータを学習させて認識させるまで。

精度、処理速度がいいと噂のYOLOv2を使って自分が検出させたいものを学習させます。
自分も試しながら書いていったので、きれいにまとまっていなくて分かりにくいです。そのうちもっとわかりやすくまとめたいですねー。
ほぼこちらにURLに書かれている通りです。英語が読めるならこちらの方を参考にしたほうがいいです。



環境

  • Ubuntu14.04
  • OpenCV2
  • Quadro6000



流れ

  • CUDAをインストールする。
  • OpenCVをインストールする。
  • YOLOv2をインストールして、とりあえずYOLOを試す。
  • 学習させるデータを用意して正解データを作る。
  • YOLO用に学習データを変換する。
  • 学習パラメータとか諸設定。
  • 学習させる。
  • 認識させる。



CUDAをインストールする。

CPU環境でも一応動くのですが、webカメラなど使って検出させると重すぎてまともに動かないのでGPU環境を使うことをお勧めします。
CUDAのインストールは下記の記事の『CUDAをインストールする。(Nvidiaドライバのインストール含む。)』の項目を参考にしてください。ついでにcuDNNもインストールするとよいでしょう。



OpenCVをインストールする。

実はYOLOを使うだけならOpenCVは必要ありません。
ただし検出結果を画像や映像として出力するためにはOpenCVが必要なります。
OpenCV3~は対応していないようで、OpenCV2系をインストールする必要があります。
インストール方法は下記の記事を参考にしてください。下記の記事はOpenCV3系をインストールしているので適宜OpenCV2系と読み替えてください。
今はOpenCV3に対応してるっぽいです。



YOLOv2をインストールして、とりあえずYOLOを試す。

YOLOv2をインストールして、ちゃんとインストールできたかの確認の為とりあえず試してみます。
gitからYOLOv2のソースをcloneします。

git clone https://github.com/pjreddie/darknet.git

cloneしたディレクトリに移動してMakefileを編集します。

cd darknet
gedit Makefile

最初の数行にある、GPU=0とOPENCV=0を1に書き換えます。
保存したら、

make

サンプル画像で検出を試す。

./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg

webカメラから

./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights



学習させるデータを用意して正解データを作る。

【学習させるデータの形式】

まずは学習させるデータの形式を説明します。
YOLOで学習させるデータは主に4種類あります。

  • 画像データ(認識させたいものが写っているもの)

拡張子はjpg等(拡張子によって学習データ作成ツールのソースを変更する必要があります。JPEGならソース変更少なく済みます。今回はjpg想定で進めます)です。

  • 座標データ

画像の中のどこに認識させたいものが写っているかの座標が記載されたテキストデータで、拡張子はtxtです。
画像と座標データはそれぞれ1対1で対応しています。
つまり、1つの画像データ(example01.jpg)に対して1つのテキストデータ(example01.txt)が必要であり、
拡張子より前の部分は同じファイル名でなくてはなりません。

  • 画像リスト

学習させる画像のファイル名のリスト(ファイルのパス含む)になります。これも拡張子はtxtです。
このリストはテストデータ用と訓練データ用に2つに分けます。

  • クラスリスト

クラスのリストです。犬や猫といった認識させるものを列挙したファイルで、拡張子はnames(もしくはlabels)です。


次に、それぞれのデータの書式についてです。

  • 画像データ

画像についてはjpg形式のデータとなり、特に説明もいらないでしょう。サイズについては特にバラバラでも問題ないと思います。

  • 座標データ

2つ目の座標のデータの書式ですが、以下のようになります。

カテゴリ番号 オブジェクトの中心x座標 オブジェクトの中心y座標 オブジェクトの幅 オブジェクトの高さ

カテゴリ番号は0から始まる整数数字で、次に示す座標が何のクラス(カテゴリ)に所属しているかを表します。(例えば、犬:0、猫:1、人間:2など)
いくつが何のクラスを表すかは後ほど別の設定ファイルに書き込みます。
また、それぞれの座標については画像の幅、高さを1としたときの割合となっています。
例として、画像の左上の方にクラス番号1としたものが画像の10分の1くらいの大きさで写っている場合、

1 0.2 0.2 0.1 0.1

といった風になります。もし1枚の画像中に複数のオブジェクトが写っている場合は、

1 0.2 0.2 0.1 0.1
2 0.8 0.4 0.1 0.3
0 0.3 0.3 0.2 0.1
    .
    .
    .

というように、2行3行と連なっていきます。

  • 画像リスト

画像のファイル名のリストになりますが、これは、

data/dog/dog00.jpg
data/dog/dog01.jpg
data/dog/dog02.jpg
    .
    .
    .

というような画像の所在を含めたファイル名のリストになります。
この時の相対パスはdarknetのバイナリからの相対パスになります。

  • クラスリスト

犬、猫といったクラス名を一行に一つずつ書いていきます。

dog
cat
bird
  .
  .
  .

このクラスリストの一行目が座標データに使われているカテゴリ番号の0に対応しています。

これで学習させるデータの形式についての説明は終わりになります。

【学習させるデータの作り方】

では、実際に学習させるデータを作っていきます。
コツコツと自分でピクセルを測ってデータを作ってもいいのですが、非常に面倒なのでツールを使います。
BBox-Label-Toolとconvert.pyというツールを使うことで楽に学習データを作れます。(楽と言っても大量のデータを作るのはやはり大変ですけどね)

まず依存関係をインストールします。(pipとかpyenvとか仮想環境使って入れたほうがいいかもしれません。)

sudo apt-get install python-tk python3-tk python-imaging-tk

BBox-Label-Toolのリポジトリからソースをクローンします。

git clone https://github.com/puzzledqs/BBox-Label-Tool.git

クローンしたディレクトリの中に、Images/001とLabels/001というディレクトリができていると思います。
このImages/001の中に入力となる画像を入れておき、ツールによって生成された座標のテキストデータがLabels/001の中に生成されます。
この時に注意して欲しいのは、画像の拡張子が大文字の『JPEG』でないとこのツールが認識してくれないという点です。
ですので『jpg』で認識するように、main.pyの中に記載されている『JPEG』をすべて『jpg』に置換してください。(たぶん3か所くらい置換するところがあると思います。)
また、このツールで作れるデータはオブジェクトのクラス数が1つの場合のみです。
multi-classというブランチを使えば複数のクラスに対応できるみたいですが、この後に使うconvert.pyツールがたぶん対応してないです。(何かいい方法知っている方がいましたら教えてください。)

では、実際の使い方ですが、
main.pyをpython2で実行します。python2系じゃないと対応してないみたいなので注意してください。

python main.py

すると、ウィンドウが立ち上がると思います。
上のImageDir欄にImagesディレクトリ内のディレクトリ、デフォルト状態なら『001』を記入してLoadを押すと001内の画像が読み込まれると思います。
読み込まれたらあとは対象となる物体をクリックで囲んでいってください。あとの使い方は感覚でわかると思います。
この作業が終わるとLabels/001に物体の座標情報のテキストが出力されていると思います。


YOLO用に学習データを変換する。

実は見てもらうと分かると思いますが、BBox-Label-Toolで作ったデータはYOLOで使える形式とは違った形式になっています。
これをYOLOの形式に変換するためconvert.pyというものを使います。

ここからコードをコピーしてconvert.pyというファイル名で保存してください。
そしたらこのconvert.pyを少し編集します。
このツールも画像の拡張子が大文字の『JPEG』でないと認識してくれないので、
・『JPEG』と書かれているところをすべて『jpg』に書き換えてください。(たぶん2か所)
また、改行コードが一か所Windows用になっている場所がありますので、(ここハマりポイントです。後に説明しますが他から既存のデータを持ってきたときは注意)
・『\r\n』と書かれているところをすべて『\n』に書き換えてください。(たぶん1か所)

次に『images』と『labels』という名前のディレクトリをconvert.pyがあるディレクトリに作ります。
labelsの中に『stopsign』と『stopsign_original』という名前のディレクトリを作ります。
そしたらimagesの中に画像のデータを、stopsign_originalの中にBBox-Label-Toolで作ったテキストデータを入れます。
ちょっとわかりにくいかもしませんがこういう感じです。

convert.py

images
  |-dog00.jpg
  |-dog01.jpg
  |-dog02.jpg

labels
  |-stopsign
  |-stopsign_original
      |-dog00.txt
      |-dog01.txt
      |-dog02.txt


準備ができたら、データを変換します。

python convert.py

stopsignの中に変換後のデータが生成されます。
また、convert.pyと同じディレクトリに画像のリストがテキストで生成されますが、今回はこれは利用しません。
学習させる画像はパスの指定がちゃんと正しければどこに置いても構わないのですが、今回は便宜上darknetディレクトリのdataの中にディレクトリを作ってそこに入れたいと思います。つまり、convert.pyで生成されたリストに載っているパスとは違うところに画像を保管するためにconvert.pyで生成されたリストは使えません。
では、学習させる画像を正しい場所に移して、リストを作りましょう。
『darknet/data/』にimagesというディレクトリを作って画像を入れます。

ここからprocess.pyというpythonスクリプトのコードをコピーして必要ならば編集して、imagesの中に保存します。
path_dataはdarknetのバイナリから見た、画像が入っているディレクトリまでの相対パスです。つまりこの場合は『data/images/』です。(最後の『/』忘れずに)
percentage_testはテストデータの割合%です。
画像の拡張子がjpgじゃない人は適宜合わせましょう。
編集が終わったら、スクリプトを実行します。これをすると、自動的に指定した割合でランダムにテストデータと訓練データに分けてリストを作ってくれます。

python process.py

すると、test.txtとtrain.txtが生成されると思います。


最後にクラスリストを作ります。
今回はクラスは1種類なので

dog

とだけ書いて、obj.namesとして保存します。

それでは今まで作ったものを適切な場所に配置しましょう。
画像とprocess.pyで作ったtest.txtとtrain.txtはもう入っていると思いますが、darknet/data/images/の中に、
convert.pyで作った座標のテキストファイルも、画像が入っているdarknet/data/images/の中にいれます。
obj.namesもdarknet/data/images/の中にいれます。


【手っ取り早く学習を試してみたい人へ】

こちらにYOLO用に用意された学習データがあります。
The data set I composed for this article can be found here (19.4Mb).
と書かれたところのリンクからダウンロードできますが、一つ注意があります。
ここからダウンロードできるデータは改行コードがWindows用(\r\n)となっています。
そのため、いざYOLOで学習をさせようとした時にエラーが出ますので改行コードをLinux用(\n)に変更する必要があります。
変更の仕方は以下参照ください。



学習パラメータとか諸設定。

パラメータとかを設定するファイルを用意します。
設定に必要なファイルは三つ。

cfg/obj.data        クラスの数やデータの所在等を指定しています。
cfg/yolo-obj.cfg    ニューラルネットモデルです。これはもとから用意されているものを少しいじって利用します。

obj.dataの書式は、

classes=1                          クラス数。今回は1種類なので1
train = data/images/train.txt      訓練用の画像リスト
valid = data/images/test.txt       テスト用の画像リスト
labels = data/images/obj.names     クラスリスト
backup = backup/                   学習した重みが保存される場所。
top = 2                            よくわかりません。なくてもあまり問題なさそうです。


cfg/yolo-obj.cfgはもとからcfgディレクトリの中にある.cfgファイルをコピーしてちょっと編集してyolo-obj.cfgとします。今回はyolo-voc.cfgファイルをコピーして使いますが、他のモデル(tiny-yolo.cfg等)が使いたかったら適宜変えてください。
コピーしてリネームしたyolo-obj.cfgを少し編集します。
3行目:batch=64 にします。学習ステップごとに使い画像の枚数です。
4行目:subdivisions=8 にします。バッチが8で除算されます。強力なGPUを積んでればこれを減らすか、バッチを増やすことができます。
244行目:classes=1 にします。クラス数です。
237行目:filters=30 にします。フィルターの大きさです。filters=(classes + 5) * 5 と決まっています?


学習させる。

必要なものはそろったので学習させます。
重みの初期値として適切なものがあると学習がうまくいきやすいです。
ここからdarknet19_448.comv.23をダウンロードし、初期値として使用します。


学習させます。

./darknet detector train cfg/obj.data cfg/yolo-obj.cfg darknet19_448.conv.23

うまくいけば数字がずらずら出てくると思います。
大事なのは何行かに一回出てくるこんな感じの数字、

2: 2.950644, 15.939886 avg, 0.001000 rate, 2.813000 seconds, 128 images

最初の数字が反復回数です。通常2000回は必要みたいです。
そしてavgの手前の数字がが小なればなるほど精度が高まっていると考えてよいです。
avgの数字が減らなくなってきたら学習を止めましょう。
反復1000回までは100回ごとに重みがそれぞれ保存されていき、1000を超えると1000ごとに最新の重みが更新されます。
学習の早期終了についてはこちら。
GitHub - AlexeyAB/darknet: YOLOv4 (v3/v2) - Windows and Linux version of Darknet Neural Networks for object detection (Tensor Cores are used)
途中で間違って学習を止めてしまった場合でも、途中まで保存された重みを初期値として再度学習すれば続きを学習できます。

認識させる。

backup/にある重みを使って認識させる。
使う重みは自分で選んで、認識させる画像は自分で用意してください。

./darknet detector test cfg/obj.data cfg/yolo-obj.cfg yolo-obj.backup data/testimage.jpg



ちなみに

Windowsでやりたい場合はこのリポジトリからできるっぽいです。
しかもこれを使えばYOLOをAPI的に使えるっぽいです。
できたらAPI的な使い方についても今度記事にしたいですね。
GitHub - AlexeyAB/darknet: YOLOv4 (v3/v2) - Windows and Linux version of Darknet Neural Networks for object detection (Tensor Cores are used)

キーレイアウトやショートカットキーのカスタマイズ

MacBookでかっこよくショートカットキーを使っている友人を見て、WindowsにもMacのCommandキー的なものが欲しくなった。
とりあえずCtrl+FBPNでカーソル移動とかしようと考えたが、元からあるショートカットも残したい。(Ctrl+Fの検索とか)
そこで、CapsLockをMacのCtrlキーに、AltをCommandに見立ててショートカットを設定してみる。


環境



流れ

  • keyswapを使ってキーの割り当て変更。
  • AutoHotKeyを使ってショートカットキーのカスタマイズ。


keyswapを使ってキーの割り当て変更。

【参考URL】

変更するためのソフトは3種類くらいあるけど今回は開発状況と使いやすさを考慮してkeyswapを使う。
keyswapを使ってCapsLockを普段絶対使わない右Windowsキーに変更する。
なぜこんな回りくどい方法をとっているかというと、この後に使うAutoHotKeyでCapsLockへの割り当てがうまくいかないため。



AutoHotKeyを使ってショートカットキーのカスタマイズ。

【参考URL】


2種類くらい見つけたけどなんとなくAutoHotKeyを使う。


取りあえずこれだけ。ほかに便利そうなものは随時追加します。Mac使ってる人でこれがあると便利だよってのがあったら教えてください。
ActiveWindowInfo.ahk

RWin::RCtrl

RWin & b::Send, {Left}
RWin & f::Send, {Right}
RWin & n::Send, {Down}
RWin & p::Send, {Up}
RWin & h::Send, {Backspace}
RWin & d::Send, {Delete}
RWin & a::Send, {Home}
RWin & e::Send, {End}

!z::Send, ^z
!x::Send, ^x
!c::Send, ^c
!v::Send, ^v
!a::Send, ^a
!f::Send, ^f
!s::Send, ^s

^!t::Run, %windir%\system32\cmd.exe

return

!はAlt、^はCtrl


他に見つけた良さそうなもの

X-Mouse Button Control
KeyToKey
KMCustomizer

Geanyのインストールと自分の設定メモ。

環境

  • Ubuntu16.04



流れ

  • Geanyのインストール
  • プラグインのインストール
  • テーマのインストール
  • 設定



Geanyのインストール

sudo apt-get install geany



プラグインのインストール

sudo apt-get install geany-plugins



テーマのインストール

git clone https://github.com/codebrainz/geany-themes
mv ./geany-themes/colorschemes ~/.config/geany/
rm -r ./geany-themes



設定

テーマは、表示⇒色の設定からOblivion2にする。
設定は、編集⇒設定から以下のようにする。
f:id:shibafu3:20170720130930p:plain
f:id:shibafu3:20170720130940p:plain
f:id:shibafu3:20170720130947p:plain
f:id:shibafu3:20170720131000p:plain
f:id:shibafu3:20170720130902p:plain

プラグインは、ツール⇒プラグインマネージャーから以下のようにする。
f:id:shibafu3:20180222112831p:plain
f:id:shibafu3:20180222112844p:plain
f:id:shibafu3:20180222112852p:plain


Ubuntu16.04にEclipseを入れてみる。

環境

  • Ubuntu16.04



流れ

  • パッケージの更新
  • Eclipseのインストール
  • C++拡張ツールのインストール
  • 日本語化
  • エラーの対処



パッケージの更新

sudo apt-get update
sudo apt-get upgrade



Eclipseのインストール

sudo apt-get install eclipse



C++拡張ツールのインストール

sudo apt-get install eclipse-cdt



日本語化

日本語化ツールをインストールして /etc/eclipse.ini を編集する。

sudo apt-get install pleiades
sudo gedit /etc/eclipse.ini

エディタが開いたら下記を追記。

-javaagent:/usr/lib/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar



エラーの対処

参考URL

このままだと自分の環境ではなぜか『JVM terminated. Exit code=1』とエラーが出てしまい落ちたり、『パースペクティブのオープンで問題が発生しました』とエラーが出たりするので、参考URLの通りに /etc/eclipse.ini から下記を削除。

-vmargs
-Xms40m
-Xmx256m




使い方はまた今度。


CeresSolverをUbuntu16.04にインストールする。

Google製の数値最適化ライブラリCeresSolverをUbuntuにインストールする。


環境

  • Ubuntu16.04



流れ

ほとんど公式に書いてある通りです。簡単です。

  • 依存関係のインストール
  • ソースのダウンロード、展開
  • ビルド、インストール
  • 実行

依存関係のインストール

パッケージを最新にして、
CMake、google-glog + gflags、BLAS & LAPACK、Eigen3、SuiteSparse and CXSparseをインストール。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install cmake
sudo apt-get install libgoogle-glog-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libsuitesparse-dev



ソースのダウンロード、展開

ここからソースをダウンロード。下記コマンドで展開。

tar zxf ceres-solver-1.12.0.tar.gz



ビルド、インストール

ビルド用のディレクトリを作ってCMakeでMakefileを作りビルド。

mkdir ceres-bin
cd ceres-bin
cmake ../ceres-solver-1.12.0
make
make test

make testが正常に通ればビルド完了。

sudo make install

でインストール。


実行

適当にサンプルをコンパイルしてみます。

【参考URL】

参考URLからサンプルコードをお借りして、main.cppという名前で保存します。
以下のコマンドでコンパイル

g++ main.cpp  `pkg-config --cflags eigen3` `pkg-config --libs libglog` -lgflags -lceres -lpthread -fopenmp -lcholmod -lblas -llapack -lcxsparse

コンパイルのリンカーオプションが多く、pkg-configが使えるものと使えないものがあって少しハマりました。
自分の環境だとgflagsだったかのパスが通ってないなどでコンパイルが通リませんでした。
その場合は下記のようにして、LD_LIBRARY_PATH にgflagsのライブラリのパスを追加して下さい。
環境変数 LD_LIBRARY_PATH に /usr/lib/x86_64-linux-gnu を追加するため.bashrcに下記を追加。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu

.bashrcを読み直し。

source ~/.bashrc



UbuntuにOpenCV3.2とcontribをインストールする。

まとめはしましたが、まだ試してみていないのでハマる箇所とか抜けがあるかもしれません。


環境



流れ

  • Ubuntuのパッケージを最新にする。
  • gitとCmakeをインストールする。
  • 依存関係をインストールする。
  • OpenCVのソースとcontribのソースをダウンロードする。
  • Cmakeを使って自分の環境に合ったソースを生成する。
  • ソースをビルドする。
  • ビルドしてできたバイナリとヘッダを適切な場所に配置する。
  • 配置したバイナリとヘッダのパスを通す。



Ubuntuのパッケージを最新にする。

書きコマンドでUbuntuに入っているパッケージを最新にします。

sudo apt-get update
sudo apt-get upgrade



gitとCmakeをインストールする。

githubからソースをダウンロードするgitと、自分の環境に合ったソースを生成するCmakeをインストールします。

sudo apt-get install git
sudo apt-get install cmake



依存関係をインストールする。

OpenCVのビルドに必要なライブラリなどをインストールします。
何が必要でどれをインストールしたらいいかは、OpenCVのドキュメントのチュートリアルUbuntuのヘルプに書いてあります。
2つのURLで書いてあることが違うのですがどっちを信用すればいいかは分かりません。
他にも人によって若干違う(?)ような感じで、みなさんどこを参考にしているのでしょうか。違いは何なんですかね。
今回はOpenCVのドキュメントに従ってみます。

【参考URL】
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

1行目2行目は必須。3行目はオプションみたいです。

ちなみにUbuntuのヘルプに従う場合は以下。-qqはエラー以外を表示しないというオプションです。

sudo apt-get -qq install libopencv-dev build-essential checkinstall cmake pkg-config yasm libjpeg-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev python-dev python-numpy libtbb-dev libqt4-dev libgtk2.0-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils ffmpeg cmake qt5-default checkinstall

参考にさせていただた記事に従うと以下になります。

sudo apt-get -y install libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff4-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip



ソースをダウンロードする。

【参考URL】

インストールしたgitを使ってOpenCVのソースをダウンロードします。
ダウンロードする場所はどこでもいいのですが、今回はホーム直下にSourcesというディレクトリを作ってその中にダウンロードします。
下記のコマンドでホームに移動してSourcesというディレクトリを作成します

cd ~
mkdir Sources

できたディレクトリに移動してOpenCVのソースとcontribのソースをダウンロードする。

cd Sources
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

ソースのダウンロードはgitを使わなくても公式サイトからダウンロードしたり、githubのリリースのところからダウンロードしてもたぶん大丈夫です。
違いは、gitは最新バージョンで、公式サイトやgithubのリリースのところは安定バージョンがダウンロードできるってだけだと思います。
ダウンロード速度は公式サイトやgithubのリリースところからダウンロードしたほうが速いっぽいです。


Cmakeを使って自分の環境に合ったソースを生成する。

【参考URL】

まずダウンロードしたソースのディレクトリに移動してビルド用のディレクトリを作り、さらにそのディレクトリに移動します。

cd opencv
mkdir build
cd build

次に、Cmakeを使って自分の環境に合ったソースを生成します。

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=~/Sources/opencv_contrib/modules ..

一つ目のオプションはリリースモードを選択しています。
二つ目のオプションはインストールする場所を選択しています。
三つ目のオプションはOpenCVのcontribの場所を指定しています。gitでダウンロードしたopencv_contribの中のmodulesディレクトリを指定しましょう。
他にも必要ならば『-D WITH_CUDA=ON』や『-D WITH_TBB=ON』『-D WITH_FFMPEG=ON』などを追加してください。
何が設定できるかはCMakeLists.txtを見ればいいっぽいです。


ソースをビルドする。

make -j $(nproc)



ビルドしてできたバイナリとヘッダを適切な場所に配置する。

このコマンドでビルドされたバイナリとヘッダが共有ライブラリディレクトリにコピーされます。(たぶん)

sudo make install



配置したバイナリとヘッダを反映させる。

共有ライブラリにコピーされただけでは反映されないので、
このコマンドで共有ライブラリにコピーされたバイナリとヘッダを反映します。(たぶん)

sudo ldconfig



最後に

これで、OpenCVが使えるようになったはずです。
PythonC++で試してみましょう。

また、この記事に書いてあること以外に、
CMakeを使う前にこのコマンドを入力しないとエラーがでるかもしれないとか、

export PYTHON_INCLUDE_DIRS="/usr/include/python2.7"
export PYTHON_LIBRARYS="/usr/lib/x86_64-linux-gnu/libpython2.7.so"

最後に以下のコマンドが必要かもしれないと、参考にさせていただいた記事にありました。
エラーが出てしまった人は試してみてください。

sudo cp ~/opencv-3.1.0/build/lib/cv2.so /usr/local/lib/python2.7/site-packages/
sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'

ちなみに、OpenCVを使うために必要なものは make install コマンドで共有ライブラリにコピーされたはずなので、
gitでダウンロードしたソース(つまりこの記事の中でいうと、Sourcesディレクトリの中身)は削除しても大丈夫なはずです。(たぶん)
また、アンインストールの方法は共有ライブラリにコピーされたバイナリとヘッダを削除するだけ?なのかな?