la Bamba Rumba

【天文】PythonでStarNetを使う時の覚え書き

2020/01/06 22:22 投稿

  • タグ:
  • 天文
  • モールスP

 StarNet++というWindowsアプリがあります。天体写真用の画像処理プログラムの一種で、ニューラルネットワークを使って、星像とその背景(にある星間ガスの光と)を分離するものです(*1)。ただしこのソフト、CPUがAVX以降に対応してないと使えません。自分のPCはAVX非対応ですが試したかったので、オリジナルのPython版StarNetを使ってみました。
本記事は、その時の手順を揮発防止の目的でまとめたものです。天体写真の画像処理に古いPCを活用する事を考えておられる方の参考になれば幸いです。

(*1:オリジナルは、Nikita Misiura(ニキータ・ミシウラ)さんがPython(言語)で書いたStarNetというプログラムです。通常、星の背景にある星間ガスの輝きは非常に暗いため、写真に残すには強調処理が必要です。ですが星も一緒に処理してしまうと、星像が明るくなりすぎてディティールが飛んでしまうため、通常は、手動/人力でマスクを作って星と背景を分離して処理します。StarNet++は、通常の天体写真とそこから星を消した画像を使って機械学習させた「重み」ファイルを使うことで、天体写真から星と背景を自動分離するプログラムです。)

StarNet++とStarNetの違い

・StarNet++(Windowsアプリ)
- 要64bitOS, 要AVX(Core iシリーズ 第二世代(SandyBridge)/AMD FX(Bulldozer)以降)
- 出来合いの「重み」ファイルを用いた星像分離機能のみ。機械学習機能はない。
- 頒布されている「重み」ファイルは、主に天体望遠鏡を使って撮影された画像から生成されたもの。
- 頒布元:https://sourceforge.net/projects/starnet/

・StarNet(Python版オリジナル)
- 要64bitOS(*2), 要SSE2以降(Pentium4/Athlon64以降)
- 組み合わせるTensorFlowライブラリを、32bit版、SSE2版、AVX版、AVX2版, CPU+GPU版などから選べる。
- 自分で撮って処理した画像で機械学習させることが出来る。
- 頒布元:https://github.com/nekitmm/starnet

(*2:自分は64bitOS環境しか持っていないので確認できませんが、32bit版のTensorFlowライブラリもリリースされており、32bit環境でも実行可能かも知れません。)

(他に、学術用画像処理プラットフォームPixInsight用のプラグインも存在します。)

処理速度について

 参考になるかは判りませんが、私が試した際の処理パフォーマンスについて書いておきます。Core i7 1.7GHz(4コア8スレ/Nehalem) RAM 8GB + Win10 Pro(64bit) + Python3.6.3 + TensorFlow 1.12(SSE2)で、16M画像一枚に要した時間は 26.3分でした。手動でマスク作るのとどっこいですが、その間、別の作業が可能なので まずまずの結果と考えています。

SSE2とAVXの処理速度差が2~6倍、AVXとGPUの処理速度差が10倍以上あるみたいなので、AVX対応CPUなら4~13分、NVIDIA GPUなら30秒以下~1分ちょいで処理できるのではと思います。


Python環境の構築

 現(2020/01/04)時点で公開されているStarNetのソースは、Python3.6用のもので、scipy 1.0を前提にした比較的古いコードです。既にPythonを使用されている場合は、ANACONDA NAVIGATORのcreateやPythonのvenvなどで、専用の仮想環境を構築されることをお勧めします。多分私よりPythonに明るいと思われるので自助努力を期待して、ここでは素のPython環境構築について説明します。(Anacondaの場合については、後で軽く触れます。)

1.Python.orgから3.6.xの64bit版パッケージをダウンロードする

- 32bit版Windowsの場合は、32bit用パッケージをダウンロードします。但し試せてないので、結果は保証できません。
- Python3.7でも環境を構築できなくはありませんが、scipy 1.3以前のバージョンが使用できないため、ソース修正が必要になります。

2.'D:\Python36'等の専用ディレクトリを作成し、インストールする

(インストールオプションは、ALLユーザ/自分のみのどちかにするかは任意。インストール先は指定、PATHは通さない。他はデフォルトのまま)

3.DOS Promptを開いて、先ほど作成した専用ディレクトリに移動します

C:\Users\Guest>CD D:\Python36
D:\Python36>

4.pipを最新版にする

D:\Python36>python -m pip install pip --upgrade

- pipはインストーラとしての機能だけでなく、インストールされたモジュールの管理や、モジュール間の依存関係のチェッカーの機能も担っています。新旧のpip間でこれらの情報管理に齟齬が出る場合があり、古いpipでインストールしたモジュールが、新しいpipで更新/削除できない等のトラブルが起こる可能性があります。なので最初に最新に更新しておくのがセオリーの様です。

5.scipy1.0をインストール

D:\Python36>python -m pip install scipy==1.0

- 現時点で入手可能なStarNetのソースは画像の入出力にscipy.misc.toimageオブジェクトを使用していますが、これがscipy 1.3から廃止になっているため、scipy 1.2だとワーニングが、1.3だとエラーが出ます。1.0を使うのが一番手間がかからないと思います。

6.TensorFlowライブラリをインストール

- 最初にCPUのSIMD拡張命令の対応状況を確認します。
 CPU-Z というCPU情報解析ツールを使うのが手っ取り早いですが、システムのプロパティから型番を得て、IntelあるいはAMDのサイトで調べる方法もあります。(大雑把には、Intelならcore i○-xxxxのxxxxが4桁の数字なら、AMDならFX(Buldozer)以降なら、AVXに対応しているはず。)

- AVX版で良い場合は、

D:\Python36>python -m pip install tensorflow==1.12

- Anaconda環境でもtensorflowはpipでインストールしてください。
- インストールするバージョンは1.12か1.13がベターです。1.14から推奨される呼び出し方法が変更になっていて後述するソース修正が必要です。1.5以降ではエラーが出ます。

- GPU版を利用する場合は、

- NVIDIA製GPUを利用している場合、CUDAドライバやCUDA Toolkitと併用することで、TensorFlow-GPUを使用してより高速に処理できる可能性があります。手順の詳細は'Tensorflow' + 'GPU'(+ 'NDIVIA')でググってみてください(私はGPUがNDIVIAではないので確認できません。自助努力でヨロ)。

- 32bit版、SSE2版、AVX2版、CPU+GPU版を必要とする場合は、

- GithubのTensorFlow-Windows-Wheelsから対応するTenserflowのパッケージを探します。
- Python3.6環境で使うので、'py36'と表記のあるものを探します。
- CPUがAVX2にも対応しているのであれば、'AVX2'と表記のあるものを使用した方がより高速に処理できます。
- バージョンは1.12, 1.13がベターですが、1.14以降のバージョン番号が付いていても、以前のバージョンをSSE2や32bit環境用にリビルドしたものが混じっているので、それぞれのパッケージの表記を確認して、慎重にパッケージを選んでください。
- 選んだパッケージをダウンロードして、'D:\Temp'等に保存します。

- ダウンロードしたwheelパッケージのインストール(例)

D:\Python36>python -m pip install D:\Temp\tensorflow-1.12.0-cp36-cp36m-win_amd64.whl

7.他の必要モジュールをインストール

D:\Python36>python -m pip install numpy==1.14

D:\Python36>python -m pip install Pillow

D:\Python36>python -m pip install matplotlib

- numpy 1.17は今回使用するモジュールと互換がなくエラーが沸くので不可。1.14 ~ 1.16を指定してインストールします。


Anacondaの場合

1.ANACONDA NAVIGATOR 左手のアイコンから Environment をクリック
2.三列ウィンドウ表示の真ん中のウィンドウの下辺にある + Createボタンをクリック
3. Create New Environment ダイアログが開くので以下を設定する
- Name:環境名(例: py36)
- Pachages:Python 3.6を指定する
-  Create  ボタンをクリック
4.二列目のウィンドウの先ほど指定した環境名の右側の右向き▲ボタンをクリック
5.表示されたプルダウンメニューから Open Terminal を選択


6.表示されたDOS窓を以下のように操作する。

(py36) D:\>CD D:\Python36

(py36) D:\Python36>conda install scipy==1.0

(py36) D:\Python36>conda install Pillow

(py36) D:\Python36>conda install numpy==1.14.1

(py36) D:\Python36>conda install matplotlib

(py36) D:\Python36>python -m pip install tenserflow==1.12

 or

(py36) D:\Python36>python -m pip install D:\Temp\tensorflow-1.12.0-cp36-cp36m-win_amd64.whl

- 詳細は前項「Python環境の構築」を参考にしてください。


StarNetの準備

1.Python環境フォルダ下にStarnet用のディレクトリを作成し移動します。

D:\Python36>MD Starnet
D:\Python36>CD Starnet
D:\Python36\Starnet>

2.StarNetソースをGithubから取得する

D:\Python36\Starnet>python -m pip install https://github.com/nekitmm/starnet.git

あるいは
https://github.com/nekitmm/starnetからzipファイルを取得し、書庫内のstarnet-master以下のファイルを、先ほど作成したディレクトリ以下に展開します。

3.「重み」ファイルを取得する

https://github.com/nekitmm/starnetの Readme.md の Weights for the network の項目にあるLINKから、学習済みの重みファイル書庫をダウンロードし、Starnetディレクトリに上書きで展開します。


実行

- Starnetディレクトリに処理対象の天体写真をコピーします。
- 以下のコマンドをタイプしstarnet.pyを実行します。

D:\Python36\Starnet>python starnet.py transform [処理対象画像ファイル名.拡張子]

- 以下の様に、処理が進行すれば完了です。

Restoring previous state of the model...
Done!
Open input image...
Done!
Transforming input image... 0%
Transforming input image... 0%
...
Transforming input image... 1%
Transforming input image... 1%
...
Transforming input image... 100%
Saving output image...
Done!
Saving mask...
Done!
Total time taken: xx.x minutes

- 入力ファイルと同じ階層に、同じ画像形式で
 入力ファイル名_starless.[拡張子](星無し背景画像)
 入力ファイル名_mask.[拡張子](星マスク画像)
 が作成されています。


エラー対策

ModuleNotFoundError: No module named 'モジュール名'

- モジュールのインストールに不足がある場合に出ます。表示されたモジュールをインストールします。

D:\Python36>python -m install [モジュール名]

ただし、不足モジュールに'PIL'が表示された場合は'Pillow'をインストールします。(PILはPython Image Libraryの略で、現在その機能はPillowモジュールが担っています。)

ImportError: cannot import name 'toimage' from 'scipy.misc'

- scipyのバージョンが1.3になっている可能性があります。まずはPythonのバージョンを以下で確認して下さい。

D:\Python36\Starnet>python -V
Python 3.x.x

- Python 3.6.x ならscipyを1.0にダウングレードを試みてください。

D:\Python36\Starnet>python -m pip uninstall scipy

D:\Python36\Starnet>python -m pip install scipy==1.0

- 1.0にダウングレードできなかった場合は1.3未満のバージョンを試してください。ワーニングは出ますが実行可能です。1.3以降しかインストールできない場合や、Python 3.7.x の場合は、ソース修正が必要です。

- 修正例

#from scipy.misc import toimage
from PIL.Image import forarray as toimage

(対象:starnet_utils.py, test.py, train.py, transform.py)

- Starnetのソースは、scipy 1.3から廃止されたscipy.misc.toimageオブジェクトを使用しています。Python3.7だとscipy 1.3が使用できる最古バージョンのため、エラーで実行できません。PIL.Image.forarrayオブジェクトで代用します。

#toimage(output * 255, cmin = 0, cmax = 255).save('./' + image + '_starless.tif')
output *= 255
toimage(output.astype(np.uint8)).save(.save('./' + image + '_starless.tif')

(配列:mask, all についても同様に処理する必要があります。)

- scipy.misc.toimageには画像出力時の正規化機能がありますが、PIL.Image.forarrayには正規化機能はないため、uint8にキャストします。

ImportError: DLL load failed: ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。

- 実行不可能な命令を含むTensorFlowライブラリを使っている可能性があります。
python -m pip install tensorflow で導入されるライブラリはAVX版です。)
- CPUが対応しているSIMD拡張命令をご確認の上、適したライブラリを取得して(エラーが出たTensorFlowをuninstallしてから)インストールしてください。
- TensorFlow-Windows-Wheelsで頒布されているパッケージのファイル名は、バージョンが同じならSSE2版、AVX版、AVX2版の別に依らず同じです。取得後に何版か判別はできないので、慎重に作業して下さい。

WARNING:tensorflow:From ~:The name tf.trainable_variables is deprecated. Please use tf.compat.v1.trainable_variables instead.

- TensorFlow 1.14から旧型式でのアクセスにワーニングがでます。

- 修正例

#import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

- 明示的にV1形式を使用します。
- TensorFlow 1.5~を使用している場合は、このワーニングに対処しても、他のエラーが出て実行できません。

ImportError: DLL load failed: 指定されたモジュールが見つかりません。

- TensorFlow 1.5や2.0を使用している可能性があります。1.5からライブラリの呼び出し方が変更になったので、対応するには手間がかかります。最新環境で最高のパフォーマンスを追求されるのなら止めませんが、単にStarNetを使うだけでしたら、TensorFlowのバージョンを下げることをお勧めします。

(番外編)古いPCで実行しているが、どうにも遅すぎる

- 諦める。
- PCをNVIDIA製GPU搭載の最新機種にリプレースする。
そっけない...
ですが、ここに妙案が...
- Google Colab上で実行することで、GPUアクセラレーション付きの仮想マシンを利用した事例がある様です。
ただし、
- Googleアカウントが必要です。
- Google Driveに画像ファイルや重みファイルを置く必要があります。
- ColabのJupyter Notebookからの操作になります。
- Colab固有の流儀があり、簡単なソース修正が必要です。(ドキュメント)
- ColabからGoogle DriveへのアクセスはIDベースになるため、入出力処理の変更が必要です。
- ColabはAI研究/開発者向けのサービスです。今後、恒常的に利用できる保証はありません。

では、良き結果が得られることを祈ります(-人-)numpy...


コメント

コメントはまだありません
コメントを書き込むにはログインしてください。

いまブロマガで人気の記事