机器视觉-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=" 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;48%;height:200px;left:1%;top:30px;">
<img src="" id="productimg" width="100%" height="100%" />
</div>
<div style="position:absolute;48%;height:200px;left:51%;top:30px;">
<textarea id="base64_output" style="height: 100%;100%"></textarea>
</div>
<div style="position:absolute;98%;height:400px;left:1%;top:250px;">
<textarea id="imgmessage" style="height: 100%;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 + "
";
string = string + "results " + analysisresultss.results.length + "
";
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]) + "
";
}
return string;
}
</script>
运行结果:(NODE+Win7)