记录基于ARM的铝片缺陷检测项目的经历(二)

记录基于ARM的铝片缺陷检测项目的经历(二),第1张

记录基于ARM的铝片缺陷检测项目的经历(二)

文章目录
  • 记录基于ARM的铝片缺陷检测项目的经历(二)
  • 利用flask框架搭建微型服务器
  • 一、接收客户端上传的图片进行检测
  • 二、将检测结果图片和数据下载到客户端
  • 三、其他问题


前一节已经将模型训练完毕了,接下来就是前后端的搭建和数据传输

利用flask框架搭建微型服务器

语言:python3.8
框架:Flask ( version == 2.1.2 )
测试平台:window10


构建流程:

  1. 接收客户端上传的图片
  2. 将图片送至模型进行检测
  3. 将检测图片和检测数据下载至客户端

一、接收客户端上传的图片进行检测

首先介绍文件夹格式

build目录用来存放将来linux系统的执行文件
static目录下的images目录用来存放用户上传来的待检测图片,result目录用来存放后台检测结果数据。
templates目录下存放客户端的html源代码
而服务器代码文件存放在根目录下


当用户访问我们服务器时,我返回一个初始网页模板给客户端。


    return render_template('upload.html')

在html代码中,用户选择的待检测图片将会以表单的形式用POST方式上传文件至服务端,所以我们在服务端用flask框架中的request方法得到用户上传的待检测图片。

if request.method == 'POST':
        f = request.files['file']

将static/images目录清空,再将得到的待检测图片改名为test.jpg存放在static目录的Images目录下。

basepath = os.path.dirname(__file__)  #

    filepath = os.path.join(basepath, 'static/images')

    del_list = os.listdir(filepath)
    for f in del_list:
        file_path = os.path.join(filepath, f)
        if os.path.isfile(file_path):
            os.remove(file_path)

再利用检测模型检测我们刚刚得到的待检测图片。并返回给用户另外一个网页模板。

if request.method == 'POST':
        f = request.files['file']

        if not (f and allowed_file(f.filename)):
            return jsonify({"error": 1001, "msg": "only png、PNG、jpg、JPG、bmp"})

        user_input = request.form.get("name")

        upload_path = os.path.join(basepath, 'static/images', secure_filename(f.filename)) 
        
        f.save(upload_path)

        os.rename(upload_path, os.path.join(basepath, 'static/images', 'test.jpg'))

        os.chdir("*.sh文件存放的绝对路径")

        os.system("./run.sh")

        return render_template('upload_ok.html', userinput=user_input, val1=time.time())

在服务端检测到客户端以POST方式上传文件时,我简单的检测了一下用户上传的文件是否是图片形式,如果不是图片形式的话,我就返回给客户端一个错误提醒。

        if not (f and allowed_file(f.filename)):
            return jsonify({"error": 1001, "msg": "only png、PNG、jpg、JPG、bmp"})

并在

此部分整体代码如下

app = Flask(__name__)

@app.route('/index', methods=['POST', 'GET'])  #
def upload():
    basepath = os.path.dirname(__file__)  #

    filepath = os.path.join(basepath, 'static/images')

    del_list = os.listdir(filepath)
    for f in del_list:
        file_path = os.path.join(filepath, f)
        if os.path.isfile(file_path):
            os.remove(file_path)

    if request.method == 'POST':
        f = request.files['file']

        if not (f and allowed_file(f.filename)):
            return jsonify({"error": 1001, "msg": "only png、PNG、jpg、JPG、bmp"})

        user_input = request.form.get("name")

        upload_path = os.path.join(basepath, 'static/images', secure_filename(f.filename)) 
        
        f.save(upload_path)

        os.rename(upload_path, os.path.join(basepath, 'static/images', 'test.jpg'))

        os.chdir("*.sh文件存放的目录的绝对路径")

        os.system("./run.sh")

        return render_template('upload_ok.html', userinput=user_input, val1=time.time())

    return render_template('upload.html')


二、将检测结果图片和数据下载到客户端

首先介绍一下服务端数据下载到客户端的原理:
利用flask框架可以将你指定的数据通过functoin的return发送到你指定的网址上,具体为: 你的Ipv4地址:你设定的端口号/你设定的网址
具体在我的检测结果数据发送,我设定的网址为: 192.168.44.21:8080/ResultData
其中192.168.44.21是我本机的Ipv4地址(没错,我是用自己的电脑做为服务端进行测试的),开放的端口号为8080端口,设定的网址是/ResultData

@app.route("/ResultData")

所以当服务端发送数据到指定网址后,只需要在html代码中访问这个网址后就能得到服务端发送的数据。相当于这个网址是服务端和客户端页面的中转站。


首先我将检测后的结果数据传到了 192.168.44.21:8080/ResultData 上。
就是一个简单的文件输入流读取文件内容后,将内容发送出去。

@app.route("/ResultData")
def giveData():
    basePath = os.path.dirname(__file__)  #
    resultDataPath = "*结果数据所在地址的路径"

    dataList = []
    dataDict = {}
    i = 0
    with open(resultDataPath, "r", encoding="utf-8") as f:
        data = f.readline()
        while data:
            dataDict[str(i)] = dict(result=data)
            i += 1
            try:
                data = f.readline().strip()
            except:
                break
        dataList.append(dataDict)
    return str(dataList).replace("'", '"')

接着将结果图片发送到 192.168.44.21:8080/dada

@app.route("/dada", methods=['GET', 'POST'])
def showImg():
    if flask.request.method == 'GET':
        image_data = open("*结果图片地址", "rb").read()
        response = flask.make_response(image_data)
        response.headers['Content-Type'] = 'image/png'
        return response
三、其他问题

在实际 *** 作中我发现一个问题,每次重启服务端时,服务端的ip地址会变化(就是我本机的IP地址一直变化),每次发送的数据都被发送到了不同的地址,那每次在html中都要重新手动修改Ajax请求的地址,这样显然不“自动化”,所以我写了一个脚本,每次启动服务端时会自动得到服务端的IP地址。


先放代码:

# -*- coding:utf-8 -*-
import os
import re

def getIpPath():
	# 使用os.popen()函数执行ifconfig命令,结果为file对象,将其传入cmd_file保存
	cmd_file = os.popen('ipconfig')
	# 使用file对象的read()方法获取cmd_file的内容
	cmd_result = cmd_file.read()
	# print(cmd_result)
	# print(type(cmd_result))       # str
	# 构造用于匹配IP的匹配模式
	obj = re.compile(r'无线局域网适配器.*?IPv4.*?:(?P.*?)子网掩码', re.S)
	ipIter = obj.finditer(cmd_result)
	with open("./static/result/ipPath.txt", "w", encoding="utf-8") as f:
		for ip in ipIter:
			ipPath = ip.group("ip").strip()
			# print(ipPath)
			path = "http://{}:8081/".format(ipPath)
			f.write(path)
			return ipPath

在windows终端中查看IP的方式是:

ipconfig

所以利用os库的os.popen()的管道式输入ipconfig,读取返回的内容(就是在终端输入ipconfig后显示的一大串信息),格式为str,可以放心让re库食用

接着利用re正则表达式来截取Ipv4的地址

obj = re.compile(r'无线局域网适配器.*?IPv4.*?:(?P.*?)子网掩码', re.S)
ipIter = obj.finditer(cmd_result)

最后将地址加设定的端口号写入txt文件中保存,方便每次html代码中读取地址。

到此,一个非常简洁的服务端基本构建完成了

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/922468.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存