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

news2024/11/17 21:33:29

在这篇文章里面,我们讲解使用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.coloradmin.cn/o/2119637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vulhub spring 远程命令执行漏洞(CVE-2022-22963)

1.执行以下命令启动靶场环境并在浏览器访问 cd spring/CVE-2022-22963docker-compose up -ddocker ps 2.反弹shell 构造payload 3.页面刷新抓包&#xff0c;修改内容 POST /functionRouter HTTP/1.1 Host: 172.16.1.89:8080 Accept-Encoding: gzip, deflate Accept: */* Acc…

任务栏颜色怎么改?快速实现Windows系统任务栏透明,全面指南和操作实践!

任务栏是电脑操作系统的重要组成部分&#xff0c;电脑会自动为任务栏选择颜色&#xff0c;一般分为浅色&#xff08;白色&#xff09;、深色&#xff08;黑色&#xff09;。如果想要设置成自己喜欢的颜色&#xff0c;也是可以更改的&#xff0c;那么任务栏颜色怎么改呢&#xf…

实时图像处理的加速器:《基于FPGA的数字图像处理原理及应用》(可下载)

图像处理技术已成为我们生活中不可或缺的一部分。从智能手机的摄像头到卫星图像分析&#xff0c;从医疗影像到安全监控&#xff0c;图像处理技术的应用无处不在。随着技术的进步&#xff0c;我们对图像处理的速度和质量要求也越来越高。在这一背景下&#xff0c;现场可编程门阵…

CDGA|大模型数据治理的案例与实践深入剖析

随着人工智能技术的飞速发展&#xff0c;大模型在数据治理领域的应用日益广泛&#xff0c;为企业带来了前所未有的机遇与挑战。本文将通过几个具体案例&#xff0c;深入剖析大模型在数据治理中的实践应用&#xff0c;探讨其带来的变革与影响。 大模型在数据治理中的核心优势 大…

大腾智能出席龙华云创中心启动与鸿蒙园揭牌仪式

在数字化转型的浪潮中&#xff0c;深圳市龙华区再次引领行业创新&#xff0c;携手华为云成功举办“龙华工业软件云工程应用创新中心启动仪式暨鸿蒙产业园揭牌仪式”&#xff0c;本次盛会已于8月26日圆满落幕。活动现场&#xff0c;来自全国各地的行业精英、企业领袖及专家学者汇…

资料分析(2)

C B 增长量不变就是1002020 上面是利滚利:按照20%当利息 本题:涨跌幅度的意思就是增长率&#xff0c;本题是按照增长率不变的情况下进行计算D B 7551400X>1.2*100000 B B B 总体增量部分增量之和 先进行计算固定通信业务收入的增长量移动通信业务实现收入的增长量 增长量现期…

11大排序的原理讲解和Python源码剖析

排序算法 【谁教你这么剪的 | 11大排序的原理讲解和Python源码剖析】 https://www.bilibili.com/video/BV1Zs4y1X7mN/?share_sourcecopy_web&vd_sourceed4a51d52f6e5c9a2cb7def6fa64ad6a 稳定&#xff1a;如果a原本在b前面&#xff0c;而ab&#xff0c;排序之后a仍然在b…

如何实现数字孪生?看这篇就够了

数字孪生&#xff08;Digital Twin&#xff09;是一种集成了物理世界和数字世界的先进概念&#xff0c;通过高精度的模拟来反映现实世界的实体或系统。它利用物联网&#xff08;IoT&#xff09;、大数据、人工智能&#xff08;AI&#xff09;、云计算等先进技术&#xff0c;实现…

应对AI挑战的职业发展与培训策略

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;各行各业正经历着前所未有的变革。为了在这场变革中保持竞争力并实现个人职业发展&#xff0c;职场人士需要积极应对AI带来的挑战&#xff0c;通过制定有效的职业发展与培训策略来不断提升自我。以下是几个关…

大数据决策分析平台建设方案(可编辑的56页PPT)

引言&#xff1a;在当今信息爆炸的时代&#xff0c;大数据已成为企业决策制定、业务优化与市场洞察的重要驱动力。为了充分挖掘大数据的潜在价值&#xff0c;提升决策效率与精准度&#xff0c;构建一套高效、灵活、可扩展的大数据决策分析平台显得尤为重要。通过大数据分析平台…

佰朔资本:沪指跌0.23%,金融板块集体上扬,半导体等板块下挫

6日早盘&#xff0c;沪指盘中轰动回落&#xff0c;深证成指、创业板指弱势下探&#xff0c;上证50指数逆市上扬&#xff0c;场内超4400股飘绿。 到午间收盘&#xff0c;沪指跌0.23%报2782点&#xff0c;深证成指跌1.01%&#xff0c;创业板指跌1.29%&#xff0c;上证50指数微涨…

不小心删除丢失了所有短信?如何在 iPhone 上查找和恢复误删除的短信

不小心删除了一条短信&#xff0c;或者丢失了所有短信&#xff1f;希望还未破灭&#xff0c;下面介绍如何在 iPhone 上查找和恢复已删除的短信。 短信通常都是非正式和无关紧要的&#xff0c;但短信中可能包含非常重要的信息。因此&#xff0c;如果您删除了一些短信以清理 iPh…

LeetCode第414场周赛(第一题)

目录 一&#xff1a;题目&#xff1a;3280. 将日期转换为二进制表示 一&#xff1a;题目&#xff1a;3280. 将日期转换为二进制表示 给你一个字符串 date&#xff0c;它的格式为 yyyy-mm-dd&#xff0c;表示一个公历日期。 date 可以重写为二进制表示&#xff0c;只需要将年…

idea创建一个spring项目,并编写一个初级spring项目实战(全网最详细)

1.创建spring项目 创建后界面显示 2.再pom.xml文件中添加Spring框架依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.10</version> </dependency> 注意&…

Spring中FactoryBean的高级用法实战

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

AT3340-6T杭州中科微BDS定位授时板卡性能指标

AT3340-6T是一款高性能多系统卫星定位安全授时板卡&#xff0c;可通过配置支持各个单系统的定位授时。 外观尺寸&#xff1a; 电气参数 应用领域&#xff1a; 通信基站授时 电力授时 广播电视授时 轨道系统授时 金融系统授时 其他授时应用 注意事项&#xff1a; 为了充分发挥…

nvidia-smi命令视图含义

第一部分&#xff1a;NVIDIA-SMI 标题 ---------------------------------------------------------------------------------------- | NVIDIA-SMI 555.42.06 Driver Version: 555.42.06 CUDA Version: 12.5 | ------------------------------------------------------------…

ML 系列:机器学习和深度学习的深层次总结(01)

​ 文章目录 一、说明二、人工智能和机器学习三、机器学习的类型四、结论 一、说明 欢迎学习机器学习系列。这门综合课程目前包括40个部分&#xff0c;指导您了解机器学习、统计和数据分析的基本概念和技术。以下是到目前为止涵盖的关键主题的简要概述&#xff1a; 1 机器学习…

C与汇编之间的相互调用(29)

1 先来看一下 基本的调用规则。 注意&#xff1a; 程序通过 r1 -r4 来保存 传递的参数&#xff0c;如果 超过了 4个参数怎么办&#xff0c; 那就 放到栈里面。 注意&#xff1a; 堆栈是满递减&#xff0c; FD。 子程序的返回结果 会放到R0 里面。 2 然后是 c 语言调用 汇编语言…

如何最好地制定自动化测试策略

尽管不能否认手动测试的价值&#xff0c;自动化测试的需求却在不断增长。自动化测试可以为公司和团队带来许多好处&#xff1a;时间效率高、覆盖面广。 如何最好地制定自动化测试策略呢&#xff1f; 在本文中&#xff0c;我将展示测试自动化策略的所有7个阶段中的一些最佳实践…