前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Unity & EasyDL 图像分割 - 识别图像中主体及其位置

Unity & EasyDL 图像分割 - 识别图像中主体及其位置

作者头像
CoderZ
发布于 2022-08-29 08:36:54
发布于 2022-08-29 08:36:54
80600
代码可运行
举报
运行总次数:0
代码可运行

EasyGL图像分割介绍:

创建应用:

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

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

3.打开EasyGL图像:

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

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

创建模型:

1.进入EasyGL图像分割:

2.创建模型:

3.创建数据集:

4.数据导入:

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

导入完成后查看并标注:

框选目标所在范围:

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

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

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

6.发布模型:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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内容的:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }
}

测试图片:

测试代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.IO;
using UnityEngine;

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

返回结果:

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
        }
    }
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 当代野生程序猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【100个 Unity实用技能】☀️ | UGUI中 判断屏幕中某个坐标点的位置是否在指定UI区域内
问题使用场景:需要判断玩家此时点击的某个点是否在某个指定的UI区域内,如果在区域内则响应点击事件,不在区域内时不进行响应事件。
呆呆敲代码的小Y
2024/01/10
1.3K0
【100个 Unity实用技能】☀️ | UGUI中 判断屏幕中某个坐标点的位置是否在指定UI区域内
Unity 如何实现框选游戏战斗单位
•在屏幕坐标系中绘制框选范围;•根据框选范围定位其在世界坐标系中对应的区域;•在该区域内进行物理检测。
CoderZ
2022/12/26
1.2K0
Unity 如何实现框选游戏战斗单位
unity--实现新手引导功能 一:矩形镂空功能 三、新手引导的方法封装四、事件渗透五、完善优化
2、导入shader,创建两个材质,将两个shader拖到两个材质上。将材质拖动到Image组件的Material上。
酱紫安
2021/03/16
5.6K0
unity--实现新手引导功能
    





        一:矩形镂空功能 三、新手引导的方法封装四、事件渗透五、完善优化
Unity SKFramework框架(十四)、Extension 扩展函数
该部分是框架中使用this关键字给一些类型做的拓展函数,为了支持链式编程或记录、封装一些功能,内容会持续补充,本文给出其中部分示例。
CoderZ
2022/08/29
6290
Unity SKFramework框架(十四)、Extension 扩展函数
【100个 Unity实用技能】 | Unity不规则图片按钮的事件屏蔽
前面写过一篇文章介绍了怎样过滤UI中透明区域的点击事件: 【100个 Unity实用技能】☀️ | Unity中 过滤透明区域的点击事件
呆呆敲代码的小Y
2024/03/19
5050
【100个 Unity实用技能】 | Unity不规则图片按钮的事件屏蔽
unity3d:折线图,读取csv数据,每s生成一段线
1.读取csv表数据,点的数据随机,在3000以上 2.x方向,y方向的最大值根据表读取 3.每1s显示当前的点的数据
立羽
2023/08/24
3590
unity3d:折线图,读取csv数据,每s生成一段线
Unity ugui Anchor锚点自动适配画布中的相对位置
https://blog.csdn.net/qq_39640124/article/details/88284191
汐夜koshio
2020/07/02
2.2K0
Unity ugui Anchor锚点自动适配画布中的相对位置
【Unity游戏开发】UGUI不规则区域点击的实现
  马三从上一家公司离职了,最近一直在出去面试,忙得很,所以这一篇博客拖到现在才写出来。马三在上家公司工作的时候,曾处理了一个UGUI不规则区域点击的问题,制作过程中也有一些收获和需要注意坑,因此记录成博客与大家分享。众所周知在UGUI中,响应点击通常是依附在一张图片上的,而图片不管美术怎么给你切,导进Unity之后都是一个矩形,如果要做其他形状,最多只能旋转一下,或者自己做一些处理。而为了美术效果,很多时候我们不得不需要特定形状的UI,并且让它们实现精准的响应点击。例如下图就是一个不规则的点击区域。
马三小伙儿
2018/09/12
3.6K0
【Unity游戏开发】UGUI不规则区域点击的实现
Unity基础(24)-UGUI
组件属性 Source Image(图像源):纹理格式为Sprite(2D and UI)的图片资源(导入图片后选择Texture Type为Sprite(2D and UI))。 Color(颜色):图片叠加的颜色。 Material(材质):图片叠加的材质,可以用来实现一些特殊效果,如凹凸感觉 Raycast Target(射线投射目标):是否作为射线投射目标,关闭之后忽略UGUI的射线检测。 Set Native Size:点击此按钮则 Image 组件的长宽自动与原图片长宽一致 Image Type(图片显示类型): Simple(基本的):图片整张全显示,不裁切,不叠加,根据边框大小会有拉伸。 Preserve Aspect(锁定比例):针对Simple模式,勾选之后,无论图片的外形放大还是缩小,都会一直保持初始的长宽比例。
孙寅
2020/06/02
4.5K0
AR涂涂乐⭐八、(add)优化原代码“7”、正方形识别图改为矩形识别图、增加BGM和App 图标
问题1:观察前面代码可发现,屏幕的宽和高在start()时便被复制,不可改变,导致旋转屏幕高宽调转方向,代码中数值却不会改变,发生问题。
星河造梦坊官方
2024/08/14
720
Unity LineRenderer 根据圆的中心、半径、朝向在三维空间中画圆
在三维空间中生成一个圆,需要知道圆的中心点位置、圆的半径以及圆的朝向这三个参数,通过这三个参数求得在圆上的点坐标,最终通过LineRenderer组件将圆绘制出来:
CoderZ
2022/08/29
1.4K0
Unity LineRenderer 根据圆的中心、半径、朝向在三维空间中画圆
浅谈合约量化系统开发详细流程丨关于量化合约系统开发说明分析
量化合约指的是目标或任务具体明确,可以清晰度量。根据不同情况,表现为数量多少,具体的统计数字,范围衡量,时间长度等等。所谓量化就是把经过抽样得到的瞬时值将其幅度离散,即用一组规定的电平,把瞬时抽样值用最接近的电平值来表示。经过抽样的图像,只是在空间上被离散成为像素(样本)的阵列。而每个样本灰度值还是一个由无穷多个取值的连续变化量,必须将其转化为有限个离散值,赋予不同码字才能真正成为数字图像。这种转化称为量化。
用户V_StPv888
2022/08/03
4800
【100个 Unity实用技能】 | Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理
RectTransform官网API地址:https://docs.unity3d.com/2020.3/Documentation/ScriptReference/RectTransform.html
呆呆敲代码的小Y
2023/03/11
2.2K0
【100个 Unity实用技能】 | Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理
【100个 Unity实用技能】☀️ | Unity UGUI ScrollView滑动到指定位置
Unity 中在使用ScrollView的时候,有需求是需要将ScrollView定位到指定的Item上。
呆呆敲代码的小Y
2023/08/13
2.4K0
使用贝塞尔曲线制作迁徙图
贝塞尔曲线是图形学中非常重要的参数曲线,在此不做详细介绍,这里我们用到的是二次方公式:
CoderZ
2022/08/29
3010
使用贝塞尔曲线制作迁徙图
自定义实现UISlider
bering
2023/10/16
2560
Unity精华☀️UI和物体可见性的判断方法
该方法适用于3D Canvas, 和 2D且赋值了相机的Canvas。 不适合2D没有赋值相机的Canvas。
星河造梦坊官方
2024/08/15
1730
【100个 Unity实用技能】☀️ | Unity中 过滤透明区域的点击事件
在Unity中我们有时候会遇到一些带有透明度的图片按钮,有些时候可能并不希望点击按钮的透明区域时也触发点击事件,这个时候就要进行额外处理,下面整理了几种方法可以进行参考使用!
呆呆敲代码的小Y
2024/03/19
7100
【100个 Unity实用技能】☀️ | Unity中 过滤透明区域的点击事件
【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现
  RT,马三最近在参与一款足球游戏的开发,其中涉及到足球的各种运动轨迹和路径,比如射门的轨迹,高吊球,香蕉球的轨迹。最早的版本中马三是使用物理引擎加力的方式实现的足球各种运动,后来的版本中使用了根据物理学公式手动计算位置和物体速度的方式实现,现在这个版本中使用的是DoTween+贝塞尔曲线调节来实现。(关于它们之间的各种优缺点我们会在以后单独开一篇博客来探讨,届时也会放出源代码互相学习下)好了,言归正传,今天马三就来和大家一起学习一下游戏中的贝塞尔曲线以及其在Unity中如何实现。
马三小伙儿
2018/09/12
4.4K0
【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现
区块链元宇宙NFT链游系统开发说明分析及功能
随着各行业都在实现区块链化,区块链的发展日益加快。在区块链上,玩家可以拥有游戏内的资产,而这些资产则有更广泛意义上的流通性;区块链游戏中资产数据的安全,可解决后端开发限制,打破头部垄断;相较传统游戏中心化的管理模式,链上游戏从技术层面赋予了更多应用场景,在未来发展中显得尤为重要。
DD_MrsFu123
2022/07/25
4710
推荐阅读
【100个 Unity实用技能】☀️ | UGUI中 判断屏幕中某个坐标点的位置是否在指定UI区域内
1.3K0
Unity 如何实现框选游戏战斗单位
1.2K0
unity--实现新手引导功能 一:矩形镂空功能 三、新手引导的方法封装四、事件渗透五、完善优化
5.6K0
Unity SKFramework框架(十四)、Extension 扩展函数
6290
【100个 Unity实用技能】 | Unity不规则图片按钮的事件屏蔽
5050
unity3d:折线图,读取csv数据,每s生成一段线
3590
Unity ugui Anchor锚点自动适配画布中的相对位置
2.2K0
【Unity游戏开发】UGUI不规则区域点击的实现
3.6K0
Unity基础(24)-UGUI
4.5K0
AR涂涂乐⭐八、(add)优化原代码“7”、正方形识别图改为矩形识别图、增加BGM和App 图标
720
Unity LineRenderer 根据圆的中心、半径、朝向在三维空间中画圆
1.4K0
浅谈合约量化系统开发详细流程丨关于量化合约系统开发说明分析
4800
【100个 Unity实用技能】 | Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理
2.2K0
【100个 Unity实用技能】☀️ | Unity UGUI ScrollView滑动到指定位置
2.4K0
使用贝塞尔曲线制作迁徙图
3010
自定义实现UISlider
2560
Unity精华☀️UI和物体可见性的判断方法
1730
【100个 Unity实用技能】☀️ | Unity中 过滤透明区域的点击事件
7100
【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现
4.4K0
区块链元宇宙NFT链游系统开发说明分析及功能
4710
相关推荐
【100个 Unity实用技能】☀️ | UGUI中 判断屏幕中某个坐标点的位置是否在指定UI区域内
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文