<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Flask快速搭建輕量級(jí)圖像識(shí)別服務(wù)器

          共 3552字,需瀏覽 8分鐘

           ·

          2020-12-24 07:27

          業(yè)務(wù)化是指將模型進(jìn)行有針對(duì)性地生產(chǎn)部署,以滿足實(shí)際應(yīng)用場(chǎng)景的需求。
          如一個(gè)集團(tuán)公司用于安防的人臉識(shí)別系統(tǒng),其模型可能設(shè)在總部機(jī)房,而實(shí)時(shí)圖像為各個(gè)分公司門衛(wèi)的攝像頭所獲取。根據(jù)攝像頭捕獲的人臉圖像實(shí)時(shí)判斷是否開關(guān)門禁就是一個(gè)實(shí)際應(yīng)用場(chǎng)景,如何滿足這樣的需求就牽扯到模型部署的具體方式方法。
          模型部署與建模訓(xùn)練可以認(rèn)為是兩個(gè)獨(dú)立的問題,這可有點(diǎn)難倒本人了,不過開發(fā)出來的模型若不能用于實(shí)際生產(chǎn)那又有什么意義呢?這當(dāng)然不能忍,在一頓查閱加實(shí)踐調(diào)試后,就有了這篇學(xué)習(xí)小結(jié),供大家參考。


          ---—?1.后臺(tái)框架?—---

          筆者選擇Flask作為開發(fā)后臺(tái)。Flask是一個(gè)基于Python編寫的Web應(yīng)用框架,相對(duì)于Django及Tornado,F(xiàn)lask可以說是一個(gè)輕量級(jí)選手,靈活、可擴(kuò)展性強(qiáng)(主要是容易上手),很適用于開發(fā)中小型網(wǎng)站或應(yīng)用服務(wù)。

          # 使用以下命令進(jìn)行安裝pip?install?Flask


          ---—?2.深度學(xué)習(xí)框架?—---

          要部署的模型則是基于Keras深度學(xué)習(xí)框架下(以TensorFlow為后端)訓(xùn)練保存的模型,其格式為HDF5,需同時(shí)含有網(wǎng)絡(luò)結(jié)構(gòu)信息與權(quán)重信息。因此需要在服務(wù)器端安裝TensorFlow及Keras,若需要使用顯卡加速,則還需安裝CUDA及cuDNN,并升級(jí)TensorFlow為GPU版本。


          ---—?3.工作原理 —---
          Flask的基本工作模式為:在程序里將一個(gè)函數(shù)分配給一個(gè)URL(Uniform Resource Locator,每一個(gè)信息資源在網(wǎng)上具有的唯一地址),每當(dāng)有用戶訪問這個(gè)URL并發(fā)送請(qǐng)求時(shí),系統(tǒng)就會(huì)執(zhí)行此URL預(yù)分配好的函數(shù),同時(shí)獲取函數(shù)的返回值并將其顯示到瀏覽器上。
          上述客戶端與服務(wù)端的鏈接通過WSGI(Web Server Gateway Interface,服務(wù)器網(wǎng)關(guān)接口)進(jìn)行建立


          ---— 4.代碼解析 —---
          顯而易見,完整地部署生產(chǎn)模型需要涉及到客戶端與服務(wù)端兩側(cè)的代碼設(shè)置,一個(gè)負(fù)責(zé)發(fā)送請(qǐng)求,一個(gè)負(fù)責(zé)處理回復(fù),下面我們將通過代碼的形式逐一進(jìn)行解析。
          服務(wù)端側(cè)
          # 使用顯卡加速時(shí),根據(jù)ID指定特定的顯卡
          import?os
          os.environ["CUDA_VISIBLE_DEVICES"]?=?"0"
          # 調(diào)整顯存使用率,方便服務(wù)器快速啟動(dòng)
          import?tensorflow?as?tf
          config=tf.compat.v1.ConfigProto()
          config.gpu_options.allow_growth=True???
          sess=tf.compat.v1.Session(config=config)?
          # 加載其他所需組件
          from?keras.preprocessing.image?import?img_to_array
          from?keras.models?import?load_model
          from?keras.applications?import?imagenet_utils
          from?PIL?import?Image
          import?numpy?as?np
          import?flask
          import?io
          #?新建一個(gè)應(yīng)用服務(wù)實(shí)例及定義保存模型的變量名
          app?=?flask.Flask(__name__)
          model?=?None
          # 加載事先訓(xùn)練好的模型,注意這里函數(shù)名為load_model2旨在為避免與keras的load_model重名而報(bào)錯(cuò)
          def?load_model2():
          ??# 設(shè)為全局變量,確保調(diào)用正確
          ??global?model
          ??model?=load_model('model_name.h5')
          # 圖片預(yù)處理過程
          def?prepare_image(image,?target):
          ??#?如果文件通道非RGB排列則調(diào)整為RGB
          ??if?image.mode?!=?"RGB":
          ????image?=?image.convert("RGB")
          ??#?尺寸縮放及數(shù)據(jù)格式調(diào)整
          ??image?=?image.resize(target)
          ??image?=?img_to_array(image)
          ??image?=?np.expand_dims(image,?axis=0)
          ??image?=?imagenet_utils.preprocess_input(image)
          ??#?返回處理后結(jié)果
          ??return?image
          # 使用函數(shù)裝飾器對(duì)新建的服務(wù)實(shí)例進(jìn)行地址與請(qǐng)求方式的擴(kuò)展設(shè)置
          @app.route("/predict",?methods=["POST"])
          # 圖像識(shí)別判斷函數(shù),若將load_model寫入則每次發(fā)送請(qǐng)求都會(huì)加載一次模型
          def?predict():
          ??#?初始化狀態(tài)值
          ??data?=?{"success":?False}
          ??#?判斷請(qǐng)求方式是否為POST,若為真則讀入圖片
          ??if?flask.request.method?==?"POST":
          ????if?flask.request.files.get("image"):
          ??????image?=?flask.request.files["image"].read()
          ??????image?=?Image.open(io.BytesIO(image))
          ??????#?對(duì)圖像進(jìn)行預(yù)處理
          ??????image?=?prepare_image(image,?target=(224,?224))
          ??????#?使用模型進(jìn)行識(shí)別
          ??????preds?=?model.predict(image)
          ??????#?將識(shí)別結(jié)果進(jìn)行轉(zhuǎn)換
          ??????fct=np.argmax(preds,?axis=1)+1
          ??????#?創(chuàng)建返回結(jié)果的字典
          ??????data["predictions"]?=?[]
          ??????# 保存識(shí)別結(jié)果及對(duì)應(yīng)的概率
          ??????r?=?{"能見度等級(jí)":?str(fct[0]),?"probability":?str(preds[0][fct[0]-1])}
          ??????# 將結(jié)果存放入字典中
          ??????data["predictions"].append(r)
          ??????#?改變狀態(tài)值
          ??????data["success"]?=?True
          ??????# 服務(wù)端顯示結(jié)果
          ??????print(data)
          ??#?將結(jié)果以JSON格式返回
          ??return?flask.jsonify(data)

          if?__name__?==?"__main__":
          ??#?加載模型
          ??load_model2()
          ??#?啟動(dòng)服務(wù)(若出現(xiàn)thread_local錯(cuò)誤,請(qǐng)?jiān)趓un中添加threaded=False,或升級(jí)keras版本)
          ??app.run()


          客戶端側(cè)
          # 加載所需組件
          import?requests
          # 設(shè)置URL地址
          KERAS_REST_API_URL?=?"http://localhost:5000/predict"
          # 設(shè)置圖像文件地址
          IMAGE_PATH?=?"test.jpg"
          #?讀取圖像并將其保存在字典中進(jìn)行發(fā)送
          image?=?open(IMAGE_PATH,?"rb").read()
          payload?=?{"image":?image}
          #?以POST發(fā)送請(qǐng)求,并將返回的JSON格式進(jìn)行解析
          r?=?requests.post(KERAS_REST_API_URL,?files=payload).json()
          #?確保服務(wù)端程序執(zhí)行正確,并顯示結(jié)果,否則提示請(qǐng)求失敗
          if?r["success"]:
          ??print(r["predictions"])
          else:
          ??print("Request?failed")


          ---— 5.結(jié)果展示 —---

          #首先啟動(dòng)服務(wù)python?keras_serve.py#由于在本地調(diào)式未啟用WSGI服務(wù),會(huì)有warning提示,另在生產(chǎn)環(huán)境中切勿使用debug模式。

          開啟應(yīng)用后,服務(wù)端界面


          #其次發(fā)送請(qǐng)求python client_request.py

          發(fā)送請(qǐng)求后,用戶端界面

          服務(wù)端界面

          更多閱讀



          用 PyQt 打造具有專業(yè)外觀的GUI(上)


          用 PyQt 打造具有專業(yè)外觀的GUI(中篇)


          PyQt5 GUI應(yīng)用程序工具包入門(3)—信號(hào)槽


          特別推薦


          程序員摸魚指南


          為你精選的硅谷極客資訊,
          來自FLAG巨頭開發(fā)者、技術(shù)、創(chuàng)投一手消息




          點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員

          瀏覽 74
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  猛操在线 | 波多野结衣av一区二区全免费观看 | 色婷婷五月天影院 | 日本无码中文字幕综合一区 | 欧美操逼高清视频 |