使用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}");}}
}

我们做开发的时候还需要注意文件的路径问题。这是我开发路径的截图:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/420230.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【高校主办,EI稳定检索】2024年人机交互与虚拟现实国际会议(HCIVR 2024)

会议简介 2024年人机交互与虚拟现实国际会议&#xff08;HCIVR 2024&#xff09;定于2024年11月15-17日在中国杭州召开&#xff0c;会议由浙江工业大学主办。人机交互&#xff0c;虚拟现实技术的发展趋势主要体现在系统将越来越实际化&#xff0c;也越来越贴近人类的感知和需求…

python-新冠病毒

题目描述 假设我们掌握了特定时间段内特定城市的新冠病毒感染病例的信息。在排名 i 的当天有 i 个案例&#xff0c;即&#xff1a; 第一天有一例感染第二天有两例感染第三天有三例感染以此类推...... 请计算 n 天内的感染总数和每天平均感染数。 输入 整数 n 表示天数&…

将星 x17 安装ubuntu 20.04 双系统

准备工作&#xff0c;包含关闭快速启动&#xff0c;关闭Secret Boot 1.进入控制面板选择小图标&#xff0c;找到电源选项 2.点击更改当前不可用的设置&#xff0c;关闭快速启动 3.开机启动时快速按F2&#xff0c;进入BIOS 4.选择Setup Utiltity&#xff0c;选择Security&#…

LeetCode 热题 100 回顾5

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

ArcGIS之建模处理栅格数据以表格显示分区统计(以夜间灯光数据为例)

当需要计算一个shp数据中多个面中的栅格数据值是&#xff0c;可以通过模型构建器进行批量处理&#xff0c;也就是统计多个面中的栅格数据值。但在处理过程中可能会遇见不同的错误&#xff0c;本文会介绍ERROR000883的解决办法。 数据准备&#xff1a;一个shp数据&#xff08;例…

Idea 创建 Maven项目的时候卡死

文章目录 一、Archetype 和 Catalog1.1 Archetype&#xff08;原型&#xff09;1.2 Catalog&#xff08;目录&#xff09; 二、可能遇到的问题2.1 问题描述2.2 原因分析2.3 解决方案 参考资料 一、Archetype 和 Catalog 1.1 Archetype&#xff08;原型&#xff09; Archetype…

私域电商 IP 化发展的探索与优势

摘要&#xff1a;本文聚焦于私域电商与社交电商的区别&#xff0c;重点探讨私域电商的 IP 属性。深入分析其在获取流量、转化用户以及挖掘用户价值方面的独特优势。同时引入链动 2 1 模式、AI 智能名片、S2B2C 商城小程序源码等元素&#xff0c;详细阐述这些元素在私域电商 IP…

C++——哈希

目录 1.undered系列容器 1.1 undered_map 1.1.1 undered_map特点介绍 1.1.2 undered_map接口介绍 1.2 undered_set 2.底层结构 2.1 哈希概念 2.2 哈希冲突 2.3 哈希函数 2.3.1 哈希函数设计原则&#xff1a; 2.3.2 常见哈希函数 1.直接定值法 2.除留余数法 3.平方…

数学建模笔记——层次分析法

数学建模笔记——层次分析法 数学建模笔记——层次分析法1. 层次分析法的基本原理和步骤2. 层次分析法的建模过程2.1 问题的提出2.2 模型原理2.3 为该问题建立层次结构模型2.4 构造判断矩阵1. 判断矩阵的含义2. 为该问题构造判断矩阵 2.5 一致性检验1. 一致性检验方法2. 对上述…

相机内存卡格式化了照片怎么恢复?格式化恢复详解

摄影爱好者们都知道&#xff0c;相机内存卡是记录我们美好瞬间的重要媒介。然而&#xff0c;在使用过程中&#xff0c;有时我们会因操作不当或设备故障&#xff0c;不小心格式化了内存卡&#xff0c;从而导致珍贵的照片丢失。面对这种情况&#xff0c;我们该如何恢复这些被格式…

电脑pe是什么意思_电脑pe系统作用详细分析

有些小白很好奇&#xff0c;电脑pe是什么意思?所谓的电脑pe系统其实就是当我们的电脑出现问题而不能进入正常系统时候的一种“紧急备用”系统。如果需要重装操作系统的话&#xff0c;以往采用光盘使用的比较多&#xff0c;随着技术的进步&#xff0c;用u盘制作一个pe启动盘去安…

【自然语言处理】实验一:基于NLP工具的中文分词

目录 前言 1. 导入jieba分词器 2. 用精确模式进行中文分词 3. 用全模式进行中文分词 4. 用搜索引擎进行中文分词 5. 利用 lcut返回结果列表(list) 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &a…

避免在C#循环中使用await

在C#中&#xff0c;异步编程因其能够提升应用程序性能和响应能力而变得越来越流行。async和await关键字使得编写异步代码变得更加容易&#xff0c;但如果使用不当&#xff0c;它们也可能引入一些陷阱。一个常见的错误是在循环中使用await&#xff0c;这可能导致性能瓶颈和意外行…

直播相关01-录制麦克风声音,QT上 .pro 将 linux,mac和windows上配置为三种可以共享, 在.pro文件中 message 的作用

一 QT 上的 .pro 文件 将 linux&#xff0c;mac和windows上配置设置为可以共享 1. 先来看文件夹布局 2. 再来看 QT 中的 .pro文件 .pro 文件的写法 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler …

Spring框架的核心模块有哪些

Spring框架的核心模块构成了其基础架构&#xff0c;并为开发者提供了丰富的功能。以下是一些主要的Spring核心模块&#xff1a; Spring Core&#xff1a; 这是Spring框架中最基础的模块&#xff0c;提供了依赖注入&#xff08;DI&#xff09;功能&#xff0c;这是Spring的基石。…

职场答案薄

公司做大的过程就是创始人把职责一层层分摊下去的过程&#xff0c;公司里的各级领导在招聘时的原始诉求都是一样的&#xff0c;就是招到可以帮自己分担一部分工作的人&#xff0c;然后自己好集中精力去做更重要的工作 如何去做运营 1.流程制度&#xff08;三个目的&#xff1a;…

MyBaits的初理解

一.Mybaits的简介 Mybaits就是对JDBC的简化&#xff0c;就是对持久化的实现。 二.基础 需要导的dependencies <dependencies><!-- mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId>&l…

STM32 HAL freertos零基础(二)-通过STM32CubeMX配置Freertos后在程序中进行任务创建,便于任务管理与识别。

1、简介 通过STM32CubeMX配置Freertos后&#xff0c;建立的任务都在freertos.c文件中&#xff0c;不易于观察&#xff0c;并且每次生成新任务还需要打开STM32CubeMX&#xff0c;本次教程讲解一种通过STM32CubeMX配置Freertos后在程序中进行任务创建&#xff0c;起到类似添加传…

【android10】【binder】【2.servicemanager启动——全源码分析】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 …

C语言 | Leetcode C语言题解之第394题字符串解码

题目&#xff1a; 题解&#xff1a; #define N 2000typedef struct {int data[30];;int top; } Stack;void push(Stack *s, int e) { s->data[(s->top)] e; }int pop(Stack *s) { return s->data[--(s->top)]; }//多位数字串转换成int int strToInt(char *s) {cha…