如何用Python代碼輕松搞定圖像分類和預(yù)測

如何用Python代碼輕松搞定圖像分類和預(yù)測,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

網(wǎng)頁設(shè)計是網(wǎng)站建設(shè)的前奏,好的網(wǎng)頁設(shè)計更深度的剖析產(chǎn)品和設(shè)計風(fēng)格定位,結(jié)合最新的網(wǎng)頁設(shè)計流行趨勢,與WVI應(yīng)用標準,設(shè)計出具企業(yè)表現(xiàn)力,大器而深穩(wěn)的網(wǎng)站界面設(shè)。成都創(chuàng)新互聯(lián)于2013年創(chuàng)立,是成都網(wǎng)站建設(shè)公司:提供企業(yè)網(wǎng)站設(shè)計,品牌網(wǎng)站制作,營銷型企業(yè)網(wǎng)站建設(shè)方案,響應(yīng)式網(wǎng)站建設(shè),小程序制作,專業(yè)建站公司做網(wǎng)站。

圖像分類是人工智能領(lǐng)域的一個熱門話題,通俗來講,就是根據(jù)各自在圖像信息中反映的不同特征,把不同類別的目標區(qū)分開。圖像分類利用計算機對圖像進行定量分析,把圖像或圖像中的每個像元或區(qū)域劃歸為若干個類別中的某一種,代替人的視覺判讀。

在實際生活中,我們也會遇到圖像分類的應(yīng)用場景,例如我們常用的通過拍照花朵來識別花朵信息,通過人臉匹對人物信息等。通常,圖像識別或分類工具都是在客戶端進行數(shù)據(jù)采集,在服務(wù)端進行運算獲得結(jié)果。

小編將嘗試通過一個有趣的 Python 庫,快速將圖像分類的功能搭建在云函數(shù)上,并且和 API 網(wǎng)關(guān)結(jié)合,對外提供 API 功能,實現(xiàn)一個 Serverless 架構(gòu)的 " 圖像分類 API"。

入門 ImageAI

首先,我們需要一個依賴庫:ImageAI

什么是 ImageAI 呢?其官方文檔是這樣描述的:

ImageAI 是一個 python 庫,旨在使開發(fā)人員能夠使用簡單的幾行代碼構(gòu)建具有包含深度學(xué)習(xí)和計算機視覺功能的應(yīng)用程序和系統(tǒng)。 ImageAI 本著簡潔的原則,支持最先進的機器學(xué)習(xí)算法,用于圖像預(yù)測、自定義圖像預(yù)測、物體檢測、視頻檢測、視頻對象跟蹤和圖像預(yù)測訓(xùn)練。ImageAI 目前支持使用在 ImageNet-1000 數(shù)據(jù)集上訓(xùn)練的 4 種不同機器學(xué)習(xí)算法進行圖像預(yù)測和訓(xùn)練。ImageAI 還支持使用在 COCO 數(shù)據(jù)集上訓(xùn)練的 RetinaNet 進行對象檢測、視頻檢測和對象跟蹤。 最終,ImageAI 將為計算機視覺提供更廣泛和更專業(yè)化的支持,包括但不限于特殊環(huán)境和特殊領(lǐng)域的圖像識別。

簡單理解,就是 ImageAI 依賴庫可以幫助用戶完成基本的圖像識別和視頻的目標提取。不過,ImageAI 雖然提供一些數(shù)據(jù)集和模型,但我們也可以根據(jù)自身需要對其進行額外的訓(xùn)練,進行定制化拓展。

其官方代碼給出了這樣一個簡單的 Demo:

from imageai.Prediction import ImagePrediction
import os
execution_path = os.getcwd()
 
prediction = ImagePrediction()
prediction.setModelTypeAsResNet()
prediction.setModelPath(os.path.join(execution_path, "resnet50_weights_tf_dim_ordering_tf_kernels.h6"))
prediction.loadModel()
 
predictions, probabilities = prediction.predictImage(os.path.join(execution_path, "1.jpg"), result_count=5 )
for eachPrediction, eachProbability in zip(predictions, probabilities):
    print(eachPrediction + " : " + eachProbability)

我們可以在本地進行初步運行,指定圖片1.jpg為下圖時:

如何用Python代碼輕松搞定圖像分類和預(yù)測

可以得到結(jié)果:

convertible  :  52.459537982940674
sports_car  :  37.61286735534668
pickup  :  3.175118938088417
car_wheel  :  1.8175017088651657
minivan  :  1.7487028613686562

讓 ImageAI 上云(部署到 Serverless 架構(gòu)上)

通過上面的 Demo,我們可以考慮將這個模塊部署到云函數(shù):

  • 首先,在本地創(chuàng)建一個 Python 的項目:mkdir imageDemo

  • 新建文件:vim index.py

  • 根據(jù)云函數(shù)的一些特殊形式,我們對 Demo 進行部分改造

    • 將初始化的代碼放在外層;

    • 將預(yù)測部分當(dāng)做觸發(fā)所需要執(zhí)行的部分,放在入口方法中(此處是 main_handler);

    • 云函數(shù)與 API 網(wǎng)關(guān)結(jié)合對二進制文件支持并不是十分的友善,所以此處通過 base64 進行圖片傳輸;

    • 入?yún)⒍?code>{"picture": 圖片的 base64},出參定為:{"prediction": 圖片分類的結(jié)果}

實現(xiàn)的代碼如下:

from imageai.Prediction import ImagePrediction
import os, base64, random
 
execution_path = os.getcwd()
 
prediction = ImagePrediction()
prediction.setModelTypeAsSqueezeNet()
prediction.setModelPath(os.path.join(execution_path, "squeezenet_weights_tf_dim_ordering_tf_kernels.h6"))
prediction.loadModel()
 
 
def main_handler(event, context):
    imgData = base64.b64decode(event["body"])
    fileName = '/tmp/' + "".join(random.sample('zyxwvutsrqponmlkjihgfedcba', 5))
    with open(fileName, 'wb') as f:
        f.write(imgData)
    resultData = {}
    predictions, probabilities = prediction.predictImage(fileName, result_count=5)
    for eachPrediction, eachProbability in zip(predictions, probabilities):
        resultData[eachPrediction] =  eachProbability
    return resultData

創(chuàng)建完成之后,下載所依賴的模型:

  • SqueezeNet(文件大小:4.82 MB,預(yù)測時間最短,精準度適中)

  • ResNet50 by Microsoft Research (文件大?。?8 MB,預(yù)測時間較快,精準度高)

  • InceptionV3 by Google Brain team (文件大?。?1.6 MB,預(yù)測時間慢,精度更高)

  • DenseNet121 by Facebook AI Research (文件大?。?1.6 MB,預(yù)測時間較慢,精度最高)

因為我們僅用于測試,所以選擇一個比較小的模型就可以:SqueezeNet

在官方文檔復(fù)制模型文件地址:

如何用Python代碼輕松搞定圖像分類和預(yù)測

使用wget直接安裝:

wget https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/squeezenet_weights_tf_dim_ordering_tf_kernels.h6

如何用Python代碼輕松搞定圖像分類和預(yù)測

接下來,進行依賴安裝:

如何用Python代碼輕松搞定圖像分類和預(yù)測

由于騰訊云 Serveless 產(chǎn)品,在 Python Runtime 中還不支持在線安裝依賴,所以需要手動打包依賴,并且上傳。在 Python 的各種依賴庫中,有很多依賴可能有編譯生成二進制文件的過程,這就會導(dǎo)致不同環(huán)境下打包的依賴無法通用。

所以,最好的方法就是通過對應(yīng)的操作系統(tǒng) + 語言版本進行打包。我們就是在 CentOS+Python3.6 的環(huán)境下進行依賴打包。

對于很多 MacOS 用戶和 Windows 用戶來說,這確實不是一個很友好的過程,所以為了方便大家使用,我在 Serverless 架構(gòu)上做了一個在線打包依賴的工具,所以可以直接用該工具進行打包:

如何用Python代碼輕松搞定圖像分類和預(yù)測

如何用Python代碼輕松搞定圖像分類和預(yù)測

生成壓縮包之后,直接下載解壓,并且放到自己的項目中即可:

如何用Python代碼輕松搞定圖像分類和預(yù)測

最后一步,創(chuàng)建serverless.yaml

imageDemo:
  component: "@serverless/tencent-scf"
  inputs:
    name: imageDemo
    codeUri: ./
    handler: index.main_handler
    runtime: Python3.6
    region: ap-guangzhou
    description: 圖像識別 / 分類 Demo
    memorySize: 256
    timeout: 10
    events:
      - apigw:
          name: imageDemo_apigw_service
          parameters:
            protocols:
              - http
            serviceName: serverless
            description: 圖像識別 / 分類 DemoAPI
            environment: release
            endpoints:
              - path: /image
                method: ANY

完成之后,執(zhí)行sls --debug部署,部署過程中會有掃碼登陸,登陸之后等待即可,完成之后,就可以看到部署地址。

如何用Python代碼輕松搞定圖像分類和預(yù)測

基本測試

通過 Python 語言進行測試,接口地址就是剛才復(fù)制的 +/image,例如:

import json
import urllib.request
import base64
 
with open("1.jpg", 'rb') as f:
    base64_data = base64.b64encode(f.read())
    s = base64_data.decode()
 
url = 'http://service-9p7hbgvg-1256773370.gz.apigw.tencentcs.com/release/image'
 
print(urllib.request.urlopen(urllib.request.Request(
    url = url,
    data= json.dumps({'picture': s}).encode("utf-8")
)).read().decode("utf-8"))

通過網(wǎng)絡(luò)搜索一張圖片:

如何用Python代碼輕松搞定圖像分類和預(yù)測

得到運行結(jié)果:

{
	"prediction": {
		"cheetah": 83.12643766403198,
		"Irish_terrier": 2.315458096563816,
		"lion": 1.8476998433470726,
		"teddy": 1.6655176877975464,
		"baboon": 1.5562783926725388
	}
}

通過這個結(jié)果,我們可以看到圖片的基礎(chǔ)分類 / 預(yù)測已經(jīng)成功了,為了證明這個接口的時延情況,可以對程序進行基本改造:

import urllib.request
import base64, time
 
for i in range(0,10):
    start_time = time.time()
    with open("1.jpg", 'rb') as f:
        base64_data = base64.b64encode(f.read())
        s = base64_data.decode()
 
    url = 'http://service-9p7hbgvg-1256773370.gz.apigw.tencentcs.com/release/image'
    
    print(urllib.request.urlopen(urllib.request.Request(
        url = url,
        data= json.dumps({'picture': s}).encode("utf-8")
    )).read().decode("utf-8"))
 
    print("cost: ", time.time() - start_time)

輸出結(jié)果:

{"prediction":{"cheetah":83.12643766403198,"Irish_terrier":2.315458096563816,"lion":1.8476998433470726,"teddy":1.6655176877975464,"baboon":1.5562783926725388}}
cost:  2.1161561012268066
{"prediction":{"cheetah":83.12643766403198,"Irish_terrier":2.315458096563816,"lion":1.8476998433470726,"teddy":1.6655176877975464,"baboon":1.5562783926725388}}
cost:  1.1259253025054932
{"prediction":{"cheetah":83.12643766403198,"Irish_terrier":2.315458096563816,"lion":1.8476998433470726,"teddy":1.6655176877975464,"baboon":1.5562783926725388}}
cost:  1.3322770595550537
{"prediction":{"cheetah":83.12643766403198,"Irish_terrier":2.315458096563816,"lion":1.8476998433470726,"teddy":1.6655176877975464,"baboon":1.5562783926725388}}
cost:  1.3562259674072266
{"prediction":{"cheetah":83.12643766403198,"Irish_terrier":2.315458096563816,"lion":1.8476998433470726,"teddy":1.6655176877975464,"baboon":1.5562783926725388}}
cost:  1.0180821418762207
{"prediction":{"cheetah":83.12643766403198,"Irish_terrier":2.315458096563816,"lion":1.8476998433470726,"teddy":1.6655176877975464,"baboon":1.5562783926725388}}
cost:  1.4290671348571777
{"prediction":{"cheetah":83.12643766403198,"Irish_terrier":2.315458096563816,"lion":1.8476998433470726,"teddy":1.6655176877975464,"baboon":1.5562783926725388}}
cost:  1.5917718410491943
{"prediction":{"cheetah":83.12643766403198,"Irish_terrier":2.315458096563816,"lion":1.8476998433470726,"teddy":1.6655176877975464,"baboon":1.5562783926725388}}
cost:  1.1727900505065918
{"prediction":{"cheetah":83.12643766403198,"Irish_terrier":2.315458096563816,"lion":1.8476998433470726,"teddy":1.6655176877975464,"baboon":1.5562783926725388}}
cost:  2.962592840194702
{"prediction":{"cheetah":83.12643766403198,"Irish_terrier":2.315458096563816,"lion":1.8476998433470726,"teddy":1.6655176877975464,"baboon":1.5562783926725388}}
cost:  1.2248001098632812

通過上面一組數(shù)據(jù),我們可以看到整體的耗時基本控制在 1-1.5 秒之間。

當(dāng)然,如果想要對接口性能進行更多的測試,例如通過并發(fā)測試來看并發(fā)情況下接口性能表現(xiàn)等。

至此,我們通過 Serveerless 架構(gòu)搭建的 Python 版本的圖像識別 / 分類小工具做好了。

Serverless 架構(gòu)下進行人工智能相關(guān)的應(yīng)用可以是說是非常多的,小編是通過一個已有的依賴庫,實現(xiàn)一個圖像分類 / 預(yù)測的接口。imageAI這個依賴庫相對來說自由度比較高,可以根據(jù)自身需要用來定制化自己的模型。本文算是拋磚引玉,期待更多人通過 Serverless 架構(gòu)部署自己的"人工智能" API。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

文章題目:如何用Python代碼輕松搞定圖像分類和預(yù)測
本文鏈接:http://bm7419.com/article14/jjdpge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站域名注冊、App開發(fā)網(wǎng)站設(shè)計公司、云服務(wù)器面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計