首页 文章 精选 留言 我的

精选列表

搜索[图形后端],共10000篇文章
优秀的个人博客,低调大师

飞桨与PyQt的碰撞,图形化目标检测So Easy

还记得3月份的时候我给大家介绍了PaddleDetection的环境部署、训练及可视化、模型导出。但那只是一个算法程序,一个完整的项目需要在算法的基础上将可视化操作开发成型。今天我给大家带来如何利用Py-Qt编一个显示界面,并结合工业相机实时采集并进行目标检测。 下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu 本文用到的软件有PyQt5、Pycharm、Hikvision工业相机。 本文内容如下: 1、在Pycharm下搭建pyqt环境 2、介绍通过飞桨进行模型保存和模型加载 3、如何利用飞桨检测单帧图像 4、PyQt5效果展示 Pycharm下搭建PyQt5的环境 该过程见此链接https://zhuanlan.zhihu.com/p/110224202,作者将飞桨和PyQt5安装在了同一个虚拟环境下面。 通过飞桨保存模型和加载模型 介绍模型的保存和加载,目的是更好地了解飞桨预测过程。本文主要介绍模型保存函数:fluid.io.save_params;fluid.io.save_inference_model和模型加载函数 ;fluid.io.save_params ;fluid.io.load_inference_model。 1. 模型的保存 1)fluid.io.save_params fluid.io.save_params:从字面意思来理解,表示保存参数。而该函数的主要目的也确实是保存训练过程中生成的各个节点之间的参数(权重、偏置等),使用fluid.io.save_params进行模型的保存,其保存的内容如下图所示: 2)fluid.io.save_inference_model fluid.io.save_inference_model:从字面上理解,表示保存可进行后续预测的模型。而该函数的主要目的也确实是保存可进行预测的模型。即调用save_inference_model函数,可在save_params所保存的参数基础上融合网络结构生成的可进行预测的模型。这一点类似于tensorflow将训练出来的ckpt文件固化成pb文件。从我们git中下载的PaddleDetection代码,在PaddleDetection-release/tools/export_model中就是利用save_inference_model导出结合后的模型。 利用export_model.py保存下来的文件如下所示:生成了两个文件,__model__和__params__文件,其中__model__表示网络结构,__params__表示训过程产生的参数。 2.模型的加载 1)fluid.io.load_params fluid.io.load_params:根据上文得知,该函数表示加载训练过程中的参数进行预测,如果要加载参数进行预测,则需要将网络结构也加载进来,PaddleDetection给出的官方预测示例就是利用该方式进行预测。 2) fluid.io.load_inference_model fluid.io.load_inference_model:根据上文得知,该函数表示加载参数和网络结构的融合体进行预测。作者在如下的内容中就是使用该方式进行预测。 3. 备注 1) 备注一 前面生成的模型文件中,__model__文件包含了NMS部分(这一点和tensorflow的pb文件不同,pb文件是没有NMS节点的)。关于__model__文件,我们可以使用Netron进行展开。Netron使用地址https://lutzroeder.github.io/netron/。打开以后可看到网络结构,在最下端发现有NMS节点。 2) 备注二 除了上述谈到的模型加载和保存的方式,还有另外一组即fluid.io.save_persistables和fluid.io.load_persistables。 如何利用飞桨进行预测? PaddleDetection里面已经有了相应的预测代码infer.py,该代码利用paddle的reader机制进行图像的预测,同时该代码使用的加载模型的方式是fluid.io.load_params。作者个人为了能配合后续在qt下运行检测,使用fluid.io.load_inference_model作为模型的加载方式,从paddle的AI Studio上截取一部分代码重新构造了预测代码。本段预测代码加载的模型是yolov3(主干网络MobileNet)训练出来的模型。 作者构造自身的预测代码思路如下图所示: 代码如下: 说明: 1. 该代码由于使用参数和网络结构融合的模型,因此对于其他库的依赖比较少,只需要将飞桨导入即可, 2. 该代码由于使用的模型文件是《__model__和__params__》,因此在使用load_inference__model时候,必须在该函数的参数中指明这两个名字。 3. 该代码中需要着重注意一下一点:由于预测加载的模型是使用yolov3训练出来的模型,因此在进行预测时要考虑图像归一化的操作,数据归一化的操作来源训练该模型的config文件,输入图像大小需要和export model时设置的图像大小保持一致 iimportnumpyasnp importtime importpaddle.fluidasfluid fromPILimportImage fromPILimportImageDraw train_parameters={ "label_dict":{0:"apple",1:"banana",2:"orange"}, "use_gpu":True, "input_size":[3,608,608],#原版的边长大小为608,为了提高训练速度和预测速度,此处压缩为448 } target_size=train_parameters['input_size'] anchors=train_parameters['anchors'] anchor_mask=train_parameters['anchor_mask'] label_dict=train_parameters['label_dict'] print(label_dict[1]) #class_dim=train_parameters['class_dim'] #print("label_dict:{}classdim:{}".format(label_dict,class_dim)) place=fluid.CUDAPlace(0)iftrain_parameters['use_gpu']elsefluid.CPUPlace() exe=fluid.Executor(place) path="C:\\Users\\zhili\\Desktop\\2"#_mobilenet_v1 [inference_program,feed_target_names,fetch_targets]=fluid.io.load_inference_model(dirname=path,executor=exe,model_filename='__model__',params_filename='__params__') classinference(): def__init__(self): print("8888888888") defdraw_bbox_image(self,img,boxes,labels,scores,save_name): """ 给图片画上外接矩形框 :paramimg: :paramboxes: :paramsave_name: :paramlabels :return: """ draw=ImageDraw.Draw(img) forbox,label,scoreinzip(boxes,labels,scores): print(box,label,score) if(score>0.9): xmin,ymin,xmax,ymax=box[0],box[1],box[2],box[3] draw.rectangle((xmin,ymin,xmax,ymax),3,'red') draw.text((xmin,ymin),label_dict[label],(255,255,0)) img.save(save_name) defresize_img(self,img,target_size):#将图片resize到target_size """ 保持比例的缩放图片 :paramimg: :paramtarget_size: :return: """ img=img.resize(target_size[1:],Image.BILINEAR) returnimg defread_image(self,img_path): origin=Image.open(img_path) img=self.resize_img(origin,target_size) resized_img=img.copy() ifimg.mode!='RGB': img=img.convert('RGB') img=np.array(img).astype('float32').transpose((2,0,1))#HWCtoCHW让矩阵进行方向的转置 img=img/255.0 img[0,:,:]-=0.485 img[1,:,:]-=0.456 img[2,:,:]-=0.406 img[0,:,:]/=0.229 img[1,:,:]/=0.224 img[2,:,:]/=0.225 img=img[np.newaxis,:] returnorigin,img,resized_img definfer(self,image_path): """ 预测,将结果保存到一副新的图片中 :paramimage_path: :return: """ origin,tensor_img,resized_img=self.read_image(image_path) input_w,input_h=origin.size[0],origin.size[1] image_shape=np.array([input_h,input_w],dtype='int32') t1=time.time() batch_outputs=exe.run(inference_program, feed={feed_target_names[0]:tensor_img, feed_target_names[1]: image_shape[np.newaxis, :]},备注:此时送入网络进行预测的图像大小是原图的尺寸大小。 fetch_list=fetch_targets, return_numpy=False) period=time.time()-t1 print("predictcosttime:{0}".format("%2.2fsec"%period)) bboxes=np.array(batch_outputs[0]) ifbboxes.shape[1]!=6: print("Noobjectfoundin{}".format(image_path)) return labels=bboxes[:,0].astype('int32') scores=bboxes[:,1].astype('float32') boxes=bboxes[:,2:].astype('float32') last_dot_index=image_path.rfind('.') out_path=image_path[:last_dot_index] out_path+='-result.jpg' self.draw_bbox_image(origin,boxes,labels,scores,out_path) if__name__=='__main__': image_path="C:\\Users\\zhili\\Desktop\\123\\2.jpg" a=inference() a.infer(image_path) PyQt5检测效果 1. 首先通过步骤1配置好的PyQt中QT Designer,创建两个Button对象,分别为“打开相机”、“开始检测”,然后创建两个Label对象,分别用于显示相机原图和显示检测后图像。 2. 创建多线程检测机制,分别给两个Button设置不同的槽函数,分别用于触发相机拍照和调用检测函数。运行infe_video.py可得到如下结果。由于作者使用的是黑白相机拍摄电脑屏幕上百度搜索出来的橘子照片,检测效果质量不高。 特别说明:该文章受到了高松鹤同学和百度飞桨团队的大力支持,表示感谢。 该项目Github地址: https://github.com/yzl19940819/Paddle_infer_python 如果您加入官方QQ群,您将遇上大批志同道合的深度学习同学。官方QQ群:703252161。 如果您想详细了解更多飞桨的相关内容,请参阅以下文档。 下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu 官网地址:https://www.paddlepaddle.org.cn 飞桨开源框架项目地址: GitHub:https://github.com/PaddlePaddle/Paddle Gitee:https://gitee.com/paddlepaddle/Paddle >> 访问 PaddlePaddle 官网,了解更多相关内容。

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

🎉 Socket.D v2.3 发布(打通前端与后端)

基于事件和语义消息流的网络应用层协议。 有用户说,“Socket.D 之于 Socket,尤如 Vue 之于 Js、Mvc 之于 Http”。支持 tcp, udp, ws, kcp 传输。 主要特性 基于事件,每个消息都可事件路由 所谓语义,通过元信息进行语义描述 流关联性,来回相关的消息会串成一个流 语言无关,使用二进制输传数据(支持 tcp, ws, udp)。支持多语言、多平台 断线重连,自动连接恢复 多路复用,一个连接便可允许多个请求和响应消息同时运行 双向通讯,单链接双向互听互发 自动分片,数据超出 16Mb(大小可配置),会自动分片、自动重组(udp 除外) 接口简单,是响应式但用回调接口 Java 适配更新(兼容 server 与 android): 新增 SendStream,RequestStream,SubscribeStream 三个流接口。强化流接口体验 添加 基于流接口,实现数据上传与下载的进度通知机制 添加 基于流接口,实现异常通知机制 调整 send 接口体验,基于流接口改造 smartsocket 升为 1.5.41 接口变化 描述 旧:session.send(event, entity) 新:session.send(event, entity) -> SendStream 发送 旧:session.sendAndRequest(event, entity, timeout?, callback) 新:session.sendAndRequest(event, entity, timeout?) -> RequestStream 发送并请求(要求1个答复) 旧:session.sendAndSubscribe(event, entity, timeout?, callback) 新:session.sendAndSubscribe(event, entity, timeout?) -> SubscribeStream 发送并订阅(可接收多个答复) Javascript 适配更新(兼容 h5, uniapp, node.js): 新增 SendStream,RequestStream,SubscribeStream 三个流接口。强化流接口体验 添加 基于流接口,实现数据上传与下载的进度通知机制 添加 基于流接口,实现异常通知机制 调整 send 接口体验,基于流接口改造 //发送 session.send("/demo/hello", SocketD.newEntity("hi")); //发送,且获取发送进度(如果有大数据发送,又需要显示进度) session.send("/demo/upload", SocketD.newEntity(file)).thenProgress((isSend, val, max)=>{ if(isSend){ //获取发送进度 } }); //发送并请求,且同步等待 let reply = session.sendAndRequest("/demo/hello", SocketD.newEntity()).await(); //发送并请求,且取接收进度(如果有大数据获取,又需要显示进度) session.sendAndRequest("/demo/download", SocketD.newEntity()).thenProgress((isSend, val, max)=>{ if(!isSend){ //获取接收进度 } }).thenReply(reply=>{ //异步获取答复 }).thenError(err=>{ //如果有出错? }); //发送并订阅 let entity = SocketD.newEntity().metaPut("videoId","1").meatPut("start","5").meatPut("size","5"); session.sendAndSubscribe("/demo/stream", entity).thenReply(reply=>{ //异步获取答复(会多次回调) }) 视频效果: for H5 https://www.bilibili.com/video/BV1ck4y197BV/ for UniAPP https://www.bilibili.com/video/BV1T94y1T7sp/ 代码仓库: https://gitee.com/noear/socketd https://github.com/noear/socketd 官网: https://socketd.noear.org

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

从0到1搭建自己的脚手架(java后端)

一、脚手架是什么 脚手架是一种基础设施工具,用于快速生成项目的框架代码和文件结构。它是一种标准化的开发工具,使开发人员能够在项目的早期阶段快速搭建出一个具备基本功能和结构的系统。 二、脚手架的意义 主流的微服务架构体系下很多公司会将原有的单体架构或者繁重的微服务进行拆分。这个时候按照模块(商品、订单、用户、库存、优惠、搜索、管理后台..)、按照领域驱动设计(投保、理赔、支付、保单管理)等进行拆分就需要很多的微服务项目,如果一个一个的去创建微服务其实是在做重复的工作容易出错而且没有意义,浪费人力物力。这个时候基础性的持久层、日志、异常处理、权限控制等在项目创建时一起生成不仅减少了重新创建或部分复制带来的风险而且高效。 三、脚手架的创建 3.1、编写项目模版 首先我们要有一个基础项目的模板,这个模板中集成了开发时所需要的常用配置,你可以自己搭建,或者找一个基础项目如:SpringBoot 项目中已经引入了 MyBatis-Plus, Redis, Logback, Hutool, Swagger-UI 等。或者将公司的架构沉淀出一个基础项目的模板。 springboot模版项目: 3.2、生成脚手架 3.2.1 使用 idea 打开项目模板 使用 IDEA 打开基础项目,查看一下 maven 的配置路径,搭建过程中要保证 maven 路径始终一致,我的 maven 路径如下。 D:/Program Files/apache-maven-3.2.5D:\Program Files\apache-maven-3.2.5\conf\settings.xmlD:\Program Files\apache-maven-3.2.5\repository 然后运行一下项目,要确保基础项目是正常的。 3.2.2 注意版本号 然后留意一下 pom.xml 文件中的项目 gvn,这是项目的版本号,也与下文生成模板的版本号有关。 org.springframework.boot.demospring‐boot‐stage‐demo0.0.1‐SNAPSHOT 3.2.3 构建脚手架 方式一:打开命令行窗口 Terminal ,正常情况指向的是本项目的目录,如果不是则 cd 到本项目,然后输入:mvn archetype:create-from-project #从已有的项目中生成archetype. 方式二:当前项目所在文件夹下执行 eg: 项目的跟路径为 D:\spring-staggingcmd下执行 d: cd D:\spring-stagging mvn archetype:create-from-project 执行完成后脚手架项目也就创建完成,生成如下所示的结构 注:这里如果生成的是如下所示的结构 解决办法1.调整如图所示的artifactId与module前缀一致 将产生的target目录移动到新的目录,打开gitbash进行如下操作 删除idea的相关文件 rm -rf .idea find . -name ".iml" -type f -print -exec rm -rf {} ; 删除不需要的实例代码find . -name "xxxMain" -type f -print -exec rm -rf {}; eg:将脚手架放到D:\spring-stagging-archetype 目录下,目录下主要存放src和pom文件即可 3.2.4发布脚手架 用idea打开后配置maven 在创建项目的时候也要保证maven的一致否则不能找到对应的脚手架pom 配置distributionManagement后deploy到artifactId仓库 否则创建的时候:Could not find artifact org.springframework.boot.demo:spring-boot-stage-demo-archetype:pom:0.0.1-SNAPSHOT xxx-central libs-releases-local http://artifactory.66.com/libs-releases-local xxx-snapshots libs-snapshot-local http://artifactory.66.com/libs-snapshots-local pom里的 gav就是以后创建项目时用到的脚手架的gav org.springframework.boot.demo spring-boot-stage-demo-archetype 0.0.1-SNAPSHOT maven-archetype 上传脚手架项目到git代码仓库保存便于以后更新和沉淀。 四、使用脚手架创建新的项目 4.1 配置脚手架的gav 4.2 填写要创建的目标项目的gav 4.3 配置maven 4.4 根据新的artifactId生成新的工程 参考资料: [1]https://maven.apache.org/archetype/maven-archetype-plugin/ -end- 本文分享自微信公众号 - 京东云开发者(JDT_Developers)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Spring

Spring

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册