一种在视觉伺服系统下的跨语言快速共享图像内存的方法与流程

文档序号:17262440发布日期:2019-03-30 09:45阅读:502来源:国知局
一种在视觉伺服系统下的跨语言快速共享图像内存的方法与流程

本发明属于图像的采集与快速传输领域,具体涉及一种跨语言快速共享图像内存的方法。



背景技术:

使用相机获取图像,并对图像进行处理,分析和理解,从而给机器人提供信息,对机器人进行控制的技术称为视觉伺服技术。在视觉伺服系统中,为了相机的图像采集(相机驱动使用c++语言)与神经网络ssd系统图像读取(使用python语言)之间的通信,相机的图像采集需要使用c++语言驱动,神经网络ssd系统的图像读取需要使用python语言,虽然这种通信方法能够完成通信,但是这种通信方法具有数据处理速度慢和目标识别效率低的问题。



技术实现要素:

本发明的目的是为解决在视觉伺服系统下,现有通信方法存在的数据处理速度慢、目标识别效率低的问题。

本发明为解决上述技术问题采取的技术方案是:

一种在视觉伺服系统下的跨语言快速共享图像内存的方法,该方法包括以下步骤:

进程1通过操作系统提供的api从操作系统的内存中申请出一块共享区域,并将生成的共享内存块与key进行绑定;

利用生成的共享内存块和所述的key,进程1将生成的共享内存块映射到进程1的地址空间,即将生成的共享内存块绑定到进程1的地址空间中;

进程2根据shmget函数和所述的key,实现生成的共享内存块到进程2的地址空间的映射,即将生成的共享内存块绑定到进程2的地址空间中;

进程1使用相机获取图像,相机驱动使用c++语言,将获取的图像存储到共享内存块中;

进程2从共享内存块中获得进程1相机获取的图像,进程2将获得的图像分为训练集和测试集两部分,

训练集输入ssd卷积神经网络进行训练,测试集用于验证训练的ssd卷积神经网络,直至测试集上的目标识别准确率不低于q时,得到训练好的ssd卷积神经网络,实现进程1与进程2之间的通信;训练好的ssd卷积神经网络用于实现目标识别;

通信结束后,操作系统通过执行shmdt函数来解除进程1和进程2与生成的共享内存块的映射关系;

在操作系统中通过执行shctl函数来删除生成的共享内存块。

本发明的有益效果是:本发明提供了一种在视觉伺服系统下的跨语言快速共享图像内存的方法,本发明通过建立共享内存块解决了相机驱动使用的c++语言与ssd卷积神经网络使用的python语言的跨语言通信问题;在各进程之间无需进行图像信息的复制,因此提高了图像的数据处理速度,缩短了ssd卷积神经网络的处理时间,使得目标识别效率达到100帧/秒。

附图说明

图1为本发明的一种在视觉伺服系统下的跨语言快速共享图像内存的方法流程图;

具体实施方式

具体实施方式一:结合图1说明本实施方式。本实施方式所述的一种在视觉伺服系统下的跨语言快速共享图像内存的方法,该方法具体包括以下步骤:

进程1通过操作系统提供的api从操作系统的内存中申请出一块共享区域,并将生成的共享内存块与特定的key进行绑定;

利用生成的共享内存块和所述的key,进程1将生成的共享内存块映射到进程1的地址空间,即将生成的共享内存块绑定到进程1的地址空间中;

进程2根据shmget函数和所述的key,实现生成的共享内存块到进程2的地址空间的映射,即将生成的共享内存块绑定到进程2的地址空间中;

进程1使用相机获取图像,相机驱动使用c++语言,将获取的图像存储到共享内存块中;

进程2从共享内存块中获得进程1相机获取的图像,进程2将获得的图像分为训练集和测试集两部分,

训练集输入ssd卷积神经网络进行训练,测试集用于验证训练的ssd卷积神经网络,直至测试集上的目标识别准确率不低于q时,得到训练好的ssd卷积神经网络,实现进程1与进程2之间的通信;训练好的ssd卷积神经网络用于实现目标识别;

通信结束后,操作系统通过执行shmdt函数来解除进程1和进程2与生成的共享内存块的映射关系;

在操作系统中通过执行shctl函数来删除生成的共享内存块。

共享内存概述:共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同malloc()函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。

共享内存实际上就是进程通过调用shmget(sharedmemoryget获取共享内存)来分配一个共享内存块,然后每个进程通过shmat(sharedmemoryattach绑定到共享内存块),将进程的逻辑虚拟地址空间指向共享内存块中。随后需要访问这个共享内存块的进程都必须将这个共享内存绑定到自己的地址空间中去。当一个进程往一个共享内存快中写入了数据,共享这个内存区域的所有进程就可用都看到其中的内容。

共享内存的特点:共享内存是进程间共享数据的一种最快的方法。一个进程向共享的内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。

使用共享内存要注意的是多个进程之间对一个给定存储区访问的互斥。若一个进程正在向共享内存区写数据,则在它做完这一步操作前,别的进程不应当去读、写这些数据。

具体实施方式二:本实施方式与具体实施方式一不同的是:所述进程1通过操作系统提供的api从操作系统的内存中申请出一块共享区域,其具体过程为:

在linux操作系统中,进程1通过执行shmget函数来从内存中申请一块共享区域。

进程1通过调用shmget(sharedmemoryget,获取共享内存)来分配一个共享内存块。

#include<sys/ipc.h>

#include<sys/shm.h>

intshmget(key_tkey,size_tsize,intshmflg);

创建或打开一块共享内存区。

参数:

key:进程间通信键值,ftok()的返回值。

size:该共享存储段的长度(字节)。

shmflg:标识函数的行为及共享内存的权限,其取值如下:

ipc_creat:如果不存在就创建

ipc_excl:如果已经存在则返回失败

函数第一个参数是一个用来标识共享内存块的键值,用特殊常量ipc_private作为键值可以保证系统建立一个全新的共享内存块。第二个参数指定了所申请的内存块的大小。第三个参数是一组标志,通过特定常量的按位或操作来shmget。

具体实施方式三:本实施方式与具体实施方式二不同的是:所述进程1将生成的共享内存块映射到进程1的地址空间,地址空间是通过执行shmaddr函数来指定的。

具体实施方式四:本实施方式与具体实施方式二不同的是:所述进程1将生成的共享内存块映射到进程1的地址空间,映射是进程1通过执行空间映射shmat函数(shmat是将共享内存映射到进程1的数据段中,即让进程1的指针指向共享内存)来实现的。

调用shmat(sharedmemoryattach,绑定到共享内存):将shmget返回的共享内存标识符shmid传递给这个函数作为第一个参数。该函数的第二个参数是一个指针,指向希望用于映射该共享内存块的进程虚拟内存地址;如果指定null,则linux会自动选择一个合适的地址用于映射。第三个参数是一个标志位

void*shmat(intshmid,constvoid*shmaddr,intshmflg);

功能:

将一个共享内存段映射到调用进程的数据段中。简单来理解,让进程和共享内存建立一种联系,让进程某个指针指向此共享内存。

参数:

shmid:共享内存标识符,shmget()的返回值。

shmaddr:共享内存映射地址(若为null则由系统自动指定),推荐使用null。

shmflg:共享内存段的访问权限和映射条件(通常为0),具体取值如下:

0:共享内存具有可读可写权限。

shm_rdonly:只读。

shm_rnd:(shmaddr非空时才有效)

返回值:

成功:共享内存段映射地址(相当于这个指针就指向此共享内存)

失败:-1

具体实施方式五:本实施方式与具体实施方式一不同的是:所述实现生成的共享内存块到进程2的地址空间的映射,映射过程是进程2通过执行空间映射shmat函数来实现的。

解除共享内存的映射:当一个进程不再使用一个共享内存块的时候应通过调用shmdt(sharedmemorydetach,脱离共享内存块)函数与该共享内存块脱离。如果当释放这个内存块的进程是最后一个使用该内存块的进程,则这个内存块将被删除。对exit或任何exec族函数的调用都会自动使进程脱离共享内存块。

intshmdt(constvoid*shmaddr);

功能:将共享内存和当前进程分离(仅仅是断开联系并不删除共享内存,相当于让之

前的指向此共享内存的指针,不再指向)。

参数:

shmaddr:共享内存映射地址。

返回值:

成功:0

失败:-1

共享内存的控制:intshmctl(intshmid,intcmd,structshmid_ds*buf);

功能:共享内存属性的控制。参数:shmid:共享内存标识符。cmd:函数功能的控制,其取值如下:ipc_rmid:删除。(常用)ipc_set:设置shmid_ds参数,相当于把共享内存原来的属性值替换为buf里的属性值。ipc_stat:保存shmid_ds参数,把共享内存原来的属性值备份到buf里。

shm_lock:锁定共享内存段(超级用户)。shm_unlock:解锁共享内存段。shm_lock用于锁定内存,禁止内存交换。并不代表共享内存被锁定后禁止其它进程访问,其真正的意义是:被锁定的内存不允许被交换到虚拟内存中。这样做的优势在于让共享内存一直处于内存中,从而提高程序性能。

buf:shmid_ds数据类型的地址,用来存放或修改共享内存的属性。

返回值:

成功:0

失败:-1

具体实施方式六:本实施方式与具体实施方式一、二、三、四或五不同的是:训练集输入ssd卷积神经网络进行训练,设置学习率为0.001,动量参数为0.9,batch_size为32,权重衰减为0.0005,不断进行迭代训练,调整ssd网络的卷积层的权重值以及偏置值,直到loss小于1.6时,用测试集验证训练的ssd卷积神经网络,直至测试集上的定位准确率不低于q时停止训练,得到训练好的ssd网络。

实施例

代码举例:

写端数据如下:

读端代码如下:

本发明还可有其它多种实施例,在不背离本发明精祌及其实质的情况下,本领域技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1