快速识别你家的猫猫狗狗,教你用ModelBox开发AI萌宠应用
本文分享自华为云社区《ModelBox-AI应用开发:动物目标检测【玩转华为云】》,作者:阳光大猫。
一、准备环境
ModelBox端云协同AI开发套件(Windows)环境准备【视频教程】
二、应用开发
1. 创建工程
在ModelBox
sdk目录下使用create.bat
创建yolov7_pet
工程
(tensorflow) PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t server -n yolov7_pet (tensorflow) D:\modelbox-win10-x64-1.5.3>set BASE_PATH=D:\modelbox-win10-x64-1.5.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 (tensorflow) D:\modelbox-win10-x64-1.5.3>set PYTHONPATH= (tensorflow) D:\modelbox-win10-x64-1.5.3>set PYTHONHOME= (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
sdk version is modelbox-win10-x64-1.5.3
dos2unix: converting file D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet/graph\modelbox.conf to Unix format...
dos2unix: converting file D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet/graph\yolov7_pet.toml to Unix format...
dos2unix: converting file D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet/bin\mock_task.toml to Unix format...
success: create yolov7_pet in D:\modelbox-win10-x64-1.5.3\workspace
create.bat
工具的参数中,-t
表示所创建实例的类型,包括server
(ModelBox
工程)、python
(Python功能单元)、c++
(C++功能单元)、infer
(推理功能单元)等;-n
表示所创建实例的名称,开发者自行命名。
2. 创建推理功能单元
在ModelBox
sdk目录下使用create.bat
创建yolov7_infer
推理功能单元
(tensorflow) PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t infer -n yolov7_infer -p yolov7_pet (tensorflow) D:\modelbox-win10-x64-1.5.3>set BASE_PATH=D:\modelbox-win10-x64-1.5.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 (tensorflow) D:\modelbox-win10-x64-1.5.3>set PYTHONPATH= (tensorflow) D:\modelbox-win10-x64-1.5.3>set PYTHONHOME= (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
sdk version is modelbox-win10-x64-1.5.3
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. 修改模型配置文件
模型和配置文件保持在同级目录下
# Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. [base]
name = "yolov7_infer"
device = "cpu"
version = "1.0.0"
description = "your description"
entry = "./best.onnx" # model file path, use relative path
type = "inference"
virtual_type = "onnx" # inference engine type: win10 now only support onnx
group_type = "Inference" # flowunit group attribution, do not change # Input ports description
[input]
[input.input1] # input port number, Format is input.input[N]
name = "Input" # input port name
type = "float" # input port data type ,e.g. float or uint8
device = "cpu" # input buffer type: cpu, win10 now copy input from cpu # Output ports description
[output]
[output.output1] # output port number, Format is output.output[N]
name = "Output" # output port name
type = "float" # output port data type ,e.g. float or uint8
3. 创建后处理功能单元
在ModelBox
sdk目录下使用create.bat
创建yolov7_post
后处理功能单元
(tensorflow) PS D:\modelbox-win10-x64-1.5.3> .\create.bat -t python -n yolov7_post -p yolov7_pet (tensorflow) D:\modelbox-win10-x64-1.5.3>set BASE_PATH=D:\modelbox-win10-x64-1.5.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 (tensorflow) D:\modelbox-win10-x64-1.5.3>set PYTHONPATH= (tensorflow) D:\modelbox-win10-x64-1.5.3>set PYTHONHOME= (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
sdk version is modelbox-win10-x64-1.5.3
success: create python yolov7_post in D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet/etc/flowunit/yolov7_post
a. 修改配置文件
# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. # Basic config
[base]
name = "yolov7_post" # The FlowUnit name
device = "cpu" # The flowunit runs on cpu
version = "1.0.0" # The version of the flowunit
type = "python" # Fixed value, do not change
description = "description" # The description of the flowunit
entry = "yolov7_post@yolov7_postFlowUnit" # Python flowunit entry function
group_type = "Generic" # flowunit group attribution, change as Input/Output/Image/Generic ... # Flowunit Type
stream = false # Whether the flowunit is a stream flowunit
condition = false # Whether the flowunit is a condition flowunit
collapse = false # Whether the flowunit is a collapse flowunit
collapse_all = false # Whether the flowunit will collapse all the data
expand = false # Whether the flowunit is a expand flowunit # The default Flowunit config
[config]
net_h = 640
net_w = 640
num_classes = 2
conf_threshold = 0.5
iou_threshold = 0.45 # Input ports description
[input]
[input.input1] # Input port number, the format is input.input[N]
name = "in_feat" # Input port name
type = "float" # Input port type # Output ports description
[output]
[output.output1] # Output port number, the format is output.output[N]
name = "out_data" # Output port name
type = "string" # Output port type
b. 修改逻辑代码
# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. #!/usr/bin/env python
# -*- coding: utf-8 -*-
import _flowunit as modelbox
import numpy as np
import json
import cv2 class yolov7_postFlowUnit(modelbox.FlowUnit):
# Derived from modelbox.FlowUnit
def __init__(self):
super().__init__() # Open the flowunit to obtain configuration information
def open(self, config):
# 获取功能单元的配置参数
self.params = {}
self.params['net_h'] = config.get_int('net_h')
self.params['net_w'] = config.get_int('net_w')
self.params['num_classes'] = config.get_int('num_classes')
self.params['conf_thre'] = config.get_float('conf_threshold')
self.params['nms_thre'] = config.get_float('iou_threshold')
self.num_classes = config.get_int('num_classes') return modelbox.Status.StatusCode.STATUS_SUCCESS # Process the data
def process(self, data_context):
# 从DataContext中获取输入输出BufferList对象
in_feat = data_context.input("in_feat")
out_data = data_context.output("out_data") # yolov7_post process code.
# 循环处理每一个输入Buffer数据
for buffer_feat in in_feat:
# 将输入Buffer转换为numpy对象
feat_data = np.array(buffer_feat.as_object(), copy=False)
feat_data = feat_data.reshape((-1, self.num_classes + 5)) # 业务处理:解码yolov7模型的输出数据,得到检测框,转化为json数据
bboxes = self.postprocess(feat_data, self.params)
result = {"det_result": str(bboxes)}
print(result) # 将业务处理返回的结果数据转换为Buffer
result_str = json.dumps(result)
out_buffer = modelbox.Buffer(self.get_bind_device(), result_str) # 将输出Buffer放入输出BufferList中
out_data.push_back(out_buffer) return modelbox.Status.StatusCode.STATUS_SUCCESS # model post-processing function
def postprocess(self, feat_data, params):
"""postprocess for yolo7 model"""
boxes = []
class_ids = []
confidences = []
for detection in feat_data:
scores = detection[5:]
class_id = np.argmax(scores)
if params['num_classes'] == 1:
confidence = detection[4]
else:
confidence = detection[4] * scores[class_id]
if confidence > params['conf_thre'] and detection[4] > params['conf_thre']:
center_x = detection[0] / params['net_w']
center_y = detection[1] / params['net_h']
width = detection[2] / params['net_w']
height = detection[3] / params['net_h'] left = center_x - width / 2
top = center_y - height / 2 class_ids.append(class_id)
confidences.append(confidence)
boxes.append([left, top, width, height]) # use nms algorithm in opencv
box_idx = cv2.dnn.NMSBoxes(
boxes, confidences, params['conf_thre'], params['nms_thre']) detections = []
for i in box_idx:
boxes[i][0] = max(0.0, boxes[i][0]) # [0, 1]
boxes[i][1] = max(0.0, boxes[i][1]) # [0, 1]
boxes[i][2] = min(1.0, boxes[i][0] + boxes[i][2]) # [0, 1]
boxes[i][3] = min(1.0, boxes[i][1] + boxes[i][3]) # [0, 1]
dets = np.concatenate(
[boxes[i], np.array([confidences[i]]), np.array([class_ids[i]])], 0).tolist()
detections.append(dets) return detections def close(self):
# Close the flowunit
return modelbox.Status() def data_pre(self, data_context):
# Before streaming data starts
return modelbox.Status() def data_post(self, data_context):
# After streaming data ends
return modelbox.Status() def data_group_pre(self, data_context):
# Before all streaming data starts
return modelbox.Status() def data_group_post(self, data_context):
# After all streaming data ends
return modelbox.Status()
4. 修改流程图
yolov7_pet
工程graph
目录下存放流程图,默认的流程图yolov7_pet.toml
与工程同名,其内容为(以Windows版ModelBox
为例):
# Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved. [driver]
dir = ["${HILENS_APP_ROOT}/etc/flowunit",
"${HILENS_APP_ROOT}/etc/flowunit/cpp",
"${HILENS_APP_ROOT}/model",
"${HILENS_MB_SDK_PATH}/flowunit"]
skip-default = true
[profile]
profile=false
trace=false
dir="${HILENS_DATA_DIR}/mb_profile"
[graph]
format = "graphviz"
graphconf = """digraph yolov7_pet {
node [shape=Mrecord]
queue_size = 4
batch_size = 1
input1[type=input,flowunit=input,device=cpu,deviceid=0] 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]
image_decoder[type=flowunit, flowunit=image_decoder, device=cpu, key="image_base64", queue_size=4]
image_resize[type=flowunit, flowunit=resize, device=cpu, deviceid=0, image_width=640, image_height=640]
image_transpose[type=flowunit, flowunit=packed_planar_transpose, device=cpu, deviceid=0]
normalize[type=flowunit flowunit=normalize device=cpu deviceid=0 standard_deviation_inverse="0.0039215686,0.0039215686,0.0039215686"]
yolov7_infer[type=flowunit, flowunit=yolov7_infer, device=cpu, deviceid=0, batch_size = 1]
yolov7_post[type=flowunit, flowunit=yolov7_post, device=cpu, deviceid=0]
httpserver_sync_reply[type=flowunit, flowunit=httpserver_sync_reply_v2, device=cpu, deviceid=0] input1:input -> httpserver_sync_receive:in_url
httpserver_sync_receive:out_request_info -> image_decoder:in_encoded_image
image_decoder:out_image -> image_resize:in_image
image_resize:out_image -> image_transpose:in_image
image_transpose:out_image -> normalize:in_data
normalize:out_data -> yolov7_infer:Input
yolov7_infer:Output -> yolov7_post:in_feat
yolov7_post:out_data -> httpserver_sync_reply:in_reply_info
}"""
[flow]
desc = "yolov7_pet run in modelbox-win10-x64"
5. 准备动物图片和测试脚本
a. 动物图片
yolov7_pet
工程data
目录下存放动物图片文件夹test_imgs
b. 测试脚本
yolov7_pet
工程data
目录下存放测试脚本test_http.py
#!/usr/bin/env python
# -*- coding: utf-8 -*- # Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. import os
import cv2
import json
import base64
import http.client
class HttpConfig:
'''http调用的参数配置'''
def __init__(self, host_ip, port, url, img_base64_str):
self.hostIP = host_ip
self.Port = port self.httpMethod = "POST"
self.requstURL = url
self.headerdata = {
"Content-Type": "application/json"
}
self.test_data = {
"image_base64": img_base64_str
}
self.body = json.dumps(self.test_data)
def read_image(img_path):
'''读取图片数据并转为base64编码的字符串'''
img_data = cv2.imread(img_path)
img_str = cv2.imencode('.jpg', img_data)[1].tostring()
img_bin = base64.b64encode(img_str)
img_base64_str = str(img_bin, encoding='utf8')
return img_data, img_base64_str
def decode_car_bboxes(bbox_str, input_shape):
try:
labels = [0, 1] # cat, dog
bboxes = json.loads(json.loads(bbox_str)['det_result'])
bboxes = list(filter(lambda x: int(x[5]) in labels, bboxes))
except Exception as ex:
print(str(ex))
return []
else:
for bbox in bboxes:
bbox[0] = int(bbox[0] * input_shape[1])
bbox[1] = int(bbox[1] * input_shape[0])
bbox[2] = int(bbox[2] * input_shape[1])
bbox[3] = int(bbox[3] * input_shape[0])
return bboxes
def draw_bboxes(img_data, bboxes):
'''画框'''
for bbox in bboxes:
x1, y1, x2, y2, score, label = bbox
color = (0, 0, 255)
names = ['cat', 'dog']
score = '%.2f' % score
label = '%s:%s' % (names[int(label)], score)
cv2.rectangle(img_data, (x1, y1), (x2, y2), color, 2)
cv2.putText(img_data, label, (x1, y1 - 10), cv2.FONT_HERSHEY_TRIPLEX, 0.5, (0, 255, 0), thickness=1)
return img_data
def test_image(img_path, ip, port, url):
'''单张图片测试'''
img_data, img_base64_str = read_image(img_path)
http_config = HttpConfig(ip, port, url, img_base64_str) conn = http.client.HTTPConnection(host=http_config.hostIP, port=http_config.Port)
conn.request(method=http_config.httpMethod, url=http_config.requstURL,
body=http_config.body, headers=http_config.headerdata) response = conn.getresponse().read().decode()
print('response: ', response) bboxes = decode_car_bboxes(response, img_data.shape)
imt_out = draw_bboxes(img_data, bboxes)
cv2.imwrite('./result-' + os.path.basename(img_path), imt_out)
if __name__ == "__main__":
port = 8083
ip = "127.0.0.1"
url = "/v1/yolov7_pet"
img_path = "./test.jpg"
img_folder = './test_imgs'
file_list = os.listdir(img_folder)
for img_file in file_list:
print("\n================ {} ================".format(img_file))
img_path = os.path.join(img_folder, img_file)
test_image(img_path, ip, port, url)
三、运行应用
在yolov7_pet
工程目录下执行.\bin\main.bat
运行应用:
(tensorflow) PS D:\modelbox-win10-x64-1.5.3> cd D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet
(tensorflow) PS D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet> .\bin\main.bat (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 (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
[2024-06-10 06:42:50,922][ WARN][ iva_config.cc:143 ] update vas url failed. Fault, no vas projectid or iva endpoint
open log file D:/modelbox-win10-x64-1.5.3/workspace/yolov7_pet/bin/../hilens_data_dir/log/modelbox.log failed, No error
input dims is:1,3,640,640,
output dims is:1,25200,7,
HTTP服务启动后可以在另一个终端进行请求测试,进入yolov7_pet
工程目录data
文件夹中使用test_http.py
脚本发起HTTP请求进行测试:
(tensorflow) PS D:\modelbox-win10-x64-1.5.3> cd D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet\data
(tensorflow) PS D:\modelbox-win10-x64-1.5.3\workspace\yolov7_pet\data> python .\test_http.py ================ Abyssinian_1.jpg ================
.\test_http.py:33: DeprecationWarning: tostring() is deprecated. Use tobytes() instead.
img_str = cv2.imencode('.jpg', img_data)[1].tostring()
response: {"det_result": "[[0.554308044910431, 0.1864600658416748, 0.7089953303337098, 0.3776256084442139, 0.82369065284729, 0.0]]"} ================ saint_bernard_143.jpg ================
response: {"det_result": "[[0.46182055473327643, 0.30239262580871584, 0.8193012714385988, 0.4969032764434815, 0.7603430151939392, 1.0]]"}
四、小结
本章我们介绍了如何使用ModelBox开发一个动物目标检测的AI应用,我们只需要准备模型文件以及简单的配置即可创建一个HTTP服务。同时我们可以了解到图片标注、数据处理和模型训练方法,以及对应的推理应用逻辑。
快速识别你家的猫猫狗狗,教你用ModelBox开发AI萌宠应用的更多相关文章
- 快速识别Hash加密方式hashid
快速识别Hash加密方式hashid hashid工具是用来识别不同类型的散列加密,进而判断哈希算法的类型.该工具的而语法格式如下所示: hashid [option] INPUT 其中,option ...
- 手把手教你使用 Clion 开发 Linux C++ 项目
手把手教你使用 Clion 开发 Linux C++ 项目 关于CLion CLion是一款专为开发C及C++所设计的跨平台IDE.它是以IntelliJ为基础设计的,包含了许多智能功能来提高开发人员 ...
- 手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统系列博文索引
近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座,来讲解如何利用FineUI快速开 ...
- 教我徒弟Android开发入门(一)
前言: 这个系列的教程是为我徒弟准备的,也适合还不懂java但是想学android开发的小白们~ 本系列是在Android Studio的环境下运行,默认大家的开发环境都是配置好了的 没有配置好的同学 ...
- ZZNU 2182 矩阵dp (矩阵快速幂+递推式 || 杜教BM)
题目链接:http://47.93.249.116/problem.php?id=2182 题目描述 河神喜欢吃零食,有三种最喜欢的零食,鱼干,猪肉脯,巧克力.他每小时会选择一种吃一包. 不幸的是,医 ...
- 【转】如何快速识别应用MOS管,几张图片就搞定了
三极管是流控型器件,MOS管是压控型器件,两者存在相似之处.三极管机可能经常用,但MOS管你用的可能较少.对于MOS管先抛出几个问题: 如何区分P-MOS和N-MOS: 如何区分MOS的G.D.S管脚 ...
- 快速识别烂项目!试试这款项目代码统计IDEA插件
编程是一个很奇妙的事情,大部分的我们把大部分时间实际都花在了复制粘贴,而后修改代码上面. 很多时候,我们并不关注代码质量,只要功能能实现,我才不管一个类的代码有多长.一个方法的代码有多长. 因此,我们 ...
- AppCan教你从零开始做开发
经常收到类似这样的提问:新手开发APP,要怎么学?我有满屏幕的文档和视频,然而并没有什么卵用,因为我不知道该从哪看起……今天的主要内容是教大家,如何在AppCan移动平台创建应用,引擎插件选择.证书管 ...
- 腾讯云总监手把手教你,如何成为AI工程师?
作者:朱建平 腾讯云技术总监,腾讯TEG架构平台部专家工程师 1.关于人工智能的若干个错误认知 人工智能是AI工程师的事情,跟我没有什么关系 大数据和机器学习(AI) 是解决问题的一种途径和手段,具有 ...
- 王晶:华为云OCR文字识别服务技术实践、底层框架及应用场景 | AI ProCon 2019
演讲嘉宾 | 王晶(华为云人工智能高级算法工程师王晶) 出品 | AI科技大本营(ID:rgznai100) 近期,由 CSDN 主办的 2019 中国AI 开发者大会(AI ProCon 2019) ...
随机推荐
- PolarDB B-tree 并发控制优化
简介: PolarDB 解决了 InnoDB 在 B-tree 并发控制上的限制,解决 index lock 竞争问题,并支持了 latch coupling. InnoDB 索引 InnoDB 引擎 ...
- MaxCompute Spark 使用和常见问题
简介: 本文将就MaxCompute Spark开发环境搭建.常用配置.作业迁移注意事项以及常见问题进行深入介绍. 一. MaxCompute Spark 介绍 MaxCompute Spark是Ma ...
- 阿里云张振尧:阿里云边缘云驱动5G时代行业新价值
简介:近日,以"5G融合通信趋势下的技术创新"为主题的2021中国增值电信及虚拟运营高峰论坛在北京召开,阿里云边缘云高级产品专家张振尧发表了<阿里云边缘云驱动5G时代行业新 ...
- [Auth] 浅谈 jwt token 的妙处
无状态(易扩展). 有过期时间限制,相对安全(可以有多个有效的 token). 更轻量(适合少量信息),类似传统 query string 签名方式. 标准统一(跨语言). Refer:JWT Aut ...
- 万字长文总结与剖析C语言关键字 -- <<C语言深度解剖>>
C总结与剖析:关键字篇 -- <<C语言深度解剖>> 目录 C总结与剖析:关键字篇 -- <<C语言深度解剖>> 程序的本质:二进制文件 变量 1.变量 ...
- Tomcat+web测试环境配置
一.JDK安装完成 二.Tomcat安装配置 1:官网下载tomact,地址为:https://tomcat.apache.org/download-80.cgi 2:将下载后的文件解压 3:进入To ...
- 本地git用cmd窗口提交时编辑模式退出问题
git commit后输入提交描述. 输入完成后按Esc (退出编辑状态),接着连按两次大写字母Z,就保存好退出了.
- 集群监管-USDP(智能大数据平台)
UCloud Smart Data Platform(简称 USDP),是 UCloud 推出的智能化.轻量级.适用于私有化部署至客户本地的大数据基础服务平台,通过自研的 USDP Manager 管 ...
- Wordpress小技巧(一)
★★★ Wordpress发表Post文章时,页面会出现评论框,如何禁止出现评论框.步骤如下: 一.使用wordpress的后台功能关闭文章评论依次进入"后台"-"设置 ...
- 用pageOffice控件实现 office word文档在线编辑 表格中写数据的方法
PageOffice对Word文档中Table的操作,包括给单元格赋值和动态添加行的效果. 1 应用场景 OA办公中,经常要在文档的指定位置表格,填充后端指定数据. 如word文档中,表格数据 如下表 ...