国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 10

這篇具有很好參考價值的文章主要介紹了【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 10。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

歡迎關注『OpenCV DNN @ Youcans』系列,持續(xù)更新中


本系列從零開始,詳細講解使用 Flask 框架構(gòu)建 OpenCV DNN 模型的 Web 應用程序。

在上節(jié)的基礎上,本節(jié)介紹使用OpenCV DNN對實時視頻進行目標檢測。DNN目標檢測的基本步驟也是加載圖像、模型設置和模型推理。


3.10 OpenCV DNN+Flask實時監(jiān)控目標檢測

在上節(jié)的基礎上,本節(jié)介紹使用OpenCV DNN對實時視頻進行目標檢測。DNN目標檢測的基本步驟也是加載圖像、模型設置和模型推理。

我們使用TensorFlow深度學習框架在MS COCO數(shù)據(jù)集上訓練的MobileNet SSD(單次檢測器)模型。與其他目標檢測模型相比,SSD 模型通常更快。此外,MobileNet 主干網(wǎng)還降低了計算密集度。因此,對于使用OpenCV DNN進行目標檢測,MobileNet是一個很好的模型。

MS COCO數(shù)據(jù)集(https://cocodataset.org/)是當前基于深度學習的對象檢測模型的基準數(shù)據(jù)集。MS COCO包括80類日常物品,從人到汽車,再到牙刷??梢允褂梦谋疚募虞d MS COCO 數(shù)據(jù)集中的所有標簽。


1、加載MobileNet SSD模型

在VideoStream類初始化程序中,使用readNet()函數(shù)加載MobileNet SSD模型。model為預訓練權(quán)重文件的路徑,即凍結(jié)計算圖(frozen graph)的路徑。Config為模型配置文件的路徑,即protobuf文本文件的路徑。Framework為加載模型的框架名稱,本例中是TensorFlow。

# 加載 DNN 模型:MobileNet SSD 模型
model = cv2.dnn.readNet(model='./models/frozen_inference_graph.pb',
          config='./models/ssd_mobilenet_v2_coco.pbtxt',
          framework='TensorFlow')

2、導入分類名稱文件

然后導入讀取分類名稱文件object_detection_classes_coco.txt,該文件將每個類別名稱存儲在列表class_names中,用新行分隔每個類別。例如:

[‘person’, ‘bicycle’, ‘car’, ‘motorcycle’, ‘a(chǎn)irplane’, ‘bus’, ‘train’, ‘truck’, ‘boat’, ‘traffic light’, … ‘book’, ‘clock’, ‘vase’, ‘scissors’, ‘teddy bear’, ‘hair drier’, ‘toothbrush’, ‘’]

為每個類別隨機設置不同顏色COLORS,用于使用指定顏色為每個類別繪制邊界框,以便在圖像中通過邊界框的顏色來區(qū)分不同類別。元組COLORS包括3個整數(shù)值,表示顏色分量。

# 讀取 COCO 類別名稱
with open('object_detection_classes_coco.txt', 'r') as f:
   class_names = f.read().split('\n')
  
# 為每個類別隨機設置不同的顏色
COLORS = np.random.uniform(0, 255, size=(len(class_names), 3))

3、處理視頻幀進行目標檢測

本例程在主線程中處理視頻幀進行目標檢測,使用一個線程update_frame()實時獲取新的視頻幀。

在主線程中的生成器函數(shù)gen_frames()逐幀獲取圖片,使用MobileNet SSD(單次檢測器)模型進行目標檢測,將圖像編碼后返回給客戶端??蛻舳藶g覽器收到視頻流以后,在img標簽定義的圖片中逐幀顯示,從而實現(xiàn)視頻播放。

生成器函數(shù)gen_frames() 處理視頻幀進行目標檢測的步驟如下:
(1)由視頻幀 frame 創(chuàng)建blob對象;
(2)使用MobileNet SSD模型,進行目標檢測;
(3)對檢測到的目標進行篩選,確定目標類別和邊界框;
(4)在視頻幀上繪制邊界框,并標注類別名稱;
(5)將圖像編碼后返回給客戶端。

例程如下。

# 創(chuàng)建 blob
blob = cv2.dnn.blobFromImage(image=image, size=(300, 300), mean=(104, 117, 123), swapRB=True)

# 基于 DNN 模型的目標檢測
start = time.time()
self.model.setInput(blob)  # 模型輸入圖像
output = self.model.forward()  # 模型前向推理
end = time.time()
fps = 1 / (end - start)  # 計算幀處理速率 FPS

# 目標檢測結(jié)果的后處理
for detection in output[0, 0, :, :]:
    # 提取檢測的置信度
    confidence = detection[2]
    # 當置信度高于閾值時才繪制邊界框
    if confidence > 0.5:
        class_id = detection[1]  # 獲取類別的id
        if class_id >= 90:  class_id = 89  # 防止類別id超出范圍
        class_name = self.class_names[int(class_id) - 1]  # 將id映射為類別標簽
        color = self.COLORS[int(class_id)]  # 該類別的顏色設置
        # color = (0, 255, 0)
        # 獲取矩形邊界框的參數(shù) (x, y, w, h)
        x_box = int(detection[3] * w_img)
        y_box = int(detection[4] * h_img)
        w_box = int(detection[5] * w_img)
        h_box = int(detection[6] * h_img)
        # 在圖像上繪制檢測目標的矩形邊界框
        cv2.rectangle(image, (x_box, y_box), (w_box, h_box), color, thickness=2)
        # 在圖像上添加類別名稱
        cv2.putText(image, class_name, (x_box, y_box - 5), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2)
        # 在圖像上添加 FPS 文本
        # cv2.putText(image, f"{fps:.2f} FPS", (20, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

4、新建一個Flask項目

新建一個Flask項目cvFlask10,本項目的框架與cvFlask09相同。
cvFlask10項目的文件樹如下。

---文件名\
    |---models\
    |    |--- object_detection_classes_coco.txt
    |    |--- ssd_mobilenet_v2_coco.pbtxt
    |    |--- ssd_mobilenet_v2_coco_frozen.pb
    |---templates\
    |    |---index4.html
    |    |---index5.html
|--- cvFlask10.py
|--- vedio_01.mp4

5、Python 程序文件

任務邏輯由Python程序文件cvFlask10.py實現(xiàn),完整代碼如下。

# cvFlask10.py
# OpenCV+Flask 圖像處理例程 10
# OpenCV+Flask+threading+MobileNet SSD
# OpenCV 實時讀取攝像頭,MobileNetSSD 模型目標檢測,瀏覽器實時播放監(jiān)控視頻
# Copyright 2023 Youcans, XUPT
# Crated:2023-5-18

# coding:utf-8

from flask import Flask, Response, request, render_template
import threading
import time
import numpy as np
import cv2

app = Flask(__name__)  # 實例化 Flask 對象

# 定義視頻流類
class VideoStream:
    def __init__(self, source):  # 傳入視頻源
        # 創(chuàng)建視頻捕獲對象,調(diào)用筆記本攝像頭
        # cam = cv2.VideoCapture(0, cv2.CAP_DSHOW)  # 修改 API 設置為視頻輸入 DirectShow
        self.video_cap = cv2.VideoCapture(0)  # 創(chuàng)建視頻讀取對象
        self.success, self.frame = self.video_cap.read()  # 讀取視頻幀
        threading.Thread(target=self.update_frame, args=()).start()

        # 加載 DNN 模型:MobileNet SSD V2 模型
        self.model = cv2.dnn.readNet(model="./models/ssd_mobilenet_v2_coco_frozen.pb",
                                config="./models/ssd_mobilenet_v2_coco.pbtxt",
                                framework='TensorFlow')
        # 讀取 COCO 類別名稱文件
        with open("./models/object_detection_classes_coco.txt", 'r') as f:
            self.class_names = f.read().split('\n')
        # 為每個類別隨機設置不同的顏色
        self.COLORS = np.random.uniform(0, 255, size=(len(self.class_names), 3))

    def __del__(self):
        self.video_cap.release()  # 釋放視頻流

    def update_frame(self):
        while True:
            self.success, self.frame = self.video_cap.read()

    def get_frame(self):
        image = self.frame
        h_img, w_img, _ = image.shape

        # 創(chuàng)建 blob
        blob = cv2.dnn.blobFromImage(image=image, size=(300, 300), mean=(104, 117, 123), swapRB=True)

        # 基于 DNN 模型的目標檢測
        start = time.time()
        self.model.setInput(blob)  # 模型輸入圖像
        output = self.model.forward()  # 模型前向推理
        end = time.time()
        fps = 1 / (end - start)  # 計算幀處理速率 FPS

        # 目標檢測結(jié)果的后處理
        for detection in output[0, 0, :, :]:
            # 提取檢測的置信度
            confidence = detection[2]
            # 當置信度高于閾值時才繪制邊界框
            if confidence > 0.5:
                class_id = detection[1]  # 獲取類別的id
                if class_id >= 90:  class_id = 89  # 防止類別id超出范圍
                class_name = self.class_names[int(class_id)-1]  # 將id映射為類別標簽
                color = self.COLORS[int(class_id)]  # 該類別的顏色設置
                # color = (0, 255, 0)
                # 獲取矩形邊界框的參數(shù) (x, y, w, h)
                x_box = int(detection[3] * w_img)
                y_box = int(detection[4] * h_img)
                w_box = int(detection[5] * w_img)
                h_box = int(detection[6] * h_img)
                # 在圖像上繪制檢測目標的矩形邊界框
                cv2.rectangle(image, (x_box,y_box), (w_box,h_box), color, thickness=2)
                # 在圖像上添加類別名稱
                cv2.putText(image, class_name, (x_box,y_box-5), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2)
                # 在圖像上添加 FPS 文本
                # cv2.putText(image, f"{fps:.2f} FPS", (20, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

        ret, buffer = cv2.imencode('.jpg', image)  # 編碼為 jpg 格式
        frame_byte = buffer.tobytes()  # 轉(zhuǎn)換為 bytes 類型
        return frame_byte

# 生成視頻流的幀
def gen_frames(video_source):
    video_stream = VideoStream(video_source)  # 從視頻文件獲取視頻流
    while True:
        frame = video_stream.get_frame()  # 獲取視頻幀
        if frame is None:
            # video_stream.__del__()  # 釋放視頻流
            break
        yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n'
               + frame + b'\r\n')  # 生成視頻流的幀


@app.route('/video_feed')
def video_feed():
    video_source = request.args.get('video_source', 'camera')  # 從網(wǎng)頁獲取視頻源

    # 通過將一幀幀的圖像返回,就達到了看視頻的目的。multipart/x-mixed-replace是單次的http請求-響應模式,如果網(wǎng)絡中斷,會導致視頻流異常終止,必須重新連接才能恢復
    return Response(gen_frames(video_source), mimetype='multipart/x-mixed-replace; boundary=frame')

@app.route('/')
def index_camera():  # 實時視頻監(jiān)控
    # <img src="{{ url_for('video_feed', video_source='camera') }}">
    return render_template('index4.html')

@app.route('/vidfile')
def index_vidfile():  # 播放視頻文件
    # <img src="{{ url_for('video_feed', video_source='vedio_01.mp4') }}">
    return render_template('index5.html')

if __name__ == '__main__':
    # 啟動一個本地開發(fā)服務器,激活該網(wǎng)頁
    print("URL: http://127.0.0.1:5000")
    app.run(host='0.0.0.0', port=5000, debug=True, threaded=True)  # 綁定 IP 地址和端口號



6、視頻流的網(wǎng)頁模板

視頻流的網(wǎng)頁模板index4.html和index5.html位于templates文件夾,內(nèi)容與cvFlask09項目完全相同。

網(wǎng)頁index4.html位于templates文件夾,具體內(nèi)容如下。

<!DOCTYPE html>
<html>
  <head>
    <title>Video Streaming Demonstration</title>
  </head>
  <body>
    <h2  align="center">OpenCV+Flask 例程:實時視頻監(jiān)控</h2>
    <div style="text-align:center; padding-top:inherit">
      <img src="{{ url_for('video_feed', video_source='camera') }}" width="600"; height="360">
    </div>
  </body>
</html>

網(wǎng)頁index5.html位于templates文件夾,具體內(nèi)容如下。

<!DOCTYPE html>
<html>
  <head>
    <title>Video Streaming Demonstration</title>
  </head>
  <body>
    <h2  align="center">OpenCV+Flask 例程:播放視頻文件</h2>
    <div style="text-align:center; padding-top:inherit">
      <img src="{{ url_for('video_feed', video_source='vedio_01.mp4') }}" width="600"; height="360">
    </div>
  </body>
</html>

7、Flask 視頻監(jiān)控目標檢測程序運行

進入cvFlask10項目的根目錄,運行程序cvFlask10.py,啟動流媒體服務器。

在局域網(wǎng)內(nèi)設備(包括移動手機)的瀏覽器打開http://192.168.3.249:5000就可以播放實時視頻監(jiān)控畫面。

【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 10

進一步地,我們添加兩個控制按鈕“Start”和“Stop”,用來控制開始和停止播放視頻流。
在 Flask 應用中添加控制按鈕需要修改前端和后端代碼。前端需要添加按鈕以及發(fā)送請求的 JavaScript 代碼,后端則需要添加處理這些請求的路由。
我們在前端添加 “start” 和 “stop” 按鈕,這兩個按鈕在被點擊時會發(fā)送請求到 “/start” 和 “/stop” 路由。


【本節(jié)完】


版權(quán)聲明:
歡迎關注『OpenCV DNN @ Youcans』系列
youcans@xupt 原創(chuàng)作品,轉(zhuǎn)載必須標注原文鏈接:
【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 10
(https://blog.csdn.net/youcans/article/details/131365824)
Copyright 2023 youcans, XUPT
Crated:2023-06-24文章來源地址http://www.zghlxwxcb.cn/news/detail-499154.html


到了這里,關于【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 10的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 02

    【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 02

    歡迎關注『OpenCV DNN @ Youcans』系列,持續(xù)更新中 【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 01 【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 02 本系列從零開始,詳細講解使用 Flask 框架構(gòu)建 OpenCV DNN 模型的 Web 應用程序。 本節(jié)介紹使用OpenCV+Flask將計算機視覺應用程序部署到Web端。 我們

    2024年02月11日
    瀏覽(20)
  • 【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 08

    【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 08

    歡迎關注『OpenCV DNN @ Youcans』系列,持續(xù)更新中 本系列從零開始,詳細講解使用 Flask 框架構(gòu)建 OpenCV DNN 模型的 Web 應用程序。 上節(jié)介紹使用Flask框架構(gòu)建一個視頻流服務器,通過OpenCV捕獲攝像頭的實時畫面,使用人臉檢測級聯(lián)分類器進行人臉識別,并在視頻圖像中標記檢測到

    2024年02月09日
    瀏覽(40)
  • 【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 07

    【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 07

    歡迎關注『OpenCV DNN @ Youcans』系列,持續(xù)更新中 本系列從零開始,詳細講解使用 Flask 框架構(gòu)建 OpenCV DNN 模型的 Web 應用程序。 本節(jié)介紹使用Flask框架構(gòu)建一個視頻流服務器,通過OpenCV捕獲攝像頭的實時畫面,使用人臉檢測級聯(lián)分類器進行人臉識別,并在視頻圖像中標記檢測到

    2024年02月13日
    瀏覽(42)
  • 【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 01

    【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 01

    歡迎關注『OpenCV DNN @ Youcans』系列,持續(xù)更新中 【OpenCV DNN】Flask 視頻監(jiān)控目標檢測教程 01 本系列從零開始,詳細講解使用 Flask 框架構(gòu)建 OpenCV DNN 模型的 Web 應用程序。 將OpenCV DNN模型部署到Web端,不需要安裝任何依賴,只需要訪問Web地址就可以訪問和運行應用程序。 面向P

    2024年02月07日
    瀏覽(30)
  • 基于視頻技術與AI檢測算法的體育場館遠程視頻智能化監(jiān)控方案

    基于視頻技術與AI檢測算法的體育場館遠程視頻智能化監(jiān)控方案

    一、方案背景 近年來,隨著居民體育運動意識的增強,體育場館成為居民體育鍛煉的重要場所。但使用場館內(nèi)的器材時,可能發(fā)生受傷意外,甚至牽扯責任賠償糾紛問題。同時,物品丟失、人力巡邏成本問題突出,體育場館在給居民提供運動場地的同時,還需特別關注場館內(nèi)

    2024年02月07日
    瀏覽(19)
  • opencv系列(1)--使用opencv和Qt6做一個視頻監(jiān)控器人臉識別

    這個程序是自己的下班之后,看看那個壞東西想來偷看我的電腦。我就隨手做的一個程序。 1.能都顯示攝像頭的內(nèi)容。 2.如果有人進入攝像頭。 3.利用opencv的模型識別人臉,識別到了就保存到自己的電腦里面。 4.并把他的照片顯示到界面上一段時間,告訴他,偷窺有罪。 5.程

    2024年02月11日
    瀏覽(22)
  • 安防監(jiān)控視頻AI智能分析網(wǎng)關V4離崗檢測算法配置步驟來啦

    安防監(jiān)控視頻AI智能分析網(wǎng)關V4離崗檢測算法配置步驟來啦

    我們的AI邊緣計算網(wǎng)關硬件 —— 智能分析網(wǎng)關目前有5個版本:V1、V2、V3、V4、V5,每個版本都能實現(xiàn)對監(jiān)控視頻的智能識別和分析,支持抓拍、記錄、告警等,每個版本在算法模型及性能配置上略有不同。硬件可實現(xiàn)的 AI 檢測包括:人臉結(jié)構(gòu)化數(shù)據(jù)、車輛結(jié)構(gòu)化數(shù)據(jù)、場景檢

    2024年02月07日
    瀏覽(17)
  • opencv dnn模塊 示例(19) 目標檢測 object_detection 之 yolox

    opencv dnn模塊 示例(19) 目標檢測 object_detection 之 yolox

    YOLOX是曠視科技在2021年發(fā)表,對標YOLO v5。YOLOX中引入了當年的黑科技主要有三點,decoupled head、anchor-free以及advanced label assigning strategy(SimOTA)。YOLOX的性能如何呢,可以參考原論文圖一如下圖所示。YOLOX比當年的YOLO v5略好一點,并且利用YOLOX獲得當年的Streaming Perception Challenge第一

    2024年02月06日
    瀏覽(21)
  • 樹莓派利用python-opencv使用CSI攝像頭調(diào)用監(jiān)控視頻

    樹莓派利用python-opencv使用CSI攝像頭調(diào)用監(jiān)控視頻

    目錄 一、安裝python-opencv。 二、使用工具Xshell7和MobaXterm 三、連接并打開CSI攝像頭 3.1連線如圖所示: 3.2打開攝像頭 四、編寫攝像頭代碼調(diào)用攝像頭 ? ? ? ? 一定要選擇配置好的安裝python-opencv,不要去配置安裝,然后還cmake編譯,沒有必要基本上安裝過程都會報2-3個錯誤,還

    2023年04月17日
    瀏覽(29)
  • 【教程】視頻匯聚/視頻監(jiān)控管理平臺EasyCVR錄像存儲功能如何優(yōu)化?具體步驟是什么?

    【教程】視頻匯聚/視頻監(jiān)控管理平臺EasyCVR錄像存儲功能如何優(yōu)化?具體步驟是什么?

    視頻云存儲/安防監(jiān)控EasyCVR視頻匯聚平臺基于云邊端智能協(xié)同,支持海量視頻的輕量化接入與匯聚、轉(zhuǎn)碼與處理、全網(wǎng)智能分發(fā)、視頻集中存儲等。視頻監(jiān)控系統(tǒng)EasyCVR拓展性強,視頻能力豐富,具體可實現(xiàn)視頻監(jiān)控直播、視頻輪播、視頻錄像、云存儲、回放與檢索、智能告警

    2024年02月07日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包