启动您的 AI 之旅:使用 Azure AI 和 AKS 构建您的第一个智能应用
在本系列动手实践的第一篇文章中,我们将深入探讨如何创建一个智能应用,该应用利用 Azure AI Vision 来分析图像并提取数据。
智能应用是一种软件应用程序,它使用人工智能 (AI),例如机器学习 (ML),来提取有意义的见解,使用户能够根据提取的文本、数据、声音、图像等做出明智的决策。
智能应用可以采用先进的算法和模型来识别图像中的对象、模式和特征,从而能够执行诸如对象识别、图像分类、面部识别和图像分割等任务。
为了探索智能应用的强大功能,让我们构建一个 Python 应用,该应用对包含数字的图像执行光学字符识别 (OCR),并对提取的数字执行聚合函数,例如求和与平均值。我们将利用Azure AI 服务来实现 OCR 功能,并利用Azure Kubernetes 服务 (AKS) 在 Azure 中开发、发布和维护一个基于云的可扩展应用。
让我们开始吧!
了解 Azure AI Vision 和 Azure Kubernetes 服务
Azure AI Vision 是一项基于云的服务,提供一系列先进的计算机视觉功能,使应用程序能够利用 ML 和其他 AI 算法来解释内容,例如图像和视频。Azure 计算机视觉让用户无需 ML 经验即可将强大的视觉功能集成到他们的项目中。
OCR 是 Azure AI Vision 中的一项关键功能,允许应用程序从图像中提取文本。在 Azure AI Vision 中,OCR 提供多项功能,包括文本提取、多语言支持、文档布局分析以及与 Azure 服务(如Azure Functions 和Azure Machine Learning)的集成。
AKS 是 Microsoft Azure 的容器编排平台,使我们能够快速有效地部署、管理和扩展容器化应用程序,例如我们的智能应用。
让我们探索如何利用这些工具来构建一个利用 Azure AI Vision 分析图像并提取数据的智能应用。
必备组件
要学习本教程,请确保您具备以下条件:
- 已安装 Python 3.8 或更高版本
- 已安装 VS Code 或其他用于编写 Python 代码的集成开发环境 (IDE)
- 已下载示例 Python 应用程序
- 安装了 pip,即 Python 的包管理器。
- 已安装 Docker Desktop。确保 Docker 在 Linux 容器上运行。
- 已安装 Postman。我们将使用它来测试我们的 API。
- 一个免费的 Azure 帐户。如果您还没有,请注册。
- Azure 命令行接口 (CLI)。
要预览此最终项目,请查看完整的项目代码。
解决方案架构
下图展示了本文的目标解决方案的架构。
使用 Azure AI Vision 构建 API
首先,登录到您的 Azure 帐户并导航到Azure 门户。
点击创建资源并搜索“资源组”。创建一个名为 computer-vision
的新资源组。
返回 Azure 门户主页并点击创建资源。
搜索“计算机视觉”并从结果中选择它。点击创建。
点击创建会显示创建计算机视觉向导。从下拉列表中选择您刚刚创建的资源组作为资源组。输入一个与下方屏幕截图相似的资源名称。请注意,这必须是唯一的名称,因此请选择一个当前未使用的名称。选择 Standard S1 作为定价层,并在底部的字段中勾选“负责任地使用 AI”复选框。
点击审查 + 创建,然后点击创建。
接下来,从您创建的 Azure AI 服务多服务帐户中获取 API 密钥和终结点。资源创建完成后,导航到资源详细信息页面。在资源管理下,选择密钥和终结点。在密钥和终结点页面上,您将找到密钥 1 和终结点值。访问 Azure AI API 需要这些凭据。
配置本地环境变量
接下来,我们定义一个本地环境变量文件。这种方便的存储 API 密钥的方法保存在一个简单的文本文件中,使我们能够管理敏感信息并将配置与 API 代码分离。
如果您尚未这样做,请将入门项目模板从 GitHub 克隆到您的本地计算机。在代码编辑器中打开入门项目模板,并在根文件夹中创建一个新的 .env 文件。
注意: 在这种情况下,根文件夹是 /Microsoft_Series17-18_Code/intelligent-app-before 文件夹。
将以下键值对添加到文件中,记住用上一步中获取的值替换占位符值。
VISION_KEY=<THE-KEY-1-VALUE-FROM-YOUR-AZURE-AI-SERVICE>
VISION_ENDPOINT=<THE-ENDPOINT-VALUE-FROM-YOUR-AZURE-AI-SERVICE>
回顾快速入门代码
让我们回顾一下入门项目模板中的 app.py 文件。
app.py 文件作为 Flask 应用程序的入口点。它负责初始化 Web 服务器,监听传入的请求,将它们分派到适当的路由处理程序,并生成响应。
以下是 app.py 文件中包含的代码
import os
import json
from flask import Flask, request
from flask_restful import Resource, Api
from werkzeug.utils import secure_filename
app = Flask(__name__,
static_url_path='',
static_folder='static/files')
api = Api(app)
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'files'
api = Api(app)
class UploadHandler(Resource):
def allowed_file(self, filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in {'png'}
def post(self):
form = request.form.to_dict()
if 'file' not in request.files:
return json.dumps({ "success": False, "error": "No file part"})
file = request.files.get("file")
if file and self.allowed_file(file.filename):
filename = secure_filename(file.filename)
upload_folder = "static/files"
if not os.path.exists(upload_folder):
os.makedirs(upload_folder)
local_file_path = os.path.join(upload_folder, filename)
file.save(local_file_path)
return f"File {filename} uploaded successfully to folder: {upload_folder}"
api.add_resource(UploadHandler, "/")
if __name__ == '__main__':
app.run(debug=True)
上面的 UploadHandler
类被定义为一个 Flask RESTful 资源来处理文件上传。该类包含两个方法
allowed_file
方法检查文件扩展名是否允许上传。在这种情况下,只允许 .png 文件。post
方法处理文件上传的 HTTP POST 请求。它将上传的 .png 文件保存到 static/files 文件夹。
最后,应用程序返回一个文本响应,告知我们文件已成功上传。
在 Python 中实现 REST API
要在 REST API 中实现图像分析,请在终端中打开入门项目模板,创建虚拟环境并激活它。
接下来,安装 Azure AI Vision SDK
pip install azure-ai-vision
然后,将以下行添加到 requirements.txt 文件中以包含 azure-ai-vision
包
azure-ai-vision==0.13.0b1
现在,在项目根文件夹中创建一个 ocr_helper.py 文件。该文件是一个 Python 模块,提供使用 OCR 处理图像的函数。将以下代码添加到该文件
import os
from statistics import median
from decimal import Decimal
import azure.ai.vision as sdk
def process_ocr(source_image):
service_options = sdk.VisionServiceOptions(os.environ["VISION_ENDPOINT"],
os.environ["VISION_KEY"])
vision_source = sdk.VisionSource(filename=source_image)
analysis_options = sdk.ImageAnalysisOptions()
analysis_options.features = (
sdk.ImageAnalysisFeature.CAPTION |
sdk.ImageAnalysisFeature.TEXT
)
analysis_options.language = "en"
analysis_options.gender_neutral_caption = True
image_analyzer = sdk.ImageAnalyzer(service_options, vision_source, analysis_options)
result = image_analyzer.analyze()
ocr_result = get_ocr_result(result)
return ocr_result
def get_ocr_result(result):
string_list = []
if result.reason != sdk.ImageAnalysisResultReason.ANALYZED:
return sdk.ImageAnalysisErrorDetails.from_result(result)
else:
if result.text is not None:
for line in result.text.lines:
for word in line.words:
string_list.append(word.content)
number_list = convert_to_decimal_list(string_list)
aggregate_result = aggregate_operations(number_list)
return {
"aggregate_result": aggregate_result,
"numbers_read": string_list
}
def convert_to_decimal_list(string_list):
return list(map(Decimal, string_list))
def aggregate_operations(numbers):
result = {
'sum': sum(numbers),
'average': sum(numbers) / len(numbers),
'median': median(numbers),
'min': min(numbers),
'max': max(numbers)
}
return result
该模块使用azure-ai-vision 包来分析图像,包括捕获字幕和从图像中提取文本。process_ocr
函数输入一个图像文件并执行 OCR 分析。该模块是分析图片中基于文本的数据并基于该数据执行数字计算的便捷工具。
让我们回顾一下上面列出的 ocr_helper.py 模块的不同组件,并探讨它的函数如何帮助我们的智能应用处理图像和执行聚合操作
process_ocr
函数采用参数source_image
,它是要处理的图像的路径。然后,该函数使用环境变量VISION_ENDPOINT
和VISION_KEY
初始化VisionServiceOptions
,以连接到 Azure AI Vision API。process_ocr
函数使用指定的 source_image 文件名创建一个VisionSource
对象。ImageAnalysisOptions
指定要分析的功能,包括CAPTION
和TEXT
。语言设置为英语 (“en”),并启用了性别中立的字幕。- 最后,使用服务选项、视觉源和分析选项创建一个
ImageAnalyzer
对象。然后使用image_analyzer.analyze
方法分析图像以检索 OCR 结果。从 OCR 结果中提取识别出的文本,并将数值存储在string_list
变量中。 convert_to_decimal_list
函数将字符串列表转换为十进制数列表,这有助于处理从文本中提取的数值。aggregate_operations
函数从数字列表中计算各种聚合统计数据(求和、平均值、中位数、最小值、最大值),并将结果以字典形式返回。
请注意,您必须配置适当的凭据 (VISION_KEY) 和终结点 (VISION_ENDPOINT
) 才能使用 Azure AI Vision API 来使用此模块。
最后,我们必须修改 app.py 文件,以便我们的代码可以使用 ocr_helper.py 文件的 process_ocr
函数。
将以下导入语句添加到 app.py 文件
from ocr_helper import process_ocr
然后,替换此行
return f"File {filename} uploaded successfully to folder: {upload_folder}"
用这两行
aggregates = process_ocr(local_file_path)
return json.dumps(aggregates, default=str)
这样做允许我们的应用程序执行在文本中找到的任何数值的聚合操作(求和、平均值、中位数、最小值、最大值),并将操作的结果作为 JSON 响应返回。
运行本地智能应用
我们的最终目标是将示例应用程序部署到 AKS,AKS 将在容器中运行该应用程序。但是,作为一种良好的实践,在将其迁移到 AKS 之前,让我们在本地容器中运行该应用程序。这样做可以确保我们的应用程序及其依赖项被封装起来,并在不同环境中一致运行。
部署到 Docker Desktop
为了使我们的应用程序能够在 Docker 上运行,它需要两个额外的文件:Dockerfile 和 docker-compose.yml。Dockerfile 通过指定构建它的步骤来创建单个容器镜像,而 docker-compose.yml 文件将多个容器管理为一个统一的应用程序,定义它们的配置和关系。Dockerfile 构建镜像,而 docker-compose.yml 编排多容器应用程序。
在项目根文件夹中,添加一个名为 Dockerfile 的文件,内容如下
# syntax=docker/dockerfile:1
FROM python:3.8-slim-buster
WORKDIR /intelligentapp
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
RUN pip install debugpy
COPY . .
CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
现在,在项目根文件夹中创建一个名为 docker-compose.yml 的文件,其中包含以下代码,根据您之前配置的环境变量替换 VISION_KEY
和 VISION_ENDPOINT
version: '3.8'
services:
intelligentapp:
build:
context: .
dockerfile: Dockerfile
image: intelligent-app
ports:
- 5000:5000
container_name: intelligent-app
environment:
- VISION_KEY=<THE-KEY-1-VALUE-FROM-YOUR-AZURE-AI-SERVICE>
- VISION_ENDPOINT=<THE-ENDPOINT-VALUE-FROM-YOUR-AZURE-AI-SERVICE>
然后,在终端中运行以下命令来构建镜像并为 docker-compose.yml 文件中定义的智能应用服务启动容器
docker-compose up --build --force-recreate
接下来,打开一个新的终端并运行以下命令来列出已部署到本地 Docker 的镜像
docker images
测试本地智能应用
现在,我们将使用以下测试图像来测试智能应用的功能
此图像是示例应用源文件中的 sample1.png。您可以在下一步中使用它。
智能应用将使用 OCR 读取上面的图像,以提取图像中的数字并执行五个聚合函数
- Sum
- Average
- 中位数
- 最小值
- 最大值
要测试 API,请打开 Postman 并按如下方式填写字段
- URL: https://:5000/
- 方法: POST
- 正文:
- 表单数据
- 键:文件 — 点击键字段的右端,然后从下拉列表中选择文件。
- 值:点击选择文件,然后选择示例代码中提供的 sample1.png 文件。
- 表单数据
现在点击发送按钮并查看结果正文
"{\"aggregate_result\": {\"sum\": \"25821\", \"average\": \"5164.2\", \"median\": \"5622\", \"min\": \"1447\", \"max\": \"9802\"}, \"numbers_read\": [\"3049\", \"5901\", \"5622\", \"1447\", \"9802\"]}"
正如我们所见,在本地容器上运行的应用程序根据示例图像返回了正确的结果。因此,我们已准备好准备我们的 Azure 资源,以便在 AKS 上运行智能应用。
后续步骤
在本文中,我们探讨了创建一个利用 Azure AI Vision 分析图像并提取数据的智能应用。我们学习了如何构建一个 Python Web API 来对上传的图像执行 OCR,并随后在本地测试该 API。
前往本系列的下一部分,通过 Azure Kubernetes Service 部署此 API。