相关文章推荐
微笑的伤痕  ·  SQL Server——SQL ...·  5 月前    · 
威武的馒头  ·  404 - 知乎·  8 月前    · 
忐忑的钢笔  ·  delphi ...·  1 年前    · 
腼腆的柠檬  ·  Ultraviolet light ...·  1 年前    · 

在本教程中,你将了解如何将图像上传到 Azure Blob 存储并使用 Azure Functions 和计算机视觉对其进行处理。 你还将了解如何在此过程中实现 Azure Function 触发器和绑定。 这些服务将一起分析包含文本的上传图像,从中提取文本,然后将文本存储在数据库行中,供以后分析或用于其他用途。

Azure Blob 存储是 Microsoft 针对云提供的可大规模缩放的对象存储解决方案。 Blob 存储设计用于存储图像和文档、流式处理媒体文件、管理备份和存档数据等等。 有关 Blob 存储的详细信息,请阅读 概述页面

Azure Functions 是一种无服务器计算机解决方案,允许你编写和运行小块代码作为高度可缩放、无服务器、事件驱动的函数。 有关 Azure Functions 的详细信息,请阅读 概述页面

本教程介绍以下操作:

  • 将图像和文件上传到 Blob 存储
  • 使用 Azure Function 事件触发器处理上传到 Blob 存储的数据
  • 使用认知服务分析图像
  • 使用 Azure Function 输出绑定将数据写入表存储
  • 具有活动订阅的 Azure 帐户。 免费创建帐户
  • 已安装 Visual Studio Code
  • Azure Functions 扩展 ,用于部署和配置函数应用。
  • Azure 存储扩展
  • Azure 资源扩展
  • 创建存储帐户和容器

    第一步是创建存储帐户来保存上传的 blob 数据,在本方案中为包含文本的图像。 存储帐户提供多种不同的服务,但本教程使用 Blob 存储和表存储。

    Visual Studio Code Azure 门户 Azure CLI
  • 仍在 Azure 资源浏览器中,找到新的存储资源,展开资源以查看节点。
  • 右键单击“Blob 容器”,然后选择“创建 Blob 容器”。
  • 输入名称 imageanalysis 。 这将创建一个专用容器。
  • 在 Azure 门户中从专用容器更改为公共容器

    此过程需要一个公共容器。 若要更改该配置,请在 Azure 门户中进行更改。

  • 右键单击 Azure 资源管理器中的存储资源,选择“在门户中打开”。
  • 在“数据存储”部分,选择“容器”。
  • 找到容器 imageanalysis ,然后选择行尾的 ... (省略号)。
  • 选择“更改访问级别”。
  • 选择“Blob (仅匿名读取访问 blob)”,然后选择“确定”。
  • 返回到 Visual Studio Code。
  • 在 Visual Studio Code 中检索连接字符串

  • 在 Visual Studio Code 中,选择 Shift + Alt + A 以打开 Azure 资源管理器。
  • 右键单击存储资源,然后选择“复制连接字符串”。
  • 将该内容粘贴到某个位置,以供稍后使用。
  • 还需要记下存储帐户名称 msdocsstoragefunction ,以供稍后使用。
  • 订阅 :选择所需的订阅。
  • 资源组 :选择“新建”并输入名称 msdocs-storage-function ,然后选择“确定”。
  • 存储帐户名称 :输入值 msdocsstoragefunction 。 存储帐户名称在 Azure 中必须是唯一的,因此你可能需要在名称后面添加数字,例如 msdocsstoragefunction123
  • 区域 :选择离你最近的区域。
  • 性能 :选择“标准”。
  • 冗余 :保持选中默认值。
  • Azure CLI 命令可以在 Azure Cloud Shell 中或是 安装了 Azure CLI 的工作站上运行。

    若要创建存储帐户和容器,可以运行如下所示的 CLI 命令。

    az group create --location eastus --name msdocs-storage-function \
    az storage account create --name msdocsstorageaccount --resource-group msdocs-storage-function -l eastus --sku Standard_LRS \
    az storage container create --name imageanalysis --account-name msdocsstorageaccount --resource-group msdocs-storage-function
    

    你可能需要稍等片刻,让 Azure 预配这些资源。

    命令完成后,还需要检索存储帐户的连接字符串。 稍后将使用连接字符串将 Azure Function 连接到存储帐户。

    az storage account show-connection-string -g msdocs-storage-function -n msdocsstorageaccount
    

    复制 connectionString 属性的值,并将其粘贴到某处供稍后使用。 此外,还需要记下存储帐户名称 msdocsstoragefunction 供稍后使用。

    创建计算机视觉服务

    接下来,创建计算机视觉服务帐户来处理上传的文件。 计算机视觉是 Azure 认知服务的一部分,可提供各种用于从图像中提取数据的功能。 有关计算机视觉的详细信息,请阅读概述页面

    Azure 门户 Azure CLI
  • 选择底部的“查看 + 创建”。 Azure 会花点时间验证输入的信息。 验证设置后,选择“创建”,Azure 将开始预配计算机视觉服务,这可能需要一些时间。

  • 操作完成后,选择“转到资源”。

    接下来,我们需要找到计算机视觉服务的密钥和终结点 URL,以在 Azure Function App 中使用。

  • 在“计算机视觉”概述页面上,选择“密钥和终结点”。

  • 在“密钥和终结点”页面上,复制“密钥 1”值和“终结点”值,并将它们粘贴到某处供稍后使用。 终结点的格式应为 https://YOUR-RESOURCE-NAME.cognitiveservices.azure.com/

    若要创建计算机视觉服务,可以运行以下 CLI 命令。

    az cognitiveservices account create \
        --name msdocs-process-image \
        --resource-group msdocs-storage-function \
        --kind ComputerVision \
        --sku F1 \
        --location eastus2 \
        --yes
    

    你可能需要稍等片刻,让 Azure 预配这些资源。

    创建计算机视觉服务后,可以使用以下命令检索密钥和 URL 终结点。

        az cognitiveservices account keys list \
        --name msdocs-process-image \
        --resource-group msdocs-storage-function  \ 
        az cognitiveservices account list \
        --name msdocs-process-image \
         --resource-group msdocs-storage-function --query "[].properties.endpoint"   
    

    下载并配置示例项目

    本教程中使用的 Azure 函数的代码可在此 GitHub 存储库 的 JavaScript 子目录中找到。 也可以使用以下命令克隆项目。

    git clone https://github.com/Azure-Samples/msdocs-storage-bind-function-service.git \
    cd msdocs-storage-bind-function-service/javascript \
    code .
    

    示例项目将完成以下任务:

  • 检索环境变量以连接到存储帐户和计算机视觉服务
  • 接受上传的文件作为 blob 参数
  • 使用计算机视觉服务分析 blob
  • 使用输出绑定将分析后的图像文本发送到新表行
  • 下载并打开项目后,需要了解一些基本概念:

  • 数据输入 - BlobTrigger ("type": "blobTrigger") 用于将函数绑定到 Blob 存储中的上传事件。 触发器有两个必需的参数:

  • path:触发器监视事件的路径。 该路径包括容器名称 imageanalysis 以及 blob 名称的变量替换。 此 blob 名称是从 name 属性中检索的。
  • name:已上传的 blob 的名称。 myBlob 的使用是传入函数的 blob 的参数名称。 请勿更改值 myBlob
  • connection:存储帐户的连接字符串。 值 StorageConnectionlocal.settings.json 文件中的名称匹配。
  • 数据输出 - TableBinding ("type": "table") 用于将出站数据绑定到存储表。

  • tableName:写入函数返回的已分析图像文本值的表的名称。 该表必须已存在。
  • connection:存储帐户的连接字符串。 值 StorageConnectionlocal.settings.json 文件中的名称匹配。
  • // ProcessImageUpload/index.js const { v4: uuidv4 } = require('uuid'); const { ApiKeyCredentials } = require('@azure/ms-rest-js'); const { ComputerVisionClient } = require('@azure/cognitiveservices-computervision'); const sleep = require('util').promisify(setTimeout); const STATUS_SUCCEEDED = "succeeded"; const STATUS_FAILED = "failed" async function readFileUrl(context, computerVisionClient, url) { try { context.log(`uri = ${url}`); // To recognize text in a local image, replace client.read() with readTextInStream() as shown: let result = await computerVisionClient.read(url); // Operation ID is last path segment of operationLocation (a URL) let operation = result.operationLocation.split('/').slice(-1)[0]; // Wait for read recognition to complete // result.status is initially undefined, since it's the result of read while (result.status !== STATUS_SUCCEEDED) { await sleep(1000); result = await computerVisionClient.getReadResult(operation); let contents = ""; result.analyzeResult.readResults.map((page) => { page.lines.map(line => { contents += line.text + "\n\r" return contents; } catch (err) { console.log(err); module.exports = async function (context, myBlob) { try { context.log("JavaScript blob trigger function processed blob \n Blob:", context.bindingData.blobTrigger, "\n Blob Size:", myBlob.length, "Bytes"); const computerVision_ResourceKey = process.env.ComputerVisionKey; const computerVision_Endpoint = process.env.ComputerVisionEndPoint; const computerVisionClient = new ComputerVisionClient( new ApiKeyCredentials({ inHeader: { 'Ocp-Apim-Subscription-Key': computerVision_ResourceKey } }), computerVision_Endpoint); // URL must be full path const textContext = await readFileUrl(context, computerVisionClient, context.bindingData.uri); context.bindings.tableBinding = []; context.bindings.tableBinding.push({ PartitionKey: "Images", RowKey: uuidv4().toString(), Text: textContext } catch (err) { context.log(err); return;

    此代码还从环境变量中检索基本配置值,例如 Blob 存储连接字符串和计算机视觉密钥。 这些环境变量在部署后添加到 Azure 函数环境。

    默认函数还使用称为 AnalyzeImage 的第二种方法。 此代码使用计算机视觉帐户的 URL 终结点和密钥向计算机视觉发出处理图像的请求。 该请求返回图像中发现的所有文本。 此文本使用出站绑定写入表存储。

    配置本地设置

    若要在本地运行项目,请在 ./local.settings.json 文件中输入环境变量。 使用之前在创建 Azure 资源时保存的值填充占位符值。

    尽管 Azure 函数代码在本地运行,但它将连接到基于云的存储服务,而不是使用任何本地模拟器。

    "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "", "FUNCTIONS_WORKER_RUNTIME": "node", "StorageConnection": "your-storage-account-connection-string", "StorageAccountName": "your-storage-account-name", "StorageContainerName": "your-storage-container-name", "ComputerVisionKey": "your-computer-vision-key", "ComputerVisionEndPoint": "https://REPLACE-WITH-YOUR-RESOURCE-NAME.cognitiveservices.azure.com/"

    创建 Azure Functions 应用

    现在可以使用 Visual Studio Code 扩展将应用程序部署到 Azure。

  • 在 Visual Studio Code 中,选择 Shift + Alt + A 以打开 Azure 资源管理器。

  • 在“Functions”部分,找到并右键单击订阅,然后选择“在 Azure 中创建函数应用(高级)”。

  • 使用下表创建函数资源。

  • 上一个资源创建过程完成后,在 Azure 资源管理器的“Functions”部分中右键单击新资源,然后选择“部署到函数应用”。
  • 如果系统询问“是否确定要部署...”,请选择“部署”。
  • 该过程完成后,会显示一条通知,其中包含“上传设置”的选项。 选择该选项。 这会将值从 local.settings.json 文件复制到 Azure 函数应用中。 如果通知在你进行选择之前就消失了,请继续执行下一部分。
  • 为存储和计算机视觉添加应用设置

    如果在通知中选择了“上传设置”,请跳过此部分。

    Azure 函数已成功部署,但它还无法连接到存储帐户和计算机视觉服务。 必须先将正确的密钥和连接字符串添加到 Azure Functions 应用的配置设置。

  • 在 Azure 资源管理器的“Functions”部分,查找你的资源,右键单击“应用程序设置”,然后选择“添加新设置”。

  • 为以下机密输入新的应用设置。 将机密值从本地项目复制并粘贴到 local.settings.json 文件中。

    将 Azure Function 连接到不同服务所需的所有环境变量现已到位。

    将图像上传到 Blob 存储

    现在可以测试应用程序了! 你可以将 blob 上传到容器,然后验证图像中的文本是否已保存到表存储。

  • 在 Visual Studio Code 的 Azure 资源管理器中,在“存储”部分查找并展开你的存储资源。
  • 展开“Blob 容器”,右键单击容器名称 imageanalysis,然后选择“上传文件”。
  • 你可以在可下载示例项目的根目录的 images 文件夹中找到一些示例图像,也可以使用自己的图像。
  • 对于“目标目录”,接受默认值 /
  • 等待文件上传并列在容器中。
  • 查看图片的文本分析

    接下来,可以验证上传是否触发了 Azure Function,以及图像中的文本是否已正确分析并保存到表存储中。

  • 在 Visual Studio Code 的 Azure 资源管理器中,在同一存储资源下,展开“表”查找你的资源。
  • ImageText 表现在应该可用。 单击该表可预览其中的数据行。 你应会看到已上传文件的已处理图像文本的条目。 可以使用时间戳或通过查看“文本”列的内容来验证这一点。
  • 恭喜! 你已成功使用 Azure Functions 和计算机视觉处理上传到 Blob 存储的图像。

    请使用下表帮助解决此过程中的问题。

  •