magattacaのブログ

日付以外誤報

化学構造認識(OCSR) DECIMERプロジェクトとDECIMER 1.0で遊んだ話

前回の記事で化学構造式のOCRソフトImg2Molで遊んでみました。「画像に含まれる化学構造式を認識してSMILESに変換」してくれるというものでした。

Img2Molと同時期に同様のタスクを扱うソフト DECIMER 1.0が公開されています。

こちらもコードや学習済みパラメータを公開してくださっています‼︎ Img2Molとの比較も兼ねて遊んでみましょう!

f:id:magattaca:20211128200953p:plain
化学構造認識の自動化を目指すDECIMERプロジェクト*1

1. DECIMER文献の流し読み

1-1. DECIMERプロジェクトについて

さて、Img2Molは製薬会社バイエルの機械学習チームによるものでしたが、DECIMERはドイツのFriedrich-Schiller大学Chirstoph Steinbeck教授の研究室(HPはこちら)で開発されたアカデミックな研究に由来するものです。

こちらもディープラーニングによる手法で、DECIMERはDeep lEarnig for Chemical ImagE Recognitionの略です。

このソフトは「化学構造式の光学認識(Optical Chemical Structure Recognition, OCSR)」の課題について、「最新の人工知能技術を使ったオープンソース自動化されたソフトウェアを開発しよう!」というDECIMERプロジェクトの中の一つです(プロジェクトWebサイト)。

関連する文献として、今回取り上げる文献の前のバージョン(DECIMER(無印))や、、、

テキストと画像の入り混じった文献を区分けして、画像部分をとりだすセグメンテーションのためのツール、、、

があります(どちらもオープンアクセス)。後者のツールはウェブアプリとして利用可能になっています。

全て筆頭著者はKohulan Rajanさんとなっていますので、こちらの方が中心になって進められているようですね。すごい。

1-2. DECIMER 1.0のモデル

それではDECIMER 1.0の具体的な中身を見てみましょう!Img2Molと同じくディープラーニングに基づく手法ですが、具体的な中身は結構違います。

おさらいですが、Img2Molは画像を畳み込みニューラルネットワーク(CNN)で認識し、化学構造式の特徴を表現する空間(CDDD)に一度埋め込んだあと、線形表記(Canonical SMILES)として取り出す、という2段階の構成でした。またCDDDはオートエンコーダーによるものでした。

f:id:magattaca:20211128201121p:plain
Img2Molの構成の復習

対してDECIMER 1.0も、画像を認識するための入力ネットワークと、認識した情報から化学構造式を取り出すためのネットワークの2段階の構成となっています。

ですが、化学構造を取り扱うネットワークを構築するために線形表記 SELFIESも利用していること、またTransformerベースのモデルになっていること、といった異なる点もあるようです。

f:id:magattaca:20211128201149p:plain
DECIMER 1.0のTransformerベースモデル

SELFIES (Self-referencing embedded strings)はAspuru-Guzik教授らのチームが開発した新しい化合物の線形表記方法で、この文法に従えばどんなふうに書いても100%分子として意味をなすという特徴があるそうです。

以下の記事が日本語でわかりやすく解説してくださっているのでおすすめです。

blacktanktop.hatenablog.com

また、モデルのベースとなっているTransformerですが、こちらはAlphaFold2のベースにもなっていたやつですね。自然言語処理の分野で高い性能を発揮したらしく、よく使われているらしいです。

なお、前報DECIER(無印)ではオートエンコーダーをベースとしたモデルが使われています。DECIMER 1.0でもencoder-decoder型のモデルとTransformer型モデルが比較されており、結果、後者の方が精度が良かったそうです。

f:id:magattaca:20211128201350p:plain
Encoder-Decoderベースのモデルも作成、比較されている

入力の画像認識 CNNのネットワーク構造としては、InceptionV3EfficientNet-B3の2つを主に比較して、後者の方がパフォーマンスが良かった様です。

f:id:magattaca:20211128201431p:plain

詳しくないのでよくわからないですが、各分野で最新の技術を色々と盛り込んだ感じでしょうか?最先端を攻める感じがアカデミックでいいですね!

1-3. DECIMER 1.0のデータセットと守備範囲

モデルの枠組みが大体わかったので、DECIMER 1.0の守備範囲についても参照しておきましょう!

前回の記事では触れませんでしたが、Img2MolPubChemChEMBLから抽出し、一定の基準で絞り込んだ化合物をトレーニングに利用しています。また、トレーニング用の画像は複数のツール(RDKit、OpenEyeのOEChem TK、Indigo)を使って生成しています。

一方DECIMER 1.0は、対象データベースはPubChemのみ、トレーニング画像の生成はCDKのみを使用するといった、トレーニングデータセット準備段階での違いがあります。*2

f:id:magattaca:20211128201611p:plain

個人的に面白かった点は、DECIMER 1.0は「立体化学イオン化状態を含めるとどうなるのかか?」という検証にも挑戦しているところです。

論文中で使われているデータセットは以下の様に「立体化学/イオン化の情報があるか?」、「Image augmentationをしたか?」で3つに分かれています。

f:id:magattaca:20211128201629p:plain

以下のTable 8Dataset 1に対する結果、Table 12Dataset 2に対する結果です。データセットのサイズが近いsubset同士を比較すると、Table 12の方がパフォーマンス(Tanimoto、Tanimoto 1.0)が低下する傾向にあるようです。

f:id:magattaca:20211128201653p:plain

立体化学やイオン化状態の識別も考え始めると、問題が一気に複雑化するのでパフォーマンスが落ちるのは納得です。それでも結構良い結果が得られているように思いますが、皆さんはどう思われますか?

なおImage augmentationは、データ拡張を行ってDataset 2のデータを追加する(Dataset 3)とパフォーマンスが良くなるかを検証したものです。興味のある方は論文のFig. 10やTable 15あたりをご参照ください。

2. DECIMER 1.0で遊ぼう!

DECIMER 1.0の概要とImg2Molの違いがだいたい分かってきたので早速遊んでみましょう!

DECIMER 1.0はMITライセンスで公開されているので企業の方にも手を伸ばしやすいかもしれません。

後ほど記載しますが、学習済みパラメータはGoogle cloudのStorageにあり、プログラムを初めて利用するときにダウンロードする仕組みとなっているみたいです。

2-1. インストール

インストール方法はGitHubのREADMEの通りです。conda環境での利用が簡単なのでオススメとのことです。

# pipでgithubからインストール
$ pip install git+https://github.com/Kohulan/DECIMER-Image_Transformer.git

# もしくは以下でPyPiからインストールしてもOK
$ pip install decimer

ところが、Img2Molの時と同様、Macユーザーはちょっとだけ面倒です。

MacOSNvidia GPUがない場合は「tensorflow==2.3.0」を指定して入れなければいけないとの記載があります。上のコマンドでは私のMacにDECIMERをインストールできませんでした。

そこでgit cloneでDECIMERを落としてきた後、setup.cfgを少し書き換えるとインストールできました。

f:id:magattaca:20211128201727p:plain

こういう感じの作業でした。

# githubからディレクトリを落としてくる
$ git clone https://github.com/Kohulan/DECIMER-Image_Transformer.git decimer

# setup.cfgを上図の様に書き換えて保存
# ディレクトリを移動
$ cd decimer/

# インストール開始
$ pip install -e. 

どなたか正しい方法を教えてください。

2-2. 訓練済みパラメータの入手

先に書いた様に、DECIMER 1.0は学習済みパラメータも公開されていて、初回利用時にダウンロードされます。

私はパラメータの保存場所などが後でわからなくなるのを防ぐために、手動でダウンロードしてdecimerディレクトリの中に入れることにしました。

decimerのsrc/decimer/ディレクトリにあるDECIMER.pyをみると以下の記載があります。

f:id:magattaca:20211128201756p:plain

デフォルトのディレクトリにパラメータファイルがなければmodel_urlからダウンロードしてくるみたいなことが書いてあります(たぶん)。

というわけでmolde_url = "https://~~~~" となっているURLにアクセスしてパラメータのzipファイルをダウンロードしました(1GBくらい)。

パラメータ保存場所として、DECIMERディレクトリにTrained_Modelsという新しいディレクトリをつくり、そこにzipを展開したファイルを格納しました。あとはDECIMER.pyDECIMER_V1.0.pyの中にあるモデルのパスの箇所を書き換えて保存したら終わりです。

f:id:magattaca:20211128201823p:plain

訓練済みのモデルにはCanonicalIsomericAugmentedの3つがあります。おそらく文献で触れられていた3つのデータセットに対応するものだと思います。*3

ダウンロードファイルの保存先を覚えておけばこんな余計なことをする必要はないと思います。私はすぐ忘れるんです。。。

何はともあれインストールとパラメータの準備ができました!

2-3. サンプルで遊んでみよう!

とりあえずJupyter notebookを起動して遊んでみましょう。Sample_Imagesディレクトリに画像例も準備してくださっているので利用します。

ライブラリをインポートしたあと、画像ファイルのパス使いたいモデルを指定するだけでSMILESに変換して返してくれます。

from decimer import DECIMER

# モデルの指定
model_name = "Isomeric"

# 画像のパスを指定
img_path = "Sample_Images/caffeine.png"

# 変換前に元々の画像を確認する
from IPython.display import display
from PIL import Image

display(Image.open(img_path))

f:id:magattaca:20211128202056p:plain

上のような画像を入力とします。さてDECIMERは無事SMILESに変換できるでしょうか??

# DECIMERでSMILESを予測
res = DECIMER.predict_SMILES(img_path, model_name)

print(res)
# > CN1C=NC2=C1C(=O)N(C)C(=O)N2C

SMILESができました!でもあってるのかわからない!読めない!

RDKitで変換した図をみてみます。(DECIMERと共存させられなかったので別のnotebookでやりました。)

from rdkit import Chem
from rdkit.Chem import Draw

m = Chem.MolFromSmiles("CN1C=NC2=C1C(=O)N(C)C(=O)N2C")
Draw.MolToImage(m)

f:id:magattaca:20211128202034p:plain

どうやらDECIMERはカフェインを認識してうまくSMILESに変換できたようです!

他のmodelではどうでしょうか?CanonicalAugmentedで行った結果はこんな感じです。

f:id:magattaca:20211128202131p:plain

AugmentedはIsomericと同様正しく認識できました!残念ながらCanonical全ての原子が硫黄の鎖状構造と誤認識してしまったようです。

論文を見る限りAugmentedが一番良さそうなので、以降の検証はこちらで行ってみます。

気になるのは立体化学の認識です。サンプルファイルに立体化学を含む例がありました。

どうだ!

f:id:magattaca:20211128202232p:plain

おお!不斉点が認識されました!!SMILESに@が入っているだけでテンションが上がります!!

RDKitでの描画の都合上向きが変わってしまっていますが、立体化学も正しいようです。また、不斉の明記されていない炭素原子もありますが、ここも不斉情報がないものとして正しく認識できています。すごい!!

次に電荷を帯びたイオンはどうでしょうか??こんな例がサンプルにありました。

f:id:magattaca:20211128202337p:plain

プラス電荷が認識されました!サンプルなのでうまくいくだろうとは思っていても実際に結果が出ると嬉しいですね!

話がそれますが、描画を並べてみるとRDKitの原子を色分けするスタイルはわかりやすくて良いですね。

2-4. 別のサンプルでテストしよう!

さてDECIMERの使い方がわかってきました。

次に気になるのはソフトの汎用性です。ソフトウェアのサンプル画像以外でもうまく機能するでしょうか???

比較対象としてちょうど良いのでImg2Molに提供されていたexamplesでテストしてみましょう!

カフェインに類似した構造の画像例です。

f:id:magattaca:20211128202417p:plain

残念!だめでした。。。出力は芳香族がうまく認識できておらず、窒素-硫黄結合といった構造もできてしまっています。

別の例ではどうでしょうか?

f:id:magattaca:20211128202439p:plain

こちらもだめでした。今回は芳香環を一つ認識できたましたが、なんとなく似ていそうで全然違う結果になってしまいました。

ひょっとして画像の化学構造式に色が含まれているのが悪かったりするのでしょうか?

別の画像例としてWikipediaのプロリンを使ってみましょう。元素記号が大きく、原子の色分けがない画像です。こちらもImg2Molではうまくいったものです。

f:id:magattaca:20211128202514p:plain

なんだかすごい構造になりました。。。こんなアミノ酸は嫌だ。

最後に手書き画像の例を見てみましょう。Img2Molのサンプルです。

こんな結果になりました。

f:id:magattaca:20211128202558p:plain

DECIMER 1.0の文献中にも記載がありましたが、環構造の認識に失敗すると、ヒトの目にはとても大きな間違いにみえますね。

上手くはいきませんでしたが手書きの構造式も化学構造として認識できいるという点はなかなかすごいと思います。

3. おわりに

以上、今回は化学構造式のOCRソフト DECIMER 1.0で遊んでみました。Img2Molと比較していかがだったでしょうか?

個人的には立体化学の認識電荷の認識にも挑戦していて、サンプル画像ではうまく認識できているという点が驚きでした。Img2Molは立体化学を全て無視するようでしたのでDECIMERの長所だと思いました。

一方で、サンプル画像以外の画像では認識があまり上手くいっていないという印象でした。Img2Molは小さな分子であればWikipediaやPubChemのキャプチャ画像でも認識できたので、汎化性能(?)という点では課題があるかもしれません。

このあたりレーニングデータセットの作り方による差もありそうです。Img2Molでは複数のツールで入力画像を作っていたのに対し、DECIMERはCDKのみでした。それぞれ異なる描画のクセがあるソフトを組みあせたデータセットの方がバラエティがあり、汎化性能が高くなりそうです。

DECIMER 1.0をImg2Molのデータセットでトレーニングしたらどうなるか?気になるところです。

あくまで素人の感想です。すみません。。。

また、DECIMERプロジェクトはImg2Molで今後の課題となっていたセグメンテーションにも既にWebアプリを公開しています。OCSRに関わる複数のソフト群全体の開発として取り組まれているので、シナジー効果によりさらに精度が改善していくかもしれません。次報が楽しみですね!

今回も色々と間違いが多そうです。ご指摘いただけると嬉しいです。

ではでは!

*1:いらすとやさんの画像を使用しました

*2:データベースからの化合物の絞り込み基準(分子量 etc.)など細かい差は他にもたくさんあります。

*3:CanonicalはcanonicalSMILES、Isomericは立体化学も扱えるisomeric SMILES、Augmentedはimage augmentaionから来ていると思います。たぶん。