UnitySimpleFileBrowser常见问题解答:从路径处理到多平台兼容的解决方案
2026/6/6 14:59:06
摘要:很多计算机专业的同学第一次做 AI 毕设,都会卡在“代码能跑,但一部署就崩”。本文把我自己踩过的坑整理成一份“新手地图”,从选题、训练到上线一条线讲清,并给出可直接复用的 PyTorch→ONNX→Flask 模板。只要跟着做完,你就能在 4 G 显存的笔记本上跑通图像分类,还能把模型塞进 Web 服务,让答辩老师现场拍照识别,稳稳过关。
.pth文件 90 M,放到服务器上内存直接爆掉,老师一句“能在手机上看效果吗?”瞬间社死。一句话:学术代码 ≠ 工程代码,毕设不仅要“跑通”,更要“落地”。
| 维度 | PyTorch | TensorFlow Lite | ONNX Runtime |
|---|---|---|---|
| 开发体验 | 动态图友好,Debug 直观 | 静态图,API 略绕 | 纯推理,训练需转模型 |
| 训练资源 | 吃显存,需 CUDA | 训练完转.tflite即可 | 不负责训练 |
| 部署体积 | 原始模型大 | 量化后 1/4 大小 | 与原始框架相关 |
| 移动端 | 需 LibTorch,体积 40 M+ | 官方支持,Android/iOS 一键 | 需 ONNX Runtime Mobile |
| 代码量 | 中 | 多(Graph、量化) | 少(仅推理) |
结论
下面以“笔记本训练 + Web 演示”为例,给出完整流程。
场景:猫狗二分类,数据集
kaggle cats_vs_dogs,笔记本 4 G 显存,目标:训练 10 min 内完成,模型大小 < 30 M。
pip install)# 建虚拟环境,Python 3.9 兼容性最好 python -m venv venv_ai source venv_ai/bin/activate # 依赖一次性锁死,后面换电脑也能复现 pip install torch==2.0.1+cu118 torchvision pandas flask onnxruntime-gpu -i https://download.pytorch.org/whl/cu118 pip freeze > requirements.txt# data.py from torchvision import transforms train_tf = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) val_tf = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ])经验:训练集加
RandomFlip,验证集不要任何随机,保证结果可复现。
# model.py import torch.nn as nn from torchvision.models import mobilenet_v3_large class CatDogNet(nn.Module): def __init__(self, num_classes=2): super.__init__() self.backbone = mobilenet_v3_large(pretrained=True) self.backbone.classifier[-1] = nn.Linear(1280, num_classes) def forward(self, x): return self.backbone(x)只改最后一层,其余冻结可省显存,但毕设时间紧,直接全量微调最快。
# train.py from torch.cuda.amp import GradScaler, autocast model = CatDogNet().cuda() opt = torch.optim.AdamW(model.parameters(), lr=3e-4) scaler = GradScaler() for epoch in range(5): # 5 轮先跑通 for x, y in train_loader: opt.zero_grad() with autocast(): # 混合精度省显存 out = model(x.cuda()) loss = nn.CrossEntropyLoss()(out, y.cuda()) scaler.scale(loss).backward() scaler.step(opt) scaler.update() torch.save(model.state_dict(), f'epoch_{epoch}.pth')技巧:
- 用
autocast几乎不掉点,显存减半;- 每轮存ckpt,崩了能从最近一轮恢复。
# export_onnx.py dummy = torch.randn(1, 3, 224, 224).cuda() torch.onnx.export(model, dummy, "catdog.onnx", input_names=['img'], output_names=['logits'], dynamic_axes={'img': {0: 'batch'}, 'logits': {0: 'batch'}})动态 batch 方便后面一次传多张图。
# app.py from flask import Flask, request, jsonify import onnxruntime as ort from PIL import Image import numpy as np, io app = Flask(__name__) ort_sess = ort.InferenceSession("catdog.onnx", providers=['CUDAExecutionProvider']) def preprocess(image_bytes): img = Image.open(io.BytesIO(image_bytes)).convert('RGB') img = val_tf(img).unsqueeze(0).numpy() return img @app.route("/predict", methods=["POST"]) def predict(): x = preprocess(request.files['img'].read()) logits = ort_sess.run(None, {'img': x})[0] prob = float(np.exp(logits[:,1]) / (np.exp(logits[:,1]) + np.exp(logits[:,0]))) return jsonify({"dog_prob": round(prob, 3)}) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)启动服务:
python app.py,局域网手机访问http://电脑IP:5000/predict即可实时识别。
warmup:在app.py里加一句ort_sess.run(...)用全零数组跑一遍,用户请求来时延迟从 2 s 降到 200 ms。Image.open遇到非图片字节会 500,需捕获异常并返回 400;catdog.onnx重命名带时间戳,如catdog_20240517_v1.onnx,Flask 启动参数传入,回滚只需改文件名。sudo pip,用venv或conda保证可迁移。pip freeze > requirements.txt后,加--hash校验更稳;如果团队多人,直接上poetry.lock。gunicorn -w 4 -b 0.0.0.0:5000 app:app起 4 进程;onnxruntime.Encryption,毕业答辩可跳过,但心里要有数。onnxruntime_tools做静态量化,权重从 FP32 压到 INT8,体积再砍一半。tf.saved_model,再用TFLiteConverter量化,最后得到model.tflite,Android Studio 直接引用。TFLite Classification Sample改两行标签即可,拍照→预处理→推理→显示,全程离线,答辩现场断网也不怕。写在最后:
整个流程我亲测在 4 G 显存笔记本跑通,训练 5 轮 8 min,ONNX 模型 27 M,Flask 接口 200 ms 内返回。你只需把数据集换成自己的课题(垃圾分拣、口罩识别、甲骨文分类……),代码模板几乎不用改。
下一步,不妨把模型搬到手机端,让评委老师现场拍一张,App 秒出结果——那一刻,你会真切体会到“工程”与“学术”双重成就感。动手试试吧,遇到坑欢迎留言交流!