imageAI圖像識別,並用python搭建本地服務

imageai是一套開源免費的,可以用於圖像智能識別的python應用包,使用門檻不高,基本上按照官方文檔去寫就可以簡單實現利用已經訓練好的模型識別圖像中的物體。
imageai圖像預檢目前實現了四種模型的算法支持,分別是SqueezeNet,ResNet,InceptionV3 和 DenseNet。不同的包對應的訓練模型大小不一致,精度也不一致。

  • SqueezeNet(文件大小:4.82 MB,預測時間最短,精準度適中)
  • ResNet50 by Microsoft Research (文件大小:98 MB,預測時間較快,精準度高)
  • InceptionV3 by Google Brain team (文件大小:91.6 MB,預測時間慢,精度更高)
  • DenseNet121 by Facebook AI Research (文件大小:31.6 MB,預測時間較慢,精度最高)

imageai不僅可以用於圖像識別,還可以進行圖形對象檢測,視頻對象預測和跟蹤,自定義訓練模型等。對於機器學習不夠深入的人員非常友好,可以幾行代碼實現一個AI應用。

更多深入的內容可以查看原文

下面,簡單瞭解一下如何在python本地服務中搭建一個圖像識別應用。

安裝imageAI的依賴

imageAI的依賴

python(>=3.5.1)
tensorflow(>=1.4.0)
Numpy(>=1.13.1)
SciPy(>=0.19.1)
openCv
pillow
matplotlib
h5py
keras

若安裝好了pip3 可以直接運行 pip3 install tensorflow numpy scipy opencv-python pillow matplotlib h5py keras imageai

imageAI的訓練模型

imageAI支持使用在ImageNet-1000數據集上訓練的4種不同的機器學習算法,也支持在CoCo數據集集上訓練的對象檢測。

圖像預檢

需要下載一個訓練模型

這裏就直接使用facebookAI的訓練模型DenseNet121

廢話不多說,上代碼:

from imageai.Prediction import ImagePrediction
import os,json

execution_path = os.getcwd() # 當前命令行執行路徑
prediction = ImagePrediction() # 獲取這個圖像預測實例
prediction.setModelTypeAsDenseNet() # facebook AI,此處要根據下一步加載的模型文件來確立對應的model類型,其他還有setModelTypeAsSqueezeNet(普通) setModelTypeAsResNet(微軟模型) setModelTypeAsInceptionV3(谷歌模型),訓練識別精確度依次提升,facebook最準確
prediction.setModelPath(os.path.join(execution_path, "DenseNet-BC-121-32.h5")) # 加載模型文件,就是剛剛下載好的那個
prediction.loadModel(prediction_speed="fast") # 速度調節,如果配置這個則需要使用精確度較高的模型,否則會出現識別率下降的問題
predictions, probabilities =prediction.predictImage(os.path.join(execution_path, "test.jpg"), result_count=6) # 對應的圖像識別路徑,以及相應的返回結果數量
predictionDict = {}
for eachPrediction, eachProbability in zip(predictions, probabilities):
     predictionDict[eachPrediction] = eachProbability
res = json.dumps(predictionDict)

print(res) # 輸出結果
雖然這裏設置了"fast",但其實對於單核來說運行速度仍然比較慢,如果你的運行服務器是多核的,可以試試並行計算,把多個核都用起來,效率會有不少提升。

代碼對應行都有相應註釋,看一下打印結果:

{"loudspeaker": 33.06401073932648, "modem": 26.803183555603027, "hard_disc": 7.0777274668216705, "projector": 4.804840311408043, "lighter": 2.9418328776955605, "electric_fan": 1.8662691116333008}

返回的是key-value的json格式,key代表物品名,value代表可能性性百分比數值,最高100,最低0,分別表示準確識別和不可能,由於訓練模型使用的是FacebookAI類型的,所以標籤名也是英文的,這對於中文用戶來說可能需要一個轉譯的過程。

如何使用python進行中英文翻譯,這裏不贅述,pip安裝googletrans試試看,不過需要翻牆。

好了,基本的識別邏輯有了,我們可以搭建一個http服務,使用get請求來接收一個圖片文件名,然後讓Python幫我們識別上傳的圖片裏都有什麼內容。

上代碼:

from http.server import HTTPServer,BaseHTTPRequestHandler
import io,shutil,urllib
from imageai.Prediction import ImagePrediction
import os,json

class MyHttpHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        name=""
        if '?' in self.path:
            self.queryString=urllib.parse.unquote(self.path.split('?',1)[1])
            #name=str(bytes(params['name'][0],'GBK'),'utf-8')
            params=urllib.parse.parse_qs(self.queryString)
            name=params["name"][0] if "name" in params else None
        r_str=name
        enc="UTF-8"
        encoded = ''.join(r_str).encode(enc)
        if name:
            execution_path = os.getcwd()
            if execution_path == '' or execution_path == '/':
                execution_path = '/www-root/blog' # 因爲網關模式執行Python可能導致當前執行路徑爲'/'或者空的情況。
            prediction = ImagePrediction()
            
            prediction.setModelTypeAsDenseNet() # facebook AI
            prediction.setModelPath(os.path.join(execution_path, "DenseNet-BC-121-32.h5"))
          
            prediction.loadModel(prediction_speed="fast")
            predictions, probabilities = prediction.predictImage(os.path.join(execution_path, "image/"+name), result_count=3)
            predictionDict = {}
            for eachPrediction, eachProbability in zip(predictions, probabilities):
                predictionDict[eachPrediction] = eachProbability
            res = json.dumps(predictionDict)
            encoded = ''.join(res).encode(enc)
        f = io.BytesIO()
        f.write(encoded)
        f.seek(0)
        self.send_response(200)
        self.send_header("Content-type", "text/html; charset=%s" % enc)
        self.send_header("Content-Length", str(len(encoded)))
        self.end_headers()
        shutil.copyfileobj(f,self.wfile)


httpd=HTTPServer(('',8080),MyHttpHandler)
print("Server started on 127.0.0.1,port 8080.....")
httpd.serve_forever()

在服務器運行python3 你的腳本名.py就可以完美運行啦!

curl -X GET 'http://127.0.0.1:8080?name=IMG_8590.JPG'
# response
{"loudspeaker": 33.06401073932648, "modem": 26.803183555603027, "hard_disc": 7.0777274668216705, "projector": 4.804840311408043, "lighter": 2.9418328776955605, "electric_fan": 1.8662691116333008}

結尾

本文只介紹了圖像識別以及如何加在python http server中方便內部調用,其實還可以做得更多,比如圖形對象檢測,視頻對象跟蹤等,你也可以自定義訓練模型,按照對應的4種算法處理模型數據,搞一個自定義AI產品。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章