Serverless實踐系列(九):「灰常」簡單的車牌識別 API 製作
- 2019 年 10 月 5 日
- 筆記
本文的真正目的,其實並非要做一個完善的車牌識別工具,而是想要通過一些簡單的 package 組合(包括深度學習框架等),實現一個簡單的對外介面,用它來進行車牌識別。
這個項目的小難點在於 —— 如何打包依賴(包含需要 .so 的依賴)。
包含 .so 的依賴,通常是某些依賴需要編譯一些文件(非純 Python 實現的),此時,「稍有不慎」就會讓我們無法執行程式碼。所以這個時候可以使自己的打包環境與雲函數一致:CentOS + Python 3.6。
本地測試
編寫程式碼:
執行結果:
打包上傳
CentOS + Python 3.6 的基本環境下:
建立文件夾並進入:
mkdir mytest && cd mytest
安裝依賴:
安裝 opencv-python
sudo pip install opencv-python -t /home/dfounderliu/code/mytest
安裝 hyperlpr(這是一個基於 DNN 的深度學習模組。該模組的使用,也充分說明了,雲函數 SCF 可以執行深度學習的項目模型,完美……)
sudo pip install hyperlpr -t /home/dfounderliu/code/mytest
建立測試:
vim index.py
編寫內容:
from hyperlpr import * import cv2
保存,並且打包,上傳至雲函數 SCF:
zip -r index.zip .
雲函數測試:
表面上看起來似乎失敗了,但實際上,它是成功的。因為失敗的是我們的方法沒有建立,而我們的 import 已經正確導入了(就是說沒有在添加依賴部分報錯!)
編寫函數
# 導入包 from hyperlpr import * import cv2 import base64 import json import urllib.parse def save_picture(base64data): try: imgdata = base64.b64decode(urllib.parse.unquote(base64data)) file = open('/tmp/picture.png', 'wb') file.write(imgdata) file.close() return True except Exception as e: return str(e) def ana_picture(): print(cv2.imread("/tmp/picture.png")) return {"resulr": HyperLPR_PlateRecogntion(cv2.imread("/tmp/picture.png"))} def main_handler(event, context): save_result = save_picture(event["body"].replace("image=","")) if save_result == True: return ana_picture() else: return save_result # return save_picture
測試結果:
測試影像轉 base64 程式碼:
#image轉base64 import base64 with open("2.png","rb") as f:#轉為二進位格式 base64_data = base64.b64encode(f.read())#使用base64進行加密 print(base64_data) file=open('1.txt','wt')#寫成文本格式 file.write(base64_data) file.close()
測試時 API 網關參數:
對接 API 網關
然後發布到測試環境,即可。
編寫測試
測試程式碼:
import base64 import urllib.request import urllib.parse with open("1.png","rb") as f: base64_data = base64.b64encode(f.read()) # 使用base64進行加密 url = "http://service-l2ksmbje-1256773370.gz.apigw.tencentcs.com/test/picture" data = { "image": base64_data.decode("utf-8") } print(urllib.parse.unquote(urllib.request.urlopen(urllib.request.Request(url, data=urllib.parse.urlencode(data).encode("utf-8"))).read().decode("utf-8")))
測試結果:
依賴包下載:https://myblog-1256773370.cos.ap-guangzhou.myqcloud.com/opencv_numpy_hyperlpr.zip
總結
本文的主要作用,其實就是通過一些簡單的 package 組合,實現對外介面並以此進行車牌識別。一方面,這說明了雲函數 SCF 可以做深度學習相關的預測工作,另一方面,也進一步鞏固了依賴的打包和與雲 API 網關的結合使用。
當然,這個介面如果經過完善後,還可以和 Iot 等進行結合使用。最後,希望各位小夥伴們自行探索 Serverless 的新世界!
推薦閱讀: