添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
健壮的烤地瓜  ·  Gpon Epon Xpon Modem ...·  6 月前    · 
玉树临风的口罩  ·  错误提示·  7 月前    · 
考研的海豚  ·  发送到 Kindle · ...·  8 月前    · 

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

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

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

在本教程中,您将学习如何执行以下操作:

  • 将图像和文件上传到 Blob 存储
  • 使用 Azure Function 事件触发器处理上传到 Blob 存储的数据
  • 使用认知服务分析图像
  • 使用 Azure Function 输出绑定将数据写入表存储
  • 具有活动订阅的 Azure 帐户。 免费创建帐户
  • 已安装 Visual Studio 2022
  • 创建存储帐户和容器

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

    Azure 门户 Azure CLI
  • 订阅 :选择所需的订阅。
  • 资源组 :选择“新建”并输入名称 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”值和“终结点”值,并将它们粘贴到某处供稍后使用。

    若要创建计算机视觉服务,可以运行以下 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 Function 的代码可在此 GitHub 存储库中找到。 也可以使用以下命令克隆项目。

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

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

  • 检索环境变量以连接到存储帐户和计算机视觉服务
  • 接受上传的文件作为 blob 参数
  • 使用计算机视觉服务分析 blob
  • 使用输出绑定将分析后的图像文本发送到新表行
  • 下载并打开项目后,需要了解下面显示的主要 Run 方法中的一些基本概念。 Azure Function 使用触发器和输出绑定,这些绑定通过 Run 方法签名上的属性来应用。

    Table 属性使用两个参数。 第一个参数指定要写入函数返回的已分析图像文本值的表的名称。 第二个 Connection 参数从环境变量中请求表存储连接字符串,以便 Azure Function 可以访问它。

    BlobTrigger 属性用于将 Azure Function 绑定到 Blob 存储中的上传事件,并将上传的 blob 提供给 Run 函数。 blob 触发器本身有两个参数 - 一个是要监视上传的 blob 容器的名称,另一个是存储帐户的连接字符串。

    // Azure Function name and output Binding to Table Storage
    [FunctionName("ProcessImageUpload")]
    [return: Table("ImageText", Connection = "StorageConnection")]
    // Trigger binding runs when an image is uploaded to the blob container below
    public async Task<ImageContent> Run([BlobTrigger("imageanalysis/{name}", 
            Connection = "StorageConnection")]Stream myBlob, string name, ILogger log)
        // Get connection configurations
        string subscriptionKey = Environment.GetEnvironmentVariable("ComputerVisionKey");
        string endpoint = Environment.GetEnvironmentVariable("ComputerVisionEndpoint");
        string imgUrl = $"https://{ Environment.GetEnvironmentVariable("StorageAccountName")}
                            .blob.core.windows.net/imageanalysis/{name}";
        ComputerVisionClient client = new ComputerVisionClient(
            new ApiKeyServiceClientCredentials(subscriptionKey)) { Endpoint = endpoint };
        // Get the analyzed image contents
        var textContext = await AnalyzeImageContent(client, imgUrl);
        return new ImageContent { 
            PartitionKey = "Images",
            RowKey = Guid.NewGuid().ToString(), Text = textContext 
    public class ImageContent
        public string PartitionKey { get; set; }
        public string RowKey { get; set; }
        public string Text { get; set; }
    

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

    ProcessImage 函数还使用称为 AnalyzeImage 的第二种方法,如下所示。 此代码使用计算机视觉帐户的 URL 终结点和密钥向该服务器发出处理图像的请求。 请求将返回在图像中发现的所有文本,然后使用 Run 方法上的输出绑定将其写入表存储。

    static async Task<string> ReadFileUrl(ComputerVisionClient client, string urlFile)
        // Analyze the file using Computer Vision Client
        var textHeaders = await client.ReadAsync(urlFile);
        string operationLocation = textHeaders.OperationLocation;
        Thread.Sleep(2000);
        // Complete code omitted for brevity, view in sample project
        return text.ToString();
    

    在本地运行

    如果你想在本地运行项目,可以使用 local.settings.json 文件填充环境变量。 在此文件中,使用之前在创建 Azure 资源时保存的值填充占位符值。

    尽管 Azure Function 代码将在本地运行,但它仍将连接到 Azure 上的实时服务,而不是使用任何本地模拟器。

    "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet", "StorageConnection": "your-storage-account-connection-string", "StorageAccountName": "your-storage-account-name", "ComputerVisionKey": "your-computer-vision-key", "ComputerVisionEndPoint": "your-computer-vision-endpoint"

    将代码部署到 Azure Functions

    现在可以使用 Visual Studio 将应用程序部署到 Azure。 在部署过程中,还可以同时在 Azure 中创建 Azure Functions 应用。

  • 首先,右键单击 ProcessImage 项目节点并选择“发布”。

  • 在“发布”对话框屏幕上,选择 Azure 并选择“下一步”。

  • 在下一个屏幕上选择“Azure Function App (Windows)”或“Azure Function App (Linux)”,然后再次选择“下一步”。

  • 在“Functions 实例”步骤中,确保选择要部署到的订阅。 接下来,选择对话框右侧的绿色 + 符号。

  • 将打开一个新对话框。 为新的 Function App 输入以下值。

  • 名称:输入 msdocsprocessimage 或类似名称。
  • 订阅名称:选择你想使用的任何订阅。
  • 资源组:使用之前创建的 msdocs-storage-function 资源组。
  • 计划类型:选择“消耗”。
  • 位置:选择离你最近的区域。
  • Azure 存储:选择之前创建的存储帐户。
  • 该过程完成后,选择“完成”以关闭对话框工作流。

  • 部署 Azure Function 的最后一步是选择屏幕右上角的“发布”。 发布函数可能也需要一些时间才能完成。 完成后,应用程序将在 Azure 上运行。

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

  • 在 Azure 门户顶部,搜索“function”并从结果中选择“Function App”。

  • 在“Function App”屏幕上,选择在 Visual Studio 中创建的 Function App。

  • 在“Function App”概述页面上,选择左侧导航栏中的“配置”。 这将打开一个页面,我们可以在其中管理应用的各种类型的配置设置。 目前,我们对“应用程序设置”部分感兴趣。

  • 下一步是为存储帐户名称和连接字符串、计算机视觉密钥和计算机视觉终结点添加设置。

  • 在“应用程序设置”选项卡上,选择“+ 新建应用程序设置”。 在出现的浮出控件中,输入以下值:

  • 名称:输入值 ComputerVisionKey。
  • :粘贴之前保存的计算机视觉密钥。
  • 单击“确定”将此设置添加到应用。

  • 接下来,让我们使用以下值对计算机视觉服务的终结点重复此过程:

  • 名称:输入值 ComputerVisionEndpoint。
  • :粘贴之前保存的终结点 URL。
  • 使用以下值对存储帐户连接再次重复此步骤:

  • 名称:输入值 StorageConnection。
  • :粘贴之前保存的连接字符串。
  • 最后,使用以下值对存储帐户名称再次重复此过程:

  • 名称:输入值 StorageAccountName。
  • :输入创建的存储帐户的名称。
  • 添加这些应用程序设置后,请确保选择配置页面顶部的“保存”。 保存完成后,还可以点击“刷新”,确保已获得设置。

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

    将图像上传到 Blob 存储

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

  • 首先,在 Azure 门户顶部,搜索“存储”并选择“存储帐户”。 在“存储帐户”页面上,选择之前创建的帐户。

  • 接下来,选择左侧导航栏中的“容器”,然后导航到之前创建的 ImageAnalysis 容器。 在此处,可以直接在浏览器中上传测试图像。

  • 你可以在可下载示例项目的根目录的 images 文件夹中找到一些示例图像,也可以使用自己的图像。

  • 在 ImageAnalysis 页面顶部,选择“上传”。 在打开的浮出控件中,选择右侧的文件夹图标以打开文件浏览器。 选择要上传的图片,然后选择“上传”。

  • 该文件应出现在 blob 容器中。 接下来,可以验证上传是否触发了 Azure Function,以及图像中的文本是否已正确分析并保存到表存储中。

  • 使用页面顶部的痕迹导航,在存储帐户中向上导航一级。 在左侧导航栏中找到并选择“存储浏览器”,然后选择“表”。

  • ImageText 表现在应该可用。 单击该表可预览其中的数据行。 你应该会看到上传的已处理图像文本的相应条目。 可以使用时间戳或通过查看“文本”列的内容来验证这一点。

  • 从列表中选择 msdocs-storage-function 资源组。
  • 选择资源组概述页面顶部的“删除资源组”按钮。
  • 在确认对话框中输入资源组名称 msdocs-storage-function。
  • 选择“删除”。 删除资源组的过程可能需要几分钟才能完成。
  •