当前位置:   article > 正文

快速识别你家的猫猫狗狗,教你用ModelBox开发AI萌宠应用

快速识别你家的猫猫狗狗,教你用ModelBox开发AI萌宠应用

本文分享自华为云社区《ModelBox-AI应用开发:动物目标检测【玩转华为云】》,作者:阳光大猫。

一、准备环境

ModelBox端云协同AI开发套件(Windows)环境准备视频教程

二、应用开发

1. 创建工程

ModelBox sdk目录下使用create.bat创建yolov7_pet工程

  1. (tensorflow) PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t server -n yolov7_pet
  2. (tensorflow) D:\modelbox-win10-x64-1.5.3>set BASE_PATH=D:\modelbox-win10-x64-1.5.3\
  3. (tensorflow) D:\modelbox-win10-x64-1.5.3>set PATH=D:\modelbox-win10-x64-1.5.3\\python-embed;C:\Users\yanso\miniconda3\envs\tensorflow\lib\site-packages\pywin32_system32;C:\Users\yanso\miniconda3\envs\tensorflow;C:\Users\yanso\miniconda3\envs\tensorflow\Library\mingw-w64\bin;C:\Users\yanso\miniconda3\envs\tensorflow\Library\usr\bin;C:\Users\yanso\miniconda3\envs\tensorflow\Library\bin;C:\Users\yanso\miniconda3\envs\tensorflow\Scripts;C:\Users\yanso\miniconda3\envs\tensorflow\bin;C:\Users\yanso\miniconda3\condabin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Git\cmd;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\Library\bin;.;C:\Program Files\Git LFS;C:\Users\yanso\AppData\Local\Microsoft\WindowsApps;.;C:\Users\yanso\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\yanso\miniconda3\envs\tensorflow\lib\site-packages\pywin32_system32;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Library\mingw-w64\bin;C:\Users\yanso\miniconda3\Library\usr\bin;C:\Users\yanso\miniconda3\Library\bin;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\bin;C:\Users\yanso\miniconda3\condabin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Git\cmd;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\Library\bin;.;C:\Program Files\Git LFS;C:\Users\yanso\AppData\Local\Microsoft\WindowsApps;.;C:\Users\yanso\AppData\Local\Programs\Microsoft VS Code\bin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Git\cmd;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\Library\bin;.;C:\Program Files\Git LFS;C:\Users\yanso\AppData\Local\Microsoft\WindowsApps;.;C:\Users\yanso\AppData\Local\Programs\Microsoft VS Code\bin
  4. (tensorflow) D:\modelbox-win10-x64-1.5.3>set PYTHONPATH=
  5. (tensorflow) D:\modelbox-win10-x64-1.5.3>set PYTHONHOME=
  6. (tensorflow) D:\modelbox-win10-x64-1.5.3>python.exe -u D:\modelbox-win10-x64-1.5.3\\create.py -t server -n yolov7_pet
  7. sdk version is modelbox-win10-x64-1.5.3
  8. dos2unix: converting file D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet/graph\modelbox.conf to Unix format...
  9. dos2unix: converting file D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet/graph\yolov7_pet.toml to Unix format...
  10. dos2unix: converting file D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet/bin\mock_task.toml to Unix format...
  11. success: create yolov7_pet in D:\modelbox-win10-x64-1.5.3\workspace

create.bat工具的参数中,-t表示所创建实例的类型,包括serverModelBox工程)、python(Python功能单元)、c++(C++功能单元)、infer(推理功能单元)等;-n表示所创建实例的名称,开发者自行命名。

2. 创建推理功能单元

ModelBox sdk目录下使用create.bat创建yolov7_infer推理功能单元

  1. (tensorflow) PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t infer -n yolov7_infer -p yolov7_pet
  2. (tensorflow) D:\modelbox-win10-x64-1.5.3>set BASE_PATH=D:\modelbox-win10-x64-1.5.3\
  3. (tensorflow) D:\modelbox-win10-x64-1.5.3>set PATH=D:\modelbox-win10-x64-1.5.3\\python-embed;C:\Users\yanso\miniconda3\envs\tensorflow\lib\site-packages\pywin32_system32;C:\Users\yanso\miniconda3\envs\tensorflow;C:\Users\yanso\miniconda3\envs\tensorflow\Library\mingw-w64\bin;C:\Users\yanso\miniconda3\envs\tensorflow\Library\usr\bin;C:\Users\yanso\miniconda3\envs\tensorflow\Library\bin;C:\Users\yanso\miniconda3\envs\tensorflow\Scripts;C:\Users\yanso\miniconda3\envs\tensorflow\bin;C:\Users\yanso\miniconda3\condabin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Git\cmd;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\Library\bin;.;C:\Program Files\Git LFS;C:\Users\yanso\AppData\Local\Microsoft\WindowsApps;.;C:\Users\yanso\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\yanso\miniconda3\envs\tensorflow\lib\site-packages\pywin32_system32;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Library\mingw-w64\bin;C:\Users\yanso\miniconda3\Library\usr\bin;C:\Users\yanso\miniconda3\Library\bin;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\bin;C:\Users\yanso\miniconda3\condabin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Git\cmd;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\Library\bin;.;C:\Program Files\Git LFS;C:\Users\yanso\AppData\Local\Microsoft\WindowsApps;.;C:\Users\yanso\AppData\Local\Programs\Microsoft VS Code\bin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Git\cmd;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\Library\bin;.;C:\Program Files\Git LFS;C:\Users\yanso\AppData\Local\Microsoft\WindowsApps;.;C:\Users\yanso\AppData\Local\Programs\Microsoft VS Code\bin
  4. (tensorflow) D:\modelbox-win10-x64-1.5.3>set PYTHONPATH=
  5. (tensorflow) D:\modelbox-win10-x64-1.5.3>set PYTHONHOME=
  6. (tensorflow) D:\modelbox-win10-x64-1.5.3>python.exe -u D:\modelbox-win10-x64-1.5.3\\create.py -t infer -n yolov7_infer -p yolov7_pet
  7. sdk version is modelbox-win10-x64-1.5.3
  8. success: create infer yolov7_infer in D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet/model/yolov7_infer

create.bat工具使用时,-t infer 即表示创建的是推理功能单元;-n xxx_infer 表示创建的功能单元名称为xxx_infer-p yolov7_infer 表示所创建的功能单元属于yolov7_infer应用。

a. 下载转换好的模型

运行此Notebook下载转换好的ONNX格式模型

b. 修改模型配置文件

模型和配置文件保持在同级目录下

  1. # Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
  2. [base]
  3. name = "yolov7_infer"
  4. device = "cpu"
  5. version = "1.0.0"
  6. description = "your description"
  7. entry = "./best.onnx" # model file path, use relative path
  8. type = "inference"
  9. virtual_type = "onnx" # inference engine type: win10 now only support onnx
  10. group_type = "Inference" # flowunit group attribution, do not change
  11. # Input ports description
  12. [input]
  13. [input.input1] # input port number, Format is input.input[N]
  14. name = "Input" # input port name
  15. type = "float" # input port data type ,e.g. float or uint8
  16. device = "cpu" # input buffer type: cpu, win10 now copy input from cpu
  17. # Output ports description
  18. [output]
  19. [output.output1] # output port number, Format is output.output[N]
  20. name = "Output" # output port name
  21. type = "float" # output port data type ,e.g. float or uint8

3. 创建后处理功能单元

ModelBox sdk目录下使用create.bat创建yolov7_post后处理功能单元

  1. (tensorflow) PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t python -n yolov7_post -p yolov7_pet
  2. (tensorflow) D:\modelbox-win10-x64-1.5.3>set BASE_PATH=D:\modelbox-win10-x64-1.5.3\
  3. (tensorflow) D:\modelbox-win10-x64-1.5.3>set PATH=D:\modelbox-win10-x64-1.5.3\\python-embed;C:\Users\yanso\miniconda3\envs\tensorflow\lib\site-packages\pywin32_system32;C:\Users\yanso\miniconda3\envs\tensorflow;C:\Users\yanso\miniconda3\envs\tensorflow\Library\mingw-w64\bin;C:\Users\yanso\miniconda3\envs\tensorflow\Library\usr\bin;C:\Users\yanso\miniconda3\envs\tensorflow\Library\bin;C:\Users\yanso\miniconda3\envs\tensorflow\Scripts;C:\Users\yanso\miniconda3\envs\tensorflow\bin;C:\Users\yanso\miniconda3\condabin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Git\cmd;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\Library\bin;.;C:\Program Files\Git LFS;C:\Users\yanso\AppData\Local\Microsoft\WindowsApps;.;C:\Users\yanso\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\yanso\miniconda3\envs\tensorflow\lib\site-packages\pywin32_system32;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Library\mingw-w64\bin;C:\Users\yanso\miniconda3\Library\usr\bin;C:\Users\yanso\miniconda3\Library\bin;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\bin;C:\Users\yanso\miniconda3\condabin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Git\cmd;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\Library\bin;.;C:\Program Files\Git LFS;C:\Users\yanso\AppData\Local\Microsoft\WindowsApps;.;C:\Users\yanso\AppData\Local\Programs\Microsoft VS Code\bin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Git\cmd;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\Library\bin;.;C:\Program Files\Git LFS;C:\Users\yanso\AppData\Local\Microsoft\WindowsApps;.;C:\Users\yanso\AppData\Local\Programs\Microsoft VS Code\bin
  4. (tensorflow) D:\modelbox-win10-x64-1.5.3>set PYTHONPATH=
  5. (tensorflow) D:\modelbox-win10-x64-1.5.3>set PYTHONHOME=
  6. (tensorflow) D:\modelbox-win10-x64-1.5.3>python.exe -u D:\modelbox-win10-x64-1.5.3\\create.py -t python -n yolov7_post -p yolov7_pet
  7. sdk version is modelbox-win10-x64-1.5.3
  8. success: create python yolov7_post in D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet/etc/flowunit/yolov7_post

a. 修改配置文件

  1. # Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved.
  2. # Basic config
  3. [base]
  4. name = "yolov7_post" # The FlowUnit name
  5. device = "cpu" # The flowunit runs on cpu
  6. version = "1.0.0" # The version of the flowunit
  7. type = "python" # Fixed value, do not change
  8. description = "description" # The description of the flowunit
  9. entry = "yolov7_post@yolov7_postFlowUnit" # Python flowunit entry function
  10. group_type = "Generic" # flowunit group attribution, change as Input/Output/Image/Generic ...
  11. # Flowunit Type
  12. stream = false # Whether the flowunit is a stream flowunit
  13. condition = false # Whether the flowunit is a condition flowunit
  14. collapse = false # Whether the flowunit is a collapse flowunit
  15. collapse_all = false # Whether the flowunit will collapse all the data
  16. expand = false # Whether the flowunit is a expand flowunit
  17. # The default Flowunit config
  18. [config]
  19. net_h = 640
  20. net_w = 640
  21. num_classes = 2
  22. conf_threshold = 0.5
  23. iou_threshold = 0.45
  24. # Input ports description
  25. [input]
  26. [input.input1] # Input port number, the format is input.input[N]
  27. name = "in_feat" # Input port name
  28. type = "float" # Input port type
  29. # Output ports description
  30. [output]
  31. [output.output1] # Output port number, the format is output.output[N]
  32. name = "out_data" # Output port name
  33. type = "string" # Output port type

b. 修改逻辑代码

  1. # Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved.
  2. #!/usr/bin/env python
  3. # -*- coding: utf-8 -*-
  4. import _flowunit as modelbox
  5. import numpy as np
  6. import json
  7. import cv2
  8. class yolov7_postFlowUnit(modelbox.FlowUnit):
  9. # Derived from modelbox.FlowUnit
  10. def __init__(self):
  11. super().__init__()
  12. # Open the flowunit to obtain configuration information
  13. def open(self, config):
  14. # 获取功能单元的配置参数
  15. self.params = {}
  16. self.params['net_h'] = config.get_int('net_h')
  17. self.params['net_w'] = config.get_int('net_w')
  18. self.params['num_classes'] = config.get_int('num_classes')
  19. self.params['conf_thre'] = config.get_float('conf_threshold')
  20. self.params['nms_thre'] = config.get_float('iou_threshold')
  21. self.num_classes = config.get_int('num_classes')
  22. return modelbox.Status.StatusCode.STATUS_SUCCESS
  23. # Process the data
  24. def process(self, data_context):
  25. # 从DataContext中获取输入输出BufferList对象
  26. in_feat = data_context.input("in_feat")
  27. out_data = data_context.output("out_data")
  28. # yolov7_post process code.
  29. # 循环处理每一个输入Buffer数据
  30. for buffer_feat in in_feat:
  31. # 将输入Buffer转换为numpy对象
  32. feat_data = np.array(buffer_feat.as_object(), copy=False)
  33. feat_data = feat_data.reshape((-1, self.num_classes + 5))
  34. # 业务处理:解码yolov7模型的输出数据,得到检测框,转化为json数据
  35. bboxes = self.postprocess(feat_data, self.params)
  36. result = {"det_result": str(bboxes)}
  37. print(result)
  38. # 将业务处理返回的结果数据转换为Buffer
  39. result_str = json.dumps(result)
  40. out_buffer = modelbox.Buffer(self.get_bind_device(), result_str)
  41. # 将输出Buffer放入输出BufferList中
  42. out_data.push_back(out_buffer)
  43. return modelbox.Status.StatusCode.STATUS_SUCCESS
  44. # model post-processing function
  45. def postprocess(self, feat_data, params):
  46. """postprocess for yolo7 model"""
  47. boxes = []
  48. class_ids = []
  49. confidences = []
  50. for detection in feat_data:
  51. scores = detection[5:]
  52. class_id = np.argmax(scores)
  53. if params['num_classes'] == 1:
  54. confidence = detection[4]
  55. else:
  56. confidence = detection[4] * scores[class_id]
  57. if confidence > params['conf_thre'] and detection[4] > params['conf_thre']:
  58. center_x = detection[0] / params['net_w']
  59. center_y = detection[1] / params['net_h']
  60. width = detection[2] / params['net_w']
  61. height = detection[3] / params['net_h']
  62. left = center_x - width / 2
  63. top = center_y - height / 2
  64. class_ids.append(class_id)
  65. confidences.append(confidence)
  66. boxes.append([left, top, width, height])
  67. # use nms algorithm in opencv
  68. box_idx = cv2.dnn.NMSBoxes(
  69. boxes, confidences, params['conf_thre'], params['nms_thre'])
  70. detections = []
  71. for i in box_idx:
  72. boxes[i][0] = max(0.0, boxes[i][0]) # [0, 1]
  73. boxes[i][1] = max(0.0, boxes[i][1]) # [0, 1]
  74. boxes[i][2] = min(1.0, boxes[i][0] + boxes[i][2]) # [0, 1]
  75. boxes[i][3] = min(1.0, boxes[i][1] + boxes[i][3]) # [0, 1]
  76. dets = np.concatenate(
  77. [boxes[i], np.array([confidences[i]]), np.array([class_ids[i]])], 0).tolist()
  78. detections.append(dets)
  79. return detections
  80. def close(self):
  81. # Close the flowunit
  82. return modelbox.Status()
  83. def data_pre(self, data_context):
  84. # Before streaming data starts
  85. return modelbox.Status()
  86. def data_post(self, data_context):
  87. # After streaming data ends
  88. return modelbox.Status()
  89. def data_group_pre(self, data_context):
  90. # Before all streaming data starts
  91. return modelbox.Status()
  92. def data_group_post(self, data_context):
  93. # After all streaming data ends
  94. return modelbox.Status()

4. 修改流程图

yolov7_pet工程graph目录下存放流程图,默认的流程图yolov7_pet.toml与工程同名,其内容为(以Windows版ModelBox为例):

  1. # Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
  2. [driver]
  3. dir = ["${HILENS_APP_ROOT}/etc/flowunit",
  4. "${HILENS_APP_ROOT}/etc/flowunit/cpp",
  5. "${HILENS_APP_ROOT}/model",
  6. "${HILENS_MB_SDK_PATH}/flowunit"]
  7. skip-default = true
  8. [profile]
  9. profile=false
  10. trace=false
  11. dir="${HILENS_DATA_DIR}/mb_profile"
  12. [graph]
  13. format = "graphviz"
  14. graphconf = """digraph yolov7_pet {
  15. node [shape=Mrecord]
  16. queue_size = 4
  17. batch_size = 1
  18. input1[type=input,flowunit=input,device=cpu,deviceid=0]
  19. httpserver_sync_receive[type=flowunit, flowunit=httpserver_sync_receive_v2, device=cpu, deviceid=0, time_out_ms=5000, endpoint="http://0.0.0.0:8083/v1/yolov7_pet", max_requests=100]
  20. image_decoder[type=flowunit, flowunit=image_decoder, device=cpu, key="image_base64", queue_size=4]
  21. image_resize[type=flowunit, flowunit=resize, device=cpu, deviceid=0, image_width=640, image_height=640]
  22. image_transpose[type=flowunit, flowunit=packed_planar_transpose, device=cpu, deviceid=0]
  23. normalize[type=flowunit flowunit=normalize device=cpu deviceid=0 standard_deviation_inverse="0.0039215686,0.0039215686,0.0039215686"]
  24. yolov7_infer[type=flowunit, flowunit=yolov7_infer, device=cpu, deviceid=0, batch_size = 1]
  25. yolov7_post[type=flowunit, flowunit=yolov7_post, device=cpu, deviceid=0]
  26. httpserver_sync_reply[type=flowunit, flowunit=httpserver_sync_reply_v2, device=cpu, deviceid=0]
  27. input1:input -> httpserver_sync_receive:in_url
  28. httpserver_sync_receive:out_request_info -> image_decoder:in_encoded_image
  29. image_decoder:out_image -> image_resize:in_image
  30. image_resize:out_image -> image_transpose:in_image
  31. image_transpose:out_image -> normalize:in_data
  32. normalize:out_data -> yolov7_infer:Input
  33. yolov7_infer:Output -> yolov7_post:in_feat
  34. yolov7_post:out_data -> httpserver_sync_reply:in_reply_info
  35. }"""
  36. [flow]
  37. desc = "yolov7_pet run in modelbox-win10-x64"

5. 准备动物图片和测试脚本

a. 动物图片

yolov7_pet工程data目录下存放动物图片文件夹test_imgs

b. 测试脚本

yolov7_pet工程data目录下存放测试脚本test_http.py

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved.
  4. import os
  5. import cv2
  6. import json
  7. import base64
  8. import http.client
  9. class HttpConfig:
  10. '''http调用的参数配置'''
  11. def __init__(self, host_ip, port, url, img_base64_str):
  12. self.hostIP = host_ip
  13. self.Port = port
  14. self.httpMethod = "POST"
  15. self.requstURL = url
  16. self.headerdata = {
  17. "Content-Type": "application/json"
  18. }
  19. self.test_data = {
  20. "image_base64": img_base64_str
  21. }
  22. self.body = json.dumps(self.test_data)
  23. def read_image(img_path):
  24. '''读取图片数据并转为base64编码的字符串'''
  25. img_data = cv2.imread(img_path)
  26. img_str = cv2.imencode('.jpg', img_data)[1].tostring()
  27. img_bin = base64.b64encode(img_str)
  28. img_base64_str = str(img_bin, encoding='utf8')
  29. return img_data, img_base64_str
  30. def decode_car_bboxes(bbox_str, input_shape):
  31. try:
  32. labels = [0, 1] # cat, dog
  33. bboxes = json.loads(json.loads(bbox_str)['det_result'])
  34. bboxes = list(filter(lambda x: int(x[5]) in labels, bboxes))
  35. except Exception as ex:
  36. print(str(ex))
  37. return []
  38. else:
  39. for bbox in bboxes:
  40. bbox[0] = int(bbox[0] * input_shape[1])
  41. bbox[1] = int(bbox[1] * input_shape[0])
  42. bbox[2] = int(bbox[2] * input_shape[1])
  43. bbox[3] = int(bbox[3] * input_shape[0])
  44. return bboxes
  45. def draw_bboxes(img_data, bboxes):
  46. '''画框'''
  47. for bbox in bboxes:
  48. x1, y1, x2, y2, score, label = bbox
  49. color = (0, 0, 255)
  50. names = ['cat', 'dog']
  51. score = '%.2f' % score
  52. label = '%s:%s' % (names[int(label)], score)
  53. cv2.rectangle(img_data, (x1, y1), (x2, y2), color, 2)
  54. cv2.putText(img_data, label, (x1, y1 - 10), cv2.FONT_HERSHEY_TRIPLEX, 0.5, (0, 255, 0), thickness=1)
  55. return img_data
  56. def test_image(img_path, ip, port, url):
  57. '''单张图片测试'''
  58. img_data, img_base64_str = read_image(img_path)
  59. http_config = HttpConfig(ip, port, url, img_base64_str)
  60. conn = http.client.HTTPConnection(host=http_config.hostIP, port=http_config.Port)
  61. conn.request(method=http_config.httpMethod, url=http_config.requstURL,
  62. body=http_config.body, headers=http_config.headerdata)
  63. response = conn.getresponse().read().decode()
  64. print('response: ', response)
  65. bboxes = decode_car_bboxes(response, img_data.shape)
  66. imt_out = draw_bboxes(img_data, bboxes)
  67. cv2.imwrite('./result-' + os.path.basename(img_path), imt_out)
  68. if __name__ == "__main__":
  69. port = 8083
  70. ip = "127.0.0.1"
  71. url = "/v1/yolov7_pet"
  72. img_path = "./test.jpg"
  73. img_folder = './test_imgs'
  74. file_list = os.listdir(img_folder)
  75. for img_file in file_list:
  76. print("\n================ {} ================".format(img_file))
  77. img_path = os.path.join(img_folder, img_file)
  78. test_image(img_path, ip, port, url)

三、运行应用

yolov7_pet工程目录下执行.\bin\main.bat运行应用:

  1. (tensorflow) PS D:\modelbox-win10-x64-1.5.3> cd D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet
  2. (tensorflow) PS D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet> .\bin\main.bat
  3. (tensorflow) D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet>set PATH=D:/modelbox-win10-x64-1.5.3/workspace/yolov7_pet/bin/../../../python-embed;D:/modelbox-win10-x64-1.5.3/workspace/yolov7_pet/bin/../../../modelbox-win10-x64/bin;D:/modelbox-win10-x64-1.5.3/workspace/yolov7_pet/bin/../dependence/lib;C:\Users\yanso\miniconda3\envs\tensorflow\lib\site-packages\pywin32_system32;C:\Users\yanso\miniconda3\envs\tensorflow;C:\Users\yanso\miniconda3\envs\tensorflow\Library\mingw-w64\bin;C:\Users\yanso\miniconda3\envs\tensorflow\Library\usr\bin;C:\Users\yanso\miniconda3\envs\tensorflow\Library\bin;C:\Users\yanso\miniconda3\envs\tensorflow\Scripts;C:\Users\yanso\miniconda3\envs\tensorflow\bin;C:\Users\yanso\miniconda3\condabin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Git\cmd;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\Library\bin;.;C:\Program Files\Git LFS;C:\Users\yanso\AppData\Local\Microsoft\WindowsApps;.;C:\Users\yanso\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\yanso\miniconda3\envs\tensorflow\lib\site-packages\pywin32_system32;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Library\mingw-w64\bin;C:\Users\yanso\miniconda3\Library\usr\bin;C:\Users\yanso\miniconda3\Library\bin;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\bin;C:\Users\yanso\miniconda3\condabin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Git\cmd;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\Library\bin;.;C:\Program Files\Git LFS;C:\Users\yanso\AppData\Local\Microsoft\WindowsApps;.;C:\Users\yanso\AppData\Local\Programs\Microsoft VS Code\bin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\Git\cmd;C:\Users\yanso\miniconda3;C:\Users\yanso\miniconda3\Scripts;C:\Users\yanso\miniconda3\Library\bin;.;C:\Program Files\Git LFS;C:\Users\yanso\AppData\Local\Microsoft\WindowsApps;.;C:\Users\yanso\AppData\Local\Programs\Microsoft VS Code\bin
  4. (tensorflow) D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet>modelbox.exe -c D:/modelbox-win10-x64-1.5.3/workspace/yolov7_pet/bin/../graph/modelbox.conf
  5. [2024-06-10 06:42:50,922][ WARN][ iva_config.cc:143 ] update vas url failed. Fault, no vas projectid or iva endpoint
  6. open log file D:/modelbox-win10-x64-1.5.3/workspace/yolov7_pet/bin/../hilens_data_dir/log/modelbox.log failed, No error
  7. input dims is:1,3,640,640,
  8. output dims is:1,25200,7,

HTTP服务启动后可以在另一个终端进行请求测试,进入yolov7_pet工程目录data文件夹中使用test_http.py脚本发起HTTP请求进行测试:

  1. (tensorflow) PS D:\modelbox-win10-x64-1.5.3> cd D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet\data
  2. (tensorflow) PS D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet\data> python .\test_http.py
  3. ================ Abyssinian_1.jpg ================
  4. .\test_http.py:33: DeprecationWarning: tostring() is deprecated. Use tobytes() instead.
  5. img_str = cv2.imencode('.jpg', img_data)[1].tostring()
  6. response: {"det_result": "[[0.554308044910431, 0.1864600658416748, 0.7089953303337098, 0.3776256084442139, 0.82369065284729, 0.0]]"}
  7. ================ saint_bernard_143.jpg ================
  8. response: {"det_result": "[[0.46182055473327643, 0.30239262580871584, 0.8193012714385988, 0.4969032764434815, 0.7603430151939392, 1.0]]"}

四、小结

本章我们介绍了如何使用ModelBox开发一个动物目标检测的AI应用,我们只需要准备模型文件以及简单的配置即可创建一个HTTP服务。同时我们可以了解到图片标注、数据处理和模型训练方法,以及对应的推理应用逻辑。

HDC 2024,6月21日-23日,东莞松山湖,期待与您相见!

更多详情请关注官网:

中文:华为开发者大会2024_HDC 2024

英文:华为开发者大会2024_HDC 2024

点击关注,第一时间了解华为云新鲜技术~

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

闽ICP备14008679号