当前位置:   article > 正文

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

easydl 图像分割应用

EasyGL图像分割介绍:

创建应用:

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

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

3.打开EasyGL图像:

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

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

创建模型:

1.进入EasyGL图像分割:

2.创建模型:

3.创建数据集:

4.数据导入:

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

 导入完成后查看并标注:

框选目标所在范围:

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

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

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

6.发布模型:

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

  1. using System;
  2. [Serializable]
  3. public class ImageSegmentationResponse
  4. {
  5. /// <summary>
  6. /// 唯一的log id 用于问题定位
  7. /// </summary>
  8. public int log_id;
  9. /// <summary>
  10. /// 标签数组结果
  11. /// </summary>
  12. public ImageSegmentationResult[] results;
  13. }
  14. [Serializable]
  15. public class ImageSegmentationResult
  16. {
  17. /// <summary>
  18. /// 标签名称
  19. /// </summary>
  20. public string name;
  21. /// <summary>
  22. /// 置信度
  23. /// </summary>
  24. public string score;
  25. /// <summary>
  26. /// 位置
  27. /// </summary>
  28. public Location location;
  29. /// <summary>
  30. /// 基于游程编码的字符串,编码内容为和原图宽高相同的布尔数组
  31. /// 若数组值为0,代表原图此位置像素点不属于检测目标,若为1,代表原图此位置像素点属于检测目标
  32. /// </summary>
  33. public bool[] mask;
  34. }
  35. [Serializable]
  36. public class Location
  37. {
  38. /// <summary>
  39. /// 目标定位位置的长方形左上顶点的水平坐标
  40. /// </summary>
  41. public int left;
  42. /// <summary>
  43. /// 目标定位位置的长方形左上顶点的垂直坐标
  44. /// </summary>
  45. public int top;
  46. /// <summary>
  47. /// 目标定位位置的长方形的宽度
  48. /// </summary>
  49. public int width;
  50. /// <summary>
  51. /// 目标定位位置的长方形的高度
  52. /// </summary>
  53. public int height;
  54. }

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

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

  1. using System;
  2. using UnityEngine;
  3. /// <summary>
  4. /// 图像分割
  5. /// </summary>
  6. public class ImageSegmentation
  7. {
  8. private const string appID = "";
  9. private const string apiKey = "";
  10. private const string secretKey = "";
  11. private const string url = "";
  12. public static ImageSegmentationResult[] SendRequest(byte[] bytes)
  13. {
  14. var client = new Baidu.Aip.EasyDL.EasyDL(appID, apiKey, secretKey);
  15. try
  16. {
  17. var response = client.requestImage(url, bytes);
  18. Debug.Log(response.ToString());
  19. ImageSegmentationResponse r = JsonUtility.FromJson<ImageSegmentationResponse>(response.ToString());
  20. return r.results;
  21. }
  22. catch (Exception error)
  23. {
  24. Debug.LogError(error);
  25. }
  26. return null;
  27. }
  28. }

测试图片:

测试代码:

  1. using System.IO;
  2. using UnityEngine;
  3. public class Example : MonoBehaviour
  4. {
  5. private void Start()
  6. {
  7. ImageSegmentation.SendRequest(File.ReadAllBytes(Application.dataPath + "/1.jpg"));
  8. }
  9. }

返回结果:

拿到了定位数据后,接下来将其区域绘制出来, 响应说明中解释(left,top)构成左上顶点,但是从返回值来看top为16,减去一个高度312的话,左下顶点的坐标已经是负数,因此推断其位置信息是在以左上角为原点的坐标系中的,我们在Unity中将该点作为左下顶点去处理。

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

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

  1. using System.IO;
  2. using UnityEngine;
  3. public class Example : MonoBehaviour
  4. {
  5. private void Start()
  6. {
  7. var results = ImageSegmentation.SendRequest(File.ReadAllBytes(Application.dataPath + "/测试.jpg"));
  8. for (int i = 0; i < results.Length; i++)
  9. {
  10. var location = results[i].location;
  11. LineRenderer line = new GameObject("LineRenderer").AddComponent<LineRenderer>();
  12. line.positionCount = 4;
  13. line.loop = true;
  14. Vector2 leftTop = new Vector2(location.left, location.top);
  15. Vector2 rightTop = new Vector2(location.left + location.width, location.top);
  16. Vector2 leftBottom = new Vector2(location.left, location.top + location.height);
  17. Vector2 rightBottom = new Vector2(location.left + location.width, location.top + location.height);
  18. RectTransformUtility.ScreenPointToWorldPointInRectangle(transform as RectTransform, leftTop, Camera.main, out Vector3 point1);
  19. RectTransformUtility.ScreenPointToWorldPointInRectangle(transform as RectTransform, rightTop, Camera.main, out Vector3 point2);
  20. RectTransformUtility.ScreenPointToWorldPointInRectangle(transform as RectTransform, rightBottom, Camera.main, out Vector3 point3);
  21. RectTransformUtility.ScreenPointToWorldPointInRectangle(transform as RectTransform, leftBottom, Camera.main, out Vector3 point4);
  22. line.SetPosition(0, point1);
  23. line.SetPosition(1, point2);
  24. line.SetPosition(2, point3);
  25. line.SetPosition(3, point4);
  26. }
  27. }
  28. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/626367
推荐阅读
相关标签
  

闽ICP备14008679号