首页 文章 精选 留言 我的

精选列表

搜索[快速],共10000篇文章
优秀的个人博客,低调大师

快速上手百度大脑EasyDL专业版·物体检测模型(附代码)

作者:才能我浪费99 1. 简介: 1.1. 什么是EasyDL专业版 EasyDL专业版是EasyDL在2019年10月下旬全新推出的针对AI初学者或者AI专业工程师的企业用户及开发者推出的AI模型训练与服务平台,目前支持视觉及自然语言处理两大技术方向,内置百度海量数据训练的预训练模型,可灵活脚本调参,只需少量数据可达到优模型效果。 适用人群: 专业AI工程师且追求灵活、深度调参的企业或个人开发者 支持定制模型类型。 1.2. 支持视觉及自然语言处理两大技术方向: 视觉:支持图像分类及物体检测两类模型训练。 任务类型: 预置算法 图像分类: Resnet(50,101)、Se_Resnext(50,101)、Mobilenet Nasnet 物体检测: FasterRCNN、YoloV3、mobilenetSSD 自然语言处理:支持文本分类及短文本匹配两类模型训练,内置百度百亿级数据所训练出的预训练模型ENNIE. ERNIE(艾尼)是百度自研持续学习语义理解框架,该框架可持续学习海量数据中的知识。基于该框架的ERNIE2.0预训练模型,已累计学习10亿多知识,中英文效果全面领先,适用于各类NLP应用场景。 任务类型 :预置网络 文本分类: BOW、CNN、GRU、TextCNN、LSTM、BiLSTM 短文本匹配:SimNet(BOW、CNN、GRU、LSTM)、FC 1.3. EasyDL专业版特点 预置百度百亿级数据规模的预训练模型,包括丰富的视觉模型及自然语言处理模型ERNIE,训练效果更突出。 对比经典版,支持代码级调整模型参数和模型结构,封装底层算法逻辑细节,代码行数更少,更易有算法基础的开发者上手。 支持从数据管理,模型训练到模型部署一站式AI服务。 如果说EasyDL经典版是倚天剑,PaddlePaddle是屠龙刀,那么EasyDL专业版就是刀剑合璧。 2. 评测案例 该应用为一个特种车辆识别的应用,主要识别邮车和消防车,未来可以扩展加入更多的车辆种类,对于特种车辆管理有很好的应用价值。 2.1. 整体说明 EasyDL专业版的工作流程如下图所示: EasyDL专业版的主界面如下图所示: 2.2. 业务需求: 需要对各种特种车辆进行识别,在本评测中为邮车、消防车两种。 2.3. 上传并标注数据: 首先需要建立特种车辆数据集,在主界面上点击“数据管理/标注”就可以进入数据管理界面,具体步骤如下: 1.设计标签 在上传之前确定想要识别哪几种物体,并上传含有这些物体的图片。每个标签对应想要在图片中识别出的一种物体。在本例中只有2个标签,就是邮车(标签:youche)和消防车(标签:xiaofang)。 例如: 2.准备图片 基于设计好的标签准备图片: 每种要识别的物体在所有图片中出现的数量最好大于50 如果某些标签的图片具有相似性,需要增加更多图片 一个模型的图片总量限制4张~10万张 图片格式要求: • 目前支持图片类型为png、jpg、bmp、jpeg,图片大小限制在4M以内 • 图片长宽比在3:1以内,其中最长边小于4096px,最短边大于30px 图片内容要求: • 训练图片和实际场景要识别的图片拍摄环境一致,举例:如果实际要识别的图片是摄像头俯拍的,那训练图片就不能用网上下载的目标正面图片。 • 每个标签的图片需要覆盖实际场景里面的可能性,如拍照角度、光线明暗的变化,训练集覆盖的场景越多,模型的泛化能力越强。 本例中从网上找了30多张不同角度的特种车辆图片。(因为是测试版,所以图片较少,实际应用的时候每种标签的图片不应少于50) 3. 上传和标注图片 先在【创建数据集】页面创建数据集: 如果训练数据需要多人分工标注,可以创建多个数据集。将训练数据分批上传到这些数据集后,再将数据集"共享"给自己的小伙伴,同步进行标注。 再进入【数据标注/上传】: 1、选择数据集 2、上传已准备好的图片 3、在标注区域内进行标注 首先在标注框上方找到工具栏,点击标注按钮在图片中拖动画框,圈出要识别的目标。 如下图所示: 然后在右侧的标签栏中,增加新标签,或选择已有标签 2.4. 创建项目和任务 在主界面点击“全部训练任务”即可进入项目界面: 点击新建项目,填写相关信息信息,即可创建项目。 在本次评测中我们使用物体检测。 创建项目后在新建的项目内选择创建任务,以建立一个新的任务: 按要求输入信息,数据集及验证集选择我们上一步建立的数据集youche和youchevalid。 网络方面,因为我们这次主要是对位置进行确认,对BoundingBox要求不高,所以先选用YOLO。 大家看脚本编辑框里面的内容可以发现就是采用PaddlePaddle实现模型功能的Python代码。点击脚本编辑框里面的立即编辑按钮可以对生成的脚本进行编辑,方便进行客户化的定制。 选择保存就可以将任务保存。 2.5. 训练模型 在任务界面中点击提交训练任务,就可以开始训练模型,因为我们这次准备的数据不多,所以有一个提示,点击继续训练就好: 运行开始后可以看到本任务的状态为运行中: 可以点击日志,查看运行情况: 训练时间与数据量大小有关,1000张图片可能需要几个小时训练,不过本评测案例因为只有不到40张图,所以速度很快。运行成功有界面如图: 2.6. 校验模型效果 可通过模型评估报告或模型校验了解模型效果: 选择一张测试图: 感觉效果还可以,虽然BoundingBox有点偏差,不过主要是因为训练集太小以及采用了追求速度的YOLO算法。如果增加训练集以及采用FastRCNN会有不小的提升。 还可以选择“模型效果”查看模型信息: 2.7. 模型部署 为了应用模型,需要对模型进行部署,点击“部署”按钮进入部署界面: 本次选择公有云部署,录入相关的信息,发布模型生成在线API: 发布后的服务,可以在“我的服务”中进行查看,修改: 2.8. 接口赋权 在正式使用之前,还需要做的一项工作为接口赋权,需要登录EasyDL控制台中创建一个应用,获得由一串数字组成的appid,然后就可以参考接口文档正式使用了 也可以直接点击服务界面的"立即使用"进入赋权界面: 3. 测试不同算法: 现在物体检测支持 FasterRCNN、YoloV3、mobilenetSSD,三种算法。我们在第2章使用的是YoloV3,在本章我们将对其他两种算法建立不同版本的服务,并互相进行对比。 3.1. 算法简介: 目标检测可以理解为是物体识别和物体定位的综合,不仅仅要识别出物体属于哪个分类,更重要的是得到物体在图片中的具体位置。因为具体算法内容很长,在这里只能进行一个简单的说明。 为了完成这两个任务,目标检测模型分为两类。一类是two-stage,将物体识别和物体定位分为两个步骤,分别完成,这一类的典型代表是R-CNN, fast R-CNN, faster-RCNN家族。他们识别错误率低,漏识别率也较低,但速度较慢,不能满足实时检测场景。为了解决这一问题,另一类方式出现了,称为one-stage, 典型代表是Yolo, YoloV2, YoloV3等。他们识别速度很快,可以达到实时性要求,而且准确率也基本能达到faster R-CNN的水平。 Faster R-CNN准确率mAP较高,漏检率recall较低,但速度较慢。而yolo则相反,速度快,但准确率和漏检率不尽人意。SSD综合了他们的优缺点。它的贡献在于它利用了多层网络特征,而不仅仅是FC7。 3.2. V2版(Fast RCNN): 在任务界面选择新建任务: 具体操作参考第2章的内容即可,区别在于网络选择Faster_R-CNN-ResNet50-FPN。训练后的模型效果如下所示: 可以发现在评测集上,FasterRCNN算法的效果很好,让我们验证一下具体的效果。选择与V1版一样的图片进行验证,效果如下: 可以看到,效果的确比YOLOV3的效果要好一些,圈取的内容更加准确。 3.3. V3版(SSD): 具体操作参考第2章的内容即可,区别在于网络选择SSD。训练后的模型效果如下所示: 选择与V1版一样的图片进行验证,效果如下: 4. 应用评测及结论 4.1. 评测代码 按照服务API的说明,针对V1版(YOLOV3)的服务,编写调用代码(Python3)。需要注意的是与其他图像识别服务不同的是定制化图像识别服务以json方式请求。 Body请求示例: { “image”: “” } 具体代码如下: import urllib import base64 import json import time import urllib3 #获取token def get_token(): host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret request = urllib.request.Request(host) request.add_header('Content-Type', 'application/json; charset=UTF-8') response = urllib.request.urlopen(request) token_content = response.read() #print (token_content) if token_content: token_info = json.loads(token_content) token_key = token_info['access_token'] return token_key #保存图片 def save_base_image(img_str,filename): img_data = base64.b64decode(img_str) with open(filename, 'wb') as f: f.write(img_data) #画识别结果 def draw_result(originfilename,results,resultfilename,fontsize): from PIL import Image, ImageDraw,ImageFont image_origin = Image.open(originfilename) draw =ImageDraw.Draw(image_origin) setFont = ImageFont.truetype('C:/windows/fonts/simhei.ttf', fontsize) for result in results: location=result['location'] draw.rectangle((location['left'],location['top'],location['left']+location['width'],location['top']+location['height']),outline = "red") draw.text((location['left'],location['top']), result['name']+', Score:'+str(round(result['score'],3)),"blue",font=setFont) image_origin.save(resultfilename, "JPEG") def specialcar(filename,resultfilename,fontsize): url = "https://aip.baidubce.com/rpc/2.0/ai_custom_pro/v1/detection/specialcar" # 二进制方式打开图片文件 f = open(filename, 'rb') img = base64.b64encode(f.read()) access_token = get_token() url=url+'?access_token='+access_token begin = time.perf_counter() #img参数进行一下str转换 params={'image':''+str(img,'utf-8')+''} #对参数params数据进行json处理 encoded_data = json.dumps(params).encode('utf-8') request=urllib3.PoolManager().request('POST', url, body=encoded_data, headers={'Content-Type':'application/json'}) #对返回的byte字节进行处理。Python3输出位串,而不是可读的字符串,需要进行转换 content = str(request.data,'utf-8') end = time.perf_counter() print('处理时长:'+'%.2f'%(end-begin)+'秒') if content: #print(content) data = json.loads(content) #print(data) results=data['results'] print(results) draw_result(filename,results,resultfilename,fontsize) 4.2 测试结果: 首先是消防车及识别结果:: 邮车及识别结果: 速度非常快,效果也很不错,虽然BoundingBox有点偏差,不过主要是因为训练集太小以及采用了追求速度的YOLO算法。如果增加训练集以及采用FasterRCNN会有不小的提升。 4.3. 评测结论 EasyDL专业版定会是深度学习开发者非常喜欢的一个功能,它将EasyDL图形开发的易用性及编程的灵活性结合在一起。在提供了很多便利的同时,又将控制权交给了客户,让客户可以更加灵活的使用深度学习技术,激发无限可能,感觉非常棒。后续我准备增加训练集再试一下,看看能提高多少,然后再尝试一下离线部署成Docker的效果,建议大家都试一下。 4.4. 评测后的优化建议: 希望百度后续能增加更多的模型,比如Mask RCNN等; 希望能支持不规则形状的BoundingBox。 希望后续增加数据导入导出功能。 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — 近期《百度大脑EasyDL深度实战营》专业版课程从3月4日至25日,每周三/四 晚8点在线直播,感兴趣的同学可以加入专业版QQ群:868826008进行学习讨论。

优秀的个人博客,低调大师

搜狗开源业内最全「阅读理解工具集合」,助力研发人员快速构建高效模型

机器阅读理解是当前智能问答领域中的热门研究问题,它的目标是根据给定的问题和文章(段落),在文章(段落)中抽取或改写文字片段作为问题的答案。举例来说,当前多数的搜索引擎,当用户输入的搜索关键字是一个问题时,就会尝试从搜索结果的网页中寻找答案并以最高优先级呈现给用户。例如搜索“搜狗的吉祥物是什么”,搜索引擎就会反馈如下: 这其中所利用到的技术便是“机器阅读理解”。 近年来,由于神经网络的复兴和大规模数据集的可访问,阅读理解的研究取得了很大的进展,相继涌现出许多优秀的机器阅读理解模型。例如,在SQuAD 1.0的排行榜中就已经有80多个提交的模型,其中有相当一部分模型的性能已经超越了人类的表现。 这里存在一个问题。作为一个研究人员或开发者,为了比较这些模型的优缺点并加以利用,重现这些模型是非常必要的。但在已有的模型中,很多

优秀的个人博客,低调大师

python设计模式(三):原型模式—快速实例化类的一种途径

原型是相对于复制、克隆而言,但是不同于模板,模板创造出的东西是一模一样,而原型创造的东西是允许差异化和个性化存在,这就是原型。 原型模式最为核心的两点是:拷贝、属性更新;拷贝指深拷贝copy.deepcopy,属性更新是类的自有属性__dict__的更新。 实例代码: #-*-coding:utf-8-*-importcopyclassInformation: """个人信息""" def__init__(self): self.name=None self.ager=None self.height=None defrun(self): """ 自我介绍方法 :return: """ print("我叫{}:年龄:{}身高:{}".format(self.name,self.ager,self.height))classPrototype: def__init__(self,obj): self.copy_object=obj() defclone(self,**attr): obj=copy.deepcopy(self.copy_object) obj.__dict__.update(attr) returnobjif__name__=='__main__': test=Prototype(Information) a=test.clone(name='张山',ager="30",height='170cm') a.run() b=test.clone(name='李飞',ager="20",height='190cm') b.run() 要实现多个人的自我介绍,一般方法是每个人都创建一个对象,但是使用原型模式之后,只需要实例化一个对象(标准人),后面的人都已这个标准人为基础来实现个性化。 这就是原型模式的精要:定义一个原型,设计一个拷贝接口,不需要频繁实例化类,只需要拷贝yuanxing 。他的好处是可以减少因为对象实例化而产生的损耗,并实行动态装载。

优秀的个人博客,低调大师

【阿里内部应用】基于Blink构建搜索全链路debug系统快速定位搜索问题

案例与解决方案汇总页:阿里云实时计算产品案例&解决方案汇总 一、背景介绍 以往在处理用户投诉或者开发过程中遇到的(特定商品在淘宝搜索中搜不到,排序靠后,价格不正确,打标不准,结果不准确等)问题或线上故障时,分析定位此类问题的过程非常繁琐: 根据用户或者搜索标识提交ODPS离线任务,捞取用户的搜索日志信息; 人工构造搜索串,重新请求引擎得到搜索复现数据; 解析复现数据,得到搜索结果列表,确认问题,分析debug trace信息,定位问题 以上调查过程存在诸多问题: 需要跑odps离线任务,消耗较多时间; 工作重复性很大,每当有类似问题出现时,都要走类似的调查流程,极大影响定位问题和解决问题的效率; 搜索实时个性化上线以后,搜索结果是千人千面的,并且相同用户在不同时刻的搜索结果也是变化的,这就导致简单通过请求的url来重现用户出问题的方

优秀的个人博客,低调大师

基于阿里云K8S服务快速构建DevOps流水线 资料下载

本次直播分享kubernetes中devops相关的理论知识及最佳实践,涉及开源jenkins、jenkinsx、gitops、kaniko、helm、skaffold等工具或理论介绍及demo。直播视频全程链接:https://yq.aliyun.com/live/840PPT精彩内容一览:PPT下载地址:https://yq.aliyun.com/download/3308 Kubernetes社区大群欢迎你 进群方式:1.点击链接即可入群:https://dwz.cn/G2EELckH2.扫描下方二维码进群

优秀的个人博客,低调大师

使用Per.js快速开发商品价格计算页面 - for Per.js3.0

先预览一下全部代码: <!DOCTYPE html> <html> <head> <title>Per.js Demo</title> <meta charset="UTF-8"> </head> <body id="body"> <div id="page1"> <h1>Welcome to use this price calculation!</h1> </div> <div id="page2" style="display: none;"> <ul p-loop-in="var1"> <li>This is {{var1.name}}</li> <li>The price is: {{var1.price}}<span p-con="{{var1.price > 20}}"> - To expensive!</span></li> </ul> </div> <button id="tp1">to page1</button> <button id="tp2">to page2</button> <button id="btn-refre">Refresh</button> <script src="Per.js"></script> <script> Per.use("Per.page"); Per.page.create.pageGroup("allPage"); Per.page.create.page("allPage","#page1"); Per.page.create.page("allPage","#page2"); var app = Per("ul"); app.dom({ loop: [{name: "apple",price: 20},{name: "bread",price: 30},{name: "banana",price: 25}], callback: function(){ Per("span").dom({ con: "in" }); } },true,true); Per("#btn-refre").dom({ info: { item: [{name: "apple",price: 20},{name: "bread",price: 30},{name: "banana",price: 25}] }, click: function(){ this._super.innerHTML = "Refresh now!"; var val = parseInt(Math.random()*30+1); this.item[0].price = val; val = parseInt(Math.random()*30+1); this.item[1].price = val; val = parseInt(Math.random()*30+1); this.item[2].price = val; app.dom.loop = this.item; } }); Per("#tp1").dom({ click: function(){ Per.page.to("allPage",1); } }); Per("#tp2").dom({ click: function(){ Per.page.to("allPage",2); } }); </script> </body> </html> 然后发上一波效果图: 没错,就是这样一个页面,那么接下来我就来教大家如何制作。 先把基本页面格式写好。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Per.js Demo</title> </head> <body> </body> </html> 之后我们使用script标签来引入Per.js文件: <script src="Per.js"></script> <script> </script> 再然后,我们在body标签里面写上基本结构: <div id="page1"> <h1>Welcome to use this price calculation!</h1> </div> <div id="page2" style="display: none;"> <ul p-loop-in="var1"> <li>This is {{var1.name}}</li> <li>The price is: {{var1.price}}<span p-con="{{var1.price > 20}}"> - To expensive!</span></li> </ul> </div> <button id="tp1">to page1</button> <button id="tp2">to page2</button> <button id="btn-refre">Refresh</button> 之后在script标签里面再写js语句: Per.use("Per.page"); Per.page.create.pageGroup("allPage"); Per.page.create.page("allPage","#page1"); Per.page.create.page("allPage","#page2"); var app = Per("ul"); app.dom({ loop: [{name: "apple",price: 20},{name: "bread",price: 30},{name: "banana",price: 25}], callback: function(){ Per("span").dom({ con: "in" }); } },true,true); Per("#btn-refre").dom({ info: { item: [{name: "apple",price: 20},{name: "bread",price: 30},{name: "banana",price: 25}] }, click: function(){ this._super.innerHTML = "Refresh now!"; var val = parseInt(Math.random()*30+1); this.item[0].price = val; val = parseInt(Math.random()*30+1); this.item[1].price = val; val = parseInt(Math.random()*30+1); this.item[2].price = val; app.dom.loop = this.item; } }); Per("#tp1").dom({ click: function(){ Per.page.to("allPage",1); } }); Per("#tp2").dom({ click: function(){ Per.page.to("allPage",2); } }); 之后打开浏览器,就正常执行了! 效果如同上方gif图一样! 【tips:必须使用Per.js >= 3.0版本】

优秀的个人博客,低调大师

微信「跳一跳」带火小游戏,开发者如何快速上手?

在微信 6.6.1 版本中,给用户推送了“玩一个小游戏才是正经事”的首屏小游戏入口,一时间整个朋友圈都在跳一跳。相信很多游戏开发者心痒难耐,想一探究竟。今天就由我和王哲从技术角度给大家科普一下微信小游戏的开发知识,这一系列文章源自我们 Cocos Creator 引擎团队和微信团队合作过程的总结,目前,Cocos Creator v1.8 编辑器已第一时间支持一键发布微信小游戏版本。 今天这篇文章是介绍微信小游戏开发系列文章的第一篇。 一、小游戏生态特点 目前微信小游戏已发布 17 款首发游戏,包括六款棋牌类游戏,以及欢乐消消消、爱消除、坦克大战、保卫萝卜等休闲游戏。 从入口方面来说,微信小游戏目前的主要入口有下面几个: 群或好友分享 识别小游戏二维码 微信聊天列表页面下拉后出现最近玩过的小游戏 发现 – 小程序 发现 – 游戏 – 我的小游戏 从技术角度来说,微信小游戏是微信小程序的基础上添加了游戏库 API。小游戏只能运行在小程序环境中,所以小游戏既不是原生游戏,也不完全等同于 HTML5 游戏。但实际上小游戏面向的就是 HTML5 游戏开发者,为了能够让 HTML5 游戏可以尽可能低成本得移植,小游戏尽可能复用了 WebGL、JavaScript 等源自浏览器的 HTML5 技术。可以说小游戏是使用 HTML5 技术搭建,具有原生体验的微信内游戏产品。 小游戏采用这样的模式有很多优点,最大的优点在于稳定和可控。相比于原生,微信可以将游戏闭环在微信内部;相比于纯 HTML5,则不用担心被游戏切广告切支付。 微信小游戏的运行时环境与曾出现过的其他 Runtime 形态相比有一个很大的好处是「兼容 HTML5 生态」。也就是说不论你用哪个游戏引擎开发的 HTML5 游戏,都可以很容易地移植到小游戏上面。这使得微信小游戏可以直接从巨大的 HTML5 生态中借力。 而在技术之外,微信给小游戏最强的加持就是社交传播了。利用好微信的社交生态来获取新用户,将在小游戏的设计中占据非常重要的地位。我们可以看到,第一批 16 款游戏中,除了跳一跳有闪屏入口之外,其他的小游戏入口都藏得比较深,所以流量来源并不是主要靠推荐榜来的,而是通过社交传播来的。这点和市面上多数导用户、洗用户、滚服合服的游戏设计思路是不同的。 微信开放的优质入口,庞大的用户基数,以及即点即玩、利于分享的特性将赋予小游戏极大的潜能。一切都看各位开发者如何把握机会,找到适合微信用户的游戏品类和形态。 二、API 之上:开发小游戏的必备知识点 之前提到,小游戏的开发主要复用了 HTML5 技术栈,所以开发过 HTML5 游戏的开发者上手会快很多,甚至很多 HTML5 游戏都可以很快移植到小游戏平台。具体来说,微信小游戏的开发技术分为三个部分。 1. 底层技术 首先是开发语言,微信小游戏只支持 JavaScript,当然可以编译为 JS 的 TypeScript 以及 CoffeeScript 都可以作为开发语言使用。 其次是小游戏所支持的游戏库 API,主要包含 HTML5 的 Canvas 2D API 和 WebGL 1.0 API,使用任何一种 API 都可以完成游戏最重要的渲染功能,不过不能够混用,除此之外,只有 WebGL 渲染模式可以支持 3D 渲染。 2. 中间件:游戏引擎 当然,直接使用 Canvas 2D 或 WebGL 来制作游戏是门槛很高,也非常费时费力的一件事,你肯定不希望一个小游戏项目拖上一年半载吧?所以使用 HTML5 游戏引擎其实是非常明智的选择,引擎封装出的高层接口可以大大降低开发者的开发门槛,缩短项目周期。目前国内的三家主流引擎 Cocos Creator、Egret、Laya 均已支持小游戏发布,Phaser.js、Three.js 等国外 HTML5 引擎虽然并没有支持直接发布,经过一些定制也是可以成功运行在小游戏环境中。 3. 微信 SDK 除此之外,微信小游戏还提供了丰富的微信内部 SDK 供开发者调用,使用这些接口可以完成用户登陆、转发、排行榜等常规的社交功能。 不过除了这些常规玩法以外,最让人欣喜的是通过转发小游戏,可以完成玩家在游戏中的组队或对战,加上小游戏即点即玩的特点,这种邀战的游戏体验可以说是天衣无缝。 欢乐坦克大战中邀请好友组队 好友通过点击转发链接直接进入游戏完成组队 这种群转发 + 即点即玩的机制可能带来非常有趣的社交玩法。 三、API 之下:理解小游戏的底层技术架构 开篇提到,小游戏既不是原生游戏,也不能等同于 HTML5 游戏,它的开发环境实际上跟两者都有非常密切的关系。与 HTML5 的关系就是它复用了 HTML5 的渲染接口,但与原生游戏又有什么关系呢?我们用一张图来解释: 小游戏的运行环境其实是微信的原生环境,游戏的 JavaScript 代码并不是通过浏览器来执行的,而是通过图中 JS VM 层独立的 JavaScript 引擎来执行的。 在 Android 平台使用 Google 的 v8 引擎,而在 iOS 上则使用苹果的 JavaScript Core 引擎。 当然 JS 引擎只负责解释执行 JS 逻辑,并没有支持渲染接口,那么渲染接口和诸多的微信功能接口又是怎么实现的呢?这就不得不提到脚本绑定技术,这种技术可以将某种原生语言的接口桥接到脚本接口上,当在脚本层调用接口时,会自动转发到原生层,调用原生接口。微信小游戏环境用的就是这样的技术,将 iOS / Android 原生平台实现的渲染、用户、网络、音视频等接口绑定为 JavaScript 接口。这也就是图中的微信原生层模块到小游戏层模块的原理。脚本绑定技术无法在这篇文章中深入探讨,如果大家有兴趣,可以去了解 Cocos Creator 的 JSB 绑定实现,这也是游戏引擎中唯一一家完全开源的绑定技术实现。 小游戏在有了这样一套框架之后,HTML5 游戏在移植过程中仍然是会遇到无数 API 兼容性问题,最简单的比如 document 对象不存在,Image 对象不存在。为了降低移植成本,微信团队提供了一个 Adapter 脚本,适配了一部分浏览器接口。 如上图所示,Adapter 部分提供了大部分 HTML5 游戏所依赖的浏览器接口,这张图也比较完整得描绘了微信小游戏中开发者可以使用的接口模块: 浏览器渲染接口 浏览器 Adapter 微信服务 SDK 值得一提的是,Adapter 脚本已经不再继续维护了,所以额外的接口适配都需要开发者自己完成,而依赖于 DOM 接口的大多数功能都是无法适配到小游戏环境中的。 刚刚也提到推荐大家使用游戏引擎去开发小游戏,小游戏环境的基础之上,游戏引擎不仅封装了高层接口,还尽力抹平了浏览器与小游戏环境之间的差异。 从图中可以看到,如果不使用游戏引擎,开发者面对的是小游戏的底层 API,在使用了游戏引擎后,面对的是引擎的 API。 总结游戏引擎为开发者所做的工作,包含下面几个方面: Framework: 高层 API 封装对于游戏开发更便利; 资源加载适配; 事件处理适配; 音频播放适配; 窗口适配; 输入框适配; 添加其他缺失的接口,比如增加 DOM Parser 用于解析 TileMap。 EDITOR: 优化程序-美术-策划的协同效率; 优秀的游戏编辑器可以大幅缩短开发周期。 GENERAL: 优秀的游戏引擎提供高设备兼容性,稳定的运行性能; 跨平台游戏引擎提供无缝发布 HTML5、小游戏、原生平台的强大能力。 高效率的编辑器带来开发成本的降低;低入门门槛降低了人力成本;高兼容性和稳定的性能降低维护成本;跨平台/渠道带来强大的流量获取能力。对于开发者来说,这些就是生存和盈利的保障! 四、上手调试小游戏 需要注意的是,在撰文的今天,微信公众平台目前尚没有开放开发者申请游戏类目的权限,所以还只能通过小游戏开发工具的 “体验小游戏” 功能来做技术层面的尝试。不过不用着急,微信团队应该很快就会开放游戏类目的申请。 1. 微信开发者工具介绍 下面这张图就是微信开发者工具在做小游戏开发时的基本布局: 微信开发者工具基本布局 其中上方是工具栏,包含最重要的编译、预览和配置详情;左侧是模拟器窗口用来展示游戏运行效果;右上方是代码编辑器,可以查看项目中的文件列表,编辑文本文件;右下是调试器窗口,使用方法和 Chrome Devtools 完全一致。 2. 微信小游戏配置和入口文件 在微信小游戏项目中,project.config.json 和 game.json 配置文件是大家首先需要添加的,其中 project.config.json 可以定义你的小游戏 appid、游戏名、配置等。而 game.json 主要用于指定游戏朝向和网络超时时间。 另外,小游戏不支持任何 html 文件,入口文件是 game.js,你需要启动的引擎和游戏脚本都应当在 game.js 中用 require 函数引入,require 函数的用法遵循 node.js 的 require 规范。 3. 编译和预览 微信开发者工具会自动监听脚本和配置的变动,发生变动时会自动更新,你也可以通过顶部的编译按钮触发重新编译。当你需要在手机上预览小游戏的效果时,需要点击预览按钮来生成二维码,扫码即可进入小游戏。生成二维码的过程实际上是在压缩和上传小游戏包到微信 CDN 上,所以会花费一些时间。 4. 详情配置 详情配置中包含一些重要的配置选项,包括: 调试基础库:小游戏应该选择 game; ES6 转 ES5:是否将 ES6 脚本转换为 ES5; 代码上传时自动压缩:是否压缩脚本; 不校验安全域名、TLS 版本以及 HTTPS 证书:当你在本地测试,或通过非正式域名测试时,需要开启这个选项才能够正常访问你的服务器。 五、市场展望 最后我们从市场上来看,其实小游戏青睐的 HTML5 技术栈蕴含着巨大的机遇,目前使用 JavaScript 支持跨平台的游戏引擎已经不少。以 Cocos Creator 为例,编写一套游戏代码,可以在编辑器中无缝发布 HTML5 手机页游、PC 页游、手机原生游戏、小游戏。我们可以简单计算一下,根据 12 月初伽马数据的行业报告,国内 2017 年手机原生游戏 1162 亿,PC 端游 648 亿,PC 页游 156 亿,所以按比例简单计算的话,手机页游的市场空间 = 1162 ÷ 648 x 156 =每年 280 亿人民币。 如果进一步考虑 Flash 宣布 2020 年停更,市面大量 PC 页游都开始转用 HTML5 技术制作,而手机原生上也出现了大量的微端产品,那么如果不考虑此消彼长的制约, HTML5 技术可以支撑的游戏市场规模应该 = 280 亿 手机页游 + 156 亿 PC 页游 + 部分手机原生游戏 ≈每年 500 亿人民币。 500 亿人民币还只是计算国内的规模。根据国外 Newzoo 在年中的数据,中国游戏产业规模占全球 25%,那么 HTML5 技术理论上可以支撑的全球手机页游、手机原生、PC 页游市场容量上限可达每年 2000 亿人民币。 所以,掌握 HTML5 技术栈,掌握微信小游戏、QQ 厘米秀、Facebook Instant Games 等「手机页游」新平台上的社交游戏开发技术,洞悉这些社交平台上的用户特点、和提出针对性的游戏设计,对于想进入这个领域的游戏开发商而言,是近期迫在眉睫的事。 而且目前普遍的观点是,在资本的推动下,手机页游的时间窗口应该只有 1~1.5 年,这里面会有原生游戏大厂布局成功的,也会有新晋的研发商和发行商。而在游戏行业产生这样的风口,平均 5 年左右才能有一次。 原文地址http://www.bieryun.com/530.html

优秀的个人博客,低调大师

在EMR中使用snappy压缩的时候快速查看压缩前文本的内容

在EMR的项目中,按理阿里云目前提供的解决方案,大多数的同学可能都是使用的logtail做的日志收集,然后通过logshipper投递到oss中存储。这么配置以后,存储在oss里面的文件都是snappy格式了,但是怎么使用估计大部分同学是一脸懵逼的。 有两个小的配置,可以方便的和使用gzip一样使用snappy文件。 1 hadoop fs -text的命令直接查看。如果是直接使用的话,你看到的都是二进制,直接把shell搞死。需要用下面的格式查看 hadoop fs -Dio.compression.codec.snappy.native=true -text oss://xxx/xx.snappy 2使用MR脚本的时候,需要配置下,这个可能大部分同学都会,因为之前使用gzip的时候,也需要添加类似的配置项才能跑起来 hadoop .......-jobconf io.compression.codec.snappy.native=true

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册