如何解决Django调用Colab训练的CNN盲文分类模型报无此文件错误
Django接入盲文分类模型"无此文件或目录"报错解决方案
核心报错原因及修复方案
你遇到的文件不存在报错由两类路径问题导致,同时代码存在多处逻辑错误需要同步修正:
1. 相对路径不兼容Django运行规则
你使用的./model/BrailleNet.h5、'.'+filelink两种相对路径写法完全依赖Django进程的启动目录,只要启动位置变化就会出现路径读取失败,统一替换为Django内置的绝对路径拼接规则:
- 首先在视图文件头部导入依赖:
import os from django.conf import settings from tensorflow.keras.models import load_model from tensorflow.keras.preprocessing import image import numpy as np import tensorflow as tf
- 模型路径替换为绝对路径:
models=load_model(os.path.join(settings.BASE_DIR, 'model', 'BrailleNet.h5')) - 上传图片不要手动拼接
.,如果图片存储在媒体目录,用os.path.join(settings.MEDIA_ROOT, 文件名)拼接真实存储路径。
2. 上传文件获取方式错误
表单上传的文件不会存储在request.POST中,你从POST读取myfiles本身就拿不到有效值,自然拼不出合法路径:
- 首先要求前端提交文件的表单必须添加属性
enctype="multipart/form-data" - 后端获取上传文件的方式改为:
upload_file = request.FILES.get('myfiles')
拿到文件对象后可先写入本地临时目录或者直接读入内存处理,无需通过url反查本地路径。
3. 模型加载逻辑优化(非报错直接原因,但会降低报错概率)
当前你每次请求都会重新加载一次模型文件,不仅响应慢还容易出现文件读取锁冲突,把模型加载逻辑移到视图函数外部,项目启动时仅加载一次即可。
其他致命逻辑错误修复
你当前的分类判断逻辑除了A和Z之外,所有预测值都会返回分类B,所有elif np.argmax(predi) == 1需要依次修改为==2到==24,对应C到Y的分类,也可以用列表映射简化代码:
label_list = [f'Classification : huruf {chr(ord("A")+i)} <br/>' for i in range(26)] predictedLabel = label_list[np.argmax(predi)]
修正后参考代码
# 项目启动时仅加载一次模型 tf.compat.v1.disable_eager_execution() img_height, img_width=224,224 model_graph = tf.Graph() with model_graph.as_default(): tf_session=tf.compat.v1.Session() with tf_session.as_default(): models=load_model(os.path.join(settings.BASE_DIR, 'model', 'BrailleNet.h5')) label_list = [f'Classification : huruf {chr(ord("A")+i)} <br/>' for i in range(26)] def prosesImg(request): # 接收上传文件 upload_file = request.FILES.get('myfiles') # 保存文件到临时目录,提前在项目根目录创建temp文件夹 temp_path = os.path.join(settings.BASE_DIR, 'temp', upload_file.name) with open(temp_path, 'wb+') as f: for chunk in upload_file.chunks(): f.write(chunk) # 图片预处理 img = image.load_img(temp_path, target_size=(img_height, img_width)) x = image.img_to_array(img) x = x / 255 x = x.reshape(1, img_height, img_width, 3) with model_graph.as_default(): with tf_session.as_default(): predi = models.predict(x) # 获取分类结果 predictedLabel = label_list[np.argmax(predi)] # 可选:删除临时文件避免占用空间 os.remove(temp_path) return render(request, 'classification/hasil.html', { 'judul': 'Result', 'subjudul': 'RESULT', 'predictedLabel': predictedLabel, 'predi': predi, 'uploaded_file_url': '/temp/'+upload_file.name } )
内容的提问来源于stack exchange,提问作者Amanda
相关产品推荐
相关产品推荐

