文章目录

  • 前言
    • 环境
    • 项目结构
  • 前端
    • 图片上传
    • 结果显示
  • 后端
    • 模型部署
    • 路由
    • 业务代码
  • 总结

本博文优先在掘金社区发布!

前言

啥也不说了,来先看效果图

本来我是打算去把昨天在实验平台训练的模型拿到手的,结果当我早上起来一看,发现不知道为什么,可能是用的人多,我的云设备断开了,于是在训练了37轮之后就挂了。没办法我只能去重新训练,想着多训练几次,然后
不出意外又挂了,mad,人嘛了。
没办法我只能把昨天的模型拿过来,这个的识别率只有 62.4%。我其实还有想法去做那个涂鸦识别的,但是这个数据集太大了,网络到是有搭建好的,后面可以看看把人家训练好的模型拿过来,然后结合一下先前mediapipe做的demo,实在不行,把这个ciarf10拿过来,然后自己搞点数据集,也能分类涂鸦,没办法,复杂的神经网络模型,很难训练,没有设备GTX1650表示顶不住,一个VGG你都要训练好几天,所以只能拿这个玩玩。

环境

我这里使用的是 Django3.2
用的是我经常使用的一个测试项目(直接有现成的嘛)
然后是直接使用html css js 写的。

项目结构

这个我是直接在原来的测试项目里面创建的。也就是这样的。


我们的代码都在这APP里面。
当然还有就是,这里使用了一张背景图片

其他的就没有了,基本上就那样。

前端

现在上我们的前端代码
这个就两个页面

图片上传

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>图片识别Demo</title>
</head><style>.center {margin: 0 auto;width: 80%;border: 5px solid #18a0ec;transition: all 0.9s;border-radius: 10px;background-image:url("/static/media/torchbackground.jpg") ;background-repeat: no-repeat;background-size: cover;-webkit-background-size: cover;-o-background-size: cover;background-position: center 0;}.centerin{width: 500px;height: 500px;margin: 0 auto;padding: 10%;border-radius: 10px;}button {margin-left: 80%;width: 20%;height: 35px;border-width: 0px;border-radius: 3px;background: #1E90FF;cursor: pointer;outline: none;font-family: Microsoft YaHei;color: white;font-size: 17px;}#info{width: 500px;/*   这个居中 */margin: 0 auto;background: #9becff;border-radius: 10px;}#info:hover {box-shadow: 0px 15px 30px rgba(0, 0, 0, 0.4);margin-top: 5px;
}.tips{text-align:center;color:#fff;text-shadow: #1e88e1 5px 5px 5px;
}
</style><body>
<div class="center"><div class="centerin"><div id="info"><p class="tips" style="margin: 0 auto;">本Demo是基于CIARF10模型和官方数据集进行构建的10分类模型,能够识别{飞机,自行车,小鸟,小猫,小狗,小鹿,青蛙,小马,船,卡车}@Huterox</p></div><br><br><form action="{% url 'torch:hello' %}" enctype="multipart/form-data" method="POST"><div style="background-color:#9becff; width: 100%; height: 300px;"><img src="" id="showimg"></div><br><input id="file" onchange="changepic(this)" type="file" name="pic"style="height: 70px; display:inline-block;width: 50%;"><button style="height: 40px;position: relative; margin-left: 29%;">确定</button></form></div></div>
</body>
<script>function changepic() {var reads = new FileReader();f = document.getElementById('file').files[0];reads.readAsDataURL(f);reads.onload = function (e) {var showing = document.getElementById('showimg');var userpic = document.getElementById('userpic');showing.src = this.result;showing.style.height = "300px";showing.style.width = "100%";};}
</script></html>

结果显示

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Answear</title>
</head>
<style>.show {margin: 100px auto;width: 80%;border: 5px solid #18a0ec;transition: all 0.9s;border-radius: 10px;}.show:hover {box-shadow: 0px 15px 30px rgba(0, 0, 0, 0.4);margin-top: 90px;
}
.tips{text-align:center;font: 50px helvetica,arial,sans-serif;color:#fff;text-shadow: #1e88e1 5px 5px 5px;
}</style>
<body><div ><div class="show"><p class="tips">{{ answear }}</p></div></div>
</body>
</html>

后端

这个也没啥好说了,你配置好环境,就能搞了

模型部署

这里就是定义了一下我们的模型,还有模型调用。

# coding=utf-8from torch import nnfrom torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequentialclass MyModule(nn.Module):def __init__(self):super().__init__()self.model = Sequential(Conv2d(3, 32, kernel_size=(5, 5), padding=2),MaxPool2d(2),Conv2d(32, 32, (5, 5), padding=2),MaxPool2d(2),Conv2d(32, 64, (5, 5), padding=2),MaxPool2d(2),Flatten(),Linear(1024, 64),Linear(64, 10))def forward(self,x):x = self.model(x)return x

模型调用

# coding=utf-8
from PIL import Image
import torchvision
import torch
from PytorchDemo.ModuleTorch.MyModle import MyModuledef recognize_img(Image):compose = torchvision.transforms.Compose([torchvision.transforms.Resize((32, 32)),torchvision.transforms.ToTensor()])module_path = "PytorchDemo/ModuleTorch/modulestate/mymodule_500.pth"image = compose(Image)module = MyModule()module.load_state_dict(torch.load(module_path))image = torch.reshape(image, (1, 3, 32, 32))module.eval()with torch.no_grad():out = module(image)return out.argmax(1).item()

路由

主路由

分路由

业务代码

这个都有解释

#coding = utf-8
from django.http import HttpResponse
from django.shortcuts import render
import asyncio# Create your views here.
from django.views.decorators.clickjacking import xframe_options_sameorigin
from django.views.decorators.csrf import csrf_exempt
from PIL import Image
from PytorchDemo.ModuleTorch.CIARF10 import recognize_imgasync def UseCIARF10(request,image):# {飞机,自行车,小鸟,小猫,小狗,小鹿,青蛙,小马,船,卡车}#是的这个view又是我从老demo里面改的,后来才想起来这是个运算密集型任务,异步同步没区别~Things = {0:"飞机",1:"自行车",2:"小鸟",3:"小猫",4:"小鹿",5:"小狗",6:"青蛙",7:"小马",8:"船",9:"卡车"}out = recognize_img(image)out = Things.get(out,"No Answear")print(out)Data = {"answear": "Answear maybe:{}".format(out)}return Data@csrf_exempt
@xframe_options_sameorigin
def Hello(request):if(request.method=="GET"):return render(request,"Show.html")elif(request.method=="POST"):image = request.FILES.get('pic')if(image):image = Image.open(image)loop = asyncio.new_event_loop()asyncio.set_event_loop(loop) #设置事件循环try:res = loop.run_until_complete(UseCIARF10(request,image))finally:loop.close()return render(request, "Answear.html",context=res)else:return render(request, "Show.html")return HttpResponse("NO Power")

值得一提的是,在Django3.x支持了异步,但是对于一个view而言总体上还是同步的,sync view 对系统进行优化,当前视图遇到IO操作可以切换,为其他用户提供算力。之后操作完后一个return返回数据。

总结

拿到模型之后部署还是很简单的,后面的话,配合uwsgc Nginx 线上部署。然后在Django里面也是发现一些以前没发现的好玩的东西。最后提前祝大家新春快乐~虎年大吉

春节小游戏之图片分类(Pytorch模型部署)相关推荐

  1. CNN自定义图片分类(Pytorch)

    CNN图片分类(Pytorch)_zju_cbw的博客-CSDN博客这篇文章主要讲述用 pytorch 完成简单 CNN 图片分类任务,如果想对 CNN 的理论知识进行了解,可以看我的这篇文章,深度学 ...

  2. TensorFlow与PyTorch模型部署性能比较

    TensorFlow与PyTorch模型部署性能比较 前言 2022了,选 PyTorch 还是 TensorFlow?之前有一种说法:TensorFlow 适合业界,PyTorch 适合学界.这种说 ...

  3. 如何将pytorch模型部署到安卓

    如何将pytorch模型部署到安卓上 这篇文章演示如何将训练好的pytorch模型部署到安卓设备上.我也是刚开始学安卓,代码写的简单. 环境: pytorch版本:1.10.0 模型转化 pytorc ...

  4. 基于C++的PyTorch模型部署

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 引言 PyTorch作为一款端到端的深度学习框架,在1.0版本之后 ...

  5. 00001-微信小游戏--显示图片

    安装微信小程序和工具的操作就不再介绍了. canvas 是一个画布,我们可以在上面绘制内容.所有绘制的内容需要使用一个屏幕坐标系,屏幕坐标系是以屏幕的左上角的点为0,0点.右方向为X轴正方向,下方向为 ...

  6. android移动拼图小游戏的图片,利用ViewDragHelper轻松实现Android拼图游戏

    前言 最近一段时间看了一些介绍ViewDragHelper的博客,感觉这是一个处理手势滑动的神器,看完以后就想做点东西练练手,于是就做了这个Android拼图小游戏. 先上个效果图 demo.gif ...

  7. python pygame小游戏素材图片_pygame 打飞机(小游戏)

    0.游戏的基本实现 ''' 游戏的基本实现 游戏的初始化:设置游戏窗口,绘制图像的初始位置,设定游戏时钟 游戏循环:设置刷新频率,检测用户交互,更新所有图像位置,更新屏幕显示 ''' 1.安装pyga ...

  8. Unity3d C# 开发微信小游戏分享图片、朋友圈等功能实现(含源码)

    广告 通过一段时间的基于minigame-unity-webgl-transform插件的开发,算是稍微完整的一小个游戏已经制作完成,具体大家可以扫码体验一下: 感谢支持!! 前言 之前编写了一篇u3 ...

  9. PyTorch模型部署:pth转onnx跨框架部署详解+代码

    文章目录 引言 基础概念 onnx:跨框架的模型表达标准 onnxruntime:部署模型的推理引擎 示例代码 0)安装onnx和onnxruntime 1)pytorch模型转onnx模型 2)on ...

最新文章

  1. 24、嵌合体序列Chimeras
  2. 数据科学工作者(Data Scientist) 的日常工作内容包括什么?
  3. DeepMind提出强化学习新算法,教智能体从零学控制
  4. 人脸相关2020eccv
  5. android logcat里面AndroidRuntime FATAL EXCEPTION: main这个是什么问题啊。
  6. re:Invent第三天:除了拥抱混合云,AWS还一口气发了这些新产品
  7. 1014 福尔摩斯的约会 (20分)
  8. 抗日战争时期的陈建功和苏步青
  9. yum 不能安装应用,提示There are no enabled repos Run yum repolist all
  10. java pdf验签_java pdf验签
  11. 09:向量点积计算【一维数组】
  12. IS-IS详解(十七)——IS-IS 区域迁移与路由汇总
  13. PlaySound 播放内存中的音频数据
  14. speedoffice(PPT)如何在幻灯片里面插入表格呢
  15. VOC检测格式数据分析和处理
  16. 什么是顶级域名、地理域名和个性域名
  17. Mysql解决微信特殊符号昵称入库报错乱码
  18. python安卓开发-一个Android开发者自学Python的心路历程
  19. 买服务器挂网站吗,云服务器 挂网站吗
  20. 华为手机开源内核代码

热门文章

  1. EMC名词 - 猪尾巴效应
  2. BeautifulSoup爬取贝壳网成都二手房源信息(附:完整源代码)
  3. 在visual studio 2019中使用msvc2015
  4. 《程序员之禅》一一10.10 淡泊宁静
  5. 基于python+django+vue的大学生租房系统pycharm源码
  6. python中的数据类型和控制流
  7. 【资源分享】之stm8,开发软件安装,例程资源,以及清风电子教程。
  8. selenium基础八种元素定位
  9. SpringBoot2入门教程
  10. grafana mysql 时间段选择_mysql – 选择特定时间段内的所有可用项目