溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何基于Serverless云函數(shù) SCF+Kaggle端到端驗證碼識別從訓(xùn)練到部署

發(fā)布時間:2021-10-12 13:56:45 來源:億速云 閱讀:139 作者:柒染 欄目:云計算

本篇文章為大家展示了如何基于Serverless云函數(shù) SCF+Kaggle端到端驗證碼識別從訓(xùn)練到部署,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

隨著驗證碼技術(shù)的更新?lián)Q代,傳統(tǒng)的驗證碼識別算法已經(jīng)越來越無用武之地了。近些年來人工智能迅速發(fā)展,尤其是在深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)這一塊生態(tài)尤為繁榮,各種算法和模型層出不窮。

今天就嘗試帶大家借助 Kaggle+SCF 快速訓(xùn)練部署一個端到端的通用驗證碼識別模型,真正的驗證碼識別從入門到應(yīng)用的一條龍服務(wù),哈哈哈~

效果展示

如何基于Serverless云函數(shù) SCF+Kaggle端到端驗證碼識別從訓(xùn)練到部署

如何基于Serverless云函數(shù) SCF+Kaggle端到端驗證碼識別從訓(xùn)練到部署

操作步驟

第一步:了解 kaggle

沒做過數(shù)據(jù)科學(xué)競賽的同學(xué),可能不太了解 kaggle 哈。

Kaggle is the world’s largest data science community with powerful tools and resources to help you achieve your data science goals.

這是 kaggle 官網(wǎng))的自我介紹,簡單來說 kaggle 是全球最大的數(shù)據(jù)科學(xué)交流社區(qū),上面有許多關(guān)于數(shù)據(jù)科學(xué)的競賽和數(shù)據(jù)集,并且提供了一些數(shù)據(jù)科學(xué)在線分析的環(huán)境和工具,一直以來吸引了全球大批數(shù)據(jù)科學(xué)愛好者,社區(qū)極其繁榮。

這里我們主要是用 kaggle 的 Notebooks 服務(wù)里的 kernel 環(huán)境來快速在云端訓(xùn)練自己的驗證碼識別模型。

如何基于Serverless云函數(shù) SCF+Kaggle端到端驗證碼識別從訓(xùn)練到部署

你可能會問在本地訓(xùn)練不可以嗎,為啥非得折騰著上云?哈哈,這還真不是折騰,普通人的電腦算力其實是有限的,而訓(xùn)練模型是需要強大 GPU 算力的支持,不然要訓(xùn)練到猴年馬月~

如何基于Serverless云函數(shù) SCF+Kaggle端到端驗證碼識別從訓(xùn)練到部署

我們再來看一下 kaggle 上的 kernel 環(huán)境的配置:

  • CPU 4核心,16 GB 運行內(nèi)存

  • GPU 2核心 13 GB 運行內(nèi)存

每個 kernel 有 9 小時的運行時長,GPU 資源每周 30 小時使用時長。除了硬件資源之外,kernel 環(huán)境里已經(jīng)配置好了一些機器學(xué)習(xí)的常用庫,包括 Pytorch, Tensorflow 2 等,它的機器學(xué)習(xí)環(huán)境是開箱即用的,零配置,零維護。

Kaggle Notebooks run in a remote computational environment. We provide the hardware—you need only worry about the code.

正如 kaggle notebooks 官方文檔所言,kaggle 免費為你提供硬件和機器學(xué)習(xí)環(huán)境,你唯一需要關(guān)心的是你的代碼。這么好的東西關(guān)鍵還是免費提供的啊,果斷選它來訓(xùn)練模型就對了。

第二步:注冊 kaggle 賬號,新建一個 kernel 環(huán)境

賬號注冊、新建 kernel 等相關(guān)問題,網(wǎng)上有很多相關(guān)文章,這里不再細說了。

第三步:clone git 倉庫,修改成自己的驗證碼數(shù)據(jù)集

如何基于Serverless云函數(shù) SCF+Kaggle端到端驗證碼識別從訓(xùn)練到部署

這里我在 github.com/nickliqian/cnn_captcha項目的基礎(chǔ)上,把原項目升級更新到了 Tensorflow 2.0,然后做了個 kaggle 訓(xùn)練 + SCF 部署的通用驗證碼識別方案。

現(xiàn)在你只需要將我修改好的倉庫 https://gitee.com/LoveWJG/tflite_train克隆到本地,

然后按照項目里的 readme 配置一下訓(xùn)練參數(shù),替換一下自己的驗證碼數(shù)據(jù)集即可。

第四步:上傳項目到 kaggle 開始訓(xùn)練

然后把配置好的項目壓縮上傳到 kaggle 直接解壓按照說明文件進行訓(xùn)練即可。

如何基于Serverless云函數(shù) SCF+Kaggle端到端驗證碼識別從訓(xùn)練到部署

這里用了 20000 張驗證碼,訓(xùn)練了 10000 輪左右,大概耗時 30 分鐘,還是相當(dāng)給力的。訓(xùn)練結(jié)束后你可以根據(jù)倉庫里的 readme 文件,把模型、日志文件打包下載到本地,然后再在本地將模型轉(zhuǎn)成 tflite 格式(方便在移動端使用,本地識別驗證碼),如果模型文件過大你也可以在本地運行 tflite.py 程序把 tflite 模型量化,大概可以把模型文件縮小到原來的 1/4,最終你應(yīng)該得到一個 .tflite 格式的模型文件。

如何基于Serverless云函數(shù) SCF+Kaggle端到端驗證碼識別從訓(xùn)練到部署

第五步:使用云函數(shù)快速部署驗證碼識別模型

云函數(shù)的創(chuàng)建、配置和發(fā)布可參考我之前的系列文章,這里就不再細講了。

新建一個 python 空白云函數(shù),然后把 scf.py 文件里的代碼填到 index.py 里保存。

# -*- coding:utf-8 -*-
import io
import json
import os
import time

import numpy as np

import tensorflow as tf
from PIL import Image

model_path = "model_quantized.tflite" #模型文件地址
chars = '23456789abcdefghjkmpqrstuvwxy' #驗證碼字符,順序要與config.json里的一致

# Load TFLite model and allocate tensors.
interpreter = tf.lite.Interpreter(model_path=model_path)
interpreter.allocate_tensors()

# Get input and output tensors.
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

#將驗證碼數(shù)據(jù)轉(zhuǎn)換成模型輸入格式
def img2input(img, width, height):
    tmpe_array = [serverless]
    for i in range(height):
        for j in range(width):
            pixel = img.getpixel((j, i))
            tmpe_array.append((0.3*pixel[0]+0.6*pixel[1]+0.1*pixel[2])/255)
    tmpe_array = np.array(tmpe_array).astype('float32')
    input_array = np.expand_dims(tmpe_array, axis=0)
    return input_array

#識別驗證碼
def predict(image):
    captcha_image = Image.open(io.BytesIO(image))
    image_np_expanded = img2input(captcha_image, 100, 50)
    interpreter.set_tensor(input_details[0]['index'], image_np_expanded)
    interpreter.invoke()
    output_data = interpreter.get_tensor(output_details[0]['index'])
    codes = ''
    for i in output_data[0]:
        codes += chars[i]
    return codes


# api網(wǎng)關(guān)響應(yīng)集成
def apiReply(reply, txt=False, content_type='application/json', code=200):
    return {
        "isBase64Encoded": False,
        "statusCode": code,
        "headers": {'Content-Type': content_type},
        "body": json.dumps(reply, ensure_ascii=False) if not txt else str(reply)
    }

#云函數(shù)入口
def main_handler(event, context):
    return apiReply(
        {
            "ok": False if not 'image' in event.keys() else True,
            "message": "請求參數(shù)無效" if not 'image' in event.keys() else predict(event['queryString']['image'])
        }
    )

把模型文件上傳到云函數(shù)根目錄,然后配置一下自己的驗證碼識別模型參數(shù)

model_path = "model_quantized.tflite" #模型文件地址
chars = '23456789abcdefghjkmpqrstuvwxy' #驗證碼字符,順序要與config.json里的一致

之后給我們的云函數(shù)添加一個 API 網(wǎng)關(guān)觸發(fā)器,并啟用響應(yīng)集成,然后發(fā)布上線即可

如何基于Serverless云函數(shù) SCF+Kaggle端到端驗證碼識別從訓(xùn)練到部署

沒有問題的話,你只需 GET 一下,就可以返回驗證碼識別結(jié)果了。

api網(wǎng)關(guān)+?base64Image=base64編碼后的驗證碼數(shù)據(jù)

小編帶大家從頭訓(xùn)練并部署了一個通用驗證碼識別模型。我們再一次看到基于 Serverless 的云函數(shù)在開發(fā)線上應(yīng)用的過程中是多么方便和迅速!

上述內(nèi)容就是如何基于Serverless云函數(shù) SCF+Kaggle端到端驗證碼識別從訓(xùn)練到部署,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI