Flask中使用Jinja模板渲染网页时返回数据为None是什么原因?
问题核心原因
- 你当前的
TSN_PIC函数最终返回的是plt.show(),没有返回分类结果数据,传给模板的result是空值 - 模板中你写的变量是
{{results}},但后端传的参数名是result,变量名不匹配 - 你当前是在循环中重复覆盖
result变量,没有把所有分类结果整理成结构化数据传递
修改步骤
1. 修改cv_acp中的TSN_PIC函数
def TSN_PIC(img): img = image.imread(img) fig, ax = plt.subplots(figsize=(18, 18)) ax.imshow(img.asnumpy()) transform_fn = transforms.Compose([ video.VideoCenterCrop(size=224), video.VideoToTensor(), video.VideoNormalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]) img_list = transform_fn([img.asnumpy()]) net = get_model('vgg16_ucf101', nclass=101, pretrained=True) pred = net(nd.array(img_list[0]).expand_dims(axis=0)) classes = net.classes topK = 5 ind = nd.topk(pred, k=topK)[0].astype('int') print('The input video frame is classified to be') # 新增:定义结果列表存储所有分类结果 result_list = [] for i in range(topK): class_name = classes[ind[i].asscalar()] confidence = nd.softmax(pred)[0][ind[i]].asscalar()*100 # 把结果以元组形式存入列表 result_list.append((class_name, round(confidence,2))) print('\t%s - %.2f'%(class_name, confidence)) # 注意:无GUI的服务器环境运行plt.show()会报错,不需要可以注释掉 # plt.show() # 返回结果列表而不是plt.show() return result_list
2. app.py无需改动,保持现在传result=result的逻辑即可
3. 修改cv_acp_TSN_PIC.html模板中的结果渲染部分
把原来的
{% block content %} <div class="container"> <p>{{results}}</p> </div> {% endblock %}
替换为:
<div class="container"> <h3>分类结果</h3> <table border="1" cellpadding="8" cellspacing="0"> <thead> <tr> <th>动作分类</th> <th>置信度(%)</th> </tr> </thead> <tbody> {% for class_name, confidence in result %} <tr> <td>{{ class_name }}</td> <td>{{ confidence }}</td> </tr> {% endfor %} </tbody> </table> </div>
注意事项
如果你的运行环境是没有图形界面的服务器,需要添加以下代码关闭matplotlib的GUI后端,避免报错:
import matplotlib matplotlib.use('Agg')
把这段代码加在cv_acp文件最开头导入matplotlib的位置即可。
内容的提问来源于stack exchange,提问作者Blob
相关产品推荐
相关产品推荐

