4

多线程之间的通信 GPU计算 单摄像头图像识别 初步思考

 2 years ago
source link: https://changkun.de/blog/posts/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B9%8B%E9%97%B4%E7%9A%84%E9%80%9A%E4%BF%A1-gpu%E8%AE%A1%E7%AE%97-%E5%8D%95%E6%91%84%E5%83%8F%E5%A4%B4%E5%9B%BE%E5%83%8F%E8%AF%86%E5%88%AB-%E5%88%9D%E6%AD%A5%E6%80%9D%E8%80%83/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

多线程通信

今天意识到多线程之间的一个明显的问题。

多个线程之间的消息如果实现共享,那么就有可能彼此抓住这个消息不放,从而导致所有使用该资源的线程全部瘫痪。

一个很简单的比方就是:

如果一桌人围着吃饭,但是只有一双筷子,每只筷子分别放在桌子的两端。当一桌人同时去抢某个筷子的时候,只有几个人抓到一些单独的筷子,而不是一双完整的筷子,这时候导致一桌人都没办法吃饭(当抓到的某个筷子被释放,很有可能被其他的人(线程)给抢走)。

于是,一个很自然的问题就是在多个线程的通信当中,建立一组实时(很重要)的通信方法,而这个貌似需要操作系统的知识,慢慢再看。

至于为什么是实时显得尤为重要,举个很简单的例子:

在一个音乐播放器当中,如果我的歌词不是去调用歌词文件(有时间标尺),而是通过歌曲的播放进程来“通知”歌词显示线程一件事实:“我已经播放到这里了”。这时显示歌词的线程才开始响应,从而才去显示歌词。而这时歌曲的播放已经进行一段了,从而导致延迟的效果。

而且这个延迟会随着使用环境的不同时好时坏,当资源通信状态良好时,延迟不会过大,而当使用环境非常恶劣时,很有可能显示歌词的线程在过了很长一段时间后才收到歌曲播放线程发来的消息。

所以,我们非常希望能够使得两个线程之间是“同步通信”或称“并行”的,而不是某个线程做出行动后才去通知另一个线程它应该开始有所行动了。

写的过程中又想到一种不建立实时通信也能够达到很好的并行效果的方法(只适用于某只线程运算较为复杂时):

当某个复杂线程开始进行反复运算时,在每一次通信的过程中,我都提前一次运算的时间(开始运算时就提醒)上提醒另一只线程该有所作为(提醒后开始),当这次运算结束时进入下一步运算,被提醒的线程已经完成了它的工作。

刚又想到还是存在致命的弱点,随着处理芯片的不同有可能出现很奇葩的不同步。(以后再想想有没有好的适配方法(毕竟这个实现起来比较简单),或者抛弃这个方案)

GPU计算

写这里的时候查了一下我这个显卡(GT650M)的流处理单元的个数,作为笔记本显卡,384还算是一个比较靠谱的值了。

至于为什么要有这个想法的诞生,其实是我在做部分图像处理的时候遇到比较头疼的问题:运算速度太慢。

如果我在处理某个图像的时候能够把一部分运算分担给GPU的话,这样CPU就会显得稍微轻松许多。

然后我查了一下关于GPU计算的信息,发现这货居然是NVIDIA先提出来的。奶奶的要是我早生几年就好了,NVIDIA的官网,很多年前NVIDIA曾今生产过并行显卡(只有并行显卡才可以使用GPU计算,原因之前已经说了),后来在官网上放了很多的例子和一些事例代码来辅助并鼓励很多开发者来使用GPU计算的强大功能。后来又不知道什么原因NVIDIA居然一段时间制造的显卡是串行显卡,于是这个GPU计算的功能荒废了一阵(原因没有考究),后来NVIDIA看见AMD也开始在GPU计算上发力,于是最近几年又开始转向GPU计算的研发并且高速发展(事实上NVIDIA比AMD在GPU计算上强了不止一点两点)。

于是我找到NVIDIA官网上一些例子发现根本用不了(远古代码,根本不支持新驱动,NVIDIA),感叹怪不得现在很多人研究这个。

很多人声称提高运行速度不止一倍两倍,是好几十倍,(根本没有源码叫我怎么验证、、说不定你说的好几十倍是最好的结果)因为关于GPU计算方面的内容多半出现在论文当中,至少Google是这么告诉我的。不过这方面的技术貌似还是受到各种限制,如果需要将大量信息流发送到显卡中让显卡来进行计算,系统总线岂不是要爆了? 万一我要处理好几个G的信息怎么办?所以这方面技术目前占时还受到一些限制、、慢慢去了解这个东西吧、

单摄像头图像识别

最后来谈一下单摄像头手势识别的问题,网上搜到很多所谓学者在研究这个事情,如果把一个手势从复杂多变的背景当中剥离出来。

要是我解决了岂不是这些人得恨死我?他们上哪儿吃饭去?因为这个主要讲究识别率的问题,如果一个手势识别率仅仅30%一下这还有什么识别的意义,不就相当于猜了么。

单个摄像头一直存在瓶颈就是没有办法判断井深,如果是两个摄像头就好解决了。其实我主要想了几个方案,由于没有实验过,也只是处于理论阶段。

方案1: 单个画面的运动物体捕捉总体来说可以考虑在某帧画面中搜寻几个易于识别的兴趣点,然后跟踪这几个点的位置变化。

方案2: 对单帧画面进行色调分析,分析出感兴趣色调范围内的区域来响应消息队列。(和使用环境有很大影响、、这个高识别率可能或者一定存在极大的困难)

方案3: 待定

前阵子听说有学者在音频信号分离方面,证明了如果仅仅是单个麦克风采集到的多个人说话的声音信息是不可能完整分离的。(被证明了不可能,所以我很怀疑一个摄像头是不是也不能判断井深、、)

最后想吐槽一下笔记本的摄像头,为什么就不能配两个?配两个我还可以进行3D建模,甚至可以让视频通话的时候建立3D视频效果,提升高强度的用户体验。

最后的最后提醒一下自己:不要随意的跳入某个大坑,坑太大即便挖倒水了,怎么爬上去呢?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK