资讯 社区 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

用BML实现物体检测

目录

1.物体检测简介
2.平台入口
3.准备数据
3.1 道路交通电子眼检测数据介绍
3.2 创建及导入数据集
4.训练模型
5.模型分析和调优
6.部署模型
7.公有云调用
7.1 使用流程

用BML实现物体检测:以道路交通电子眼检测为例

物体检测简介

亲爱的开发者您好,欢迎使用百度BML全功能AI开发平台开启您的AI开发之旅!

物体检测任务是当前深度学习应用最广的计算机视觉应用任务,主要是检测图中每个物体的位置、名称。适合图中有多个主体要识别、或要识别主体位置及数量。其主要应用场景有:

  • 视频监控:如检测是否有违规物体、行为出现。
  • 工业质检:如检测图片里微小瑕疵的数量和位置。
  • 医疗诊断:如医疗细胞计数、中草药识别等。

下文中将以道路交通电子眼检测任务为例,分步骤向您详细介绍如何使用百度BML全功能AI开发平台开发您自己的物体检测模型。

道路交通电子眼检测任务简介:
在实时地图导航场景下,对于不同种类的交通电子提示装置的实时提醒,在规范车主驾驶行为、保障用户出行等方面至关重要。而各类电子提示装置分布于道路大街小巷,这类物体普通目标小,不易发现,通过常规的数据采集和人力手段很难识别,为实现导航规划增加了额外成本。对以电子眼为代表的道路交通要素进行检测,有着较大的价值。

平台入口

BML全功能AI开发平台为企业及个人开发者提供机器学习和深度学习一站式AI开发服务,并提供高性价比的算力资源,助力企业快速构建高精度AI应用,进入官方网站点击【立即使用】。

1、平台入口.png

准备数据

准备数据是AI模型开发的关键一环,训练数据的质量决定了训练所得模型效果可达到的上限,下面来介绍数据规范与相关操作步骤。

道路交通电子眼检测数据介绍

道路交通电子眼检测数据集来自于百度与曙光合作的『先导杯·计算应用大奖赛』的比赛数据,采集自百度地图的实际业务数据。训练集包括近2W样本,其中包含三类目标:rect_eye、sphere_eye、box_eye。

导入平台即可使用,数据下载链接:道路交通电子眼检测数据-json格式

创建及导入数据集

1、在官网界面点击【数据总览】,进入数据集操作界面,点击【创建数据集】。

3.1数据.png

2、进入创建数据集界面,填写相关信息,选择数据和标注类型(注意训练集、验证集、测试集需要分开创建)。

3.1数据1.png

3、数据集创建完成后,可以在数据总览界面看到刚才创建好的数据集ID,点击【导入】,将自己要训练的数据集导入。

3.1数据2.png

以本地导入-上传压缩包为例:导入方式选择【本地导入】,选择标注格式,点击【上传压缩包】。

3.1数据3.png

仔细阅读上传压缩包格式要求,可点击【下载示例压缩包】确认格式:

3.1数据4.png

确认格式无误后,点击【已阅读并上传】, 注意上传时不要关闭网页:

3.1数据5.png

点击【确认并返回】后自动开始导入:

3.1数据6.png

可看到【标注状态】为100%,如果数据集没有全部标注,可使用平台【智能标注】功能。

训练模型

BML上提供了预置模型调参、NoteBook建模、自定义作业三种开发模式,开发难度和开发的灵活性程度不一,分别满足不同水平和需求的开发者。

本文以使用者最多的预置模型调参开发模式为例,示意训练模型的基本步骤。

1、进入bml官方平台点击【预置模型调参】-【计算机视觉模型】,点击【创建】。

4.1训练模型.png

2、填写项目信息并点击【新建】。

4.1训练模型1.png

3、点击【新建任务】。

4.1训练模型2.png

4、点击【+请选择】,勾选刚刚上传数据集下的所有标签类,点击右下角【确定】。

4.1训练模型3.png

5、可以选择上传验证集和测试集。验证集用来确定模型训练过程中超参数的调整。测试集用来获得更客观的模型效果评估结果。如果选择不上传,系统也会自动从已上传的训练集中分割出验证和测试集。

4.1训练模型4.png

6、配置网络,网络选型参考:网络选型介绍

4.1训练模型5.png

7、配置超参数。如果选择脚本编辑为超参来源,可在脚本编辑部分代码框内自定义超参数。超参数配置参考:超参数选择

4.1训练模型5.png

8、可填写相关信息,并发布模型。也可以模型训练完成后再根据训练结果决定是否发布。

4.1训练模型6.png

9、根据自身的周期和经费安排,配置计算资源。

4.1训练模型7.png

10、最后点击【提交训练任务】,进入模型训练。

4.1训练模型8.png

模型分析和调优

1、获取评估报告:点击【模型仓库】-【模型管理】,点击对应任务的【版本列表】查看训练好的模型,点击【评估报告】。

5.1模型评估.png

评估报告如下所示:

5.1模型评估1.png

2、点击【校验模型】。

5.1模型评估2.png

3、模型调优:新建模型时添加如下配置,可提高模型效果。

策略一:数据增强策略(数据增强算子参考

5.1模型评估3.png

策略二:百度超大规模数据集预训练(预训练模型参考

5.1模型评估4.png

策略三:自动超参搜索(自动超参配置参考

5.1模型评估6.png

采用以上优化策略之后,重新打开评估报告,可以看到效果有明显的提升。

5.1模型评估7.png

部署模型

1、在模型管理中,可选择公有云部署, 端云协同服务,批量预测,和纯离线服务四种方式部署模型。具体参考:如何选择部署方式

6.1部署.png

2、在模型部署中,用户按照自己情况填写信息完成模型部署。下图以本地部署纯离线服务为例。

6.1部署1.png

公有云调用

模型仓库中的视觉模型,发布为公有云部署时储在云端,可通过独立Rest API调用模型,实现AI能力与业务系统或硬件设备整合。BML具有完善的鉴权、流控等安全机制,并配置丰富的资源集群稳定承载高并发请求。 并且支持查找云端模型识别错误的数据,纠正结果并将其加入模型迭代的训练集,不断优化模型效果。

使用流程

1、在BML平台公有云部署的操作页面,点击『部署模型』,新建模型部署的任务。

6.1模型调用6.png

2、填写相关信息,完成创建。

6.1模型调用1.png

2、完成创建后回到操作页面,点击『查看详情』,查看配置信息,并获取『接口地址』信息。

6.1模型调用2.png

6.1模型调用5.png

3、点击控制台,进入百度智能云-BML控制台,创建应用。

6.1模型调用3.png

4、创建应用后,在应用列表页可获取『API Key』和『Secret Key』两个信息。

6.1模型调用4.png

5、请求示例如下。

HTTP方法:POST

请求URL: 请首先进行自定义模型训练,完成训练后申请上线,上线成功后可在服务列表中查看并获取url。

URL参数如下:

参数
access_token 通过API Key和Secret Key获取的access_token

Header如下:

参数
Content-Type application/json

注意:如果出现336001的错误码很可能是因为请求方式错误,与其他图像识别服务不同的是定制化图像识别服务以json方式请求。

6、请求参数注意事项如下。

参数 是否必选 类型 可选值范围 说明
image string - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,注意请去掉头部
threshold number - 阈值,默认值为推荐阈值(0-1之间),具体值可在我的训练任务列表-模型效果查看

7、按照下述示例代码,填入相关信息即可完成调用API服务。

以python3.7为例:

# coding:utf-8
"""
 Copyright (c) 2021 Baidu.com, Inc. All Rights Reserved
 Author: test@baidu.com
"""

import requests
import json
import base64
import cv2 as cv


def data_form(image_path):
    """
    Convert data format.
    """
    with open(image_path, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        data = base64_data.decode()
    return data


def show_result(image_path, result, out_path):
    """
    Draw results on image.
    """
    image = cv.imread(image_path)
    for target in result:
        box = target['location']
        label = target['name']
        score = target['score']
        first_point = (box['left'], box['top'])
        last_point = (box['left'] + box['width'], box['top'] + box['height'])
        cv.rectangle(image, first_point, last_point, (0, 255, 0), 2)
        cv.putText(image, label + ':' + '%.4f' % score, first_point, cv.FONT_HERSHEY_SIMPLEX, 0.5,(255,0,0), 1, cv.LINE_AA)
    cv.imwrite(out_path, image)
    img = cv.resize(image, (600,600))
  

def detection(image_path, header, request_url, out_path):
    """
    Processing detection results.
    """
    data = data_form(image_path)
    request_payload = {
        "image": data,
        "threshold": "0.7"}
    response = requests.post(request_url,data=json.dumps(request_payload),headers=header).text
    print('response : ', response)
    tt = json.loads(response)
    result = tt['results']
    show_result(image_path, result, out_path)
    # 打印预测结果
    print('result : ', result)


# 调用鉴权接口获取token
def get_access_token(host):
    """
    get access_token.
    """
    response = requests.get(host)
    if response:
        return response.json()['access_token']
    else:
        print('fail to get access_token')
        return None


if __name__ == "__main__":
    # 获取API Key、Secret Key(需要修改)
    AK = '【控制台应用列表处复制】'
    SK = '【控制台应用列表处复制】'
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(AK, SK)
    # 获取access_token
    access_token = get_access_token(host)
    # 本地数据集存放地址 (需要修改)
    image_path = './检测/道路交通电子眼检测/道路交通电子眼检测_测试集/image/19530.jpg'
    # Header
    header = {"Content-Type": "application/json"}
    # API接口地址 (需要修改)
    request_address = 'https://aip.baidubce.com/rpc/2.0/ai_custom_bml/v1/detection/trafficV1'【配置详情页处复制】
    # 拼接API接口地址和access_token
    request_url = '{}?access_token='.format(request_address) + access_token 
    # 预测输出路径 (需要修改)
    out_path = './output/detection_result.jpg'
    # 调用API
    detection(image_path, header, request_url, out_path)
上一篇
用BML实现图片分类
下一篇
用BML实现实例分割