服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity实现识别图像中主体及其位置

Unity实现识别图像中主体及其位置

2023-02-08 14:23CoderZ1010 C#

EasyDL基于飞桨开源深度学习平台,面向企业AI应用开发者提供零门槛AI开发平台,实现零算法基础定制高精度AI模型。本文将利用Unity和EasyDL实现识别图像中主体及其位置,感兴趣的可以了解一下

EasyDL图像分割介绍

Unity实现识别图像中主体及其位置

 

创建应用

1.进入百度AI开放平台打开控制台:

Unity实现识别图像中主体及其位置

2.在左上角打开产品服务列表,找到EasyDL零门槛AI开放平台:

Unity实现识别图像中主体及其位置

3.打开EasyDL图像:

Unity实现识别图像中主体及其位置

4.在公有云部署-应用列表中创建一个应用:

Unity实现识别图像中主体及其位置

5.创建完成后获取到AppID、API Key、Secret Key:

Unity实现识别图像中主体及其位置

 

创建模型

1.进入EasyGL图像分割:

Unity实现识别图像中主体及其位置

2.创建模型:

Unity实现识别图像中主体及其位置

Unity实现识别图像中主体及其位置

3.创建数据集:

Unity实现识别图像中主体及其位置

Unity实现识别图像中主体及其位置

4.数据导入:

Unity实现识别图像中主体及其位置

上传图片,图片的数量尽量多些

Unity实现识别图像中主体及其位置

导入完成后查看并标注:

Unity实现识别图像中主体及其位置

框选目标所在范围:

Unity实现识别图像中主体及其位置

添加标签并为框选的目标设置标签:

Unity实现识别图像中主体及其位置

设置完成后保存当前标注:

Unity实现识别图像中主体及其位置

5.训练模型:(开始训练后需要等待一定时间)

Unity实现识别图像中主体及其位置

6.发布模型:

Unity实现识别图像中主体及其位置

发布完成后,拿到接口地址,来到Unity中,根据接口响应字段说明定义相应数据结构:

Unity实现识别图像中主体及其位置

using System;

[Serializable]
public class ImageSegmentationResponse
{
  /// <summary>
  /// 唯一的log id 用于问题定位
  /// </summary>
  public int log_id;
  /// <summary>
  /// 标签数组结果
  /// </summary>
  public ImageSegmentationResult[] results;
}
[Serializable]
public class ImageSegmentationResult
{
  /// <summary>
  /// 标签名称
  /// </summary>
  public string name;
  /// <summary>
  /// 置信度
  /// </summary>
  public string score;
  /// <summary>
  /// 位置
  /// </summary>
  public Location location;
  /// <summary>
  /// 基于游程编码的字符串,编码内容为和原图宽高相同的布尔数组
  /// 若数组值为0,代表原图此位置像素点不属于检测目标,若为1,代表原图此位置像素点属于检测目标
  /// </summary>
  public bool[] mask;
}
[Serializable]
public class Location
{
  /// <summary>
  /// 目标定位位置的长方形左上顶点的水平坐标
  /// </summary>
  public int left;
  /// <summary>
  /// 目标定位位置的长方形左上顶点的垂直坐标
  /// </summary>
  public int top;
  /// <summary>
  /// 目标定位位置的长方形的宽度
  /// </summary>
  public int width;
  /// <summary>
  /// 目标定位位置的长方形的高度
  /// </summary>
  public int height;
}

在任意一个模块下载C#SDK,例如在图像识别中下载,它是包含EasyDL的API内容的:

Unity实现识别图像中主体及其位置

有了SDK后,放入Unity中的Plugins文件夹中,封装调用函数,只需要将检测图片的字节数据作为参数,其中appID、apiKey、secretKey是在上面创建应用时获取到的,url是发布模型时获取到的:

using System;
using UnityEngine;

/// <summary>
/// 图像分割
/// </summary>
public class ImageSegmentation
{
  private const string appID = "";
  private const string apiKey = "";
  private const string secretKey = "";
  private const string url = "";

  public static ImageSegmentationResult[] SendRequest(byte[] bytes)
  {
      var client = new Baidu.Aip.EasyDL.EasyDL(appID, apiKey, secretKey);
      try
      {
          var response = client.requestImage(url, bytes);
          Debug.Log(response.ToString());
          ImageSegmentationResponse r = JsonUtility.FromJson<ImageSegmentationResponse>(response.ToString());
          return r.results;

      }
      catch (Exception error)
      {
          Debug.LogError(error);
      }
      return null;
  }
}

测试图片:

Unity实现识别图像中主体及其位置

测试代码:

using System.IO;
using UnityEngine;

public class Example : MonoBehaviour
{
  private void Start()
  {
      ImageSegmentation.SendRequest(File.ReadAllBytes(Application.dataPath + "/1.jpg"));
  }
}

返回结果:

Unity实现识别图像中主体及其位置

拿到了定位数据后,接下来将其区域绘制出来, 响应说明中解释(left,top)构成左上顶点,但是从返回值来看top为16,减去一个高度312的话,左下顶点的坐标已经是负数,这里姑且猜想它构成的是左下顶点:

Unity实现识别图像中主体及其位置

首先创建一个Image来放置我们的测试图片,Canvas、Image大小也设为测试图片的大小640 * 359:

Unity实现识别图像中主体及其位置

Unity实现识别图像中主体及其位置

以下是测试脚本,将其挂载于Image测试:

using System.IO;
using UnityEngine;

public class Example : MonoBehaviour
{
  private void Start()
  {
      var results = ImageSegmentation.SendRequest(File.ReadAllBytes(Application.dataPath + "/测试.jpg"));

      for (int i = 0; i < results.Length; i++)
      {
          var location = results[i].location;

          LineRenderer line = new GameObject("LineRenderer").AddComponent<LineRenderer>();
          line.positionCount = 4;
          line.loop = true;

          Vector2 leftTop = new Vector2(location.left, location.top);
          Vector2 rightTop = new Vector2(location.left + location.width, location.top);
          Vector2 leftBottom = new Vector2(location.left, location.top + location.height);
          Vector2 rightBottom = new Vector2(location.left + location.width, location.top + location.height);

          RectTransformUtility.ScreenPointToWorldPointInRectangle(transform as RectTransform, leftTop, Camera.main, out Vector3 point1);
          RectTransformUtility.ScreenPointToWorldPointInRectangle(transform as RectTransform, rightTop, Camera.main, out Vector3 point2);
          RectTransformUtility.ScreenPointToWorldPointInRectangle(transform as RectTransform, rightBottom, Camera.main, out Vector3 point3);
          RectTransformUtility.ScreenPointToWorldPointInRectangle(transform as RectTransform, leftBottom, Camera.main, out Vector3 point4);

          line.SetPosition(0, point1);
          line.SetPosition(1, point2);
          line.SetPosition(2, point3);
          line.SetPosition(3, point4);
      }
  }
}

Unity实现识别图像中主体及其位置

emmm... 区域大概准确吧,可能测试的模型数据集足够丰富的话检测会更精确。

以上就是Unity实现识别图像中主体及其位置的详细内容,更多关于Unity的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/qq_42139931/article/details/123029331

延伸 · 阅读

精彩推荐
  • C#C# log4net日志库的用法小结

    C# log4net日志库的用法小结

    log4net日志开源库是用来控制日志文件大小,日志文件个数,滚动式覆盖,自由控制日志打印等级,今天通过本文给大家介绍C# log4net日志库的用法小结,感...

    Genven_Liang3822022-12-06
  • C#C#自定义控件实现TextBox禁止粘贴的方法

    C#自定义控件实现TextBox禁止粘贴的方法

    这篇文章主要介绍了C#自定义控件实现TextBox禁止粘贴的方法,结合具体实例形式分析了C#自定义控件的创建、使用方法及TextBox禁止粘贴的实现技巧,需要的朋...

    JoeBlackzqq9432022-01-07
  • C#C#使用for循环移除HTML标记

    C#使用for循环移除HTML标记

    大家在项目开发阶段移除文字中的html标记最常用的方法就是使用正则表达式,但是正则表达式不能处理所有的html文档,所以采用迭代方式会更好,下面小...

    Jaxu8892021-12-03
  • C#一个状态机的实现

    一个状态机的实现

    本文主要介绍了C#实现一个状态机的思路与方法,具有很好的参考价值,下面跟着小编一起来看下吧...

    诺贝尔8592021-12-22
  • C#c# 使用WebRequest实现多文件上传

    c# 使用WebRequest实现多文件上传

    这篇文章主要介绍了c# 使用WebRequest实现多文件上传的方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    陈开华10772022-11-08
  • C#C#中实现一次执行多条带GO的sql语句实例

    C#中实现一次执行多条带GO的sql语句实例

    这篇文章主要介绍了C#中实现一次执行多条带GO的sql语句,以实例形式较为详细的分析了C#执行sql语句的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考...

    yenange5372021-10-27
  • C#c# 用Base64实现文件上传

    c# 用Base64实现文件上传

    这篇文章主要介绍了c# 用Base64实现文件上传的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    Charles_Su7212022-09-29
  • C#C#编程调用Cards.dll实现图形化发牌功能示例

    C#编程调用Cards.dll实现图形化发牌功能示例

    这篇文章主要介绍了C#编程调用Cards.dll实现图形化发牌功能,结合实例形式分析了C#动态链接库调用及图形操作技巧,需要的朋友可以参考下...

    songkexin3502022-01-11