主要内容

将目标检测模型部署为微服务

此示例说明如何从 MATLAB® 目标检测模型创建微服务 Docker® 镜像。通过 MATLAB Compiler™ 创建的微服务镜像提供一个可用于访问 MATLAB 代码的 HTTP/HTTPS 端点。

您可以先将 MATLAB 函数打包成可部署存档,然后创建包含该存档和最小 MATLAB Runtime 包的 Docker 镜像。之后,您可以在 Docker 中运行该镜像,并使用任何 MATLAB Production Server™ 客户端 API 调用服务。

示例文件列表

  • cvt.m

要下载示例文件,请在 MATLAB 命令行窗口中键入以下内容。

openExample("compilersdk/ObjectDetectionMicroserviceExample", workDir=pwd)

下载支持包

在 MATLAB 命令提示符下键入 matlabshared.supportpkg.getInstalled 以验证是否安装了以下附加功能:

  • Computer Vision Toolbox™ Model for YOLO v4 Object Detection

如果您需要安装该附加功能,请点击 MATLAB 工具条中的附加功能图标,然后搜索该附加功能。您也可以从 MathWorks File Exchange 下载并安装该附加功能。

前提条件

创建 MATLAB 函数以检测目标

使用以下代码编写一个名为 cvt 的目标检测函数。将该函数保存在名为 cvt.m 的文件中。

function [bboxes, scores, labels] = cvt(imageUrl)
iminfo = imfinfo(imageUrl);
    % Read image
    % If indexed image, read colormap and convert to rgb
    if strcmp(iminfo.ColorType,'indexed') == 1
        [im, cmap] = webread(imageUrl, 'Timeout', 10);
        im = ind2rgb(im, cmap);
    else
        im = webread(imageUrl, 'Timeout', 10);
    end
% Add  pretrained YOLO v4 dataset tinyYOLOv4COCO.mat to MATLAB path for testing
% Comment or remove the next 2 lines of code prior to deploying as microservice
detectorPath = [matlabshared.supportpkg.getSupportPackageRoot, '/toolbox/vision/supportpackages/yolov4/data'];
addpath(detectorPath)
load('tinyYOLOv4COCO.mat', 'detector');

% Detect objects in image using detector
[bboxes,scores,labels] = detect(detector,im);
labels = cellstr(labels);
end

从 MATLAB 命令行测试该函数:

%% Specify image URL
imageUrl = "https://www.mathworks.com/help/examples/deeplearning_shared/win64/TrafficSignDetectionAndRecognitionExample_02.png"
%% Display image
imageFile = "trafficimage.jpg";
imageFileFullPath = websave(imageFile, imageUrl);
[im, cmap] = imread(imageFileFullPath);
imshow(im, cmap)
%% Detect objects in image
[bboxes, scores, labels] = cvt(imageUrl)
bboxes =
  2×4 single matrix
  445.3871  326.4009  223.3270   98.7086
  504.2861  271.4571   45.7471   41.0955
scores =
  2×1 single column vector
    0.9151
    0.6610
labels =
  2×1 cell array
    {'truck'    }
    {'stop sign'}

创建可部署存档

在创建可部署档案之前,请在 cvt.m 文件中注释以下代码行。

% detectorPath = [matlabshared.supportpkg.getSupportPackageRoot, '/toolbox/vision/supportpackages/yolov4/data'];
% addpath(detectorPath)

使用 compiler.build.productionServerArchive 函数将 cvt 函数打包成可部署存档。

您可以使用名称-值参量在 compiler.build 命令中指定其他选项。有关详细信息,请参阅compiler.build.productionServerArchive

buildResults = compiler.build.productionServerArchive('cvt.m', ...
    'ArchiveName','yolov4od','Verbose',true, ...
    'SupportPackages',{'Computer Vision Toolbox Model for YOLO v4 Object Detection'});
buildResults = 
  Results with properties:

                  BuildType: 'productionServerArchive'
                      Files: {'/home/mluser/work/yolov4odproductionServerArchive/yolov4od.ctf'}
    IncludedSupportPackages: {'Computer Vision Toolbox Model for YOLO v4 Object Detection'}
                    Options: [1×1 compiler.build.ProductionServerArchiveOptions]
        RuntimeDependencies: [1×1 compiler.runtime.Dependencies]

buildResults 对象包含有关编译类型、生成的文件、包含的支持包和编译选项的信息。

编译完成后,该函数会在您的当前目录中创建一个名为 yolov4odproductionServerArchive 的文件夹来存储可部署存档。

将存档打包成微服务 Docker 镜像

使用您创建的 buildResults 对象构建微服务 Docker 镜像。

您可以使用名称-值参量在 compiler.build 命令中指定其他选项。有关详细信息,请参阅compiler.package.microserviceDockerImage

compiler.package.microserviceDockerImage(buildResults,...
    'ImageName','yolov4od-microservice',...
    'DockerContext',fullfile(pwd,'microserviceDockerContext'));

该函数会在当前工作目录中名为 microserviceDockerContext 的文件夹中生成以下文件:

  • applicationFilesForMATLABCompiler/yolov4od.ctf - 可部署存档文件。

  • Dockerfile - 指定 Docker 运行时选项的 Docker 文件。

  • GettingStarted.txt - 包含部署信息的文本文件。

测试 Docker 镜像

在系统命令行窗口中,确认您的 yolov4od-microservice 镜像在 Docker 镜像列表中。

docker images
REPOSITORY                                      TAG           IMAGE ID            CREATED             SIZE
yolov4od-microservice                           latest        4401fa2bc057        33 seconds ago      7.56GB
matlabruntime/r2022b/update0/4200000000000000   latest        5259656e4a32        24 minutes ago      7.04GB

从系统命令提示符运行 yolov4od-microservice 微服务镜像。

docker run --rm -p 9900:9910 yolov4od-microservice -l trace &

端口 9910 是 Docker 容器内微服务公开的默认端口。您可以将微服务映射到主机上的任何可用端口。对于此示例,微服务映射到端口 9900。

您可以在 Docker 命令中指定其他选项。有关完整选项列表,请参阅微服务命令参量

当微服务容器在 Docker 中运行后,您可以通过在 Web 浏览器中转至以下 URL 来检查服务的状态:http://hostname:9900/api/health

如果服务已准备就绪,可以接收请求,您将看到以下消息:"status: ok"

测试正在运行的服务。在终端中,使用 curl 命令通过端口 9900 向服务发送 JSON 查询。有关构造 JSON 请求的详细信息,请参阅MATLAB 数据类型的 JSON 表示 (MATLAB Production Server) (MATLAB Production Server)。

curl -v -H Content-Type:application/json \
-d '{"nargout":3,"rhs":["https://www.mathworks.com/help/examples/deeplearning_shared/win64/TrafficSignDetectionAndRecognitionExample_02.png"]}' \ 
"http://hostname:9900/yolov4od/cvt" | jq -c

输出为:

{"lhs":[{"mwdata":[445.387146,504.286102,326.40094,271.457092,223.327026,45.7471,98.7086487,41.09552],"mwsize":[2,4],"mwtype":"single"},
{"mwdata":[0.91510725,0.661022],"mwsize":[2,1],"mwtype":"single"},
{"mwdata":[{"mwdata":["truck"],"mwsize":[1,5],"mwtype":"char"},
{"mwdata":["stop sign"],"mwsize":[1,9],"mwtype":"char"}],"mwsize":[2,1],"mwtype":"cell"}]}

您也可以从 MATLAB 桌面进行测试:

%% Import MATLAB HTTP interface packages
import matlab.net.*
import matlab.net.http.*
import matlab.net.http.fields.*

%% Setup message body
body = MessageBody;
body.Payload = ...
    '{"nargout": 3,"rhs": ["https://www.mathworks.com/help/examples/deeplearning_shared/win64/TrafficSignDetectionAndRecognitionExample_02.png"]}';

%% Setup request
requestUri = URI('http://hostname:9900/yolov4od/cvt');
options = matlab.net.http.HTTPOptions('ConnectTimeout',20,...
    'ConvertResponse',false);
request = RequestMessage;
request.Header = HeaderField('Content-Type','application/json');
request.Method = 'POST';
request.Body = body;

%% Send request & view raw response
response = request.send(requestUri, options);
disp(response.Body.Data)

%% Decode JSON
lhs = mps.json.decoderesponse(response.Body.Data);

%% Clean up printed output
for i = 1:length(lhs)
    [r,c] = size(lhs{i});
    if ~iscell(lhs{i}) && c==1
        tmp(:,i) = num2cell(lhs{i});
    elseif ~iscell(lhs{i}) && c~=1
        tmp(:,i) = num2cell(lhs{i},2);
    else
        tmp(:,i) = lhs{i};
    end
end
%% Display response as a table
T = cell2table(tmp,'VariableNames',{'Boxes', 'Scores', 'Labels'})

输出为:

T =

  2×3 table

                   Boxes                    Scores        Labels    
    ____________________________________    _______    _____________

    445.39     326.4    223.33    98.709    0.91511    {'truck'    }
    504.29    271.46    45.747    41.096    0.66102    {'stop sign'}

要停止服务,请使用以下命令显示容器 ID。

docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
f372b8b574e8        yolov4od-microservice   "/opt/matlabruntime/…"   6 hours ago         Up 6 hours          0.0.0.0:9900->9910/tcp   distracted_panini

使用指定的容器 ID 停止服务。

docker stop f372b8b574e8

共享 Docker 镜像

您的 Docker 镜像可以通过多种方式共享。

  • 将您的镜像推送到 Docker 的中央注册表 DockerHub,或者推送到您的私有注册表。这是最常见的工作流。

  • 将您的镜像保存为 tar 存档,然后与他人共享。该工作流适合于立即测试。

有关将您的镜像推送到 DockerHub 或您的私有注册表的详细信息,请查阅 Docker 文档。

将 Docker 镜像保存为 Tar 存档

要将您的 Docker 镜像保存为 tar 存档,请打开系统命令行窗口,导航到 Docker 上下文文件夹,然后键入以下命令。

docker save yolov4od-microservice -o yolov4od-microservice.tar

此命令会在当前文件夹中创建一个名为 yolov4od-microservice.tar 的文件。在与其他用户共享 tarball 之前,请设置适当的权限(例如,使用 chmod 进行设置)。

从 Tar 存档加载 Docker 镜像

在最终用户计算机上加载 tarball 中包含的镜像。

docker load --input yolov4od-microservice.tar

验证镜像是否已加载。

docker images

运行 Docker 镜像

docker run --rm -p 9900:9910 yolov4od-microservice

另请参阅

| | |

主题

外部网站