使用Azure+C#+Visual Studio开发图像目标检测系统
使用Azure+C#+Visual Studio开发图像目标检测系统
在这篇文章中,我们将讲解如何使用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}");
}
}
}
在开发过程中,还需要注意文件路径的问题。以下是开发路径的截图:
可能的扩展方向
除了上述实现,还可以考虑以下扩展方向:
- 使用前端框架(如Angular、Vue或React)与后端进行交互
- 使用其他云服务(如AWS或腾讯云)进行部署
- 将目标检测系统部署到嵌入式设备上