天天看點

Serverless實踐系列(九):“灰常”簡單的車牌識别 API 制作

本文的真正目的,其實并非要做一個完善的車牌識别工具,而是想要通過一些簡單的 package 組合(包括深度學習架構等),實作一個簡單的對外接口,用它來進行車牌識别。

這個項目的小難點在于 —— 如何打包依賴(包含需要 .so 的依賴)。

包含 .so 的依賴,通常是某些依賴需要編譯一些檔案(非純 Python 實作的),此時,「稍有不慎」就會讓我們無法執行代碼。是以這個時候可以使自己的打包環境與雲函數一緻:CentOS + Python 3.6。

本地測試

編寫代碼:

Serverless實踐系列(九):“灰常”簡單的車牌識别 API 制作

執行結果:

Serverless實踐系列(九):“灰常”簡單的車牌識别 API 制作

打包上傳

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 .           

複制

雲函數測試:

Serverless實踐系列(九):“灰常”簡單的車牌識别 API 制作

表面上看起來似乎失敗了,但實際上,它是成功的。因為失敗的是我們的方法沒有建立,而我們的 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           

複制

測試結果:

Serverless實踐系列(九):“灰常”簡單的車牌識别 API 制作

測試圖像轉 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 網關參數:

Serverless實踐系列(九):“灰常”簡單的車牌識别 API 制作

對接 API 網關

Serverless實踐系列(九):“灰常”簡單的車牌識别 API 制作
Serverless實踐系列(九):“灰常”簡單的車牌識别 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")))           

複制

測試結果:

Serverless實踐系列(九):“灰常”簡單的車牌識别 API 制作

依賴包下載下傳:https://myblog-1256773370.cos.ap-guangzhou.myqcloud.com/opencv_numpy_hyperlpr.zip

總結

本文的主要作用,其實就是通過一些簡單的 package 組合,實作對外接口并以此進行車牌識别。一方面,這說明了雲函數 SCF 可以做深度學習相關的預測工作,另一方面,也進一步鞏固了依賴的打包和與雲 API 網關的結合使用。

當然,這個接口如果經過完善後,還可以和 Iot 等進行結合使用。最後,希望各位小夥伴們自行探索 Serverless 的新世界!

推薦閱讀:

  • 「Serverless 技術專欄」基本概念入門
  • 「Serverless 技術專欄」運作原理與元件架構
  • 「Serverless 技術專欄」開發者工具建設
Serverless實踐系列(九):“灰常”簡單的車牌識别 API 制作