本記事は「TRUST SMITH & COMPANY Advent Calendar 2022」の2日目です。
予想以上に誰もやってくれなかったのでとりあえず埋め合わせの記事を書いています。(悲しい)
動機
AzureのOCRサービスであるCognitive Servicesは、web api ocrの中でも高い認識精度で知られており、競合のGoogle Vision APIと比べると認識精度の点で一歩先に行っている印象があります。
しかし、Azure Cognitive Services APIは推論処理の不安定さに問題があり、例えば弊社COOの安藤のTwitterをスクリーンショットした589*310 pxの画像をOCRしてみると
Azure
GCP
とかなりGCP APIに水をあけられている状況になっています。(これは結構調子がいいほうで、混雑状況に応じて10秒程度待たされることがあります。)
よって、これをAzure Cognitive Containerを用いて高速化していきます。
導入
書き始めてから気が付いたのですが、導入方法を書いた記事はほかに存在していました。
APIの導入についてはこちらの記事を参照いただくとして、この記事ではAPIがlocalhost:5000
で起動していることを前提に話を進めます。
API速度比較
環境
Core i9-10980XEのうち8コアを使ったlocalhostAPIを起動しています。(多分そこまでCPUリソースは必要なさそうです。)
コード
以下のようにしてAPIを10回叩きます。
import requests
import time
headers = {
'accept': '*/*',
'Content-Type': 'application/octet-stream',
}
path = 'ando.jpg'
with open(path, 'rb') as f:
data = f.read()
for i in range(10):
# local API request
start = time.time()
response = requests.post('http://localhost:5000/vision/v3.2/read/syncAnalyze', headers=headers, data=data)
end = time.time()
#print(response.text)
print("offline time:", end - start)
結果
上記の画像をOCRしてみたところ、GCP APIと遜色のない速度が得られました。
外部ネットワークを通じていないため、やはり当たり前ですがかなり速いです。
ちなみに、4K画像を入力した場合はGCP APIがかなり有利になり、
GCP
Azure Offline
Azure Online
といった具合になります。
Azure Offlineの処理が遅くなった分だけOnlineの処理も遅くなっているので、たぶんリソースとしては同じ程度でネットワークを挟むか挟まないかの違いなんだと思います。