当前位置:   article > 正文

AI项目七:WEB端部署YOLOv5_web部署yolov5

web部署yolov5

若该文为原创文章,转载请注明原文出处。

一、介绍

最近接触网页大屏,所以就想把YOLOV5部署到WEB端,通过了解,知道了两个方法:

1、基于Flask部署YOLOv5目标检测模型。

2、基于Streamlit部署YOLOv5目标检测

代码在github上,个人感觉两个比较好的,所以基于两份代码测试。

https://github.com/ngzhili/Yolov5-Real-Time-Object-Detection

GitHub - harshit-tech03/Fire_Detection: A fire detection web app using yolov5.

一、虚拟环境创建

1、创建虚拟环境

conda create -n yolov5_env python=3.8  

2、激活环境

conda activate yolov5_env

3、下载yolov5

https://github.com/ultralytics/yolov5

4、安装yolov5

pip install -r requirements.txt

注意以下测试都是基于此环境测试

二、基于Flask部署YOLOv5目标检测模型。

1、安装环境

requirements.txt

  1. flask
  2. requests
  3. black
  4. matplotlib>=3.2.2
  5. numpy>=1.18.5
  6. opencv-python>=4.1.2
  7. Pillow
  8. PyYAML>=5.3.1
  9. scipy>=1.4.1
  10. torch>=1.7.0
  11. torchvision>=0.8.1
  12. tqdm>=4.41.0
  13. tensorboard>=2.4.1
  14. seaborn>=0.11.0
  15. pandas
  16. thop # FLOPs computation

代码感觉相对简单,而且也挺详细的,所以直接上代码。

2、前端代码

index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta content="width=device-width, initial-scale=1.0" name="viewport">
  6. <title>YOLOV5 Real Time Inference</title>
  7. <style>
  8. .corner {
  9. border-radius: 25px;
  10. border: 5px solid #212aad;
  11. padding: 0px;
  12. width:60%;
  13. height:auto;
  14. text-align: center;
  15. }
  16. .video-container {
  17. justify-content: center;
  18. text-align: center;
  19. height:100%;
  20. /*border: 1px solid black;*/
  21. }
  22. </style>
  23. </head>
  24. <body >
  25. <div class="container">
  26. <div class="row" style="text-align: center; width:100%;">
  27. <img src="../static/pytorch.png" style="width:40px; position:relative; left: -10px; display:inline-block;">
  28. <h1 style="text-align: center; display:inline-block;">Template for YOLOV5 Object Detection Model Real-Time Inference Using Web Cam</h1>
  29. </img>
  30. <h2 style="text-align: center;">Built by Zhili</h2>
  31. </div>
  32. </div>
  33. <div class="video-container">
  34. <img src="{{ url_for('video') }}" class="corner"></img>
  35. <!--<img src="../static/pytorch.png" class="corner"></img>-->
  36. <!--<img src="{{ url_for('video') }}" width="50%"/>-->
  37. </div>
  38. </body>
  39. </html>

3、后端代码

app.py

  1. """
  2. Simple app to upload an image via a web form
  3. and view the inference results on the image in the browser.
  4. """
  5. import argparse
  6. import io
  7. import os
  8. from PIL import Image
  9. import cv2
  10. import numpy as np
  11. import torch
  12. from flask import Flask, render_template, request, redirect, Response
  13. app = Flask(__name__)
  14. #'''
  15. # Load Pre-trained Model
  16. #model = torch.hub.load(
  17. # "ultralytics/yolov5", "yolov5s", pretrained=True, force_reload=True
  18. # )#.autoshape() # force_reload = recache latest code
  19. #'''
  20. # Load Custom Model
  21. #model = torch.hub.load("ultralytics/yolov5", "custom", path = "./best_damage.pt", force_reload=True)
  22. model = torch.hub.load('./yolov5', 'custom', './yolov5s.pt',source='local')
  23. # Set Model Settings
  24. model.eval()
  25. model.conf = 0.6 # confidence threshold (0-1)
  26. model.iou = 0.45 # NMS IoU threshold (0-1)
  27. from io import BytesIO
  28. def gen():
  29. cap=cv2.VideoCapture(0)
  30. # Read until video is completed
  31. while(cap.isOpened()):
  32. # Capture frame-by-fram ## read the camera frame
  33. success, frame = cap.read()
  34. if success == True:
  35. ret,buffer=cv2.imencode('.jpg',frame)
  36. frame=buffer.tobytes()
  37. #print(type(frame))
  38. img = Image.open(io.BytesIO(frame))
  39. results = model(img, size=640)
  40. #print(results)
  41. #print(results.pandas().xyxy[0])
  42. #results.render() # updates results.imgs with boxes and labels
  43. results.print() # print results to screen
  44. #results.show()
  45. #print(results.imgs)
  46. #print(type(img))
  47. #print(results)
  48. #plt.imshow(np.squeeze(results.render()))
  49. #print(type(img))
  50. #print(img.mode)
  51. #convert remove single-dimensional entries from the shape of an array
  52. img = np.squeeze(results.render()) #RGB
  53. # read image as BGR
  54. img_BGR = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) #BGR
  55. #print(type(img))
  56. #print(img.shape)
  57. #frame = img
  58. #ret,buffer=cv2.imencode('.jpg',img)
  59. #frame=buffer.tobytes()
  60. #print(type(frame))
  61. #for img in results.imgs:
  62. #img = Image.fromarray(img)
  63. #ret,img=cv2.imencode('.jpg',img)
  64. #img=img.tobytes()
  65. #encode output image to bytes
  66. #img = cv2.imencode('.jpg', img)[1].tobytes()
  67. #print(type(img))
  68. else:
  69. break
  70. #print(cv2.imencode('.jpg', img)[1])
  71. #print(b)
  72. #frame = img_byte_arr
  73. # Encode BGR image to bytes so that cv2 will convert to RGB
  74. frame = cv2.imencode('.jpg', img_BGR)[1].tobytes()
  75. #print(frame)
  76. yield(b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
  77. @app.route('/')
  78. def index():
  79. return render_template('index.html')
  80. @app.route('/video')
  81. def video():
  82. """Video streaming route. Put this in the src attribute of an img tag."""
  83. return Response(gen(),
  84. mimetype='multipart/x-mixed-replace; boundary=frame')
  85. '''
  86. @app.route('/video')
  87. def video():
  88. return Response(generate_frames(),mimetype='multipart/x-mixed-replace; boundary=frame')
  89. '''
  90. '''
  91. @app.route("/", methods=["GET", "POST"])
  92. def predict():
  93. if request.method == "POST":
  94. if "file" not in request.files:
  95. return redirect(request.url)
  96. file = request.files["file"]
  97. if not file:
  98. return
  99. img_bytes = file.read()
  100. img = Image.open(io.BytesIO(img_bytes))
  101. results = model(img, size=640)
  102. # for debugging
  103. # data = results.pandas().xyxy[0].to_json(orient="records")
  104. # return data
  105. results.render() # updates results.imgs with boxes and labels
  106. for img in results.imgs:
  107. img_base64 = Image.fromarray(img)
  108. img_base64.save("static/image0.jpg", format="JPEG")
  109. return redirect("static/image0.jpg")
  110. return render_template("index.html")
  111. '''
  112. if __name__ == "__main__":
  113. parser = argparse.ArgumentParser(description="Flask app exposing yolov5 models")
  114. parser.add_argument("--port", default=5000, type=int, help="port number")
  115. args = parser.parse_args()
  116. '''
  117. model = torch.hub.load(
  118. "ultralytics/yolov5", "yolov5s", pretrained=True, force_reload=True
  119. ).autoshape() # force_reload = recache latest code
  120. model.eval()
  121. '''
  122. app.run(host="0.0.0.0", port=args.port) # debug=True causes Restarting with stat
  123. # Docker Shortcuts
  124. # docker build --tag yolov5 .
  125. # docker run --env="DISPLAY" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" --device="/dev/video0:/dev/video0" yolov5

4、运行结果

执行python app.py

三、基于Streamlit部署YOLOv5目标检测。

1、什么是Streamlit

Streamlit 是一个用于数据科学和机器学习的开源 Python 框架。它提供了一种简单的方式来构建交互式应用程序,使数据科学家和机器学习工程师可以更轻松地将他们的模型展示给其他人。

以下是 Streamlit 常用的一些方法:

  • st.write():打印文本、数据框、图表等。
  • st.title():创建标题。
  • st.header():创建大标题。
  • st.subheader():创建小标题。
  • st.text():打印文本。
  • st.markdown():打印 Markdown 文本。
  • st.latex():打印 LaTeX 公式。
  • st.dataframe():显示数据框。
  • st.table():显示表格。
  • st.line_chart():创建线形图。
  • st.area_chart():创建面积图。
  • st.bar_chart():创建条形图。
  • st.map():创建地图。
  • st.pyplot():显示 Matplotlib 图表。
  • st.altair_chart():显示 Altair 图表。
  • st.vega_lite_chart():显示 Vega-Lite 图表。
  • st.bokeh_chart():显示 Bokeh 图表。
  • st.plotly_chart():显示 Plotly 图表。
  • st.image():显示图像。
  • st.audio():显示音频。
  • st.video():显示视频。
  • st.file_uploader():上传文件。
  • st.download_button():下载文件。

以上是 Streamlit 的一些常用方法,可以根据需要选择使用。

只能説Streamlit比Flask更简单,更容易看懂。

在上面环境的基础上在安装一次环境

2、安装环境

requirements.txt

  1. yolov5
  2. opencv_python_headless
  3. streamlit
  4. numpy
  5. Pillow
  6. torch
  7. torchvision
  8. PyYAML
  9. tqdm
  10. matplotlib
  11. requests
  12. scipy
  13. tensorboard
  14. pandas
  15. seaborn
  16. streamlit-webrtc
  17. IPython

3、代码

代码不分前后端

Fire_Detection.py

  1. import streamlit as st
  2. import cv2
  3. import numpy as np
  4. import av
  5. import torch
  6. import tempfile
  7. from PIL import Image
  8. @st.cache
  9. def load_model():
  10. model = torch.hub.load('ultralytics/yolov5','custom',path="weights/last.pt",force_reload=True)
  11. return model
  12. demo_img = "fire.9.png"
  13. demo_video = "Fire_Video.mp4"
  14. st.title('Fire Detection')
  15. st.sidebar.title('App Mode')
  16. app_mode = st.sidebar.selectbox('Choose the App Mode',
  17. ['About App','Run on Image','Run on Video','Run on WebCam'])
  18. if app_mode == 'About App':
  19. st.subheader("About")
  20. st.markdown("<h5>This is the Fire Detection App created with custom trained models using YoloV5</h5>",unsafe_allow_html=True)
  21. st.markdown("- <h5>Select the App Mode in the SideBar</h5>",unsafe_allow_html=True)
  22. st.image("Images/first_1.png")
  23. st.markdown("- <h5>Upload the Image and Detect the Fires in Images</h5>",unsafe_allow_html=True)
  24. st.image("Images/second_2.png")
  25. st.markdown("- <h5>Upload the Video and Detect the fires in Videos</h5>",unsafe_allow_html=True)
  26. st.image("Images/third_3.png")
  27. st.markdown("- <h5>Live Detection</h5>",unsafe_allow_html=True)
  28. st.image("Images/fourth_4.png")
  29. st.markdown("- <h5>Click Start to start the camera</h5>",unsafe_allow_html=True)
  30. st.markdown("- <h5>Click Stop to stop the camera</h5>",unsafe_allow_html=True)
  31. st.markdown("""
  32. ## Features
  33. - Detect on Image
  34. - Detect on Videos
  35. - Live Detection
  36. ## Tech Stack
  37. - Python
  38. - PyTorch
  39. - Python CV
  40. - Streamlit
  41. - YoloV5
  42. ##
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/83225
    推荐阅读
    相关标签