机器视觉-EasyDL商品检测-标准版

功能:

EasyDL是百度大脑中的一个定制化训练和服务平台,EasyDL零售版是EasyDL针对零售场景推出的行业版,定制商品检测服务是EasyDL零售版的一项服务,专门用于训练货架合规性检查、自助结算台、无人零售货柜等场景下的定制化商品检测AI模型,训练出的模型将以API的形式为客户提供服务,API接口可以返回商品的名称和商品在图中的位置,适用于识别货架中的商品信息,商品计数,辅助货架商品陈列合规检查,如铺货率、陈列情况等。具体细节(包括操作步骤)请看相关API技术文档:

https://ai.baidu.com/docs#/EasyDL_Retail_Intro/top

下面是我写的Demo,目前平天上没提供相关Demo。一开始用PHP写的,后来为了兼容公司这边实际情况,改成了NODEJS了,开发过程中遇到了很多坑点,参数交互的时候,一定要细心。百度大脑后台对应的服务器有的支持Ajax跨域,有的不支持,这个是自己实际测出来的,这个要注意,还有就是我的这个Demo是本地通过请求获取token,然后在拿着token直接在本地访问百度的接口,把图片的base64编码扔了过去,实际情况可能不是这样的,比如图片的话你可能自己服务器也要存,这种情况请根据实际业务需求进行对应更改。切记不要暴露自己的 API KEY  和 Secret Key 。同时百度的EasyDL分两个模式,一个是定制版一个是标准版,我这次整理的是标准版的接口,标准版不涉及到自己训练数据。所以相对简单。同时标准版和定制版的Demo可以通用的。只是定制版本再加上自己去平台训练数据参数调整等一些额外的操作等。还有很多流程和细节,请直接看上面API文档链接。

server.js

var http = require("http");

var https = require('https');

var fs = require('fs');

var url = require('url');

function gettoken(response) { // 浏览器端发来get请求

    var apikey = "XXX换成自己的";  //API Key

    var secretkey = "XXXX换成自己的"; //Secret Key

    var url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + apikey + "&client_secret=" + secretkey;

    https.get(url,function(res){  //通过get方法获取对应地址中的页面信息

        var chunks = [];

        var size = 0;

        res.on('data',function(chunk){   //监听事件 传输

            chunks.push(chunk);

            size += chunk.length;

        });

        res.on('end',function(){  //数据传输完

            var data = Buffer.concat(chunks,size);

            var html = data.toString();

            var obj = JSON.parse(html);

            var token = obj.access_token;

            console.log(token);

            response.write(token);

            response.end();

        });

    });

}

http.createServer(function(request, response) {

    response.writeHead(200, {"Content-Type": "text/html"});//text/plain

    var pathname = url.parse(request.url).pathname;

    console.log(pathname);

    if(pathname == "/token"){

        console.log("request get token!");

        gettoken(response);

    }else{

            fs.readFile(pathname.substr(1), function (err, data) {

            if (err) {

                console.log(err);

                // HTTP 状态码: 404 : NOT FOUND

                // Content Type: text/html

                response.writeHead(404, {'Content-Type': 'text/html'});

            }else{

                // HTTP 状态码: 200 : OK

                // Content Type: text/html

                response.writeHead(200, {'Content-Type': 'text/html'});

                // 响应文件内容

                response.write(data.toString());

            }

            //  发送响应数据

            response.end();

        });

    }

    //response.write("Hello World");

    //response.end();

}).listen(8888);

console.log("nodejs start listen 8888 port!");

console.log("http://127.0.0.1:8888/client.html");

client.html

<div style="width: 100%;height: 100%">

    <div style="position:absolute;left:0;top:0px;">

        <input accept="image/*"  id="upload_file" type="file">

    </div>

    <div style="background-color: #5bc0de; position:absolute;width:48%;height:200px;left:1%;top:30px;">

        <img src="" id="productimg" width="100%" height="100%" />

    </div>

    <div style="position:absolute;width:48%;height:200px;left:51%;top:30px;">

        <textarea id="base64_output"  style="height: 100%;width:100%"></textarea>

    </div>

    <div style="position:absolute;width:98%;height:400px;left:1%;top:250px;">

        <textarea id="imgmessage"  style="height: 100%;width:100%"></textarea>

    </div>

</div>

<script>

    document.getElementById("upload_file").onchange = function (e) {

        var file = e.target.files[0];

        $_("productimg").src=URL.createObjectURL(file);

        gen_base64();

    };

    function $_(id) {

        return document.getElementById(id);

    }

    function gen_base64() {

        var file = $_('upload_file').files[0];

        r = new FileReader();  //本地预览

        r.onload = function(){

            $_('base64_output').value = r.result;

            var imgbase64 = r.result;

            work(imgbase64);

        }

        r.readAsDataURL(file);    //Base64

    }

    document.getElementById("upimage").onchange = function () {

        gen_base64();

    };

</script>

<script>

    function work(imgbase64) {

        var url = "./token";

        var httpRequest = new XMLHttpRequest();

        httpRequest.open('GET', url, true);

        httpRequest.setRequestHeader("Content-type","application/json");

        httpRequest.send();

        httpRequest.onreadystatechange = function () {

            if (httpRequest.readyState == 4 && httpRequest.status == 200) {

                var token = httpRequest.responseText;//获取到json字符串,还需解析

                //console.log(json);

                //document.write(json);

                getimgmessage(imgbase64,token);

            }

        };

    }

    function getimgmessage(imgbase64,token){

        var index = imgbase64.indexOf(',');

        imgbase64 = imgbase64.substring(index+1,imgbase64.length);

        //document.write(imgbase64);

        var obj = { "image": imgbase64};

        var httpRequest = new XMLHttpRequest();

        var url = "https://aip.baidubce.com/rpc/2.0/easydl/v1/retail/drink?access_token=" + token;

        httpRequest.open('POST', url, true);

        httpRequest.setRequestHeader("Content-type","application/json");

        httpRequest.send(JSON.stringify(obj));

        /**

         * 获取数据后的处理程序

         */

        httpRequest.onreadystatechange = function () {

            if (httpRequest.readyState == 4 && httpRequest.status == 200) {

                var json = httpRequest.responseText;

                var analysisresults =unescape(json.replace(/\\u/g, '%u'));

                //console.log(json);

                //document.write(unescape(json.replace(/\\u/g, '%u')));

                var analysisresultss = JSON.parse(analysisresults);

                document.getElementById('imgmessage').value = dealstring(analysisresultss);

            }

        };

    }

    function  dealstring(analysisresultss){

        var string = "log_id:" + analysisresultss.log_id + "\n";

        string = string + "results " + analysisresultss.results.length + "\n";

        for(var index = 0 ;index <analysisresultss.results.length ;index ++){

            var strtmp = "";

            if(index < 10) strtmp = "000";

            else if(index < 100)strtmp = "00";

            else strtmp = "0";

            string = string + strtmp + index + "." + JSON.stringify(analysisresultss.results[index]) + "\n";

        }

        return string;

    }

</script>

运行结果:(NODE+Win7)

机器视觉-EasyDL商品检测-标准版-Demo的更多相关文章

  1. 酷睿彩票合买代购网站管理系统 v2016 - 源码下载 有合买功能 有免费版 标准版 高级版

    源码介绍 免费版下载地址 电信 浙江腾佑 网鼎科技 正易网络下载 联通 网鼎联通   标准版联系QQ:1395239152 彩票合买代购网站管理系统公司独立开发,完全拥有软件自主知识产权.具有电脑We ...

  2. Windows 2003 Server 标准版启动问题解决(资源转贴)

    维护的系统之一是部署在windows2003 Server标准版的服务器上,可能是由于某个应用问题,导致远程重启失败,害得我在机房呆了一早晨,可算是够折腾的.最后按照官方文档解决,刚放文档地址是:ht ...

  3. Rational AppScan 标准版可扩展性和二次开发能力简介

    下载:IBM® Rational® AppScan 标准版  |   Web 应用安全与 IBM Rational AppScan 工具包 获取免费的 Rational 软件工具包系列,下载更多的 R ...

  4. oracle 11g R2 标准版 64位linux安装

    安装环境:Redhat es 5.5 64位 ,系统内存8G,swap 10G ,oracle 11G R2 标准版 一,Oracle 安装前的准备检查一下包,必须全部安装:binutils-2.17 ...

  5. 下载-MS SQL Server 2005(大全版)含开发人员版、企业版、标准版【转】

    中文名称:微软SQL Server 2005 英文名称:MS SQL Server 2005资源类型:ISO版本:开发人员版.企业版.标准版发行时间:2006年制作发行:微软公司地区:大陆语言:普通话 ...

  6. SQL Server 2016 SP1 标准版等同企业版?!

    上周微软发布了SQL Server的历史性公告:SQL Server 标准版的SP1提供你和企业版一样得功能.你不信的话?可以点击这里. 这改变了整个关系数据库市场,重重打击了Oracle.在今天的文 ...

  7. 五一干货来袭!开源Moon.Orm标准版发布!

    标准版源代码下载: 链接:http://pan.baidu.com/s/1i3xj0f7 因五一早过(现在中旬了),解压码获取请到: http://www.cnblogs.com/humble/p/3 ...

  8. SQL Server 2008 标准版不支持Reporting Services的数据驱动订阅

    今天开发同事找我,说为什么Reporting Services服务器的报表管理的订阅选项里面只有"新建订阅"选项, 没有"数据驱动订阅"选项,说实话,我也基本上 ...

  9. SQL Server 2008 R2 企业版/开发版/标准版(中英文下载,带序列号)

    一. 简体中文 1. SQL Server 2008 R2 Developer (x86, x64, ia64) – DVD (Chinese-Simplified) File Name: cn_sq ...

随机推荐

  1. 【MaixPy3文档】写好 Python 代码!

    本文是给有一点 Python 基础但还想进一步深入的同学,有经验的开发者建议跳过. 前言 上文讲述了如何认识开源项目和一些编程方法的介绍,这节主要来说说 Python 代码怎么写的一些演化过程和可以如 ...

  2. java 给时间增加时间得到一个新的时间(日期)

    SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd") LocalDate expirationDate String exp ...

  3. 关于个Base64,MD5,16进制的转换

    1,待签名数据以UTF-8的格式转字节流,对字节流进行MD5算法得到的签名字节流,再转换为16进制字符串,即生成了数字签名. byte[] targetData = md5.ComputeHash(S ...

  4. Django 页面缓存的cache_key是如何生成的

    页面缓存 e.g. @cache_page(time_out, key_prefix=key_prefix) def my_view(): ... 默认情况下,将使用配置中的default cache ...

  5. 通过unity Distribution Portal发布华为渠道的游戏

    背景说明 前面几个帖子详细介绍了: Unity Editor安装和Apk打包 手把手教您快速运行Unity提供的华为游戏demo 使用unity完成华为游戏的初始化和华为帐号登录 快速开发Unity游 ...

  6. java例题_09 1000以内的完全数

    1 /*9 [程序 9 求完数] 2 题目:一个数如果恰好等于它的所有因子之和,这个数就称为"完数". 3 例如 6=1+2+3.编程找出 1000 以内的所有完数. 4 */ 5 ...

  7. MongoDB 那些事(一文以蔽之)

    前言 身边一直都有小伙伴在问:MongoDB到底是什么?它有到底什么特性?有什么与众不同?在什么情况下使用MongoDB最合适?以什么样的姿势是最好的?难道就一定要用吗?....说实话,这些问题都问到 ...

  8. vue 快速入门 系列 —— 虚拟 DOM

    其他章节请看: vue 快速入门 系列 虚拟 DOM 什么是虚拟 dom dom 是文档对象模型,以节点树的形式来表现文档. 虚拟 dom 不是真正意义上的 dom.而是一个 javascript 对 ...

  9. 计算机体系结构——CH1基本概念

    CH1基本概念 右键点击查看图像,查看清晰图像 CH1基本概念 目的与内容 了解计算机系统的完整概念 学习计算机系统的分析方法与设计方法 编写程序所必需了解的计算机属性 计算机系统结构简介 为什么要研 ...

  10. 从零搭建一个IdentityServer——会话管理与登出

    在上一篇文章中我们介绍了单页应用是如何使用IdentityServer完成身份验证的,并且在讲到静默登录以及会话监听的时候都提到会话(Session)这一概念,会话指的是用户与系统之间交互过程,反过来 ...