日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

【flask整合深度学习】ubuntu系统下显示深度学习视觉检测结果图片并可在web端访问,配置允许手机浏览器打开

發布時間:2024/9/30 windows 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【flask整合深度学习】ubuntu系统下显示深度学习视觉检测结果图片并可在web端访问,配置允许手机浏览器打开 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 介紹
  • flask文件
  • 前端代碼
  • 輸入命令

介紹

之前有一篇flask和mongodb交互的記錄文:
https://blog.csdn.net/qq_41358574/article/details/117845077

首先需要先下載的工具:pycharm,pytorch一堆的相關包,flask相關包
本電腦沒有cuda,故模型傳入時輸入:

device = torch.device('cpu')# Set up modellamodel = Darknet(opt.model_def, img_size=opt.img_size).to(device)if opt.weights_path.endswith(".weights"):# Load darknet weightsmodel.load_darknet_weights(opt.weights_path)else:# Load checkpoint weightsmodel.load_state_dict(torch.load(opt.weights_path,map_location=device))

項目在深度學習的pytorch框架下載入模型對圖片進行檢測,然后結果保存在文件夾中,用flask渲染前段頁面動畫顯示結果,且可以手機瀏覽器輸入ip+端口號訪問頁面
效果:


(字體是動畫的,圖片看不出來)

flask文件

目錄:
utils 和model.py是和深度學習有關的文件代碼。
detect.py相當于main.py,深度學習的目標檢測也寫在里面了,所以代碼挺多

from __future__ import divisionfrom models import * from utils.utils import * from utils.datasets import * from utils.augmentations import * from utils.transforms import *import os import sys import time import datetime import argparsefrom PIL import Imageimport torch import torchvision.transforms as transforms from torch.utils.data import DataLoader from torchvision import datasets from torch.autograd import Variableimport matplotlib.pyplot as plt import matplotlib.patches as patches from matplotlib.ticker import NullLocator from flask import Flask,request,make_response,render_template import socket from time import sleep myhost = socket.gethostbyname(socket.gethostname()) app = Flask(__name__) igpath = '/home/heziyi/pic/' @app.route('/', methods=['GET', 'POST']) # 使用methods參數處理不同HTTP方法 def home():return render_template('index.html')#@app.route('/img/<string:filename>',methods=['GET']) @app.route('/img/',methods=['GET']) def display():if request.method == 'GET':# if filename is None:# pass# else:image = open("/static/he_21.png", "rb").read()# image = open(igpath+filename,"rb").read()response = make_response(image)response.headers['Content-Type'] = 'image/jpg'return response if __name__ == "__main__":parser = argparse.ArgumentParser()parser.add_argument("--image_folder", type=str, default="data/custom/dd", help="path to dataset")parser.add_argument("--model_def", type=str, default="config/yolov3-custom.cfg", help="path to model definition file")parser.add_argument("--weights_path", type=str, default="checkpoints/ckpt_88.pth", help="path to weights file")parser.add_argument("--class_path", type=str, default="data/custom/classes.names", help="path to class label file")parser.add_argument("--conf_thres", type=float, default=0.8, help="object confidence threshold")parser.add_argument("--nms_thres", type=float, default=0.4, help="iou thresshold for non-maximum suppression")parser.add_argument("--batch_size", type=int, default=1, help="size of the batches")parser.add_argument("--n_cpu", type=int, default=0, help="number of cpu threads to use during batch generation")parser.add_argument("--img_size", type=int, default=416, help="size of each image dimension")parser.add_argument("--checkpoint_model", type=str,default="checkpoints/ckpt_88.pth",help="path to checkpoint model")opt = parser.parse_args()print(opt)#device = torch.device("cuda" if torch.cuda.is_available() else "cpu")device = torch.device('cpu')os.makedirs("../output", exist_ok=True)# Set up modellamodel = Darknet(opt.model_def, img_size=opt.img_size).to(device)if opt.weights_path.endswith(".weights"):# Load darknet weightsmodel.load_darknet_weights(opt.weights_path)else:# Load checkpoint weightsmodel.load_state_dict(torch.load(opt.weights_path,map_location=device))#cpu!!!!!!model.eval() # Set in evaluation modedataloader = DataLoader(ImageFolder(opt.image_folder, transform= \transforms.Compose([DEFAULT_TRANSFORMS, Resize(opt.img_size)])),batch_size=opt.batch_size,shuffle=False,num_workers=opt.n_cpu,)classes = load_classes(opt.class_path) # Extracts class labels from fileTensor = torch.cuda.FloatTensor if torch.cuda.is_available() else torch.FloatTensorimgs = [] # Stores image pathsimg_detections = [] # Stores detections for each image indexprint("\nPerforming object detection:")prev_time = time.time()for batch_i, (img_paths, input_imgs) in enumerate(dataloader):# Configure inputinput_imgs = Variable(input_imgs.type(Tensor))# Get detectionswith torch.no_grad():detections = model(input_imgs)detections = non_max_suppression(detections, opt.conf_thres, opt.nms_thres)# Log progresscurrent_time = time.time()inference_time = datetime.timedelta(seconds=current_time - prev_time)prev_time = current_timeprint("\t+ Batch %d, Inference Time: %s" % (batch_i, inference_time))# Save image and detectionsimgs.extend(img_paths)img_detections.extend(detections)# Bounding-box colorscmap = plt.get_cmap("tab20b")colors = [cmap(i) for i in np.linspace(0, 1, 20)]print("\nSaving images:")# Iterate through images and save plot of detectionsfor img_i, (path, detections) in enumerate(zip(imgs, img_detections)):print("(%d) Image: '%s'" % (img_i, path))# Create plotimg = np.array(Image.open(path))plt.figure()fig, ax = plt.subplots(1)ax.imshow(img)# Draw bounding boxes and labels of detectionsif detections is not None:# Rescale boxes to original imagedetections = rescale_boxes(detections, opt.img_size, img.shape[:2])unique_labels = detections[:, -1].cpu().unique()n_cls_preds = len(unique_labels)bbox_colors = random.sample(colors, n_cls_preds)for x1, y1, x2, y2, conf, cls_conf, cls_pred in detections:print("\t+ Label: %s, Conf: %.5f" % (classes[int(cls_pred)], cls_conf.item()))box_w = x2 - x1box_h = y2 - y1color = bbox_colors[int(np.where(unique_labels == int(cls_pred))[0])]# Create a Rectangle patchbbox = patches.Rectangle((x1, y1), box_w, box_h, linewidth=2, edgecolor=color, facecolor="none")print(int(box_w)*int(box_h))# if(box_w*box_h>10000):# se.write("1".encode())# time.sleep(3)# se.write("0".encode())# Add the bbox to the plotax.add_patch(bbox)# Add labelplt.text(x1,y1,s=classes[int(cls_pred)],color="white",verticalalignment="top",bbox={"color": color, "pad": 0},)# Save generated image with detectionsplt.axis("off")plt.gca().xaxis.set_major_locator(NullLocator())plt.gca().yaxis.set_major_locator(NullLocator())filename = os.path.basename(path).split(".")[0]output_path = os.path.join("../output", f"{filename}.png")plt.savefig(output_path, bbox_inches="tight", pad_inches=0.0)plt.close()app.run() #啟動flask服務器

其中函數display():用于在瀏覽器輸入地址后直接返回圖片

@app.route('/img/',methods=['GET']) def display():if request.method == 'GET':# if filename is None:# pass# else:image = open("/static/he_21.png", "rb").read()# image = open(igpath+filename,"rb").read()response = make_response(image)response.headers['Content-Type'] = 'image/jpg'return response

除了最后一行app.run()其他的都是深度學習的代碼,學過的應該很容易看懂。

前端代碼

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" type="text/css" href="static/Login.css"/> </head> <body><h1 >檢測結果</h1><h1>hello!!!!!!!!!!!!```</h1> <h2>this is the detection result</h2> <img src="/static/he_21.png"> <img src="/static/he_14.png"> <img src="/static/he_4.png"> </body> </html>

css:

html{width: 100%;height: 100%;overflow: hidden;font-style: sans-serif; } body{width: 100%;height: 100%;font-family: 'Open Sans',sans-serif;margin: 0;background-color: #4A374A; }img{widht: 300px;height: 300px;border: 1px solid red;}h1{text-align:center;color:#fff;font-size:48px;text-shadow: 1px 1px 1px #ccc,0 0 10px #fff,0 0 20px #fff,0 0 30px #fff,0 0 40px #ff00de,0 0 70px #ff00de,0 0 80px #ff00de,0 0 100px #ff00de,0 0 150px #ff00de;transform-style: preserve-3d;-moz-transform-style: preserve-3d;-webkit-transform-style: preserve-3d;-ms-transform-style: preserve-3d;-o-transform-style: preserve-3d;animation: run ease-in-out 9s infinite;-moz-animation: run ease-in-out 9s infinite ;-webkit-animation: run ease-in-out 9s infinite;-ms-animation: run ease-in-out 9s infinite;-o-animation: run ease-in-out 9s infinite;}@keyframes run{0% {transform:rotateX(-5deg) rotateY(0);}50%{transform:rotateX(0) rotateY(180deg);text-shadow: 1px 1px 1px #ccc,0 0 10px #fff,0 0 20px #fff,0 0 30px #fff,0 0 40px #3EFF3E,0 0 70px #3EFFff,0 0 80px #3EFFff,0 0 100px #3EFFee,0 0 150px #3EFFee;}100% {transform:rotateX(5deg) rotateY(360deg);}}@-webkit-keyframes run{0% {transform:rotateX(-5deg) rotateY(0);}50%{transform:rotateX(0) rotateY(180deg);text-shadow: 1px 1px 1px #ccc,0 0 10px #fff,0 0 20px #fff,0 0 30px #fff,0 0 40px #3EFF3E,0 0 70px #3EFFff,0 0 80px #3EFFff,0 0 100px #3EFFee,0 0 150px #3EFFee;}100% {transform:rotateX(5deg) rotateY(360deg);}}@-moz-keyframes run{0% {transform:rotateX(-5deg) rotateY(0);}50%{transform:rotateX(0) rotateY(180deg);text-shadow: 1px 1px 1px #ccc,0 0 10px #fff,0 0 20px #fff,0 0 30px #fff,0 0 40px #3EFF3E,0 0 70px #3EFFff,0 0 80px #3EFFff,0 0 100px #3EFFee,0 0 150px #3EFFee;}100% {transform:rotateX(5deg) rotateY(360deg);}}@-ms-keyframes run{0% {transform:rotateX(-5deg) rotateY(0);}50%{transform:rotateX(0) rotateY(180deg);text-shadow: 1px 1px 1px #ccc,0 0 10px #fff,0 0 20px #fff,0 0 30px #fff,0 0 40px #3EFF3E,0 0 70px #3EFFff,0 0 80px #3EFFff,0 0 100px #3EFFee,0 0 150px #3EFFee;}100% {transform:rotateX(5deg) rotateY(360deg);}}

輸入命令

export FLASK_APP=“detect.py” #由于是linux故輸入這個
flask run --host=0.0.0.0 --port=8000
記得開放ubuntu的端口:

sudo ufw allow 8000

附:
開啟/禁用

sudo ufw allow|deny [service]

sudo ufw allow smtp 允許所有的外部IP訪問本機的25/tcp (smtp)端口

sudo ufw allow 22/tcp 允許所有的外部IP訪問本機的22/tcp (ssh)端口

sudo ufw allow 53 允許外部訪問53端口(tcp/udp)

sudo ufw allow from 192.168.1.100 允許此IP訪問所有的本機端口

sudo ufw allow proto udp 192.168.0.1 port 53 to 192.168.0.2 port 53
查看防火墻狀態

sudo ufw status

總結

以上是生活随笔為你收集整理的【flask整合深度学习】ubuntu系统下显示深度学习视觉检测结果图片并可在web端访问,配置允许手机浏览器打开的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。