File size: 2,852 Bytes
d174fa9
a21a305
4215475
e4d24f7
4215475
 
e0f1a63
4215475
16d7d74
 
 
 
e4d24f7
9ef87fa
 
 
 
 
 
 
 
 
 
e4d24f7
24c7d9f
3635d67
865684e
 
 
 
e4d24f7
 
 
 
 
 
 
865684e
e4d24f7
16d7d74
 
865684e
 
 
5fd743a
e4d24f7
4cbc041
9ef87fa
24c7d9f
e4d24f7
 
 
 
 
16d7d74
9ef87fa
 
 
 
 
16d7d74
 
 
e4d24f7
 
 
16d7d74
 
 
3635d67
16d7d74
 
3635d67
e4d24f7
3635d67
24c7d9f
 
9ef87fa
24c7d9f
9ef87fa
 
24c7d9f
 
 
 
 
3635d67
 
 
e4d24f7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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)