| import sys, os |
| sys.path.append(os.path.dirname(os.path.abspath(__file__))) |
|
|
| import gradio as gr |
| from rdkit import Chem |
| from rdkit.Chem import Draw |
| from ONNX0630 import main as predict_smiles |
|
|
| import tempfile |
| import logging |
| logging.basicConfig(level=logging.INFO) |
| logger = logging.getLogger(__name__) |
|
|
| def visualize_molecule(smiles): |
|
|
| try: |
| mol = Chem.MolFromSmiles(smiles) |
| if mol is None: |
| return None |
| img = Draw.MolToImage(mol) |
| return img |
| except: |
| return None |
|
|
| def predict(image): |
| try: |
| if image is None: |
| logger.error("上传的图片为空") |
| return "错误: 请上传有效的图片文件" |
|
|
| |
| work_dir = "/home/user/app" |
| if not os.path.isdir(work_dir): |
| logger.error(f"工作目录不存在或不是目录: {work_dir}") |
| return f"错误: 工作目录无效 - {work_dir}" |
|
|
| with tempfile.NamedTemporaryFile(suffix=".png", dir=work_dir, delete=False) as temp_file: |
| temp_path = os.path.abspath(temp_file.name) |
| logger.info(f"保存图片到: {temp_path}, 类型: {type(temp_path)}") |
| image.save(temp_path) |
|
|
| if not os.path.exists(temp_path): |
| logger.error(f"图片文件未正确保存: {temp_path}") |
| return f"错误: 图片文件未正确保存 - {temp_path}" |
|
|
| logger.info(f"传递给 main 的路径: {temp_path}") |
| smiles = predict_smiles([temp_path]) |
| mol_image = visualize_molecule(smiles) |
|
|
| try: |
| os.remove(temp_path) |
| logger.info(f"已删除临时文件: {temp_path}") |
| except Exception as e: |
| logger.warning(f"删除临时文件失败: {e}") |
|
|
| if mol_image is None: |
| return None, smiles |
| |
| return mol_image, smiles |
| |
| except FileNotFoundError as e: |
| logger.error(f"文件路径错误: {e}") |
| return f"错误: 文件路径问题 - {str(e)}" |
| except IsADirectoryError as e: |
| logger.error(f"路径是目录: {e}") |
| return f"错误: 路径是目录 - {str(e)}" |
| except PermissionError as e: |
| logger.error(f"权限错误: {e}") |
| return f"错误: 文件权限问题 - {str(e)}" |
| except Exception as e: |
| logger.error(f"处理错误: {e}") |
| return f"错误: {str(e)}" |
|
|
| |
| iface = gr.Interface( |
| fn=predict, |
| inputs=gr.Image(label="Upload molecular image", type="pil"), |
| outputs=[ |
| gr.Image(label="Mol Image"), |
| gr.Text(label="SMILES"), |
| ], |
| title="Optical Chemical Structure Recognition", |
| description="Convert a molecular image into SMILES.<br> ", |
| examples=[ |
| ["example.png"] |
| ] |
| ) |
|
|
| if __name__ == "__main__": |
| iface.launch(server_name="0.0.0.0", server_port=7860, share=False) |