OCSU / app.py
jibsn's picture
Update app.py
4215475 verified
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)}"
# 定义 Gradio 界面
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)