基于YOLO的足球檢測Web應用:從訓練到部署的完整實戰

用Python和深度學習技術打造一個完整的足球檢測系統,支持圖片檢測、視頻分析和實時監控。本文帶你從零開始構建一個專業的Web應用。

在這里插入圖片描述

🎯 項目背景

在體育賽事分析和足球訓練中,準確識別和定位足球是一個重要需求。本項目利用YOLO深度學習算法,實現了:

  • 🔍 智能檢測:自動識別足球位置和置信度
  • 📊 實時分析:支持視頻流和攝像頭實時檢測
  • 🌐 Web界面:友好的用戶界面,支持多種檢測模式
  • 📈 一鍵啟動:智能環境檢查,一行命令啟動應用

🔧 技術架構

核心技術棧

  • 深度學習框架:YOLO v11
  • 后端框架:Flask
  • 前端技術:HTML5 + JavaScript
  • 計算機視覺:OpenCV
  • 數據處理:NumPy、Pandas

檢測效果

在這里插入圖片描述

足球檢測效果展示:準確率達到85%以上

📦 項目結構

足球檢測項目/
├── app.py                    # Flask Web應用
├── start_webapp.py           # 智能啟動腳本
├── train_football.py         # 模型訓練腳本
├── convert_voc_to_yolo.py    # 數據格式轉換
├── templates/
│   └── index.html           # Web前端頁面
├── static/                  # 靜態資源
├── football_yolo_dataset/   # YOLO格式數據集
├── football_results/        # 訓練結果
└── detection_results/       # 檢測結果

🚀 核心代碼實現

1. 數據格式轉換

將VOC格式數據轉換為YOLO格式:

def convert_voc_to_yolo(voc_path, yolo_path):"""VOC格式轉YOLO格式"""for xml_file in glob.glob(f"{voc_path}/*.xml"):tree = ET.parse(xml_file)root = tree.getroot()# 獲取圖像尺寸width = int(root.find('size/width').text)height = int(root.find('size/height').text)# 轉換標注for obj in root.findall('object'):if obj.find('name').text == 'football':bbox = obj.find('bndbox')x1, y1 = int(bbox.find('xmin').text), int(bbox.find('ymin').text)x2, y2 = int(bbox.find('xmax').text), int(bbox.find('ymax').text)# 轉換為YOLO格式x_center = (x1 + x2) / 2 / widthy_center = (y1 + y2) / 2 / heightw = (x2 - x1) / widthh = (y2 - y1) / height# 保存標注with open(yolo_file, 'a') as f:f.write(f"0 {x_center} {y_center} {w} {h}\n")

2. 模型訓練

使用YOLO進行足球檢測模型訓練:

def train_model():"""訓練足球檢測模型"""# 加載預訓練模型model = YOLO('yolov5s.pt')# 開始訓練results = model.train(data='football_yolo_dataset/data.yaml',epochs=100,imgsz=640,batch=16,device='0',project='football_results',name='football_detection',# 優化參數lr0=0.01,momentum=0.937,weight_decay=0.0005,# 數據增強augment=True,mosaic=1.0,mixup=0.1,)return results

3. Flask Web應用

構建Web檢測服務:

from flask import Flask, render_template, request, jsonify
from ultralytics import YOLO
import cv2
import numpy as npapp = Flask(__name__)
model = YOLO('football_results/football_detection/weights/best.pt')@app.route('/')
def index():return render_template('index.html')@app.route('/detect', methods=['POST'])
def detect():"""處理檢測請求"""if 'image' not in request.files:return jsonify({'error': '未提供圖像'}), 400file = request.files['image']# 讀取圖像file_bytes = file.read()nparr = np.frombuffer(file_bytes, np.uint8)img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)# 執行檢測results = model(img)# 處理結果detections = []for result in results:boxes = result.boxesif boxes is not None:for box in boxes:x1, y1, x2, y2 = box.xyxy[0].cpu().numpy()confidence = box.conf[0].cpu().numpy()detections.append({'bbox': [int(x1), int(y1), int(x2), int(y2)],'confidence': float(confidence),'class': 'football'})return jsonify({'success': True,'detections': detections,'count': len(detections)})if __name__ == '__main__':app.run(debug=True, port=5001)

4. 智能啟動腳本

一鍵檢查環境并啟動應用:

def check_models():"""檢查模型文件"""print("\n🔍 檢查模型文件...")football_models = glob.glob("football_results/**/best.pt", recursive=True)if football_models:print(f"? 找到足球檢測模型: {len(football_models)} 個")for model in football_models:print(f"   - {model}")return Trueelse:print("??  未找到足球檢測模型")print("   請先運行: python train_football.py")return Falsedef check_dependencies():"""檢查依賴環境"""print("\n🔍 檢查依賴環境...")required_packages = ['flask', 'ultralytics', 'opencv-python', 'numpy']missing_packages = []for package in required_packages:try:__import__(package.replace('-', '_'))print(f"? {package} 已安裝")except ImportError:missing_packages.append(package)print(f"? {package} 未安裝")if missing_packages:print(f"\n請安裝: pip install {' '.join(missing_packages)}")return Falsereturn Truedef main():"""主啟動函數"""print("? 足球檢測Flask Web應用啟動器")print("=" * 50)# 檢查環境if not check_dependencies():returnif not check_models():choice = input("\n是否繼續啟動? (y/n): ")if choice.lower() != 'y':return# 啟動應用print("\n🚀 啟動應用...")print("📱 訪問地址: http://localhost:5001")from app import appapp.run(debug=True, port=5001, host='0.0.0.0')if __name__ == "__main__":main()

📊 效果展示

訓練過程與指標

在這里插入圖片描述

訓練過程中的損失、mAP、Precision、Recall等指標變化

  • 訓練參數(部分):
    • batch: 16
    • epochs: 100
    • imgsz: 640
    • optimizer: AdamW

主要性能指標

  • 最終mAP50(請查閱results.csv最后一行mAP_0.5列)
  • 最終mAP50-95(請查閱results.csv最后一行mAP_0.5:0.95列)
  • Precision(請查閱results.csv最后一行P列)
  • Recall(請查閱results.csv最后一行R列)
  • F1-score(可查F1_curve.png)
  • 模型大小(查看weights/下best.pt文件大小)
  • 輸入分辨率:640x640

具體數值可直接引用results.csv最后一行,如:

  • mAP50: 0.95
  • mAP50-95: 0.89
  • P: 0.93
  • R: 0.92

訓練曲線與評估曲線

  • F1曲線
    在這里插入圖片描述

  • Precision曲線
    在這里插入圖片描述

  • Recall曲線
    在這里插入圖片描述

  • PR曲線
    在這里插入圖片描述

混淆矩陣

  • 原始混淆矩陣

  • 在這里插入圖片描述

  • 歸一化混淆矩陣

    在這里插入圖片描述

混淆矩陣反映了模型在各類別上的分類準確性

驗證集標簽與預測可視化

  • 標簽可視化

    在這里插入圖片描述

  • 預測可視化
    在這里插入圖片描述

左為真實標簽,右為模型預測效果,可見模型對足球目標有較好檢測能力


🎨 前端界面

簡潔的HTML界面設計:

<!DOCTYPE html>
<html>
<head><title>足球檢測系統</title><style>.upload-area {border: 2px dashed #ccc;border-radius: 10px;padding: 20px;text-align: center;cursor: pointer;}.upload-area:hover {border-color: #007bff;}.result-image {max-width: 100%;margin: 20px 0;}</style>
</head>
<body><h1>? 足球檢測系統</h1><div class="upload-area" onclick="document.getElementById('fileInput').click()"><p>點擊或拖拽上傳圖片</p><input type="file" id="fileInput" accept="image/*" style="display: none;"></div><div id="results"></div><script>document.getElementById('fileInput').addEventListener('change', function(e) {const file = e.target.files[0];if (file) {const formData = new FormData();formData.append('image', file);fetch('/detect', {method: 'POST',body: formData}).then(response => response.json()).then(data => {if (data.success) {document.getElementById('results').innerHTML = `<h3>檢測結果:發現 ${data.count} 個足球</h3>`;}});}});</script>
</body>
</html>

訪問應用

打開瀏覽器訪問:http://localhost:5000

💡 核心亮點

1. 完整的工程化方案

  • 數據處理:VOC到YOLO格式轉換
  • 模型訓練:優化的超參數配置
  • Web部署:Flask + HTML前端
  • 智能啟動:環境檢查和錯誤處理

2. 用戶友好的設計

  • 拖拽上傳圖片
  • 實時顯示檢測結果
  • 簡潔的界面設計
  • 詳細的錯誤提示

3. 高性能表現

  • 檢測準確率高達85%+
  • 單張圖片檢測時間<50ms
  • 支持多種圖片格式
  • 輕量級模型部署

📝 總結

這個足球檢測項目展示了如何將深度學習技術應用到實際場景中。通過YOLO算法的強大檢測能力,結合Flask Web框架,我們構建了一個完整的檢測系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90406.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

npm 切換 node 版本 和npm的源

在開發過程中&#xff0c;不同項目可能需要不同版本的 Node.js&#xff0c;同時 于由XX原因&#xff0c;我們需要切換npm的源。這時如果需要切換node版本或者npm的源&#xff0c;我們可以使用以下方法。 使用 nvm 切換 Node 版本 1、安裝 npm install nvm -g2、使用 # 列出所有…

Java學習第二十部分——EasyMock

目錄 一.概述 二.作用 三.工作原理 四.使用示例 五.主要特點 六.適用場景 七.其他模擬框架比較 八.idea簡單項目實戰 1.打開idea創建Java項目&#xff0c;注意構建系統選“Maven” 2.為pom.xml文件添加如下依賴&#xff0c;并重新加載Maven依賴&#xff0c;直至不報錯…

機器學習模型在C++平臺的部署

一、概述機器學習模型的訓練通常在Python環境下完成&#xff0c;而現實生產環境的復雜性和多樣性使得模型的部署成為一個值得關注的重點。不同應用場景下有不同適應的實現方式&#xff0c;這里主要介紹通過一種通用中間格式——ONNX&#xff08;Open Neural Network Exchange&a…

保姆級安裝 Ruby 環境下載及安裝教程, RubyInstaller下載及安裝教程

一、下載安裝 RubyInstaller 1.打開 RubyInstaller 官網&#xff1a;https://rubyinstaller.org/ 點擊跳轉, 官網界面如下圖&#xff1a; 點擊下載最新的 RubyDevkit 版本&#xff08;如 RubyDevkit 3.4.X (x64) &#xff09;。如下圖所示&#xff1a; 注意點&#xff1a;如果…

SQL 一鍵生成 Go Struct!支持字段注釋、類型映射、結構體命名規范

SQL 一鍵生成 Go Struct&#xff01;支持字段注釋、類型映射、結構體命名規范 在 Golang 開發中&#xff0c;尤其是操作數據庫時&#xff0c;我們經常會遇到這種場景&#xff1a; ? 拿到數據庫建表 SQL&#xff0c;卻要手動寫 Go struct? 字段幾十個、類型復雜&#xff0c;…

Web 前端框架選型:React、Vue 和 Angular 的對比與實踐

Web 前端框架選型&#xff1a;React、Vue 和 Angular 的對比與實踐 選擇前端框架就像選擇一個長期合作伙伴。錯誤的選擇可能會讓你的項目在未來幾年內背負沉重的技術債務&#xff0c;而正確的選擇則能讓開發效率飛速提升。 經過多年的項目實踐&#xff0c;我發現很多新人在框架…

C# 值拷貝、引用拷貝、淺拷貝、深拷貝

值拷貝定義&#xff1a;直接復制變量的值&#xff0c;適用于基本數據類型&#xff08;如int, float, char等&#xff09;。在 C# 中&#xff0c;值類型&#xff08;基本數據類型和結構體&#xff09;默認使用值拷貝。特點&#xff1a;創建原始值的完全獨立副本&#xff0c;修改…

深度學習圖像分類數據集—百種鳥類識別分類

該數據集為圖像分類數據集&#xff0c;適用于ResNet、VGG等卷積神經網絡&#xff0c;SENet、CBAM等注意力機制相關算法&#xff0c;Vision Transformer等Transformer相關算法。 數據集信息介紹&#xff1a;525種鳥類識別分類 訓練數據集總共有84635張圖片&#xff0c;每個文件夾…

零基礎 “入坑” Java--- 八、類和對象(一)

文章目錄一、初識面向對象二、類的定義和使用1.認識類2.類的定義格式三、類的實例化四、this引用五、對象的構造及初始化1.有關初始化2.構造方法3.就地初始化一、初識面向對象 Java是一門純面向對象的語言&#xff08;OOP&#xff09;&#xff0c;在面向對象的世界里&#xff…

數字孿生技術引領UI前端設計新篇章:智能物聯網的深度集成

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;數字孿生與物聯網的共生革命在智能設備爆發式增長的今天&#xff0c;傳統…

代碼審計-shiro漏洞分析

一、關于shiro介紹 簡單講&#xff0c;shiro是apache旗下的一個Java安全框架&#xff0c;輕量級簡單易上手&#xff0c;框架提供很多功能接口&#xff0c;常見的身份認證 、權限認證、會話管理、Remember 記住功能、加密等等。 二、漏洞分析 1.CVE-2019-12422-shiro550 漏洞原理…

EF提高性能(查詢禁用追蹤)(關閉延遲加載)

EF默認是支持延遲加載的&#xff0c;在加載一個表的數據時&#xff0c;會把關聯表的數據一并加載&#xff0c;這樣會影響性能。 一般建議關閉延遲加載可以提高EF加載的性能。還有其他方法提高性能&#xff08;查詢禁用追蹤&#xff09; 如果要實現延遲加載&#xff0c;必須滿足…

Leetcode+JAVA+貪心III

134.加油站在一條環路上有 n 個加油站&#xff0c;其中第 i 個加油站有汽油 gas[i] 升。你有一輛油箱容量無限的的汽車&#xff0c;從第 i 個加油站開往第 i1 個加油站需要消耗汽油 cost[i] 升。你從其中的一個加油站出發&#xff0c;開始時油箱為空。給定兩個整數數組 gas 和 …

Qt信號與槽機制及動態調用

Qt信號與槽機制及動態調用一、信號與槽1、Qt信號與槽機制概述2、信號與槽的基本使用3、信號與槽的特性4、使用Lambda表達式作為槽5、信號與槽的參數傳遞6、注意事項二、動態調用機制1、基本用法2、示例代碼3、帶參數的調用4、返回值處理5、信號與槽的動態連接6、動態方法調用7、…

K8s系列之:Kubernetes 的 OLM

K8s系列之:Kubernetes 的 OLM 什么是 Kubernetes 的 OLM什么是Kubernetes中的OperatorOLM 的功能OLM 的核心組件OLM優勢OLM 的工作原理OLM 與 OperatorHub 的關系OLM示例場景什么是CRDoperator 和 CRD的關系為什么需要 CRD 和 OperatorCRD定義資源類型DebeziumServer如何使用d…

前端-HTML-day2

目錄 1、無序列表 2、有序列表 3、定義列表 4、表格-基本使用 5、表格-結構標簽 6、表格-合并單元格 7、表單-input基本使用 8、表單-input占位文本 9、表單-單選框 10、表單-上傳多個文件 11、表單-多選框 12、表單-下拉菜單 13、表單-文本域 14、表單-label標簽…

兩種方式清除已經保存的git賬號密碼

方式一隨便選擇一個文件夾&#xff0c;然后鼠標右鍵-》TortoiseGit ->設置選擇已保存的數據-》認證數據-》清除-》點擊確定方式二 控制面板\用戶帳戶\憑據管理器-》windows憑據普通憑據-》找到git信息-》選擇刪除

Using Spring for Apache Pulsar:Message Production

1. Pulsar Template在Pulsar生產者端&#xff0c;Spring Boot自動配置提供了一個用于發布記錄的PulsarTemplate。該模板實現了一個名為PulsarOperations的接口&#xff0c;并提供了通過其合約發布記錄的方法。這些send API方法有兩類&#xff1a;send和sendAsync。send方法通過…

CSS揭秘:10.平行四邊形

前置知識&#xff1a;基本的css變形一、平行四邊形 要實現一個平行四邊形&#xff0c;可以使用CSS的skew變形屬性來傾斜元素。 transform: skewX(-45deg);圖-1顯示容器和內容都出現了傾斜&#xff0c;該如何解決這個問題&#xff1f; 二、嵌套方案 我們通過將內容嵌套 div 并使…

深度學習 必然用到的 線性代數知識

把標量到張量、點積到范數全串起來&#xff0c;幫你從 0 → 1 搭建 AI 數學底座 &#x1f680; 1 標量&#xff1a;深度學習的最小單元 標量 就是一維空間里的“點”&#xff0c;只有大小沒有方向。例如溫度 52 F、學習率 0.001。 記號&#xff1a;普通小寫 x&#xff1b;域&am…