AI_ML_DL’s diary

人工知能、機械学習、ディープラーニングの日記

第一原理計算をやってみよう!20220614

20220614 第一原理計算をやってみよう

参考書:前園 涼/市場 友宏著 動かして理解する 第一原理状態計算

 

機械学習/ディープラーニングによって第一原理計算の高速化や高精度化を図るということを体験したいと思っているのだが、全く進んでいない。

今回取り上げるのは機械学習を全く含まない純然たる第一原理計算である。

まずこれを知らないとダメだろうということもあるが、今回このテキストを使ってみようと思ったのは、どうしても自分で計算してみたいことがある、パソコンでどこまでできるか知りたい、できればこの延長線上で大型計算機も使えるようになりたい、というのが最も強い動機である。

 

 

 

 

 

 

 

style=186, iteration=500

 

Expert SystemからLearning systemへ

機械学習は、どう使うのか、どう使われているのかを、日々、考え、調べ、学んでいる(つもりである)。

 

機械学習はさまざまな分野で用いられているが、機械学習を用いることによって得られた成果は、高解像度、高速、自動化、高精度化、分類、などでAI/AGIというほどのものではなく、見慣れてしまっているものが多い。

 

しかしながら、PauliNet, FermiNet, AlphaZero, AlphaFoldなどは、レベルが違っているように感じる。その仕組みを理解し、そのアルゴリズムを使ってみたいと思う。さらに、N. Artrithらがナノ粒子表面のDFTシミュレーションを機械学習を使って精密化している研究成果なども、実際に使ってみたいと思っている。

 

一昨日から、Using AI to accelerate scientific discovery - Demis Hassabis (Crick Insight Lecture Series)、のビデオを聴講している。

AlphaFoldは”32 component algorithms and 60 pages of SI”と説明されている(SI:supplemental information)。約20名が5年間をかけて開発しており、domain knowledgeを用いているので、AGIではないと述べている。

 

どのようなものなのか、論文をみてみよう。

Highly accurate protein structure prediction with AlphaFold

John Jumper et al., Nature, Vol 596, (2021) 583

 

Fig. 3

Training with labelled and unlabelled data
The AlphaFold architecture is able to train to high accuracy using only supervised learning on PDB data, but we are able to enhance accuracy (Fig. 4a) using an approach similar to noisy student self-distillation35. In this procedure, we use a trained network to predict the structure of around 350,000 diverse sequences from Uniclust3036 and make a new dataset of predicted structures filtered to a high-confidence subset. We then train the same architecture again from scratch using a mixture of PDB data and this new dataset of predicted structures as the training data, in which the various training data augmentations such as cropping and MSA subsampling make it challenging for the network to recapitulate the previously predicted structures. This self-distillation procedure makes effective use of the unlabelled sequence data and considerably improves the accuracy of the resulting network. Additionally, we randomly mask out or mutate individual residues within the MSA and have a Bidirectional Encoder Representations from Transformers (BERT)-style37 objective to predict the masked elements of the MSA sequences. This objective encourages the network to learn to
interpret phylogenetic and covariation relationships without hardcoding a particular correlation statistic into the features. The BERT objective is trained jointly with the normal PDB structure loss on the same training examples and is not pre-trained, in contrast to recent independent work.

良質な3次元構造データベースPDB(Protein Data Bank)が存在するということが大前提だということだろう。

 

Kaggleコンペが面白いのは、様々な分野から良質なデータベースが提供されるからだろうと思う。

プログラミング技術を習得して、Kaggleマスターを目指そう!

とは思うのだが、今は時間が取れず、Kaggleから遠ざかっている。

こんなことではだめだ。

 

こういうときに自分の性能を向上させるAIモデルを開発してみたいものだ。

自分の性能を向上させるAIモデルの仕様を決めよう。

Q&Aモデルが良さそうだ。

Q:現在の仕事のレベルアップとKaggleグランドマスターの両方を1年間で達成するにはどうすればよいのか。

A:現在の仕事のレベルアップに必要なAIモデルと、KaggleのGold Medalを獲得できるAIモデルを半年くらいのうちに開発すればよい。

 

ということで、今から実行に移そう。

 

style=185, iteration=500

 

吸着

W. J. Moore:Physical Chemistry 3rd Edition, 1962の藤代亮一訳に学ぶ

 

8章 34. 固体表面における気体反応

Langmuirの等温式は、表面が吸着分子によって次第におおわれ、吸着層が均一な1分子の厚さになったとき飽和するということに基礎をおいている。この等温式は特に化学吸着、すなわち、通常の化学結合と同じ程度の結合によって吸着分子が表面にむすびつけられているような吸着に適用できる。これはまた化学反応速度を促進させる吸着方式であり、化学吸着層は触媒反応における中間化合物としての役割を果たすのである。

 

つづく

 

f:id:AI_ML_DL:20220313080735p:plain

style=184 iteration=500



 

中性子散乱とX線散乱の機械学習による解析

中性子散乱とX線散乱の機械学習による解析

 

PDF解析をDiffPy-CMI&ASEでやりはじめたが、すでに限界が見えている。

これは、トライアンドエラーの積み上げ方式、すなわち、力業で攻める方式である。

すでに、パラダイムシフトが起きている。

古いパラダイムは潔く捨てよう。

 

ということで、次の総説に学び、プログラムを作って使ってみることにする。

 

Machine learning on neutron and x-ray scattering and spectroscopies
Zhantao Chen, Nina Andrejevic, Nathan C. Drucker, et al.                                            Chem. Phys. Rev. 2, 031301 (2021)

 

f:id:AI_ML_DL:20220220002807p:plain

小角散乱と吸収スペクトルはシミュレーションスペクトルデータベースがあるので、それを教師データにすれば良さそうと書かれている。

回折スペクトルは、そう簡単ではない。回折スペクトルをとる目的によって欲しいデータベースは全く異なるという理由で。

それでは始めてみようと思って小角散乱から取り掛かかってみたが、良く用いられる球状近似や楕円近似から、多角形、棒状、膜状へと対象範囲を広げていくことが、比較的容易に行えることが特徴のようだが、現状、ニーズは少ないので後回しにしよう。

次は吸収スペクトルだ。XANESやEXAFSは経験を要する解析である。これなら役に立ちそうだと思って取り掛かってみた。やはり重要なのは教師データである。これが充実しているのでお薦めだということで、シミュレーションスペクトルの計算方法、近似手法の検討、測定データとシミュレーションデータとの比較などを見ているうちに、提示されている例は広い範囲をカバーしているが、実際に使うとなると、もっと精密な計算に基づくシミュレーションスペクトル、様々な原子構造モデルに対するシミュレーションスペクトルが無いと結局は使い物にならないことがわかってきた。膨大な教師データからニューラルネットワークが学ぶのは、隠れた特徴量ではなさそうだ。これなら、与えられた条件を満たすスペクトルを検索しているのと大差ないように感じてしまった。イメージ図は不足データを補完することを期待させるものだが、測定スペクトルとの乖離が気になるし、そもそもデータベースはK殻の吸収が前提で、L殻は含まれていないようなので、途中下車することにした。

他に無いのかと探してみたら、PDFのことが書かれている箇所があったので読んでみたが、原理的なことを形式的に説明しているだけである。原子構造モデルからPDFを計算したシミュレーションスペクトルのデータベースは、公開されていないようである。自分で作成しよう。

 

以上で、やるべきことが明確になった。とにかく、計算資源を活用して、精度の高いシミュレーションスペクトルを集めることから始める必要があるということだ。

機械学習を用いて、短時間で、大量の、高精度なシミュレーションスペクトルを作ることができるプログラムをつくることも、選択肢の1つである。

 

<要検討>

損失関数の弱点は、1つ1つのデータの重要性の違いを、評価できていないことにあるような気がする。

マルチドメインなんて、重要性の違いという言葉に意味が無いような気がするので、個別にベストな解を目指すようにすることになるのだろうな。

1つ1つのデータの重要性の違いを評価する必要があれば、そうすればよい。データごとに最適化するだけの事。つまり、目的に適合しないデータは省く。ノイズとして扱うか信号として扱うかの判断を1か0かではなく定量的に評価する必要があるのだが、結局は原理に行きつくはずなので本質を把握し最適な関係式を探して適用することができるかどうかにかかっており、最適な関係式を見つけることができなければそのレベルのものになるということだな。

 

日々、レベルが下がっていくように感じる。その原因が、知れば知るほどわからないことが増える。何がわかっていないかを知る機会が増えていることがその理由であればよいのかもしれないが、単に思考力が低下し続けているのだということであれば、それは、克服する方法を探して対策を講じなければいけない。実際にはどちらも含まれているのだろうと思うので、後者の対策は意識的にやっていく必要があるように思う。

 

 

f:id:AI_ML_DL:20220220000930p:plain

style=183 iteration=500



Mask R-CNNを使ってみよう!2022.1.21-2

Mask R-CNNを使ってみよう!2022.1.21-2

ちょっとハードルを下げてみよう。

この2日間で、どんなかたちであれ、Mask R-CNNを使う!

 

1月22日12時すぎ:

気合十分で始めたのだが、なかなか進まぬ!

参考にしている(動かそうとしている)コードは、トレーニング無しのコード、すなわち、cocoで学習したモデルtorchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True, progress=True, num_classes=91)

を使って、用意した画像を、その学習済みモデルに入力して、どのような結果が得られるかを見るだけのものである。

参考にさせていただいているのは、Sovit Ranjan Rath氏の「Instance Segmentation with PyTorch and Mask R-CNN」というタイトルの記事とコードである。

学習することによって性能を上げるのが常であるが、今回は、学習済みモデルが学習したドメインと、インスタンスセグメンテーションに用いる画像はドメインが同じなので、学習する必要がない、というのが前提となっている。

 

つい最近終了したKaggleのコンペで、細胞のセグメンテーションの課題があった。そこでも学習済みのMask R-CNNを使っているチームがいたが、みんな、学習用のデータを使って学習させてから予測する。何が違うのか。そう、ドメインが違う。セグメンテーションモデルの学習済みモデルは、cocoで学習させていて、cocoには細胞の画像が含まれていないので、そのまま使っても正しく予測できるはずがない。細胞の教師データを使って追加で学習させる必要がある。つまり、学習済みモデルのドメインと、そのモデルを適用するドメインが同じであればそのまま使えるが、ドメインが異なれば、新たなドメインのデータセットで追加学習あるいは再学習させる必要がある。

 

1月22日22時すぎ:

Anacondaプロンプトで、次のコマンドを入力することによって、image1.jpgに対して、インスタンスセグメンテーションの結果が表示された。

python mask_rcnn_images.py --input ../input/image2.jpg”

f:id:AI_ML_DL:20220122202938p:plain

f:id:AI_ML_DL:20220122220041p:plain

手元にあるいろいろな画像で試してみてわかったことは、91種類の物体に対しては、かなり正確に判別するようだが、91種類以外の物体は検知されない。当然のことだが、次のチューリップは検知されなかった。

f:id:AI_ML_DL:20220122220308j:plain

閾値を0.4まで下げると全体がバウンディングボックスで囲まれた。ラベルは見えないのでわからない。"potted plant"と判定したのだろうと思う。

f:id:AI_ML_DL:20220122222907p:plain

目的物に対して学習させないと使えないことを、改めて感じさせられた。
個々の物質に対する識別能力が高ければ高いほど、少しでも違っていると検知しないということになる。もちろん確率の問題なので、確からしさを下げれば検知される。

上に示した絵画で、0.965のしきい値では、子どもは検知され、母親は検知されていない。しきい値を0.7まで下げれば、次のように、母親も検知された。

f:id:AI_ML_DL:20220122221752p:plain

ラベルと、バウンディングボックスと、スコアと、マスクの4つのデータが出力されること、および、それらのデータ構造の概要がわかった。

cocoで学習させたMask R-CNNが簡単に使えることがわかったとともに、目的物ごとに、データセットを用意して、追加学習させないことには、どうにもならないことも、身に染みて、わかった。

 

プログラミング技術の向上を急ごう!

 

f:id:AI_ML_DL:20220121113852p:plain

style=182 iteration=500

 

PDFgui/fit2を使う ⇒ DiffPy-CMIへ ⇒ DiffPy-CMI + ASEへ

PDFgui/fit2を使う

 

「今日からMacBook Pro/Anacondaを使おう(2021.12.11-12)」という記事を書いて、DiffPy-CMIを使えるところまで進もうとしていたのだが、停滞中である。

 

まずは、PDFgui(DiffPy-CMIの前のバージョン)についてもう少し前に進みたいと思って、この記事を書いている。

 

現状:python=2.7でしか動かないということが気にいらないので、賞味期限切れのsingle-file installers, diffpy-1.0-r3067.exeをダウンロード、インストールして練習用に使っている。

しかしながら、発展性が全くないので、Windows/Anaconda環境で使うことにする。

といっても、Anacondaのコマンドプロンプトから、以下のcondaコマンドを入力しただけである。

conda update -n base conda
conda config --set restore_free_channel true

conda config --add channels diffpy
conda create --name=py27 python=2.7
conda activate py27
conda install "diffpy.pdfgui>=1.1.2"

 

DiffPyのフォルダーに新たにPDFgui(py27)が追加されただけで、何も変わらない。

さて、測定データを借りてきたのだがどうやって読み込めばよいのだろう。

テキストデータは、そのまま読み込むことができた。担当の方がこのソフトで読めるようして下さっていたということ。

 

解析準備が整った。PDFfit2を使えばよいだけだが、フィッティングパラメータが理解できていない/忘れていることに気付いた。3次元原子構造モデルを使って解析することに気をとられ、PDFのデータがどのようにして作られているのかも理解できておらず、スペクトルの減衰、ピーク幅、そのサイズ依存性、ひずみや欠陥の評価方法など、知らないことだらけだ。

粒径に意識が集中しすぎていたようだ。

 

球形近似で粒径を求めるだけであれば、比較的簡単に行えることが分かった。

1.QdampとQbroadは使わない事。

2.フィッティングパラメータは6つ

・Scale Factor

・spdiameter

格子定数

・u11, u22, u33

・delta2

・delta1

delta1とdelta2を両方同時に使うとRwは小さくなり、フィッティングは良くなるが、片方がマイナスになるのが気になる。そのことに合理性があれば良いと思うが、そこまで確認は取れていない。

とりあえずうまくいってると思うのだが、それは、Rigakuの技術資料のおかげである。その資料には、QbroadとQdampの値を大きくすると(いずれも0.05くらい)、ナノ粒子のG(r)のように、減衰してしまうことが、図で示されているのである。

 

このことを知らずに、QbroadとQdampを変数にしてフィッティングすると、エラーになれば気付くのだが、エラーにならず、予想に近い粒径で収束することも起こりうるので、まずは、使わないに越したことはないと思う。

 

ひずみや欠陥の情報を得ようと思ったら、もっともっと掘り下げないとダメだと思うし、PDFguiではなく、DiffPy-CMIを使うことが必要で、かつ、ひずみや欠陥を原子構造モデルで自在に作り出すことができるソフトと組み合わせることが必要である。

そこまでやらないと、PDFを使う意味が無い。球体近似で平均粒径を算出しただけでは、殆ど利用価値は無い。フィッティング後の格子定数が小さくなるとか、uijが大きいとかに、物理化学的意味はあるのだが、そこは通過点。ひずみのラジアル方向の変化、表面に吸着している元素の情報、・・・。

 

*次の機会には、次のレベルに行こう!

 

1月24日-25日

Brookhaven National LaboratoryのPavol Juhasさんのパワポ資料:DiffPy-CMI - a software toolbox for real-space structure analysis and Complex Modeling

を読んでみた。パワポだから、読むところは少ない。

 

まずは、PDFguiについて、

PDFgui limitationsとして1ページに15行ほどでまとめられている。

・periodic structures only, no support for isolated particles

扱えるのは周期構造のみ、孤立粒子は扱えない。

球体近似でナノ粒子の粒径を算出することが可能だが、それは、ナノ粒子を孤立粒子として解析しているのではないということかな。

周期構造についてPDFを計算し、その境界条件として、ナノメートルの球体であることを適用することと、クラスターやナノ粒子の原子構造モデルに対してPDF計算することとは等価ではないということだな。

・particle size corrections only for spherical shape, no option for ellipsoid, cylinder, prism, etc.

PDFguiの開発チームから、こうやって明確に表現されると、落胆してしまう。

楕円でも円柱でも正八面体でも幾何学的に表現できるものは、容易に計算できるものだと思っていたが、そう簡単に計算できるものではないということか、それとも対応する予定は無いということなのか。

・internal structure representation is very basic - no options mor molecules, rigid groupes, bond length/angle relations, no internal support for representation as space group with asymmetric unit

・limited math support within constraint formulas

・no way to adjust PDF calculations by user-defined profile functions or improved peak-width formulas

・no option to incorporate other informations soueces (theory or experiment) into optimization

・PDF-calculation engine PDFfit2 is hard to maintain or extend

こうやってできないことを並べ立てられると、幻想は打ち砕かれ、目が覚める。

これらをできるようにしたのが、DiffPy-CMIということなのだろう。これらすべての制限を取っ払うことができたのかどうかはわからないが、PDFgui/fit2にはこういう制約があるとは間違いないということだ。すなわち、PDFgui/fit2は、触媒粒子に対しては役に立たないということは間違いないところだろう。

最後に、PDFgui/fit2のadvantageが書かれている。

・eagy to learn, noneed to know any programming language

・[simple] simulations are easy to setup and process

なるほど、こういう利点があるのか。

確かに、短期間で学べた。これ以上はやろうとしても出来ないところまで到達したのだ、PDFgui/fit2においては。

 

次に、何ページかにわたって、DiffPy-CMIの概要の説明が続き、概要が1ページにまとめられている。

上記のことができるようにした、あるいは、できるはずだということである。

最後に3つだけdrawbacksが書かれている。

・steep learning curve

・no GUI, canbe only used from Python scripts

・requires fair knowledge of Python

1行目を直訳すると急激な成長曲線となるが、どういう意味だろう。これを使えば急激に成長できる、ということであればdrawbackではない。急な坂道だから、体力・気力・知力がなければ一歩たりとも進めないということなのだろう。

2つ目は、アイコンを押せばソフトやデータがロード/セーブされるとか、アイコンを押せばシミュレーションスペクトルやフィッティング残差がグラフ化されて表示されるのではないということだ。FortranやBASICなどで経験してきたようなプログラムを書かなければ何も始まらないということだ。Pythonでプログラムを書かなければ何も始まらないのだ。

3つ目は、Pythonを使いこなすには十分な知識が必要だということである。

要するに、DiffPy-CMIは何でもできますよ、ただし、知力・気力・体力のある人に限る!と言われているのだ。

とはいえ、PythonFortranやBASICよりも格段に書きやすいし、見やすい(他人が書いたプログラムでも、読みやすい・理解しやすい)言語だと思う。

FortranやBasicは、書いた当人でもしばらく経つと解読に苦労するのだが、Pythonはそこは圧倒的に扱いやすいと思う。

 

ともあれ、DiffPy-CMIを攻略しなければ、PDF測定データが、宝の持ち腐れになるということは間違いないので、早急に習得しなければならない。

 

さあ、DiffPy-CMIの世界へ飛び立とう!

 

1月28日(金)

 ナノ粒子の解析にPDFは有効だという論文を読んでいると、確かにそうだな、2 nmくらいの白金粒子だと、最表面原子の数は50%くらいになるのかな。そうすると、最表面原子層の中心に向かう原子間距離が全て変化すれば、容易に検出されるだろうと思うのだが、そう簡単な話ではなさそうである。各原子はエネルギー的に安定な位置に収まろうとするのだが、その経路は複数あり、計算上の最終安定状態がわかっても、いつその状態になるのかわからない。

 観測されたスペクトルから推定される構造が、エネルギー的に安定かどうかは、計算すればわかるが、実際に安定状態になっているかどうかはわからない。熱力学的不安定状態にあるナノ粒子を観測する際に、原子が移動しやすい温度にまで上げてしまうと、構造安定化が生じるかもしれない。

 触媒活性が、熱力学的安定状態で実現されているかどうかもわからない。

 いずれにしても、正しい答えは、全てを正しく処理し、理解し、計測し、解析し、考察しなければ、得られないのであるから、すべてできるようにしていこう。

 

2月11日(金)

今日、Windows Subsystem for Linux 2(WSL2)の環境で、Anacondaをインストールし、DiffPy-CMIとASEをインストールし、JupyterLab上でdd2019-diffpy-cmiのプログラムの動作確認を行った。

「DiffPy-CMI + ASE」の計算環境が、ようやく整った。

まだリンクさせて動かしてはいないので、計算環境として十分かどうかは、実際に計算させながらの作業となる。

 

2月13日(日)

Windows10+WSL2で「DiffPy-CMI + ASE」を使うことにしたので、MacBook 

proは知人に使ってもらうことにし、初期化した。

 

2月14日(月):DiffPy-CMI

diffpy/add2019-diffpy-cmiを走らせてみる。(GitHubからJupyterLabに移した:知人にやってもらった)

01から10まで走らせてみた。02, 06, 08, は途中で停止、もしくは図が表示されず。09, 10はdiffpy.mpdfモジュールがインストールされていないために動かなかった。

 

2月15日(火):diffpy/add2019-diffpy-cmi

09, 10のdiffpy.mpdfは、Python 2.7バージョンであり、使う予定もないので無視する。

02は、ipyparallelをインストールしてOK、さらに、'Line 2D' object has no property 'hold'は、hold = Falseを除くことで、OK

06, 08で図が表示されなかったのは、%matplotlib notebookを%matplotlib inlineとすればOK、ということで、チュートリアルプログラムの動作確認は、無事終了!

 

 

f:id:AI_ML_DL:20220116090900p:plain

style=181 iteration=500

 

Mask-RCNNを使って、画像解析しよう。

2022年1月5日

Mask-RCNNを使って、画像解析しよう。

 

昨日、ブログ記事を参考にして細胞のインスタンスセグメンテーションを学ぼうとしていた。Mask-RCNNモデルをGitHubからもってきて、インストールまでできた。しかしながら、今朝からcocoで学習させたweightをダウンロードしようとして行き詰まってしまった。行き詰まりの原因の1つは、辿った先のGitHubのレポジトリーがなくなっていたことにある。

 

9:12 作戦変更 

Kaggleコンペで、PyTorchでMask R-CNNを使っているコードがあったので、それから学んでみよう。

Anaconda3のjupyter notebookにアップロードして動かしてみた。

ModuleNotFoundError: No module named 'torchvision'

pytorch.orgで調べてみよう。

関係ないと思うが、pytorchのバージョンが1.6.0だったので、1.10.1 にアップデートしてみる。conda update pytorch。

9:40頃完了。しかし、1.6.0のままだった。なぜだろう。ならば、1.6.0をuninstallしてから、あらためてpytorchをインストールしようと思って、conda uninstall pytorch=1.6.0としてみたら、途中で作業が進まなくなった。環境が、inconsistentなのだそうだ。

 

10:12 進まないので、anacondaプロンプトを強制終了し、torchvisionをインストールすることにした。conda install torchvision。見つからない。channelを追加したらインストールできたが、情報が古くて、python2だった。

Kaggleで何でもできるようになった(機械学習が身に付いた)と思っていたのだが、大間違いだった。

Kaggleの計算環境は理想的(至れり尽くせり)であった。だから、いろんなことができるようになったと勘違いした。Kaggleの計算環境を、Anaconda/Windowsで、再現することから始めよう。

 

10:50頃 pytorch.orgのgetstartedを見ていると、start locallyの下にある表が、現在の自分のパソコンの環境を読み取っていることがわかった(違う環境を手動で設定してから更新すると、適切な環境が自動的に選択されている)。Run this Command:のところに、conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorchと表記されているので、この通りに、Anaconda promptから入力したら、上記と同様にinconsistent情報が現れ、少し停滞していたが、しばらく待っていると、内容変更候補が現れ、実行するかどうか聞いてきたので、 y を選択した。pytorch 1.10.1のインストールが始まった。

これでうまくいったら、これからは、pytorchを使うしかない!と思う。

終了したので、conda listで、pytorch 1.10.1torchvision 0.11.2がインストールされていることが確認できた。

jupyter notebookにアップロードしたKaggleコンペのMask-RCNNのコードの最初のセルの、パッケージ/モジュールのimportを、ほんの小さなエラーのみで、無事通過した。

これで、自分のパソコン(Windows 10)でPyTorch: Mask-RCNNを使う準備ができた。

 

11:55 pytorchのデフォルトで使えるモデルの情報を集めよう。

Mask R-CNN
torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=False, progress=True, num_classes=91, pretrained_backbone=True, trainable_backbone_layers=None, **kwargs)

Constructs a Mask R-CNN model with a ResNet-50-FPN backbone.

pretrained (bool) – If True, returns a model pre-trained on COCO train2017

torchvisionを使えば、COCOによる学習済みモデルが使えるのだ!!

 

それは、これから取り組む画像解析でも同じだが、Kaggleコンペとの最も大きな違いは、データ集めである。

モデルの訓練には元画像の他に次のデータを用意する必要がある。

During training, the model expects both the input tensors, as well as a targets (list of dictionary), containing:

boxes (FloatTensor[N, 4]): the ground-truth boxes in [x1, y1, x2, y2] format, with 0 <= x1 < x2 <= W and 0 <= y1 < y2 <= H.

labels (Int64Tensor[N]): the class label for each ground-truth box

masks (UInt8Tensor[N, H, W]): the segmentation binary masks for each instance

ラベルは、粒径計測の場合はバックグラウンドとそれ以外ということで、1か0ということで問題は無い。

boxmaskは、基本的には、手作業で作ることになるのだろう。テスト段階では、maskは、二値化ソフトで出力したもので間に合うかもしれない。boxは、手作業になるかもしれない。

Faster-R-CNNを使えば、bounding boxを出力してくれるのだが、それでも、訓練データは必要になる。

そうではなく、マスクができれば、マスクに外接する長方形がbounding boxだから、変換するプログラムを作ればよい。

 

maskからbaunding boxをつくる(変換する)プログラムが、pytorchで用意されているようだ。

torchvision.ops.masks_to_boxes(masks: torch.Tensor) → torch.Tensor

Compute the bounding boxes around the provided masks.

Returns a [N, 4] tensor containing bounding boxes. The boxes are in (x1, y1, x2, y2) format with 0 <= x1 < x2 and 0 <= y1 < y2.

計算式:

if masks.numel() == 0:
        return torch.zeros((0, 4), device=masks.device, dtype=torch.float)

    n = masks.shape[0]

    bounding_boxes = torch.zeros((n, 4), device=masks.device, dtype=torch.float)

    for index, mask in enumerate(masks):
        y, x = torch.where(masks[index] != 0)

        bounding_boxes[index, 0] = torch.min(x)
        bounding_boxes[index, 1] = torch.min(y)
        bounding_boxes[index, 2] = torch.max(x)
        bounding_boxes[index, 3] = torch.max(y)

    return bounding_boxes

 

これからは、PyTorchを使って、自分でコードを書かなければならない。

21:16 今から、jupyter notebook上で、pytorchのtutorialに従って、練習する。

23:03 Quickstartをダウンロードし、jupyter notebookにアップロードし、動かしてみた。

今日の午前中に、最新のPyTorchをインストールできたおかげで、Quickstart(FashionMNISTを使った簡単なNNモデルの学習と予測の練習)が自分のパソコンの計算環境Anaconda3で実行できたのはよかった。

これで、Mask-R-CNNによるインスタンスセグメンテーションも、自前の計算環境で行えるような気がしてきた。ハイパーパラメータを調整するチューナーからプログラムを組み立てることができるデータサイエンティストに変身しよう!正月だし、これを今年の目標にしよう。

「ハイパーパラメータを調整するチューナー」は、出来上がったコードを借用して、ハイパーパラメータを調整して、その結果を投稿する人を指している。これは、もちろん、初心者にはできない事だし、チューナーもレベルが上がってくると、loss functionやoptimizerを入れ替えたり、モデルも入れ替えることができるようになり、見た目がすっかり変わっていて、全く別のコードに変えてしまうこともできるようになる。さらにレベルが上がると、入力データを加工したり、後処理もするようになる。結局はすべてマスターしてしまうようになる人もいるだろうと思う。

これとは逆の人もいて、コードは書けるのだが、スコアが上がらない人がいる。discussionを見ていると、データ処理から入った方々に多く見られ、データ加工ができるから、入力部分や出力部分は書けるし、モデルはゼロから作るわけではなく借用するのが普通だからそこも問題なくできる。ただし、予測まで含めた全体を仕上げるところをやった経験がないと、loss functionやoptimizerの選択、そのパラメータの設定などが適切でなければ、スコアは上がらず、学習すら進まないことも普通におきる。

 

1月8日:

今日はテンソルを勉強している。

今更ですが、jupyter notebookを使うと、パラメータの変更と演算を繰り返すことができて、途中の変数と演算結果も即座に表示できるので、テキストを読むより理解が進む。

torchvision.ops.masks_to_boxes(masks: torch.Tensor) の演算を理解するために、テンソルを勉強しているのだから、 torch.min(x)と torch.max(x)も理解しておこう。

 y, x = torch.where(masks[index] != 0)

        bounding_boxes[index, 0] = torch.min(x)
        bounding_boxes[index, 1] = torch.min(y)
        bounding_boxes[index, 2] = torch.max(x)
        bounding_boxes[index, 3] = torch.max(y)

    return bounding_boxes

マスクが領域内に1つだけ存在するのであれば、マスク領域のx座標の最大値と最小値、y座標の最大値と最小値が、bounding_boxの位置/サイズになる。

複数個所にマスク領域が存在する場合はどうするのだろう。

 

1月16日(日)

機械学習はPyTorchの枠組みの中でやるとしても、科学技術全体を見渡した時には、ベースになる言語をマスターしておくことが必要になる。昔はfortranやbasicだったが、今は、Pythonである。

Kaggleをやっていて、結局身に着かなかったのが、ベースとなるプログラミング技術である。fortranでもbasicでもない。Pytonである。機械学習ディープラーニングのテキストのはじめの方にPython入門、超入門、概要などの章が設けられていて、簡単な説明がなされていて、defやclassが理解できないまま終わる。しかし、実際のプログラムの中身は、KerasでもTensorFlowでもPyTorchでもない。Python(+C++)なのだ。

主題のMask-RCNNからはずれてしまったが、Mask-RCNNを使いこなすためにも、Pythonで自在にプログラムが書けるようになろう。

 

 

f:id:AI_ML_DL:20220105075141p:plain

style=180 iteration=500