问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用Azure+C#+Visual Studio开发图像目标检测系统

创作时间:
作者:
@小白创作中心

使用Azure+C#+Visual Studio开发图像目标检测系统

引用
CSDN
1.
https://m.blog.csdn.net/qq_35837578/article/details/142066188

在这篇文章中,我们将讲解如何使用Azure、C#和Visual Studio开发图像目标检测系统。虽然笔者是第一次接触C#,但凭借之前在Python、Java和Scala方面的经验,发现C#和.NET确实是一个非常好用的开发系统。C#与Java非常相似,因此如果熟悉其中一个,学习另一个会非常快。

目标检测简介

目标检测是一种计算机视觉技术,用于在图像或视频中识别并定位特定物体的类别和位置。它主要分为两个部分:定位和识别。这类似于我们小时候玩的套圈游戏,需要先确定目标的范围,然后识别出目标是什么。

在深度学习时代之前,目标检测被认为是一个非常困难的问题,效果也不理想。但随着深度学习的发展,这个问题已经得到了很好的解决。目前最流行且效果最好的框架是YOLO,它可以在Flask、Django等框架或嵌入式设备(如无人机或相机)上轻松使用。

开发环境搭建

1. 安装Visual Studio

这是整个开发过程中最简单的一部分。需要注意的是,Visual Studio和Visual Studio Code是两个不同的软件,后者是前者的简化版。以下是安装指南:

虽然Visual Studio Code也能完成开发工作,但建议使用命令行进行操作。

2. 注册Azure账号

这是相对复杂的一部分。建议直接参考微软的官方文档,尽管文档较长且格式较为正式,但确实能解决问题。ChatGPT等AI工具可能提供过时的信息,而且没有图片说明,因此建议直接查看官方文档。

在创建资源后,需要记录下密钥和终结点信息。为了安全起见,建议将这些信息保存在一个JSON文件中,而不是直接写入代码:

{
  "COMPUTER_VISION_KEY": "",
  "COMPUTER_VISION_ENDPOINT": ""
}

代码实现

接下来,我们将使用C#编写程序来实现图像目标检测功能。在开始编码之前,需要通过NuGet安装所需的包。在Visual Studio中,这个过程非常简单。

以下是完整的代码示例:

using System;
using System.IO;
using System.Text.Json; // 用于处理 JSON 数据
using Microsoft.Azure.CognitiveServices.Vision.ComputerVision; // Azure 计算机视觉服务库
using Microsoft.Azure.CognitiveServices.Vision.ComputerVision.Models; // 计算机视觉相关模型
using System.Collections.Generic;
using System.Threading.Tasks;

class Program
{
    // 存储 Azure 计算机视觉服务的终端点和密钥
    private static string endpoint;
    private static string key;

    // 程序的入口点
    static async Task Main(string[] args)
    {
        // 定义配置文件的路径
        var configPath = @"";
        // 检查配置文件是否存在
        if (!File.Exists(configPath))
        {
            Console.WriteLine("Configuration file does not exist.");
            return;
        }
        try
        {
            // 从配置文件中读取并反序列化 JSON 配置
            var config = JsonSerializer.Deserialize<Dictionary<string, string>>(File.ReadAllText(configPath));
            // 检查是否包含所需的键值
            if (config == null || !config.ContainsKey("COMPUTER_VISION_ENDPOINT") || !config.ContainsKey("COMPUTER_VISION_KEY"))
            {
                Console.WriteLine("Configuration file is missing required keys.");
                return;
            }
            // 设置终端点和密钥
            endpoint = config["COMPUTER_VISION_ENDPOINT"];
            key = config["COMPUTER_VISION_KEY"];
            // 检查终端点或密钥是否为空
            if (string.IsNullOrEmpty(endpoint) || string.IsNullOrEmpty(key))
            {
                Console.WriteLine("Endpoint or key is not set in the configuration file.");
                return;
            }
        }
        catch (JsonException ex)
        {
            // 捕获 JSON 解析错误
            Console.WriteLine($"Error reading configuration file: {ex.Message}");
            return;
        }

        // 定义图像的相对路径
        string imagePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "images", "image.jpg");
        Console.WriteLine($"Image Path: {imagePath}");

        // 输出当前目录
        Console.WriteLine($"Current Directory: {Directory.GetCurrentDirectory()}");

        // 列出 images 文件夹中的所有文件
        string imagesDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "images");
        // 检查 images 目录是否存在
        if (Directory.Exists(imagesDirectory))
        {
            Console.WriteLine("Files in images directory:");
            // 输出 images 文件夹中的所有文件
            foreach (var file in Directory.GetFiles(imagesDirectory))
            {
                Console.WriteLine(file);
            }
        }
        else
        {
            Console.WriteLine("Images directory does not exist.");
            return;
        }

        // 检查图像文件是否存在
        if (!File.Exists(imagePath))
        {
            Console.WriteLine("File does not exist.");
            return;
        }

        try
        {
            // 创建 Azure 计算机视觉服务客户端
            ComputerVisionClient client = new ComputerVisionClient(new ApiKeyServiceClientCredentials(key))
            {
                Endpoint = endpoint
            };

            // 读取图像文件流并分析图像中的物体
            using (var imageStream = new FileStream(imagePath, FileMode.Open))
            {
                // 调用 Azure 计算机视觉服务的 API 以检测图像中的物体
                var result = await client.AnalyzeImageInStreamAsync(imageStream, new List<VisualFeatureTypes?> { VisualFeatureTypes.Objects });
                // 遍历检测结果并输出物体的名称、置信度和位置
                foreach (var obj in result.Objects)
                {
                    Console.WriteLine($"Object: {obj.ObjectProperty}, Confidence: {obj.Confidence}, Location: {obj.Rectangle.X}, {obj.Rectangle.Y}, {obj.Rectangle.W}, {obj.Rectangle.H}");
                }
            }
        }
        catch (UriFormatException ex)
        {
            // 捕获 URI 格式错误
            Console.WriteLine($"Invalid URI: {ex.Message}");
        }
        catch (Exception ex)
        {
            // 捕获其他异常
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}

在开发过程中,还需要注意文件路径的问题。以下是开发路径的截图:

可能的扩展方向

除了上述实现,还可以考虑以下扩展方向:

  1. 使用前端框架(如Angular、Vue或React)与后端进行交互
  2. 使用其他云服务(如AWS或腾讯云)进行部署
  3. 将目标检测系统部署到嵌入式设备上

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号