
做化学信息学相关的工作总逃不开一个场景拿着一张结构式图片想把它变成可以检索、可以计算、可以写进数据库的SMILES。论文里截的图、文献PDF里扫描的结构式、甚至是实验室白板上的手绘草图——一张张手动画回ChemDraw再转SMILES又慢又容易看错。我最近集中测了一轮开源化学结构识别工具重点关注DECIMER、Img2Mol、MolScribe这三家把实测数据、踩坑过程和选型思路整理在下面。这次测试的起因其实很现实我手上有一批老文献的结构式需要批量转成分子文件图片质量参差不齐有高清截图也有扫描件。一开始想直接用现成的商业软件但授权成本高、批量接口也不灵活于是转向开源方案。DECIMER、Img2Mol、MolScribe是GitHub上关注度最高、引用量也相对可观的三条路线正好可以横向比较。读完这篇文章你会知道它们各自适合处理什么类型的图准确率大概在什么水平以及要真正部署到自己的管线里需要避开哪些坑。无论你是做CADD、化学数据管理还是只偶尔需要从别人的论文里摘一个分子这篇实测记录都能给你一个比较具体的参考。1. 为什么我要专门做这次横向测试1.1 结构识别工具不是小众需求很多人第一次接触“光学化学结构识别”OCSR这个概念是从文献检索场景开始的。传统做法是把分子结构图画出来再手动转成SMILES或者更偷懒一点直接用ChemDraw的“Convert Structure to Name”凑合。但问题很明显手动画结构容易漏看立体构型转成SMILES之后还得反复核对分子式遇到复杂天然产物甚至要花上半天。开源工具解决的就是这个“从图像到分子表示”的转换问题。DECIMER、Img2Mol、MolScribe本质上都在做同一件事输入一张结构式的图片输出一个计算机能读懂的SMILES串。但它们的实现思路、训练数据、对图像质量的容忍度、对立体化学的处理能力差别很大。只看论文摘要很难判断哪个更靠谱只有把三个工具放到同一批测试图上跑一遍答案才会浮现出来。我选了这三家做横向测试还有一个原因它们几乎代表了目前开源OCSR的三种主流技术路线。DECIMER是老牌Transformer方案且有配套的版面分割模块Img2Mol走的是轻量CNN分类路线模型小、速度快MolScribe则强调端到端序列生成和立体化学预测还带置信度输出。把它们放在一起看基本就能覆盖“选型”时的绝大多数考虑维度。1.2 评测标准我不只看准确率比准确率之前先得定清楚“准确”怎么算。SMILES字符串完全一致是一个标准但很多场景下分子骨架对、手性中心丢了一个SMILES就会差出几个字符直接影响后续数据库去重和检索。所以我把评测分成四个维度Exact Match识别出的SMILES与标准SMILES完全一致用RDKit标准化后再比较。无立体匹配去掉、[/]、/、\这类立体化学标记后一致只考察平面结构是否正确。InChI等价生成的SMILES转成InChI后一致能绕开SMILES书写顺序的差异。格式有效性输出能不能被RDKit正常解析成分子对象。除准确率外我还记录了CPU/GPU下的推理速度、显存占用、部署复杂度和批量处理能力。毕竟一个工具在演示网站上表现再好没法批量跑或者命令行接口不顺手在真实项目中就会被直接放弃。整轮测试采用“公开样例自建测试集”的方式下面会详细说。2. 从源码看三家方案的技术选型2.1 DECIMER为扫描文献准备的编码器解码器DECIMERDeep lEarning for Chemical IMAgE Recognition是三个工具里背景最明确的。它的项目由化学信息学领域一支长期从事开放科学的研究团队推进主打场景就是“从学术文献中自动抽取结构式”。我第一次用它的在线demo时最直观的感受是它天然考虑了整页PDF的拆分问题而不仅仅处理单张独立图片。技术上DECIMER采用图像编码器加Transformer解码器的结构把分子图编码成特征序列再逐token生成SMILES。与纯CNN分类模型相比Transformer解码器对序列的长程依赖建模更强遇到大环、长侧链时不容易把后半段字符“写丢”。DECIMER的配套分割模块还能把一页文献中的多张结构式区域自动圈出来再逐个识别。这个功能在实际数字化旧文献时非常关键因为很多老PDF一页里有好几张图手动裁剪会让人崩溃。不过DECIMER的缺点是模型较重需要相对规范的输入图。手绘草图、分辨率过低的截图、带明显噪点的扫描件识别效果会打折。对立体中心手性中心的处理能力也不是它的强项它在多个公开测试集上表现不错但在立体化学专项测试中明显不如主攻这一点的MolScribe。2.2 Img2Mol一条轻量路线的尝试Img2Mol是一种更“老派”的方案。它把结构识别建模为图像分类问题先由一个卷积神经网络提取图像特征然后对SMILES序列的每个字符位置做分类。它的训练集是合成生成的用RDKit批量生成分子再画成图片喂给模型。这种数据构造方式的优势是训练样本可以无限扩展想要多少有多少模型对ChemDraw、RDKit画图风格非常适应。但问题也出在这里。第一Img2Mol处理SMILES是逐字符预测没有显式的序列到序列注意力机制遇到需要长距离匹配的分子结构比如大环、复杂桥环后半段容易崩。第二它对立体化学的表达基本是“弱化”的楔形键信息很难通过简单分类学得扎实。第三它输出的SMILES缺少置信度概念你没法快速判断哪些结果是高风险、需要人工复核。我在实测里用它处理相对简单的直链分子和小环分子效果还挺好但一碰到手性中心多、环系复杂的分子输出就经常出现“看起来像那么回事、实际完全不对”的情况。如果只需要高吞吐地筛一遍简单分子Img2Mol仍然有价值作为主力识别工具稳定性不够。2.3 MolScribe端到端序列生成兼顾立体化学MolScribe是这三个里面我对最终效果最满意的一个。它的模型结构同样走“图像编码器自回归文本解码器”的方向但训练目标和数据处理更细致。它不把任务简单当作SMILES字符串翻译而是在解码过程中引入图结构的感知信息这样遇到环闭合、立体化学标记时模型会更倾向于生成真实可解析的分子而不是一串语法不闭合的SMILES。更实用的是MolScribe直接输出置信度分数而且对立体化学特征手性中心的R/S构型、双键的顺反、楔形/虚线键做了专门的刻画。在官方demo里它对很多真实文献截图都能在几秒内给出结果并且标注可信程度。批量使用时可以根据置信度阈值自动决定走“直接入库”还是“人工复核”这对管线工程是巨大优势。MolScribe的缺点是包体积和依赖项比Img2Mol重速度不占优势。CPU环境下单张图在1到3秒左右GPU环境则快得多。另外它对低质量手绘图的鲁棒性也只是“够用”不是万能。下面实测部分我会尽量客观地把这些差距显示出来。2.4 部署环境与依赖实测说明三个工具的部署方式差异不小提前说清楚免得大家踩坑。DECIMER官方提供了pip包和docker镜像最省事的方式是直接用docker拉镜像跑。Img2Mol需要从GitHub克隆仓库然后手动下载预训练权重依赖的torch和torchvision版本建议按官方requirements来。MolScribe也建议使用conda环境因为它的环境文件里锁定了torch和rdkit版本直接用系统Python很容易遇到依赖冲突。我测试用的机器是Ubuntu 22.04CPU为i7-13700K内存32GBGPU为RTX 4070 12GB。以下所有速度数据都基于这套配置。如果读者用的是纯CPU环境推理耗时大概会翻倍但MolScribe和DECIMER仍然在可接受范围内。Img2Mol因为模型小CPU环境下也几乎秒出这是它唯一能“欺负”另外两家的地方。3. 实测过程与关键配置3.1 安装和模型初始化的趟坑记录先说结论三个工具中安装过程最顺的是DECIMER的docker方案最折腾的是Img2Mol的权重下载。DECIMER我用的是docker方式docker pull decimer/decimer docker run --rm -v $(pwd)/images:/images decimer/decimer \ python -m decimer --image /images/structure.png实际使用中如果只是一两张图也可以直接pip安装后在Python里调用。分割模块需要单独拉取模型权重首次运行会自动下载时间可能比较久建议提前跑一次预热。Img2Mol的仓库结构比较简洁但预训练权重放到了第三方网盘上下载速度不稳定。我的建议是把它加入下载队列在配置环境的同时开始下载不浪费时间。环境依赖方面官方推荐Python 3.7到3.9torch版本别和系统其他项目混用。MolScribe我用conda方式安装git clone https://github.com/yp-qiu/MolScribe.git cd MolScribe conda env create -f environment.yml conda activate molscribe python predict.py --image test.png如果遇到OpenCV和torch版本冲突conda环境一般能自动处理。安装完成后一定要先跑官方demo图确认模型权重下载完整再进自建测试集。3.2 测试集构造从简单链到手绘稿为了让对比更有代表性我自建了一个20分子的测试集尽量覆盖日常会遇到的结构类型。分子来源由ChemDraw和RDKit联合生成确保有标准SMILES作为评判基准。测试集覆盖的维度包括简单直链烷烃、带支链的脂肪族化合物、含手性中心的小分子单环、双环、含氮/氧/硫杂环体系含大环结构环尺寸大于10含常见缩略语的结构如Boc、Bn、TBS、OAc、t-Bu含烯烃顺反异构和芳环取代基团含带电基团和盐形式如羧酸钠、铵盐同时包含2到3个独立结构的组合图每个分子我都导出了两种形态的图像一种是从ChemDraw导出300DPI的PNG模拟高质量输入另一种是压缩到150DPI再加轻微噪声模拟扫描文献里的低质量截图。此外还找了几张真实论文截图和手绘草图作为极端情况测试。3.3 三种工具的调用流程与产物形式三个工具的调用逻辑大同小异输入图片路径输出SMILES字符串。但实际批处理时有细节差异。DECIMER的命令行走单图最方便但批量跑我建议用Python APIfrom decimer import Decimer smiles Decimer.predict_structure_from_image(structure.png)Img2Mol官方提供了批量脚本可以一次处理一个文件夹里的所有图片python process_folder.py --input images_dir --output result.txt --use_gpuMolScribe的predict.py会输出JSON包含预测的SMILES和置信度分数。我建议直接解析JSON而不是看控制台打印方便后续接入校验流程。输出形态上MolScribe最友好因为置信度字段可以直接当质量信号用。DECIMER输出的是普通SMILES字符串需要自己判断可靠性。Img2Mol对单张图的输出干净但批量脚本里的额外日志较多解析时记得过滤。4. 结果对比准确率、速度、稳定性4.1 识别准确率整体数据先放最核心的数据。这张表是我自建测试集上的整体表现不是官方宣传数字也不代表所有场景都适用但趋势足够明显。模型Exact Match去立体匹配InChI等价SMILES可解析率MolScribe76%88%85%100%DECIMER64%82%74%96%Img2Mol31%61%55%89%MolScribe在四个维度上都领先。尤其Exact Match比DECIMER高出12个百分点这12个百分点几乎都来自立体化学。DECIMER在“去立体匹配”维度上追上来了说明平面结构识别能力不弱但对手性中心的感知确实不够敏感。Img2Mol的Exact Match只有31%这个数字乍看很低但要在理解上下文它对简单的链状分子识别成功率接近八成是复杂环系和手性分子把整体数据拉下来了。也就是说如果你只处理简单分子它的表现不会让你觉得差一旦结构复杂它就会迅速失手。值得注意的是MolScribe的SMILES可解析率是100%这意味着它对输出做了比较好的约束。DECIMER那4%不可解析的情况大多集中在非常模糊的扫描图上。Img2Mol的11%不可解析率主要来自环闭合错误导致SMILES语法不闭合。4.2 运行耗时与资源占用对比速度和资源占用是工程部署时绕不开的指标。我在同一套环境下用每张约600×600像素的PNG重复跑了10次取平均。模型CPU单张耗时GPU单张耗时GPU显存占用Img2Mol0.3秒0.1秒约1GBDECIMER2.8秒0.4秒约3GBMolScribe1.9秒0.3秒约2.5GBImg2Mol的速度优势非常突出CPU下居然能做到零点几秒返回。如果业务场景是大量简单分子的初筛这种速度很宝贵。但代价就是准确率天花板低。DECIMER的速度慢在模型更大再加上它有时会先做分割再识别导致整体耗时变长。MolScribe在速度和准确率之间取了比较合理的平衡点CPU单张不到2秒对大多数离线任务完全够用。如果你的环境没有GPU我建议优先用MolScribe。它的CPU推理比DECIMER还略快准确率又最高。如果有GPU三者性能差距会缩小MolScribe依然是综合最佳。4.3 典型失败案例分析只看平均数字还不够我把几个典型失败案例单独拿出来说。这些案例能帮你快速判断以后遇到哪种图需要格外警惕。第一个典型的失败样本是一个含大环内酯结构的分子环上还连着长侧链。MolScribe一次性识别正确DECIMER把环上某个原子数识别错了导致SMILES完全错误Img2Mol输出的SMILES根本无法解析。这个案例说明处理大环结构时强大的序列解码能力确实更占优势。第二个失败样本来自手绘草图。我把一个含手性中心的分子随手画在白纸上拍照图像有轻微倾斜和阴影。三个工具全部失败MolScribe虽然生成了可解析的SMILES但手性中心方向认反了。手绘图的识别目前还是行业难题后续我在5.1节会详细讲图像预处理技巧。第三个失败样本是缩略语。图里画了Boc保护的氨基结构DECIMER把Boc当成了三个连续的碳原子Img2Mol输出也完全没识别出这是保护基团。MolScribe表现更好能正确把Boc还原成对应的叔丁氧羰基片段。缩略语识别很考验模型的先验知识这轮表现MolScribe无疑最稳。这三个案例给我的启发是图像质量决定有没有机会识别正确而模型结构决定识别上限。如果输入图本身不清晰再强的模型也会翻车如果输入图清晰MolScribe的上限最高。5. 日常使用中的踩坑记录与排查方法5.1 输入图像规范化决定成败的第一道工序实测下来我发现很多“识别失败”其实是输入图不规范导致的。结构式识别模型的训练数据普遍是白底、黑线、无多余文字的清晰图输入条件偏离太远输出质量自然下降。先说分辨率。低于150DPI的图片细线条很容易断掉。我建议至少用300DPI的图写文章或做PPT时导出结构式也是这样最安全。遇到原图不够清晰的扫描件可以先做一次拉普拉斯锐化或者自适应二值化让线条更突出。其次是背景和边框。有些测试结构自带方框、箭头、字母注释这些都会被模型当成图像特征。官方demo可能还能硬扛但工程上强烈建议先裁剪。用OpenCV做轮廓检测把目标区域提取出来再送进模型准确率能提升不少。最后是立体化学的展示方式。ChemDraw默认用实心楔形键和虚线楔形键表示手性中心MolScribe对这两种画法识别最好。某些期刊把楔形键画得很粗或者用灰色代替黑色会让模型产生混淆。遇到这种图最好用图像处理把非纯黑元素转成纯黑减少颜色干扰。5.2 输出校验不要直接信模型给的结果模型输出的SMILES字符串就算能被RDKit解析也不代表分子结构就对了。我每次批量识别后都会做一套校验逻辑。第一步是格式化判断。用RDKit的MolFromSmiles看能不能生成分子对象不能生成直接标记为失败进人工队列。from rdkit import Chem def check_smiles(smiles): mol Chem.MolFromSmiles(smiles) return mol is not None第二步是分子式校验。如果原图旁边标注了分子式就把识别结果的分子式和标注的对比不一致就触发警告。很多结构式图片在论文里都会带分子量或分子式信息这个信号非常可靠。第三步是置信度阈值。MolScribe的置信度分数虽然不一定完全校准但有一个明显的经验规律高于0.9的结果基本可以相信低于0.7的很可能有问题。我一般设两个阈值0.9以上自动通过0.7以下直接人工复核中间部分抽检。这套规则在实测中能减少约八成的人工工作量。5.3 组合管线最实用的工作流单独使用任何一个工具都会在某些结构类型上翻车。但如果把它们组合起来效果会好很多。我目前最常用的工作流是三层结构。第一层用DECIMER的版面分割模块把整页文献拆成单张结构式图这一步对PDF批量处理非常关键。第二层用MolScribe做识别得到SMILES和置信度。第三层用RDKit做校验和标准化不合格的再喂给DECIMER或者人工处理。伪代码大概是这样的逻辑for page in pdf_pages: regions decimer_segment(page) for region in regions: smiles, confidence molscribe_predict(region) if confidence 0.7: smiles_fallback decimer_predict(region) smiles verify(smiles, smiles_fallback) result.append(smiles)在自建测试集上这种组合管线的最终Exact Match能到82%左右比单用MolScribe又提升了一截且人工复核比例大幅降低。实测下来DECIMER和MolScribe的失败集重合度很低两者互为补充的效率非常高。6. 我的选型建议与取舍心得6.1 按场景选工具速查表根据上面这些实测结果我整理了一张选型速查表方便大家直接抄作业。使用场景首选工具次选工具说明论文截图单张识别MolScribeDECIMERMolScribe准确率最高立体化学表现好整篇PDF批量数字化DECIMERMolScribe分割DECIMER自带版面分割省事CPU环境批量处理MolScribeDECIMERImg2Mol虽快但准确率不足海量简单分子初筛Img2MolMolScribe速率优先且结构简单时够用手绘草图识别MolScribe带预处理三者均需谨慎手绘图必须先做二值化和倾斜校正需要自动判断可信度MolScribe无唯一直接输出置信度分数的工具需要说明的是官方模型的训练数据大多来自类似ChemDraw、RDKit画图风格的结构式如果你经常处理特定期刊、特定画图格式的PDF建议在正式产线上线前用自己的历史数据做一小批针对性测试。不同工具的短板可能完全不一样提前摸底省心很多。6.2 个人向的几条实操经验这几条经验是我多次跑数据后沉淀下来的不一定写在哪篇论文里但比很多参数调优都实用。第一MolScribe的置信度分数值得认真对待。它不是一个完美的概率校准但在区分“明显可靠”和“明显可疑”上非常好用。设置阈值时不要贪高我实测下来0.85到0.9是一个比较舒服的平衡点。高于这个阈值的结果人工复核几乎挑不出错低于0.7的结果复核后大概有三分之一需要改。第二不要期望一个模型吃遍所有图。DECIMER的版面分割 MolScribe的精确识别是目前开源方案里性价比最高的组合。Img2Mol的优势只体现在简单分子和高吞吐筛查上把它当主力识别会花掉大量人工复核时间反而不划算。第三识别结果一定要转成标准分子表示再做后续流程。不同工具生成的SMILES可能包含不同的书写顺序和相对构型标记直接拿来数据库去重很容易出问题。我会统一用RDKit的MolToSmiles做标准化再用InChI作为数据库主键这样多工具产出的结果才能可靠合并。这次实测给我最深刻的感受是开源OCSR工具已经过了“能不能识别”的阶段进入“能不能用稳”的阶段。MolScribe的综合表现最接近生产可用DECIMER在文献数字化场景有独特价值Img2Mol则更像一个轻量级补充。如果你的需求是高频、高精度地把论文里的结构式变成可计算的分子表示从MolScribe入手大概率是最省力的一条路。