开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
图像技术
文字识别
人脸与人体识别
视频技术
AR与VR
自然语言处理
知识图谱
数据智能
场景方案
部署方案
行业应用
智能教育
智能医疗
智能零售
智能工业
企业服务
智能政务
智能农业
信息服务
智能园区
智能硬件
EasyDL零门槛AI开发平台

    EasyDL图像-物体检测快速开始

    目录

    1. 场景介绍
    2. 实现步骤
    3. 总结
    4. 了解更多

    场景介绍

    工业场景

    零件分拣、零件计数是在工业生产过程中的一个常见业务需求,由于零件样式多样,市面上没有现成的零件识别服务可以直接使用,往往需要定制企业零件专用的图像识别能力。 某个工业质检领域的服务商收到甲方需求,希望能在工厂中实现检测螺丝和螺母,并借助机械臂等装置协助人工完成自动分拣。该服务商经过详细了解需求,发现螺丝与螺母由于排列密集且没有规律,如果要配合机械臂完成就需要精准定位出图片中每个零件的名称及位置。经过调研,由于市场上并没有任何一家公司有现成的螺丝螺母识别服务,同时该服务商缺少相关AI算法工程师及算力资源,如果筹备相关技术及资源成本较高,成为该服务商面临的一大难题。无意中了解到百度EasyDL可以灵活定制并可以快速上手获得业务所需的高精度AI能力,刚好可以解决该服务商面临的问题。

    实现步骤

    只需四步即可完成自定义AI模型的训练,以及将模型以云端API、离线SDK发布。

    Step1:成为百度AI开放平台的开发者

    要调用百度AI开放平台的语音合成能力先要成为百度AI开放平台的开发者,首先让我们花5分钟来注册百度AI开放平台的开发者 (如果您已经是开发者可跳过此步骤)

    先点击此处注册百度账户进入 如下图 的页面快速的建立一个百度账号吧。

    image.png

    Step2:提前准备训练数据

    物体检测需要提供包含目标物体的图片并标注物体即可训练物体检测模型,自动识别图中所有目标物体的位置、名称,下面我们来看看这次需要计数的包含螺丝螺母的图片示例:

    image.png

    图片数量越多理论上训练的效果就越好,物体检测的图片数据理建议不低于20张图片 注意图片需要为业务生产的真实环境所采集的图片,与真实场景越贴近,训练模型效果越佳

    Step3:使用EasyDL训练物体检测模型

    我们有账号之后可以在EasyDL官网登录,并且进入物体检测 训练页面,选择物体检测服务

    image.png

    在创建模型之前,我们需要上传我们之前准备好的原始图片,我们先点击菜单 创建数据集 创建一个数据集

    image.png

    接下来我们针对这个创建完成的数据集上传图片

    image.png

    image.png

    上传完成后进行图片的标注

    image.png

    标注的过程需要在右侧建立标签,然后在图片上框选出物体并选择右侧相应的标签标识物体类型,最后点击完成。

    image.png

    在我们将所有的图片都进行标注完成后,我们可以使用这个数据集来创建模型了,点击左边菜单的创建模型进入创建模型页面

    image.png

    创建完成模型后我们就可以开始训练模型了,在模型列表中点击列表中的训练开始模型的训练

    我们需要填写一些相应的信息,其中最重要的是选择我们之前标注完成的数据集

    image.png

    之后完成模型的创建,创建完成后模型开始一段时间的训练,在进行下一步之前我们需要等待模型的训练完成

    image.png

    等待训练完成后我们可以在列表中看到模型的效果指标数据,我们可以先选择发布云服务以及离线服务将训练好的模型进行发布。 这里我们先选择发布云服务

    image.png

    发布云服务需要我们输入一个在线服务地址,之后会用来生成在线服务调用地址

    image.png

    发布完成后我们可以通过云服务的 服务详情 按钮查看服务地址

    image.png

    接下来为了能够安全的使用刚刚创建的在线服务,我们点击立即使用,跳转到百度云控制台创建一个应用

    image.png

    image.png

    填写信息创建完成后,我们需要查看API KEY 以及 Secret KEY,之后在调用在线服务的时候需要它们,至此我们完成了模型的创建训练工作,之后让我们用一些简单的客户端代码来调用这个服务

    Step4: 通过使用在线API测试所训练的模型效果

    第三步最后API KEY 以及 Secret KEY,以及第二步的数据,我们就可以写一个示例代码调用我们之前创建并训练完成的自定义螺丝螺母识别模型

    准备开发环境

    我们选择用python来快速搭建一个原型,如果没有接下来需要安装一下python。可以参考下表列出的不同操作系统的安装方法进行安装。

    Python的官方下载地址:下载python

    image.png

    Windows 快速测试包

    windows平台的用户如果对上述的python安装感到困难,可以下载我们的一键测试包,下载地址:windows测试包

    解压zip文件后,双击run.bat即可测试。

    编写代码

    新建一个 main.py

    粘贴以下内容,不要忘记替换你的 API_KEY 以及 SECRET_KEY

    # coding=utf-8
    
    import sys
    import json
    import base64
    
    
    # 保证兼容python2以及python3
    IS_PY3 = sys.version_info.major == 3
    if IS_PY3:
        from urllib.request import urlopen
        from urllib.request import Request
        from urllib.error import URLError
        from urllib.parse import urlencode
        from urllib.parse import quote_plus
    else:
        import urllib2
        from urllib import quote_plus
        from urllib2 import urlopen
        from urllib2 import Request
        from urllib2 import URLError
        from urllib import urlencode
    
    # 防止https证书校验不正确
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    
    # 百度云控制台获取到ak,sk以及
    # EasyDL官网获取到URL
    
    # ak
    API_KEY = 'Wiz6X3riOjoy3DpQPdW8fO7l'
    
    # sk
    SECRET_KEY = 'mU1npXUNnk4IDGozEobnceewTHAkICPT'
    
    # url
    EASYDL_OBJECT_DETECT_URL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/detection/luosiluomushu"
    
    """  TOKEN start """
    TOKEN_URL = 'https://aip.baidubce.com/oauth/2.0/token'
    
    """
        获取token
    """
    def fetch_token():
        params = {'grant_type': 'client_credentials',
                  'client_id': API_KEY,
                  'client_secret': SECRET_KEY}
        post_data = urlencode(params)
        if (IS_PY3):
            post_data = post_data.encode('utf-8')
        req = Request(TOKEN_URL, post_data)
        try:
            f = urlopen(req, timeout=5)
            result_str = f.read()
        except URLError as err:
            print(err)
        if (IS_PY3):
            result_str = result_str.decode()
    
        result = json.loads(result_str)
    
        if ('access_token' in result.keys() and 'scope' in result.keys()):
            if not 'brain_all_scope' in result['scope'].split(' '):
                print ('please ensure has check the  ability')
                exit()
            return result['access_token']
        else:
            print ('please overwrite the correct API_KEY and SECRET_KEY')
            exit()
    
    """
        读取文件
    """
    def read_file(image_path):
        f = None
        try:
            f = open(image_path, 'rb')
            return f.read()
        except:
            print('read image file fail')
            return None
        finally:
            if f:
                f.close()
    
    """
        调用远程服务
    """
    def request(url, data):
        req = Request(url, json.dumps(data))
        has_error = False
        try:
            f = urlopen(req)
            result_str = f.read()
            if (IS_PY3):
                result_str = result_str.decode()
            return result_str
        except  URLError as err:
            print(err)
    
    
    if __name__ == '__main__':
    
        # 获取access token
        token = fetch_token()
    
        # 拼接url
        url = EASYDL_OBJECT_DETECT_URL + "?access_token=" + token
    
        filename = "test_image.jpg"
    
        file_content = read_file(filename)
    
        # 请求接口
        response = request(url, 
            {
                'image': base64.b64encode(file_content),
                'threshold': 0.6
            })
    
        result_json = json.loads(response)
    
        result = result_json["results"]
        if len(result) == 0:
            print("图片中未识别到丝螺母")
        else:
            for obj in result:
                loc = obj["location"]
                print("物体类型:" + str(obj["name"]))
                print("置信度:" + str(obj["score"]))
                print("物体位置坐标:")
                print("    左:" + str(loc["left"]) +  " 上:" + str(loc["top"]) + " 长:" + str(loc["width"]) + " 高:" + str(loc["height"]))
                print("")

    运行代码

    在命令行中运行python main.py

    您还可以在我们的github地址中找到main.py

    结果

    若代码正确运行,命令行界面上会显示出运行结果:

    物体类型:luomu
    置信度:0.994093716145
    物体位置坐标:
        左:704 上:185 长:138 高:131
    
    物体类型:luomu
    置信度:0.992784619331
    物体位置坐标:
        左:1128 上:638 长:137 高:138
    
    物体类型:luomu
    置信度:0.93083935976
    物体位置坐标:
        左:835 上:552 长:136 高:139
    
    物体类型:luosi
    置信度:0.920519411564
    物体位置坐标:
        左:661 上:458 长:187 高:275
    
    物体类型:luomu
    置信度:0.917781472206
    物体位置坐标:
        左:881 上:369 长:131 高:132

    结果中返回了识别出的所有物体的标签,置信度,以及在识别的图片中所处的位置和大小,更详细的参数和返回结果描述可以查看API文档EasyDL 物体检测API参考文档

    使用设备端离线SDK测试训练好的模型

    对于没有网络等特殊情况,我们还可以使用运行在端设备上的离线模型进行识别

    我们进入我的模型 查看模型列表,在之前训练的模型的离线服务后点击申请发布

    image.png

    勾选我们需要的端设备平台发布

    image.png

    等待审批成功并发布完成后我们点击服务详情 查看和下载各类平台的sdk和示例程序,我们还可以直接用安装或者iOS手机扫码下载示例程序测试

    image.png

    WINDOWS离线SDK使用示例

    服务详情中选择windows -》 下载SDK -》基础班SDK -》通用X86版,并且点击获取序列号进入获取序列号页面,获取序列号

    image.png

    获取序列号

    image.png

    解压并且打开下载包,启动exe文件,在Serial Num框里填写上一部获取到的序列号(格式为xxxx-xxxx-xxxx-xxxx)后点击『启动服务』按钮

    image.png

    启动成功后我们就可以在没有网络的情况下访问本地地址调用物体检测服务了,下面我们写一个简单的python示例:

    # coding=utf-8
    import requests
    
    with open('../test_image.jpg', 'rb') as f:
        img = f.read()
    
    result = requests.post('http://127.0.0.1:24401/', params={'threshold': 0.1},
                                                      data=img).json()
    
    results = result["results"]
    
    if len(results) == 0:
        print("图片中未识别到螺丝螺母")
    else:
        for obj in results:
     
            print("物体类型:" + str(obj["label"]))
            print("置信度:" + str(obj["confidence"]))
            print("物体位置坐标:")
            print("    左:" + str(obj["x1"]) +  " 上:" + str(obj["y1"]) + " 右:" + str(obj["x2"]) + " 下:" + str(obj["y2"]))
            print("")

    在sdk的exe目录中创建一个offline_windows_demo.py并且粘贴上面的代码,并且把需要预测的图片放到目录中,在命令行中执行

    python37\python demo.py

    您还可以在我们的github地址中找到demo.py,以及我们为您准备好的test_image.jpgdemo.bat, 请拷贝到sdk目录中直接双击demo.bat即可,我们来看看调用结果:

    image.png

    总结

    使用EasyDL我们在零算法基础的情况下,通过可视化的页面流程训练出了一个针对工业质检领域的可检测出螺丝螺母的在线以及离线模型,通过简单的python程序即可完成两类服务的调用,既方便又有效的为工业质检领域AI赋能,解决实际业务问题。

    了解更多

    除上文提到的场景外,EasyDL还有更多的AI定制化能力用于满足各个行业的各种场景,您可以点击这里 了解更多

    示例源代码

    您可以在我们的官方github上下载示例源码

    https://github.com/Baidu-AIP/QuickStart/tree/master/EASYDL-DETECT

    快速体验

    我们提供了上述案例的官方android手机演示app下载地址,安装完成即可快捷方便的体验手机端的物体检测模型效果

    D787CB60BA67495CA6533C1B745AC372.png

    Android APP下载二维码:

    image.png

    测试图片原图:

    image.png

    产品特色

    可视化操作: 无需机器学习专业知识,模型创建-数据上传-模型训练-模型发布全流程可视化便捷操作,最快15分钟即可获得一个高精度模型 高精度效果:EasyDL底层结合百度 AutoDL/AutoML技术,针对用户数据自动获得最优网络和超参组合,基于少量数据就能获得出色效果和性能的模型 端云结合:训练完成的模型可发布为云端API或离线SDK,灵活适配各种使用场景及运行环境 数据支持:全方位支持训练数据的高质量采集与高效标注,支持在模型迭代过程中不断扩充数据,助力提升模型效果

    更多参考

    百度EasyDL平台简介

    如何获取API Key及Secret Key

    上一篇
    EasyDL图像-图像分类快速开始
    下一篇
    EasyDL文本-文本分类快速开始