【愚公系列】华为云系列之基于ModelBox搭建的AI寻车系统

news2025/1/19 11:30:14

文章目录

  • 前言
  • 一、ModelBox简介
    • 1.ModelBox是什么
    • 2.AI开发遇到的问题和解决方案一
      • 2.1 相关问题
      • 2.2 解决方案
    • 3.AI开发遇到的问题和解决方案二
      • 3.1 相关问题
      • 3.2 解决方案
    • 4.ModelBox的功能
    • 5.ModelBox的其他特性
    • 6.ModelBox的应用场景
  • 二、ModelBox搭建的AI寻车系统
    • 1.案例效果
    • 2.环境安装
      • 2.1 ModelBox端云协同AI开发套件(Windows)设备注册
        • 2.1.1 安装VS Code
        • 2.1.2 注册HiLens设备
      • 2.2 ModelBox端云协同AI开发套件(Windows)SDK安装
        • 2.2.1 安装Git for Windows
        • 2.2.2 下载ModelBox sdk
    • 3.AI寻车系统搭建相关步骤
      • 3.1 下载模板
      • 3.2 创建工程
      • 3.3 查看流程图
      • 3.4 核心逻辑
      • 3.5 三方依赖库
      • 3.6 启动脚本执行应用
  • 总结


前言

AI寻车系统的作用是通过使用人工智能技术来帮助车主快速找到自己的车辆,提高车辆管理的效率和准确性。该系统可以通过车载设备、智能手机等终端设备实现车辆定位、追踪和管理,为车主提供便捷的车辆管理服务。

华为云ModelBox是华为云推出的一种AI模型开发和管理平台,它提供了丰富的AI模型算法和工具,可以帮助开发者快速构建和部署AI模型。同时,华为云ModelBox还支持多种AI模型的部署方式,包括在线API、离线SDK和容器化部署等。

本文主要介绍基于ModelBox搭建的AI寻车系统主要包含以下两部分

  • ModelBox简介
  • ModelBox搭建的AI寻车系统

一、ModelBox简介

1.ModelBox是什么

ModelBox是端边云统一的、高性能、高扩展、易用的AI推理开发框架,它可以帮助AI开发者快速完成从模型文件到AI推理应用的开发和上线工作,降低AI算法落地门槛,同时带来AI应用的高稳定性和极致性能。

在这里插入图片描述

2.AI开发遇到的问题和解决方案一

2.1 相关问题

AI硬件主要有以下几种:

  • GPU(图形处理器):GPU是一种高度并行的处理器,适合于处理大规模的数据并行计算,因此被广泛应用于深度学习等AI领域。
  • FPGA(现场可编程门阵列):FPGA是一种可编程的硬件,可以根据需要重新配置其电路,因此适合于加速特定的计算任务,如卷积神经网络。
  • ASIC(专用集成电路):ASIC是一种专门为某种特定应用而设计的芯片,可以提供高性能和低功耗,但是开发成本较高。
  • CPU(中央处理器):CPU是一种通用的处理器,可以执行各种不同的计算任务,但是在处理大规模的数据并行计算时性能较差。
  • TPU(张量处理器):TPU是一种专门为深度学习任务而设计的芯片,可以提供高性能和低功耗,但是只能用于特定的计算任务。

AI 基础框架种类包括 TensorFlow、PyTorch、Keras、Caffe、MXNet 等。

在如此多的AI硬件和基础框架会造成一系列问题:

  • 部署场景复杂,系统架构涉及端边云多种组合
  • 芯片、操作系统、推理框架纷繁多样

在这里插入图片描述

2.2 解决方案

ModelBox的特性(应用编排异构计算组件),它具有以下特性:

  • 支持多种异构计算组件,包括CPU、GPU、FPGA等。
  • 提供了灵活的应用编排能力,可以根据应用需求自由组合不同的计算组件。
  • 支持动态调度和资源管理,可以根据实际负载情况自动调整计算资源。
  • 具有高效的数据传输和通信能力,可以实现不同计算组件之间的数据交换和协同计算。

总之,ModelBox是一种高性能、灵活、可扩展的应用编排异构计算组件,可以为各种应用提供强大的计算支持,缩短跨平台开发和部署成本,一次开发,端边云部署运行。

在这里插入图片描述

3.AI开发遇到的问题和解决方案二

3.1 相关问题

AI应用性能优化确实是一个挑战,因为AI模型通常需要大量的计算资源和时间来训练和推理。但是,有许多技术可以用来优化AI应用的性能,例如使用更高效的算法、优化硬件和软件配置、使用分布式计算等。此外,还可以使用一些技术来减少模型的大小和复杂度,以提高性能。

对于本案例中AI应用性能优化困难主要有:

  • 视频分析应用:多模型多模块,提高FPS
  • HTTP服务:高并发,降低时延,提高吞吐量

在这里插入图片描述

3.2 解决方案

ModelBox的特性(高性能并发调度引擎):ModelBox是一个高性能并发调度引擎,它可以帮助开发者更高效地管理和调度任务,提高系统的并发能力和性能。它的特性包括:支持多种任务类型,支持任务优先级,支持任务依赖关系,支持任务超时控制,支持任务重试机制,支持任务状态监控和报告等。开发者无需掌握底层调度机制,也能保证应用优化效果。
在这里插入图片描述

4.ModelBox的功能

在这里插入图片描述

  • 流程图:有向图,表达应用逻辑,控制ModelBox执行过程,采用GraphvizDOT语言进行表述
  • 功能单元:流程图中的顶点,应用的基本组成部分,ModelBox的执行单元,开发者主要开发的组件
  • ModelBoxAI应用开发流程:
    • 流程图设计:定义业务流程,划分功能单元,理顺功能单元间的数据传递关系
    • 功能单元开发:采用框架已提供的通用功能单元,实现自己定义的业务功能单元
    • 运行与测试:使用图片、视频文件、实时视频流等测试应用

5.ModelBox的其他特性

  • 预置视频处理、图像处理、HTTP服务等通用功能单元,缩短开发成本
  • 集成可视化编排服务,零代码体验AI应用开发

在这里插入图片描述

6.ModelBox的应用场景

华为云ModelBox的应用场景包括但不限于:机器学习、深度学习、自然语言处理、图像识别、智能推荐、数据分析等领域。它可以帮助企业快速构建和部署AI模型,提高数据的价值和利用率,实现智能化转型。

在这里插入图片描述

二、ModelBox搭建的AI寻车系统

1.案例效果

本案例主要使用的技术有:

  1. FairMOT进行车辆检测与跟踪
  2. yolov5进行车牌检测
  3. crnn进行车牌识别,在停车场入口、出口、停车位对车辆进行跟踪与车牌识别,无论停车场路线多复杂,小车在你掌控之中

最终效果如下:

在这里插入图片描述

2.环境安装

2.1 ModelBox端云协同AI开发套件(Windows)设备注册

2.1.1 安装VS Code

与使用ModelBox的其他套件一样,我们推荐使用VS Code进行技能开发,请登录VS Code官网下载安装Windows x64版本的编辑器。

在这里插入图片描述

2.1.2 注册HiLens设备

HiLens设备的注册有两种方式:

  • 使用VS Code插件注册
  • 登录华为云HiLens页面手动下载注册固件,使用命令行注册。 我们推荐第一种方式,操作更简单

1)在VS Code中搜索并安装ModelBox管理插件:

在这里插入图片描述
2)安装完成后,点击界面下方进入华为云登录界面,获取访问密钥,再进行登录:

在这里插入图片描述
如果有访问密钥,即AK/SK,直接输入登录即可登录;否则则需要点击第②步获取访问密钥,在弹出的页面点击新增访问密钥,确认后将下载的表格文件中的AK/SK依次复制填入第③步的填空框内即可。

在这里插入图片描述
在这里插入图片描述
3)如下图依次点击,进行ModelBox设备注册:

在这里插入图片描述
4)确认后,如下图显示“运行中”即完成注册:

在这里插入图片描述

2.2 ModelBox端云协同AI开发套件(Windows)SDK安装

2.2.1 安装Git for Windows

ModelBox中有些脚本的执行依赖bash,使用Git bash也可以让开发者在Windows上获得与Linux相同的执行环境,因此需要安装Git for Windows。

安装完成后右键点击可以看到:

在这里插入图片描述

2.2.2 下载ModelBox sdk

1)在HiLens管理控制台专业版的技能开发-工具/插件板块下载Windows系列的ModelBox sdk:

在这里插入图片描述

2)新建一个用于ModelBox开发的文件夹(注意路径中不能有中文和空格),将下载的sdk压缩包移动到该路径并解压,使用VS Code打开该文件夹:

在这里插入图片描述
其中modelbox-win10-x64文件夹即为ModelBox核心库,包含ModelBox运行环境、内置的功能单元等。另外,为了做到开箱即用,可以看到sdk中已经包含了Python运行环境(python-embed目录),AI应用常用的OpenCV、NumPy等三方库也已经内置,开发者无需手动安装。

此外,我们也推荐安装一些VS Code插件,提高开发效率。

1、Python插件

后面教程会涉及到ModelBox的Python功能单元开发,推荐安装Python插件,微软官方出品,可以进行语法高亮、自动补全、代码跳转等:

在这里插入图片描述
2、Even Better TOML

ModelBox中的流程图、配置文件等使用 TOML 语法编写,因此我们推荐安装 Even Better TOML 插件,可以进行语法检查、关键字高亮、文件排版等:

在这里插入图片描述
3)打开Terminal终端

在这里插入图片描述
4)ModelBox技能模板

我们准备了一些口罩检测、手势检测、人体姿态识别等AI技能模板,存放在华为云OBS中;然后在ModelBox sdk中提供了一个solution.bat工具,用于下载云侧的技能模板,执行.\solution.bat -l可看到当前已有的技能模板:

在这里插入图片描述

3.AI寻车系统搭建相关步骤

这个应用对应的ModelBox版本已经做成模板放在华为云OBS中,可以用sdk中的solution.bat工具下载,接下来我们给出该应用在ModelBox中的完整开发过程:

3.1 下载模板

执行.\solution.bat -l可看到当前公开的技能模板:

在这里插入图片描述
结果中的vehicle_plate_multi_centernet_yolov5_crnn即为AI寻车应用模板,可使用如下命令下载模板:

.\solution.bat -s vehicle_plate_multi_centernet_yolov5_crnn

在这里插入图片描述
solution.bat工具的参数中,-l 代表list,即列出当前已有的模板名称;-s 代表solution-name,即下载对应名称的模板。下载下来的模板资源,将存放在ModelBox核心库的solution目录下。

3.2 创建工程

在ModelBox sdk目录下使用create.bat创建vehicle_plate工程:

.\create.bat -t server -n vehicle_plate -s vehicle_plate_multi_centernet_yolov5_crnn

在这里插入图片描述
create.bat工具的参数中,-t 表示创建事务的类别,包括工程(server)、Python功能单元(Python)、推理功能单元(infer)等;-n 代表name,即创建事务的名称;-s 代表solution-name,表示将使用后面参数值代表的模板创建工程,而不是创建空的工程。

workspace目录下将创建出vehicle_plate工程,工程内容如下所示:

vehicle_plate
|--bin
│  |--main.bat:应用执行入口
│  |--mock_task.toml:应用在本地执行时的输入输出配置,此应用默认使用4路本地视频文件为输入源,最终结果拼接为四宫格输出到屏幕,可根据需要修改
|--CMake:存放一些自定义CMake函数
|--data:存放应用运行所需要的图片、视频、文本、配置等数据
│  |--chuchang_10.mp4:停车场出口测试视频
│  |--ruchang_10.mp4:停车场入口测试视频
│  |--ruku_10.mp4:停车位1测试视频
│  |--kong_10.mp4:停车位2测试视频
│  |--plate_keys.txt:车牌字符文件
│  |--content_file.json:技能参数全局配置文件
|--dependence
│  |--modelbox_requirements.txt:应用运行依赖的外部库在此文件定义,本应用依赖pillow、scipy等工具包
|--etc
│  |--flowunit:应用所需的功能单元存放在此目录
│  │  |--cpp:存放C++功能单元编译后的动态链接库,此应用没有C++功能单元
│  │  |--collapse_ocr:归拢功能单元,车牌识别后处理
│  │  |--condition:条件功能单元,判断是否检测到车辆/车牌
│  │  |--draw_full_screen:多路视频拼接输出功能单元
│  │  |--draw_plate:车牌检测结果绘制
│  │  |--draw_track_bbox:车辆跟踪结果绘制
│  │  |--expand_image:展开功能单元,展开车辆检测/车牌检测结果并行推理
│  │  |--letter_resize:车辆检测预处理功能单元
│  │  |--object_tracker:跟踪功能单元
│  │  |--plate_det_post:车牌检测后处理功能单元
│  │  |--url_cfg:流单元,多路输入解析
│  │  |--vehicle_det_post:车牌检测结果绘制
|--flowunit_cpp:存放C++功能单元的源代码,此应用没有C++功能单元
|--graph:存放流程图
│  |--vehicle_plate.toml:默认流程图,使用本地视频文件作为输入源
│  |--modelbox.conf:modelbox相关配置
|--hilens_data_dir:存放应用输出的结果文件、日志、性能统计信息
|--model:推理功能单元目录
│  |--vehicle_det:车辆检测推理功能单元
│  │  |--vehicle_det.toml:车辆检测推理功能单元的配置文件
│  │  |--vehicle_det_320x576.onnx:车辆检测onnx模型
│  |--plate_det:车牌检测推理功能单元
│  │  |--plate_det.toml:车牌检测推理功能单元的配置文件
│  │  |--plate_det.onnx:车牌检测onnx模型
│  |--plate_rec:车牌识别推理功能单元
│  │  |--plate_rec.toml:车牌识别推理功能单元的配置文件
│  │  |--plate_rec.onnx:车牌识别onnx模型
|--build_project.sh:应用构建脚本
|--CMakeLists.txt
|--rpm:打包rpm时生成的目录,将存放rpm包所需数据
|--rpm_copyothers.sh:rpm打包时的辅助脚本

3.3 查看流程图

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

# 功能单元的扫描路径,包含在[]中,多个路径使用,分隔
# ${HILENS_APP_ROOT} 表示当前应用的实际路径
# ${HILENS_MB_SDK_PATH} 表示ModelBox核心库的实际路径
[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和trace开关启用应用的性能统计
profile = false                       # 是否记录profile信息,每隔60s记录一次统计信息
trace = false                         # 是否记录trace信息,在任务执行过程中和结束时,输出统计信息
dir = "${HILENS_DATA_DIR}/mb_profile" # profile/trace信息的保存位置

[graph]
format = "graphviz"  # 流程图的格式,当前仅支持graphviz
graphconf = """digraph vehicle_plate{
    node [shape=Mrecord]
    queue_size = 1
    batch_size = 1
    
    input1[type=input,flowunit=input,device=cpu,deviceid=0]
    data_source_parser[type=flowunit, flowunit=data_source_parser, device=cpu, deviceid=0]
    url_cfg[type=flowunit, flowunit=url_cfg, device=cpu, deviceid=0]
    video_demuxer[type=flowunit, flowunit=video_demuxer, device=cpu, deviceid=0]
    video_decoder[type=flowunit, flowunit=video_decoder, device=cpu, deviceid=0, pix_fmt="rgb"]
    letter_resize[type=flowunit, flowunit=letter_resize, device=cpu]
    color_transpose[type=flowunit, flowunit=packed_planar_transpose, device=cpu, deviceid=0]
    normalize[type=flowunit, flowunit=normalize, device=cpu, deviceid=0, standard_deviation_inverse="0.003921568627451, 0.003921568627451, 0.003921568627451"]
    vehicle_det[type=flowunit, flowunit=vehicle_det, device=cpu, deviceid=0, batch_size=1]
    vehicle_det_post[type=flowunit, flowunit=vehicle_det_post, device=cpu, deviceid=0]
    object_tracker[type=flowunit, flowunit=object_tracker, device=cpu, deviceid=0]
    vehicle_condition[type=flowunit, flowunit=condition, device=cpu, deviceid=0]

    expand_car[type=flowunit, flowunit=expand_image, device=cpu, deviceid=0, img_h=640, img_w=640]
    plate_color_transpose[type=flowunit flowunit=packed_planar_transpose device=cpu deviceid="0"]
    plate_normalize[type=flowunit flowunit=normalize device=cpu deviceid=0 standard_deviation_inverse="0.003921568627451,0.003921568627451,0.003921568627451"]
    plate_det[type=flowunit flowunit=plate_det device=cpu deviceid="0", batch_size=1]
    plate_det_post[type=flowunit, flowunit=plate_det_post, device=cpu, deviceid=0]
    plate_condition[type=flowunit, flowunit=condition, device=cpu, deviceid=0, key="plate"]
    
    expand_plate[type=flowunit, flowunit=expand_image, device=cpu, deviceid=0, img_h=48, img_w=168, key="plate"]
    ocr_color_transpose[type=flowunit flowunit=packed_planar_transpose device=cpu deviceid="0"]
    ocr_mean[type=flowunit flowunit=mean device=cpu deviceid="0" mean="149.94,149.94,149.94"]
    ocr_normalize[type=flowunit flowunit=normalize device=cpu deviceid=0 standard_deviation_inverse="0.020319,0.020319,0.020319"]
    plate_rec[type=flowunit flowunit=plate_rec device=cpu deviceid="0", batch_size=1]
    collapse_ocr[type=flowunit flowunit=collapse_ocr device=cpu deviceid="0"]
    
    draw_plate[type=flowunit, flowunit=draw_plate, device=cpu, deviceid=0]
    draw_track_bbox[type=flowunit, flowunit=draw_track_bbox, device=cpu, deviceid=0]
    draw_full_screen[type=flowunit, flowunit=draw_full_screen, device=cpu, deviceid=0]
    video_out[type=flowunit, flowunit=video_out, device=cpu, deviceid=0, full_screen=true]

    input1:input -> data_source_parser:in_data
    data_source_parser:out_video_url -> url_cfg:in_1
    url_cfg:out_1 -> video_demuxer:in_video_url
    video_demuxer:out_video_packet -> video_decoder:in_video_packet
    video_decoder:out_video_frame -> letter_resize:in_image
    letter_resize:resized_image -> color_transpose:in_image
    color_transpose:out_image -> normalize:in_data
    normalize:out_data -> vehicle_det:input
    vehicle_det:output -> vehicle_det_post:in_feat
    letter_resize:out_image -> vehicle_det_post:in_image
    vehicle_det_post:out_feat -> object_tracker:in_feat
    object_tracker:out_track -> vehicle_condition:in_track
    video_decoder:out_video_frame -> vehicle_condition:in_image

    vehicle_condition:out_track -> expand_car:in_image
    expand_car:out_image -> plate_color_transpose:in_image
    plate_color_transpose:out_image -> plate_normalize:in_data
    plate_normalize:out_data -> plate_det:input
    plate_det:output -> plate_det_post:in_feat
    expand_car:out_image -> plate_det_post:in_image
    plate_det_post:out_tracks -> plate_condition: in_track
    vehicle_condition:out_track -> plate_condition: in_image

    plate_condition:out_track -> expand_plate:in_image
    expand_plate:out_image -> ocr_color_transpose:in_image
    ocr_color_transpose:out_image -> ocr_mean:in_data
    ocr_mean:out_data -> ocr_normalize:in_data
    ocr_normalize:out_data -> plate_rec:input
    plate_rec:output -> collapse_ocr:in_feat
    expand_plate:out_image -> collapse_ocr:in_image
    collapse_ocr:out_tracks -> draw_plate:in_feat

    plate_condition:out_track -> draw_plate:in_image
    draw_plate:out_image -> draw_track_bbox:in_image
    plate_condition:out_image -> draw_track_bbox:in_image
    draw_track_bbox:out_image -> draw_full_screen:in_image
    vehicle_condition:out_image -> draw_full_screen:in_image
    draw_full_screen:out_image -> video_out:in_video_frame
}"""

[flow]
desc = "vehicle_plate run in modelbox-win10-x64"

将流程图可视化:
在这里插入图片描述
功能解释如下:

  • 灰色部分为预置功能单元
  • 绿色为一般通用功能单元
  • 红色为推理功能单元
  • 蓝色为条件功能单元
  • 黄色为展开归拢功能单元

整个应用逻辑如下:

  1. 视频解码后做图像预处理
  2. 接着是车辆检测
  3. 模型后处理得到车形框与128维车辆reid特征
  4. 送入跟踪算法进行实时跟踪,经过条件功能单元判断,检测到车辆的图送入展开功能单元
  5. 切图进行车牌检测,车牌检测结果归拢后同样要判断是否检测到车牌
  6. 检测到车牌的帧再展开并行进行车牌识别,未检测到的则直接绘制车辆信息。 而未检测到车辆的帧则直接送入多路拼接功能单元,最终输出。

3.4 核心逻辑

本应用核心逻辑中的跟踪与区域判断,跟踪逻辑在object_tracker功能单元中,检测与跟踪使用的是FairMOT算法,算法介绍可参考论文。

首先查看object_tracker功能单元中返回的跟踪对象结构:

def get_tracking_objects(self, online_targets_dict):
        tracking_objects = {}
        for cls_id in range(self.num_classes):
            online_targets = online_targets_dict[cls_id]
            for t in online_targets:
                obj = {}
                tlwh = t.tlwh
                if tlwh[2] * tlwh[3] < self.min_box_area:
                    continue
                tid = t.track_id
                obj["bbox"] = [max(0, tlwh[0]), max(0, tlwh[1]), tlwh[0] + tlwh[2], tlwh[1] + tlwh[3]]
                obj["licence"] = ""
                obj["licence_score"] = 0.0
                obj["plate"] = np.zeros((4, 2)).tolist()
                obj["plate_score"] = 0.0
                obj["bbox_score"] = t.score
                tracking_objects[tid] = obj
        return tracking_objects

可以看到,我们返回的跟踪对象包括车型框、车辆检测得分等已有信息以及车牌、车牌得分、车牌框、车牌框得分等包含默认数据的占位信息,方便后续功能单元获取更新。

从流程图中可以看到,object_tracker后结果送入车辆检测条件功能单元,同样的在流程图中还包含车牌检测条件功能单元,我们当然是希望使用同一个功能单元完成两个判断,所以在条件功能单元condition中,我们配置了参数key,默认为key = “bbox”,即对结构体中的车型框进行判断,具体实现为:

if track_result and np.any([v.get(self.key) for k, v in track_result.items()]):
    buffer_img.set("track", track_json)
    out_track.push_back(buffer_img)
else:
    buffer_img.set("track", track_json)
    out_image.push_back(buffer_img)

这样的话如果是对车型框进行判断,只需要在流程图中配置key = “plate”即可。

同样的,图展开功能单元expand_image也使用了同样的方法,使车辆检测与车牌检测可以共用功能单元:

tracking_objects = json.loads(buffer_img.get("track"))
for idx, target in tracking_objects.items():
	box = np.array(target.get(self.key))
    ...

此外,由于本应用输入为4路视频,因此需要在url_cfg单元中进行session级别信息配置:

url_str = str(self.count) + input_meta.get_private_string("source_url") 
self.count += 1
data_context.get_session_context().set_private_string("multi_source_url", url_str)

session级别的信息在功能单元之间是同步的,这样就可以在后续的功能单元中获取当前输入为哪路输入:

url = data_context.get_session_context().get_private_string("multi_source_url")
image_index = int(url[0])

同样的,对于多路输入,我们需要在本地mock时在bin/mock_task.toml文件中进行输入配置:

[input]
type = "url"
url = "${HILENS_APP_ROOT}/data/ruchang_10.mp4"
[input1]
type = "url"
url = "${HILENS_APP_ROOT}/data/chuchang_10.mp4"
[input2]
type = "url"
url = "${HILENS_APP_ROOT}/data/ruku_10.mp4"
[input3]
type = "url"
url = "${HILENS_APP_ROOT}/data/kong_10.mp4"
对于多路输入的感兴趣区域划定,我们使用content_file配置:

[common]
content_file = "../data/content_file.json"
配置文件内容为:

[
    {
        "vehicle_area": "190,245,382,656,1265,630,956,249",
        "plate_area": "190,245,382,656,1265,630,956,249"
    },
    {
        "vehicle_area": "663,467,228,675,994,682,1167,459",
        "plate_area": "663,467,228,675,994,682,1167,459"
    },
    {
        "vehicle_area": "0,0,1280,0,1280,720,0,720",
        "plate_area": "0,0,1280,0,1280,720,0,720"
    },
    {
        "vehicle_area": "0,0,1280,0,1280,720,0,720",
        "plate_area": "0,0,1280,0,1280,720,0,720"
    }
]

即针对不同输入配置各自的车型车牌感兴趣区域,在后续功能单元中获取配置的参数信息进行处理,如plate_det_post功能单元:

self.areas = json.loads(data_context.get_session_config().get_string("iva_task_common"))
url = data_context.get_session_context().get_private_string("multi_source_url")
image_index = int(url[0])
self.area = self.areas[image_index].get("plate_area")
if self.area:
    self.area = np.array(list(map(int, self.area.split(",")))).reshape(-1, 1, 2).astype(np.int32)

我们目前对于车型和车牌检测的参数配置是保持一致的,也可以配置为不同参数。

3.5 三方依赖库

本应用依赖scipy等工具包,ModelBox应用不需要手动安装三方依赖库,只需要配置在dependence\modelbox_requirements.txt,应用在编译时会自动安装。

3.6 启动脚本执行应用

在项目目录下执行.\bin\main.bat运行应用:

.\bin\main.bat

在这里插入图片描述

白线即配置的感兴趣区域,区域外/未过线车辆根据id赋色,区域内/已过线车辆的使用灰色框,可在输入输出配置中修改划区域任务类型与坐标点。
在这里插入图片描述

总结

AI寻车系统的搭建难点和挑战主要包括以下几个方面:

  • 数据采集和处理:需要收集大量的车辆数据,包括车型、颜色、车牌号码等信息,并对这些数据进行处理和分析,以便系统能够准确地识别和追踪车辆。
  • 图像识别和处理:需要使用先进的图像识别技术,对车辆的外观特征进行识别和分析,以便系统能够准确地识别车辆。
  • 实时性和准确性:需要保证系统能够实时地追踪车辆,并准确地识别车辆的位置和状态,以便及时采取措施。
  • 安全性和隐私保护:需要保护车主的隐私和车辆的安全,防止系统被黑客攻击或滥用。

华为云ModelBox提供了一种快速、高效的模型部署方式,可以帮助开发者快速将训练好的模型部署到生产环境中,从而提高应用的响应速度和性能表现。同时,ModelBox还提供了多种部署方式和灵活的配置选项,可以满足不同场景下的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/884398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『虫无涯赠书01期』|〖测试设计思想〗

『虫无涯赠书01期』&#xff5c;〖测试设计思想〗 &#x1f498; 赠书 - 《测试设计思想》&#x1f9e1; 内容简介&#x1f49b; 作者简介&#x1f496; 本书内容&#x1f497; 读后感想&#x1f49d; 参与方式 &#x1f498; 赠书 - 《测试设计思想》 购书传送门&#xff1a;测…

应用 - 行为分析篇

前言 以商超项目为例&#xff0c;为了更好的给用户提供服务&#xff0c;我们需要了解到用户喜欢什么&#xff0c;我的产品中哪些是用户感兴趣的&#xff0c;哪些是不感兴趣的。我应该在推荐栏目中给用户推荐的内容是哪些。 基于这些业务场景&#xff0c;我们需要一套行为分析…

STL转GLTF【在线工具】

3DConvert 是一个可以进行3D模型格式转换的在线工具&#xff0c;支持多种3D模型格式进行在线预览和互相转换。 1、STL与GLTF格式简介 STL&#xff08;Stereo Lithography&#xff09;文件是一种用于3D打印的文件格式。它是由3D Systems公司开发的一种二进制文件格式&#xff0…

创意转写,文字催生:介绍有用的录音实时转写功能

我有一个朋友叫小敏&#xff0c;是一名记者。她在采访工作中常常遇到一个难题&#xff1a;采访过程中非常容易错过重要信息&#xff0c;到底要用哪款手机录音实时转写软件才能解决这个问题&#xff1f;于是有一天&#xff0c;她听说了一款神奇的录音转文字软件&#xff0c;决定…

84. 柱状图中最大的矩形(单调栈)

题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 解题思路&#xff1a; 方法一&#xff1a;暴力解法 矩形的面积由宽和高决定&#xff0c;可以枚举所有的高度&#xff0c;也就是固定高度&#xff0c;然后从当前高度所在的位置向…

创新方案|超越炒作 – 从产品驱动增长PLG到产品驱动销售PLS的务实策略指南

这篇文章探讨从产品驱动增长到产品驱动销售的策略&#xff0c;超越了产品驱动增长的炒作。尽管产品驱动增长模式被认为是科技公司的灵丹妙药&#xff0c;但要取得成功&#xff0c;通常需要结合更传统的企业模式的要素。研究表明&#xff0c;只有少数采用产品驱动增长模式的公司…

生信豆芽菜-ESTIMATE预测免疫评分

网址&#xff1a;http://www.sxdyc.com/immuneEstimateScore 一、ESTIMATE预测免疫评分介绍 ESTIMATE&#xff08;Estimation of STromal and Immune cells in MAlignant Tumor tissues using Expression data&#xff09;是一种用于预测肿瘤免疫评分的计算方法。它通过分析基因…

LC-相交链表(解法2)

LC-相交链表&#xff08;解法2&#xff09; 链接&#xff1a;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 描述&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在…

生态系统NPP及碳源、碳汇模拟教程

详情点击链接&#xff1a;生态系统NPP及碳源、碳汇模拟教程 一&#xff1a;CASA模型 1.1 碳循环模型 1.2 CASA模型原理 1.3 CASA下载与安装 1.4 CASA注意事项 二&#xff1a;CASA初步操作 2.1 ENVI界面 2.2 ENVI 数据及格式 2.3 基于ENVI的CASA模拟 2.4 CASA结果分析 …

第一张Web及基础与HTTP协议

dns与域名&#xff1a; 网络是基于tcp/ip协议进行通信以及链接 应用层——传输层——网络层——数据链路层——物理层 ip地址&#xff0c;我们每一台主机&#xff0c;都有唯一的地址标识&#xff08;固定的ip地址&#xff09; ip地址的作用&#xff1a; 1&#xff0c;区分用…

一阶RC低通滤波器[原理详细推导]

注意这里面的截止频率 因为前面的推导中的复阻抗里面多了一个f 这里的的函数是: 其中: f为输入信号的频率,f_B为滤波器的截止频率。 该函数的相位角φ&#xff0c;&#xff08;为其argument的反余弦值&#xff09;: 将函数带入有: Re(H(f)) Im(H(f)) 相位角φ为: φ…

重组金黄色葡萄球菌蛋白A(Recombinant Staphylococcal Protein A, r-SPA)——一种基因工程重组蛋白

品 名&#xff1a;重组金黄色葡萄球菌蛋白A&#xff08;Recombinant Staphylococcal Protein A, r-SPA&#xff09;规 格&#xff1a;1 mg&#xff0c;10 mg&#xff0c;100 mg&#xff0c;500 mg&#xff0c;特殊订制产品形式&#xff1a;冷冻干粉&#xff1b;冻干前缓冲…

ATFX汇市:澳洲联储公布会议纪要,美元指数重归103上方

环球汇市行情摘要—— 昨日&#xff0c;美元指数上涨0.29%&#xff0c;收盘在103.17点&#xff0c; 欧元贬值0.37%&#xff0c;收盘价1.0907点&#xff1b; 日元贬值0.41%&#xff0c;收盘价145.55点&#xff1b; 英镑贬值0.06%&#xff0c;收盘价1.2687点&#xff1b; 瑞…

软考高项-思维导图34-36(计算机高级系统项目管理师)

陆续更新一些软考高项的思维导图&#xff0c;都是一些必背知识点&#xff0c;希望可以帮助大家早日考过高项&#xff0c;早日当上高工&#xff0c;早日成为杭州E类人才。全部完整导图快速获取链接&#xff1a;计算机高级系统项目管理师-思维导图汇总 三十四、需求按层次分 三十…

ReBel 论文学习笔记

论文&#xff1a;《Combining Deep Reinforcement Learning and Search for Imperfect-Information Games》 地址&#xff1a;https://arxiv.org/abs/2007.13544v2 代码&#xff1a;https://github.com/facebookresearch/rebel 材料&#xff1a; BV1gt4y1k77C&#xff08;1小时…

LC-链表的中间节点(递归)

LC-链表的中间节点&#xff08;递归&#xff09; 链接&#xff1a;https://leetcode.cn/problems/middle-of-the-linked-list/description/ 描述&#xff1a;给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个…

Kali Linux是什么?它的主要用途是什么?

1. Kali Linux是什么&#xff1f; Kali Linux是一款基于Debian Linux的发行版&#xff0c;专注于网络安全和渗透测试。它由全球顶尖的安全专家和黑客社区维护开发&#xff0c;提供了丰富的工具和资源&#xff0c;用于测试网络、系统和应用程序的安全性。Kali Linux以其强大的功…

SpringCloud教程(中)

目录 八、Hystrix&#xff08;服务降级&#xff09; 8.1、Hystrix基本概念 8.1.1、分布式系统面临的问题 8.1.2、Hystrix是什么&#xff1f; 8.1.3、服务降级 概念 哪些情况会触发降级 8.1.4、服务熔断 8.1.5、服务限流 8.2、Hystrix案例 8.2.1、Hystrix支付微服务构…

关于vue3+niginx前端部署问题

曾经有人给我讲&#xff0c;所谓个人技术是死磕出来的&#xff0c;只有经过不断的试错和解决过程所有问题&#xff0c;以及不断变换思路去解决一件问题的过程&#xff0c;就是个人技术的成长。 最近在给自己搭建的小服务加一个bolg模块&#xff0c;在网上大概看了下轻量级的框…

发明专利写作模板和指导以及案例分析

文章目录 权利要求书说明书摘要摘要附图说明书技术领域背景技术发明内容附图说明具体实施方式 说明书附图 权利要求书 写作模板 1. 一种xxx方法&#xff0c;其特征在于&#xff0c;包括如下步骤&#xff1a;S1, &#xff08;概况介绍第一步&#xff09;&#xff1b;S2, &#x…