歡迎關(guān)注『OpenCV DNN @ Youcans』系列,持續(xù)更新中
【OpenCV DNN】Flask 視頻監(jiān)控目標(biāo)檢測(cè)教程 01
本系列從零開(kāi)始,詳細(xì)講解使用 Flask 框架構(gòu)建 OpenCV DNN 模型的 Web 應(yīng)用程序。
將OpenCV DNN模型部署到Web端,不需要安裝任何依賴,只需要訪問(wèn)Web地址就可以訪問(wèn)和運(yùn)行應(yīng)用程序。
面向Python程序的Web框架可以用于部署應(yīng)用程序。Web框架使開(kāi)發(fā)者可以專注于應(yīng)用程序的核心算法和業(yè)務(wù)邏輯,而不必具體處理底層細(xì)節(jié),例如協(xié)議、套接字或進(jìn)程和線程管理。
1. 面向Python程序的Web框架
Web 框架主要用于網(wǎng)站開(kāi)發(fā),為開(kāi)發(fā)者實(shí)現(xiàn)業(yè)務(wù)邏輯提供了一套通用方法,可以實(shí)現(xiàn)數(shù)據(jù)的交互和業(yè)務(wù)功能的完善。
開(kāi)發(fā)者在基于Web框架實(shí)現(xiàn)業(yè)務(wù)邏輯時(shí),可以專注于應(yīng)用程序的核心算法和業(yè)務(wù)邏輯,而不必具體處理底層細(xì)節(jié),例如協(xié)議、套接字或進(jìn)程和線程管理。在進(jìn)行數(shù)據(jù)緩存、數(shù)據(jù)庫(kù)訪問(wèn)、數(shù)據(jù)安全校驗(yàn)等方面,不需要自己重新實(shí)現(xiàn)。
Python的開(kāi)發(fā)速度和靈活性使其可以很容易地快速建立和運(yùn)行網(wǎng)站。,Python在web框架中提供了大量的選擇和自由度。
Django
Django是一個(gè)免費(fèi)的、開(kāi)源的全棧Python Web 開(kāi)發(fā)框架,開(kāi)發(fā)快速、代碼較少、可擴(kuò)展性強(qiáng)。Django 采用 MTV(Model、Template、View)模型組織資源,框架功能豐富,模板擴(kuò)展選擇最多,適合大型網(wǎng)站開(kāi)發(fā)。Django的學(xué)習(xí)曲線相對(duì)陡峭,靈活度較差。
Flask
Flask 是一個(gè)Python 編寫(xiě)的Web微框架,讓我們可以用Python語(yǔ)言快速實(shí)現(xiàn)Web服務(wù)。只提供Web服務(wù)器支持,不提供全棧開(kāi)發(fā)支持。Flask 非常輕量、學(xué)習(xí)簡(jiǎn)單,適合小微原型系統(tǒng)的開(kāi)發(fā)。
Bottle
Bottle 是一個(gè)用于 Python 的快速、簡(jiǎn)單和輕量級(jí)的 WSGI 微型網(wǎng)絡(luò)框架。它作為單個(gè)文件模塊分發(fā),除了 Python 標(biāo)準(zhǔn)庫(kù)之外沒(méi)有任何依賴項(xiàng)。支持干凈和動(dòng)態(tài)的 URL。
Flask 是非全??蚣?,F(xiàn)lask 具有以下依賴項(xiàng):
- Werkzeug WSGI 工具包: WSGI 實(shí)用程序庫(kù)
- Jinja2:模板引擎
Django 和 Flask 均可用于部署開(kāi)發(fā)計(jì)算機(jī)視覺(jué)和深度學(xué)習(xí)應(yīng)用程序,但 Flask 的學(xué)習(xí)曲線更平滑,且 Flask 專注于極簡(jiǎn)主義。
2. Flask 框架的安裝與使用
2.1 Flask 安裝
為了使用 Flask 構(gòu)建計(jì)算機(jī)視覺(jué) Web 應(yīng)用程序,首先進(jìn)行安裝:
$ pip3 install flask
安裝完成后,通過(guò)控制臺(tái)命令cmd或 Anaconda Prompt (miniconda)進(jìn)入命令行進(jìn)行測(cè)試。
$ python
>>> import flask
>>> print(flask.__version__)
2.3.1
2.2 Flask 框架例程
使用Flask框架編寫(xiě)一個(gè)顯示“Hello Flask!”的web程序,介紹如何配置、調(diào)試Flask框架。
(1)新建一個(gè)Flask項(xiàng)目,項(xiàng)目的文件樹(shù)如下。
---項(xiàng)目文件名\
|---static\
|---templates\
|--- server.py
項(xiàng)目默認(rèn)配置建立static和templates目錄,static目錄用來(lái)存放靜態(tài)資源,例如圖片、js、css文件等,templates目錄存放模板文件。網(wǎng)站邏輯保存在Python程序文件server.py中。
# server.py
from flask import Flask # 導(dǎo)入 Flask 包
app = Flask(__name__) # 用當(dāng)前腳本名稱實(shí)例化Flask對(duì)象
@app.route('/') # 將函數(shù)綁定到指定URL
def hello():
return 'Hello Flask!'
if __name__ == '__main__':
app.run() # 啟動(dòng)一個(gè)本地開(kāi)發(fā)服務(wù)器,激活該網(wǎng)頁(yè)
例程首先創(chuàng)建 Flask 類的實(shí)例,作為Web服務(wù)器的網(wǎng)關(guān)接口(Web Server Gateway Interface, WSGI)。然后,route()裝飾器用于指定URL的觸發(fā)函數(shù),將觸發(fā)函數(shù)綁定到指定URL。最后,函數(shù)返回在瀏覽器中顯示的內(nèi)容。
(2)運(yùn)行Python程序。
運(yùn)行程序server.py,在控制臺(tái)顯示如下的消息,表明Web服務(wù)器已啟動(dòng)。
$ python server.py
* Serving Flask app 'server'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000/
(Press CTRL+C to quit)
(3)在瀏覽器中訪問(wèn)http://127.0.0.1:5000/。
這將對(duì)服務(wù)器發(fā)送GET請(qǐng)求,該請(qǐng)求將返回相應(yīng)的消息:
127.0.0.1 - - [26/Apr/2023 21:42:13] “GET / HTTP/1.1” 200 -
127.0.0.1 - - [26/Apr/2023 21:42:13] “GET /favicon.ico HTTP/1.1” 404 -
2.3 綁定IP和端口
雖然flask命令可以啟動(dòng)一個(gè)本地服務(wù)器,但是每次程序修改后都需要手動(dòng)重啟服務(wù)器。將應(yīng)用對(duì)象的debug屬性設(shè)為T(mén)rue,可以啟用Debug模式。
app.run(debug=True)
在Debug模式下,修改應(yīng)用代碼之后服務(wù)器會(huì)自動(dòng)重啟,當(dāng)應(yīng)用出錯(cuò)時(shí)還會(huì)提供一個(gè)調(diào)試器。重新運(yùn)行Python程序,在控制臺(tái)將顯示如下的消息。
* Serving Flask app 'server2'
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 110-148-621
Flask默認(rèn)的綁定IP為127.0.0.1,端口為5000。通過(guò)設(shè)置參數(shù)host可以自定義IP地址,設(shè)置參數(shù)port可以自定義端口。
app.run(host=‘0.0.0.0’)
重新運(yùn)行Python程序,在控制臺(tái)將顯示如下的消息。
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://192.168.3.249:5000
這樣就可以從局域網(wǎng)內(nèi)的其他設(shè)備執(zhí)行請(qǐng)求。例如,從連接局域網(wǎng)的手機(jī)訪問(wèn)IP地址:http://192.168.3.249:5000,將對(duì)服務(wù)器發(fā)送GET請(qǐng)求,并在手機(jī)瀏覽器中顯示網(wǎng)頁(yè)內(nèi)容。
2.4 Flask路由
Web框架使用路由技術(shù)直接訪問(wèn)所需的頁(yè)面,而無(wú)需從主頁(yè)導(dǎo)航。
Flask中使用route()裝飾器將應(yīng)用程序的URL綁定到函數(shù),可以實(shí)現(xiàn)路由訪問(wèn)。例如:@app.route('/hello')
將URL/hello
規(guī)則綁定到hello_world()函數(shù)。
@app.route('/hello')
def hello_world():
return 'hello world'
用戶訪問(wèn) http://localhost:5000/hello,將在瀏覽器中顯示hello_world()函數(shù)的輸出。
application對(duì) 象的add_url_rule()函數(shù)也可用于將URL與函數(shù)綁定,如上例所示,使用route()裝飾器的目的也由以下表示:
def hello_world():
return 'hello world'
app.add_url_rule('/', 'hello', hello_world)
通過(guò)向規(guī)則參數(shù)添加變量部分,可以動(dòng)態(tài)構(gòu)建URL。此變量部分標(biāo)記為<converter:variable_name>
。它作為關(guān)鍵字參數(shù)傳遞給與規(guī)則相關(guān)聯(lián)的函數(shù)。
例如,在下面的例程中,route()裝飾器的規(guī)則參數(shù)包含附加到URL’/hello’的<name>
。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello world!'
@app.route('/user')
def hello_user():
return 'Hello user!'
@app.route('/hello/<name>')
def hello_name(name):
return 'Hello %s!' % name
if __name__ == '__main__':
app.run(host='0.0.0.0')
如果在瀏覽器中輸入http://localhost:5000/hello/youcans作為URL,則’youcans’ 將作為參數(shù)提供給 hello_name()函數(shù)。該請(qǐng)求將返回相應(yīng)的消息:
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:80
* Running on http://192.168.3.249:80
Press CTRL+C to quit
127.0.0.1 - - [27/Apr/2023 09:06:27] "GET /hello/youcans HTTP/1.1" 200 -
127.0.0.1 - - [27/Apr/2023 09:06:27] "GET /favicon.ico HTTP/1.1" 404 -
【本節(jié)完】
下節(jié)內(nèi)容:使用OpenCV+Flask部署Web應(yīng)用程序。
歡迎關(guān)注『OpenCV DNN @ Youcans』系列,持續(xù)更新中
版權(quán)聲明:
youcans@xupt 原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接:
【OpenCV DNN】Flask 視頻監(jiān)控目標(biāo)檢測(cè)教程 01 (https://blog.csdn.net/youcans/article/details/130785571)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-464677.html
Copyright 2023 youcans, XUPT
Crated:2023-05-20
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-464677.html
到了這里,關(guān)于【OpenCV DNN】Flask 視頻監(jiān)控目標(biāo)檢測(cè)教程 01的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!