{"id":2566,"date":"2025-11-27T17:28:56","date_gmt":"2025-11-27T09:28:56","guid":{"rendered":"https:\/\/sanlangcode.com\/?p=2566"},"modified":"2025-11-27T17:28:56","modified_gmt":"2025-11-27T09:28:56","slug":"onnx-%e4%bb%8b%e7%bb%8d%e4%b8%8e%e4%bd%bf%e7%94%a8","status":"publish","type":"post","link":"https:\/\/sanlangcode.com\/index.php\/2025\/11\/27\/onnx-%e4%bb%8b%e7%bb%8d%e4%b8%8e%e4%bd%bf%e7%94%a8\/","title":{"rendered":"ONNX \u4ecb\u7ecd\u4e0e\u4f7f\u7528"},"content":{"rendered":"\n<p>\u6700\u8fd1\u9879\u76ee\u9047\u5230\u4e86\uff0c\u67d0\u4e9b\u6a21\u578b\u67b6\u6784\u4e0d\u4e00\u6837\uff0c\u9700\u8981\u8f6c\u6362\u7684\u9700\u6c42\u3002\u6211\u5206\u914d\u5230\u8fdb\u884c\u6a21\u578b\u8f6c\u6362\uff08\u522b\u4eba\u8d1f\u8d23\u63d0\u5230\uff09<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">ONNX \u4ecb\u7ecd<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u4ec0\u4e48\u662f ONNX\uff1f<\/h2>\n\n\n\n<p><strong>ONNX\uff08Open Neural Network Exchange\uff09<\/strong> \u662f\u4e00\u4e2a\u5f00\u653e\u7684\u673a\u5668\u5b66\u4e60\u6a21\u578b\u683c\u5f0f\u6807\u51c6\uff0c\u7528\u4e8e\u5728\u4e0d\u540c\u6846\u67b6\u548c\u5de5\u5177\u4e4b\u95f4\u4ea4\u6362\u6a21\u578b\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u6838\u5fc3\u7279\u70b9<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8de8\u6846\u67b6\u4e92\u64cd\u4f5c\u6027<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u652f\u6301 PyTorch\u3001TensorFlow\u3001Keras\u3001scikit-learn \u7b49\u6846\u67b6<\/li>\n\n\n\n<li>\u6a21\u578b\u53ef\u5728\u4e0d\u540c\u6846\u67b6\u95f4\u8f6c\u6362\u548c\u8fd0\u884c<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8de8\u5e73\u53f0\u90e8\u7f72<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u652f\u6301 CPU\u3001GPU\u3001\u79fb\u52a8\u8bbe\u5907\u3001\u8fb9\u7f18\u8bbe\u5907<\/li>\n\n\n\n<li>\u53ef\u5728 Windows\u3001Linux\u3001macOS\u3001iOS\u3001Android \u7b49\u5e73\u53f0\u8fd0\u884c<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4f18\u5316\u63a8\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u63d0\u4f9b ONNX Runtime \u7b49\u8fd0\u884c\u65f6<\/li>\n\n\n\n<li>\u652f\u6301\u591a\u79cd\u786c\u4ef6\u52a0\u901f\uff08CUDA\u3001TensorRT\u3001OpenVINO \u7b49\uff09<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e3b\u8981\u7528\u9014<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6a21\u578b\u8f6c\u6362<\/strong>\uff1a\u5c06\u8bad\u7ec3\u597d\u7684\u6a21\u578b\u8f6c\u6362\u4e3a ONNX \u683c\u5f0f<\/li>\n\n\n\n<li><strong>\u6a21\u578b\u90e8\u7f72<\/strong>\uff1a\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u4f7f\u7528 ONNX Runtime \u8fdb\u884c\u63a8\u7406<\/li>\n\n\n\n<li><strong>\u6a21\u578b\u4f18\u5316<\/strong>\uff1a\u901a\u8fc7 ONNX \u5de5\u5177\u94fe\u8fdb\u884c\u6a21\u578b\u4f18\u5316\u548c\u91cf\u5316<\/li>\n\n\n\n<li><strong>\u8de8\u5e73\u53f0\u90e8\u7f72<\/strong>\uff1a\u4e00\u6b21\u8bad\u7ec3\uff0c\u591a\u5e73\u53f0\u90e8\u7f72<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u5de5\u4f5c\u6d41\u7a0b<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\u8bad\u7ec3\u6a21\u578b (PyTorch\/TensorFlow) \n    \u2193\n\u8f6c\u6362\u4e3a ONNX \u683c\u5f0f\n    \u2193\n\u4f7f\u7528 ONNX Runtime \u8fdb\u884c\u63a8\u7406<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5e38\u7528\u5de5\u5177<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ONNX Runtime<\/strong>\uff1a\u9ad8\u6027\u80fd\u63a8\u7406\u5f15\u64ce<\/li>\n\n\n\n<li><strong>onnx-tf<\/strong>\uff1aONNX \u4e0e TensorFlow \u4e92\u8f6c<\/li>\n\n\n\n<li><strong>torch.onnx<\/strong>\uff1aPyTorch \u5bfc\u51fa ONNX<\/li>\n\n\n\n<li><strong>onnx-simplifier<\/strong>\uff1a\u7b80\u5316 ONNX \u6a21\u578b<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f18\u52bf<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 \u6807\u51c6\u5316\u683c\u5f0f\uff0c\u51cf\u5c11\u5382\u5546\u9501\u5b9a<\/li>\n\n\n\n<li>\u2705 \u9ad8\u6027\u80fd\u63a8\u7406<\/li>\n\n\n\n<li>\u2705 \u5e7f\u6cdb\u7684\u786c\u4ef6\u652f\u6301<\/li>\n\n\n\n<li>\u2705 \u6d3b\u8dc3\u7684\u793e\u533a\u548c\u5de5\u5177\u751f\u6001<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>\u4ecb\u7ecd ONNX \u6a21\u578b\u7684\u4e3b\u6d41\u4f7f\u7528\u65b9\u6cd5\uff0c\u6db5\u76d6\u5e38\u89c1\u573a\u666f\u548c\u6700\u4f73\u5b9e\u8df5\u3002<\/p>\n\n\n\n<p>[2 tools called]<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">ONNX \u6a21\u578b\u7684\u4e3b\u6d41\u4f7f\u7528\u65b9\u6cd5\u8be6\u89e3<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e00\u3001ONNX \u6a21\u578b\u7684\u4e3b\u8981\u4f7f\u7528\u573a\u666f<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. <strong>\u6a21\u578b\u8f6c\u6362\u4e0e\u5bfc\u51fa<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">PyTorch \u2192 ONNX<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>import torch\nimport torch.onnx\n\n# \u52a0\u8f7d\u8bad\u7ec3\u597d\u7684\u6a21\u578b\nmodel = YourModel()\nmodel.load_state_dict(torch.load('model.pth'))\nmodel.eval()\n\n# \u521b\u5efa\u793a\u4f8b\u8f93\u5165\ndummy_input = torch.randn(1, 3, 224, 224)\n\n# \u5bfc\u51fa\u4e3a ONNX\ntorch.onnx.export(\n    model,                          # \u6a21\u578b\n    dummy_input,                    # \u793a\u4f8b\u8f93\u5165\n    \"model.onnx\",                  # \u8f93\u51fa\u8def\u5f84\n    export_params=True,            # \u4fdd\u5b58\u8bad\u7ec3\u53c2\u6570\n    opset_version=11,              # ONNX \u64cd\u4f5c\u96c6\u7248\u672c\n    do_constant_folding=True,      # \u5e38\u91cf\u6298\u53e0\u4f18\u5316\n    input_names=&#91;'input'],         # \u8f93\u5165\u540d\u79f0\n    output_names=&#91;'output'],       # \u8f93\u51fa\u540d\u79f0\n    dynamic_axes={\n        'input': {0: 'batch_size'},\n        'output': {0: 'batch_size'}\n    }  # \u652f\u6301\u52a8\u6001batch size\n)<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">TensorFlow \u2192 ONNX<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>import tf2onnx\nimport onnx\n\n# \u4f7f\u7528 tf2onnx \u8f6c\u6362\nspec = (tf.TensorSpec((None, 224, 224, 3), tf.float32, name=\"input\"),)\noutput_path = \"model.onnx\"\nmodel_proto, _ = tf2onnx.convert.from_keras(model, input_signature=spec, opset=13, output_path=output_path)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. <strong>\u6a21\u578b\u63a8\u7406\uff08Python\uff09<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u4f7f\u7528 ONNX Runtime\uff08\u63a8\u8350\uff09<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>import onnxruntime as ort\nimport numpy as np\n\n# \u521b\u5efa\u63a8\u7406\u4f1a\u8bdd\nsession = ort.InferenceSession(\n    \"model.onnx\",\n    providers=&#91;'CUDAExecutionProvider', 'CPUExecutionProvider']  # GPU\u4f18\u5148\uff0cCPU\u5907\u7528\n)\n\n# \u83b7\u53d6\u8f93\u5165\u8f93\u51fa\u4fe1\u606f\ninput_name = session.get_inputs()&#91;0].name\noutput_name = session.get_outputs()&#91;0].name\n\n# \u51c6\u5907\u8f93\u5165\u6570\u636e\ninput_data = np.random.randn(1, 3, 224, 224).astype(np.float32)\n\n# \u6267\u884c\u63a8\u7406\noutputs = session.run(&#91;output_name], {input_name: input_data})\nresult = outputs&#91;0]<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u6027\u80fd\u4f18\u5316\u914d\u7f6e<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># \u4f7f\u7528\u4f18\u5316\u9009\u9879\nsession_options = ort.SessionOptions()\nsession_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL\nsession_options.execution_mode = ort.ExecutionMode.ORT_SEQUENTIAL\nsession_options.enable_mem_pattern = True\nsession_options.enable_cpu_mem_arena = True\n\nsession = ort.InferenceSession(\"model.onnx\", session_options, providers=&#91;'CPUExecutionProvider'])<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. <strong>Node.js \u73af\u5883\u4f7f\u7528\uff08\u9002\u5408\u4f60\u7684\u9879\u76ee\uff09<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u5b89\u88c5\u4f9d\u8d56<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install onnxruntime-node<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u57fa\u672c\u4f7f\u7528<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>const ort = require('onnxruntime-node');\nconst fs = require('fs');\n\nasync function runInference() {\n    \/\/ \u521b\u5efa\u63a8\u7406\u4f1a\u8bdd\n    const session = await ort.InferenceSession.create('.\/model.onnx', {\n        executionProviders: &#91;'cpu'],  \/\/ \u6216 &#91;'cuda', 'cpu'] \u5982\u679c\u6709GPU\n        graphOptimizationLevel: 'all'\n    });\n\n    \/\/ \u51c6\u5907\u8f93\u5165\u6570\u636e\n    const inputTensor = new ort.Tensor('float32', \n        new Float32Array(&#91;1, 2, 3, 4, 5, 6, 7, 8, 9]), \n        &#91;1, 3, 3]  \/\/ shape\n    );\n\n    \/\/ \u6267\u884c\u63a8\u7406\n    const feeds = { &#91;session.inputNames&#91;0]]: inputTensor };\n    const results = await session.run(feeds);\n\n    console.log(results&#91;session.outputNames&#91;0]].data);\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u5728 Express \u670d\u52a1\u5668\u4e2d\u96c6\u6210<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u5728\u4f60\u7684 server.js \u4e2d\u6dfb\u52a0\nconst ort = require('onnxruntime-node');\nlet modelSession = null;\n\n\/\/ \u521d\u59cb\u5316\u6a21\u578b\uff08\u542f\u52a8\u65f6\u52a0\u8f7d\u4e00\u6b21\uff09\nasync function initModel() {\n    try {\n        modelSession = await ort.InferenceSession.create('.\/models\/your_model.onnx', {\n            executionProviders: &#91;'cpu'],\n            graphOptimizationLevel: 'all'\n        });\n        console.log('\u2705 ONNX \u6a21\u578b\u52a0\u8f7d\u6210\u529f');\n    } catch (error) {\n        console.error('\u274c \u6a21\u578b\u52a0\u8f7d\u5931\u8d25:', error);\n    }\n}\n\n\/\/ API \u7aef\u70b9\u793a\u4f8b\napp.post('\/api\/predict', async (req, res) =&gt; {\n    try {\n        const { inputData } = req.body;\n\n        \/\/ \u8f6c\u6362\u4e3a Float32Array\n        const inputTensor = new ort.Tensor(\n            'float32',\n            new Float32Array(inputData),\n            &#91;1, inputData.length]\n        );\n\n        \/\/ \u63a8\u7406\n        const feeds = { &#91;modelSession.inputNames&#91;0]]: inputTensor };\n        const results = await modelSession.run(feeds);\n\n        res.json({\n            success: true,\n            prediction: Array.from(results&#91;modelSession.outputNames&#91;0]].data)\n        });\n    } catch (error) {\n        res.status(500).json({ success: false, error: error.message });\n    }\n});\n\n\/\/ \u542f\u52a8\u65f6\u521d\u59cb\u5316\ninitModel();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4. <strong>\u6a21\u578b\u4f18\u5316<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u6a21\u578b\u91cf\u5316\uff08\u51cf\u5c0f\u4f53\u79ef\uff0c\u52a0\u901f\u63a8\u7406\uff09<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>from onnxruntime.quantization import quantize_dynamic, QuantType\n\n# \u52a8\u6001\u91cf\u5316\uff08\u63a8\u8350\uff0c\u7b80\u5355\u5feb\u901f\uff09\nquantize_dynamic(\n    model_input=\"model.onnx\",\n    model_output=\"model_quantized.onnx\",\n    weight_type=QuantType.QUInt8  # \u6216 QuantType.QInt8\n)\n\n# \u91cf\u5316\u540e\u6a21\u578b\u901a\u5e38\u51cf\u5c0f 75%\uff0c\u63a8\u7406\u901f\u5ea6\u63d0\u5347 2-4 \u500d<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u6a21\u578b\u7b80\u5316<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>import onnx\nfrom onnxsim import simplify\n\n# \u52a0\u8f7d\u6a21\u578b\nmodel = onnx.load(\"model.onnx\")\n\n# \u7b80\u5316\u6a21\u578b\nsimplified_model, check = simplify(model)\n\n# \u4fdd\u5b58\u7b80\u5316\u540e\u7684\u6a21\u578b\nonnx.save(simplified_model, \"model_simplified.onnx\")<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5. <strong>Web \u6d4f\u89c8\u5668\u4e2d\u4f7f\u7528<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u4f7f\u7528 ONNX.js<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script src=\"https:\/\/cdn.jsdelivr.net\/npm\/onnxjs\/dist\/onnx.min.js\"&gt;&lt;\/script&gt;\n&lt;script&gt;\nasync function runInference() {\n    const session = new onnx.InferenceSession();\n    await session.loadModel(\".\/model.onnx\");\n\n    const inputTensor = new onnx.Tensor(\n        new Float32Array(&#91;1, 2, 3, 4]),\n        &#91;1, 4]\n    );\n\n    const outputMap = await session.run(&#91;inputTensor]);\n    const output = outputMap.values().next().value;\n    console.log(output.data);\n}\n&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">6. <strong>\u79fb\u52a8\u7aef\u90e8\u7f72<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">iOS (Core ML)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># \u4f7f\u7528 coremltools \u8f6c\u6362\npython -m coremltools.converters.onnx.convert model.onnx --output model.mlmodel<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Android (TensorFlow Lite)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># ONNX \u2192 TensorFlow \u2192 TFLite\nimport onnx\nfrom onnx_tf.backend import prepare\nimport tensorflow as tf\n\nonnx_model = onnx.load(\"model.onnx\")\ntf_rep = prepare(onnx_model)\ntf_rep.export_graph(\"model_tf\")\n\n# \u8f6c\u6362\u4e3a TFLite\nconverter = tf.lite.TFLiteConverter.from_saved_model(\"model_tf\")\ntflite_model = converter.convert()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e8c\u3001\u4e3b\u6d41\u4f7f\u7528\u6d41\u7a0b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u5b8c\u6574\u5de5\u4f5c\u6d41<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>1. \u8bad\u7ec3\u6a21\u578b (PyTorch\/TensorFlow)\n   \u2193\n2. \u5bfc\u51fa\u4e3a ONNX \u683c\u5f0f\n   \u2193\n3. \u6a21\u578b\u4f18\u5316\uff08\u91cf\u5316\u3001\u7b80\u5316\uff09\n   \u2193\n4. \u90e8\u7f72\u5230\u76ee\u6807\u5e73\u53f0\n   - Python \u670d\u52a1\uff1aONNX Runtime\n   - Node.js \u670d\u52a1\uff1aonnxruntime-node\n   - Web \u524d\u7aef\uff1aONNX.js\n   - \u79fb\u52a8\u7aef\uff1aCore ML \/ TFLite\n   - \u8fb9\u7f18\u8bbe\u5907\uff1aONNX Runtime + \u786c\u4ef6\u52a0\u901f<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e09\u3001\u6027\u80fd\u4f18\u5316\u6700\u4f73\u5b9e\u8df5<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u9009\u62e9\u5408\u9002\u7684\u6267\u884c\u63d0\u4f9b\u8005<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GPU\uff1a<code>CUDAExecutionProvider<\/code><\/li>\n\n\n\n<li>CPU\uff1a<code>CPUExecutionProvider<\/code><\/li>\n\n\n\n<li>\u79fb\u52a8\u7aef\uff1a<code>CoreMLExecutionProvider<\/code> (iOS)<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6279\u91cf\u5904\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>   # \u6279\u91cf\u63a8\u7406\u6bd4\u5355\u6b21\u63a8\u7406\u6548\u7387\u9ad8\n   batch_input = np.random.randn(32, 3, 224, 224).astype(np.float32)\n   outputs = session.run(&#91;output_name], {input_name: batch_input})<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4f7f\u7528 IO Binding\uff08\u51cf\u5c11\u6570\u636e\u62f7\u8d1d\uff09<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>   io_binding = session.io_binding()\n   io_binding.bind_input('input', 'cuda', 0, np.float32, &#91;1, 3, 224, 224], input_data)\n   io_binding.bind_output('output', 'cuda')\n   session.run_with_iobinding(io_binding)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u56db\u3001\u5e38\u89c1\u5e94\u7528\u573a\u666f<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u56fe\u50cf\u5206\u7c7b\/\u76ee\u6807\u68c0\u6d4b<\/strong>\uff1aYOLO\u3001ResNet\u3001MobileNet<\/li>\n\n\n\n<li><strong>\u81ea\u7136\u8bed\u8a00\u5904\u7406<\/strong>\uff1aBERT\u3001GPT \u7b49 Transformer<\/li>\n\n\n\n<li><strong>\u8bed\u97f3\u8bc6\u522b<\/strong>\uff1aWhisper\u3001Wav2Vec<\/li>\n\n\n\n<li><strong>\u63a8\u8350\u7cfb\u7edf<\/strong>\uff1a\u6df1\u5ea6\u63a8\u8350\u6a21\u578b<\/li>\n\n\n\n<li><strong>\u65f6\u95f4\u5e8f\u5217\u9884\u6d4b<\/strong>\uff1aLSTM\u3001GRU<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6700\u8fd1\u9879\u76ee\u9047\u5230\u4e86\uff0c\u67d0\u4e9b\u6a21\u578b\u67b6\u6784\u4e0d\u4e00&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[73,86],"class_list":["post-2566","post","type-post","status-publish","format-standard","hentry","category-4","tag-ai","tag-onnx"],"_links":{"self":[{"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/posts\/2566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/comments?post=2566"}],"version-history":[{"count":1,"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/posts\/2566\/revisions"}],"predecessor-version":[{"id":2567,"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/posts\/2566\/revisions\/2567"}],"wp:attachment":[{"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/media?parent=2566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/categories?post=2566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/tags?post=2566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}