当前位置: 首页 > news >正文

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

在这篇文章里面,我们讲解使用Azure+C#+visual studio在Azure上做图像的目标检测系统。

笔者是头一次接触C#。之前以Python Java和Scala为主。感觉C#+.Net是一种挺好用的开发系统。C#和Java非常像。会一个学另一个很快。

首先,目标检测是个什么东西?目标检测是一种计算机视觉技术,用于在图像或视频中识别并定位特定物体的类别和位置。

目标检测,其实分为两个部分。一个是定位,二一个是识别。这有点像我们小时候玩的套圈游戏。也就是说,要首先选出这个框,然后能识别出框里面是啥东西。

目标检测的案例图

目标检测在深度学习曾经在图像处理时代被认为是一个非常难做的问题。在当时目标检测的效果也很差。我记得在我小时候日本进口的照相机能够识别人脸,我们都觉得这是非常牛逼的功能。但是在深度学习时代,这个任务已经做的非常好了。目前最流行,也是最好用的框架便是yolo(可以直接在github,或者ultranalytics的官网上进行查看)。现在,非常好用,非常好训练,也非常容易可以在flask/dijango这样的框架或者嵌入式设备(比如无人机或者照相机)上使用。
在这里插入图片描述

一篇很好的目标检测的review是(笔者后续也会更新一篇文章,估计是2万字长文,详细讲解所有的主流目标检测以及图像分割算法):https://www.cvmart.net/community/detail/3056

1,安装VS,以及在Azure上安装C#

这个可以说是最简单的一部分了(请注意visual studio和visual studio code是两个不同的软件,后者是前者的一个简化版):

这里是安装指南。
https://docs.pingcode.com/ask/ask-ask/108294.html

vscode也能搞。但是我个人推荐用vscode的时候尽量用命令行。

2,注册Azure

这个反而是相对麻烦的一部分。我建议大家直接看微软的官方文档(虽然又臭又长,感觉更像是律师而不是程序员看的东西。但是确实能解决问题。ChatGPT之类的可能给你的是旧信息,而且没有图片。问copolit会是个不错的选择。毕竟是微软自家的产品)。

如何创建Azure账号(AWS,GCP,阿里云,腾讯云,华为云和这个是同一个性质的东西)
https://learn.microsoft.com/zh-cn/dotnet/azure/create-azure-account

这里是关于计算机视觉服务的内容。需要先建立一个资源组,然后在这个资源组里加入计算机视觉的服务
https://learn.microsoft.com/zh-cn/azure/ai-services/custom-vision-service/

需要注意的在这里:
创建好资源以后在这里,记录一下你的密钥和终结点(密钥两个选一个即可):
在这里插入图片描述
我的建议是绝对不要把这两个以明文的形式写入代码里面。最好的办法是写成一个.json文件:

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

然后你就可以开始正式写代码了。

3,正式开搞

在这里,我们用C#写程序来解决问题:

在开搞之前,你需要用Nuget安装需要的package。vs里面,很好用。

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). 能不能把这个目标检测系统装载在嵌入式设备上?

相关文章:

  • 《黑神话.悟空》与人工智能AI重塑经典与探索未来的交织
  • Android内存知识总结
  • JAVA毕业设计173—基于Java+Springboot+vue3的酒店民宿管理系统(源代码+数据库)
  • 浙大数据结构:03-树2 List Leaves
  • 数据库MySQL
  • 源码到class字节码的编译流程 字节码到内存的Java类加载流程
  • 算法提高模板强连通分量tarjan算法
  • AIoTedge边缘计算+边缘物联网平台
  • sed awk 第二版学习(四)—— 基本 sed 命令
  • Matlab如何配置小波工具(Wavelet Toolbox)
  • C++ STL库的使用总结
  • 【项目】云备份
  • Oracle(122)如何进行控制文件的恢复?
  • Linux rm命令详解使用:掌握安全删除技巧
  • 多输入多输出 | Matlab实现SO-BP蛇群算法优化BP神经网络多输入多输出预测
  • #Java异常处理
  • ComponentOne 2017 V2版本正式发布
  • css选择器
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • PHP 小技巧
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Redash本地开发环境搭建
  • 从输入URL到页面加载发生了什么
  • 大型网站性能监测、分析与优化常见问题QA
  • 对超线程几个不同角度的解释
  • 分布式任务队列Celery
  • 聚类分析——Kmeans
  • 力扣(LeetCode)22
  • 前嗅ForeSpider采集配置界面介绍
  • 实现简单的正则表达式引擎
  • 为视图添加丝滑的水波纹
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ###项目技术发展史
  • #《AI中文版》V3 第 1 章 概述
  • #define、const、typedef的差别
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (19)夹钳(用于送货)
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (转载)从 Java 代码到 Java 堆
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .NET CORE Aws S3 使用
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Core中如何集成RabbitMQ
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET大文件上传知识整理
  • [ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)
  • [18] Opencv_CUDA应用之 基于颜色的对象检测与跟踪
  • [2016.7 test.5] T1
  • [20180224]expdp query 写法问题.txt
  • [30期] 我的学习方法