视觉学习建议

目录


程序语言

C++

​ C++编写起来和C语言一样结构清晰,又在C语言的基础上增加了许多新的功能,还可以直接操作硬件,绝对是研发机器视觉最好的语言。

​ 面向对象,封装、多态、继承这些思想绝对是编程的重点。小型项目可能感觉不出来,一旦项目代码超过千行,如何解耦和划分功能模块就成了所有人不得不面对的问题,而C++正好提供了面向对象的编程模型,又是静态编译型语言,速度快,是一定要学好的。

​ 一个人写代码乱一点可能不要紧,但是多个人一起写代码就需要一个强有力的代码规范,比如变量的命名、类的命名、宏定义的命名和缩进格式等,这里我推荐大家看一下华为的方舟编译器代码规范,学习一下别人的代码是如何编写的。

Python

​ Python是我们用来编写深度学习的脚本语言,py的编写方式远比C++简单,开发小型项目的效率比C++高。但是Python是解释型语言,不进行编译,运行时底层有一个Pyhton解释器在动态解释代码,这就造成了Python在开发大型项目时运行速度会变慢,结构不清晰。

​ 我们一般使用Python来训练机器学习模型,清洗机器学习所需要的数据集和部署大型神经网络。雷达站就是使用了YoloV4深度学习框架+DeepSort追踪器,YoloV4是C语言编写的框架,DeepSort是Python编写的,语言不同,但是使用py可以把这两个框架联合起来,共同为我们服务。这就是py的优点。


操作系统-Ubuntu

​ 在车上跑的系统肯定不能是Windows,系统太过臃肿,有很多的功能我们并不需要,这时候Ubuntu就出场了,Ubuntu是一个基于Linux的、开源的操作系统。体统非常简洁,但是可以办到的事情却一点也不简单,视觉组的代码都是即可以运行在Windows上又可以运行在Ubuntu上的。平时使用WIndows开发,到了比赛的时候就在Ubuntu上跑代码。

windows环境下ubuntu usb系统盘制作教程

安装Ubuntu系统

一般有虚拟机安装,双系统,移动硬盘安装等方式安装ubuntu,这里不推荐虚拟机安装,因为过程占用内存过大,跑我们的代码会非常卡,这里我们推荐双系统, ubuntu与windows共存,重启电脑即可切换系统,安装也相对简单。愿意买一块移动硬盘安装ubuntu也是不错的选择,不用占用原电脑硬盘容量,安装过程更加简单粗暴,甚至可以插入别人的电脑打自己的代码,随时随地都能开心地工作,是你在实验室赶进度的最佳选择。

​ 安装完ubuntu后需要各位熟悉linux系统的一些基本命令行操作。比如ctrl+alt+t打开一个终端,cd进入某个目录,sudo获取root权限。rm删除某个文件或文件夹等等,初接触时会觉得繁琐,但熟练运用后你会觉得特别便捷高效。参考链接


管理工具-Git

在战队待一整年,你需要和很多人合作,编写大量代码,代码改来改去容易乱套……

所以你必须学会使用强大的版本管理工具——Git。

在Git中,你可以看到队友们每次修改的内容,出现问题时,可以退回到任意一次修改之前。

Git也具有强大的分支合并功能,视觉组平时开发时一个组员开发一个特定的分支,一个分支实现一个特定的功能,在功能开发和测试完毕后,就会合并到主分支。这样主分支的代码永远是可以使用的状态,新的功能的开发都在测试分支上。

下图为方舟编译器代码的分支合并情况。可以看到优秀的代码工程都是多个模块并行开发,持续集成到主分支。

image-20200718165733341

官方网站(英文)

推荐教程(中文)

教学游戏


OpenCV

这是视觉组的任务重点,需要花最多的时间学习。

官方网站

OpenCV是当前最具影响力的计算机视觉开源库。它的官网资料相当完整,在页面右边,有Online Documentation(在线文档)、Tutorials(教程)、User Q&A forum(问答论坛)都非常棒。

在Tutorials里就有详细的安装教程,我们建议在你的Windows和Ubuntu上都安装OpenCV,这里要求各位安装opencv3及以上版本。

OpenCV最推荐的资料还是官网文档。内容详细、更新速度快。大家也要尽快适应阅读英文资料,因为后面有些问题中文几乎查不到。

不过这里仍然为想要快速熟悉opencv的朋友推荐一本opencv3的书,《OpenCV3编程入门》

最好的学习方法其实就是多用,我们更推荐遇到问题的时候再去查找相关资料,完成视觉组面试前实战任务是最快速的opencv学习方法。


数学基础

我们来谈谈简单有趣的数学基础,如果我直接和你说“线代很重要赶紧学”,可能你就体会不到我们这篇文章简单有趣的核心思想了,所以我打算举几个例子。

好像有某位厉害的人说过:“矩阵就是映射。”

比如说从世界坐标系映射到相机坐标系,从相机坐标系映射到像素坐标系。所以其实“从相机坐标系映射到像素坐标系”这句话翻译成人话就是相机内参,“从世界坐标系映射到相机坐标系”这句话翻译过来就是相机外参。就是说相机内参和外参其实都是用矩阵表示的,而且矩阵的应用不止这么一小点,比如特征的描述子,比如矩阵卷积来提取高维的特征等等,所以知道重要还不赶紧去学一波。

顺便附上祖传线代链接

而且也不仅仅是线代,概率论也是偶尔用得上的,比如让你描述一个轮廓的特征,你可能想到轮廓矩,这里的矩其实就是概率论里面的矩,把轮廓点集的坐标值当成一组随机变量来看这是很有意思的想法,有了这些概念你拿到api帮你算出来的矩心理也比较有底,知道怎么去用对吧。

这么多底层的算法仔细想一想就头大,别担心,这当然不用你亲自去写了。OpenCV都已经帮你封装好了,RM视觉需要用到的矩阵运算方法一般OpenCV里都有,还有各种坐标点和相机参数的处理方法。


神经网络

神经网络今年主要是用来识别车上的装甲板的,用了SVM训练装甲板模型进行检测。在雷达站上也用到了darknet深度学习框架,直接训练目标检测模型,外加TensorFlow做一些辅助处理。

image-20200718170342967


推荐网站

stackoverflow

中文名:栈溢出。程序员交友网站,外国版的CSDN。

可以解答你在计算机语言学习过程中的绝大多数疑惑。

当然,提问和回答都是English的,不过程序员的专业英语比较简单,词汇量较少,看懂还是比较容易的。

如何优雅地使用 Stack Overflow? - 猴子的回答 - 知乎

Github

没有使用过Github的程序员就不是一个真正的程序员,Github是世界上最大的开源库,别人家的优秀代码的集中地。

如何使用 GitHub? - 杨晓辉的回答 - 知乎

Gitee

码云,中国的Github,没有Github访问和下载慢的烦恼,还有一系列本土化讨好中国程序员的功能,中国的开源项目一般都会发布在码云上一份。

平时没事的时候就会逛码云开源项目精选,Github上开源的都是英语,极少有中文,学习起来比较困难。在码云上热门的开源项目都会写完整的中文文档,帮助我们了解此项目。

One more thing

为什么有的人代码写的这么烂,很多写死的代码,一点儿灵活性都没有,更没有规范,完全就是堆压。

为什么有的人根本不知道怎么去抽象,并不清楚怎么样积累成公共组件,为什么他们改一个问题,通常会引出更多的问题?

为什么他们的代码里的实现方案,让人看完之后恨的牙痒痒,想改又完全不能改,毕竟,正常工作的代码才是好代码?

很大程度上是因为,很多程序员,不懂的代码的扩展性,不会面向未来编程。

怎么叫做面向未来编程?

一个好的工程师,在听到需求的时候,可以根据自己的业务能力,判断出来这些需求中,哪些是有可能变化的,哪些是不太可能变化的。

针对这些变化的内容,在编写的过程中,不会写死,而反复确认不可能会变化的需求,会写的简单一些,防止过度设计引起的复杂度。

简单说,当他拿到需求时,并不单纯是考虑这个需求怎么实现,还会考虑,自己设计的架构体系,扩展性在哪里,在他的眼里,看到的需求会被分解,折分,然后自己的技术方案,会挨个分解,分配。

而且会拿着自己的架构体系跟领导沟通,讲清楚。

在完成设计之后,他会很清楚的知道 ,自己设计的系统里,哪些变化是支持的,随便你改,我只需要改动一个很简单的内容。哪些是你绝对不能改的,你要改,我就必须花很大的代价,特别是在已经有线上数据的时候。

哪一个参数应该直接写一个固定值?哪一个参数应该作为函数的入口参数?

哪一个参数是需要在程序运行过程中动态调整的?哪一个参数是需要写进配置文件中的?

什么样的变化是支持的?短信通道是有可能变化的,而调用短信通道的地方可能会有点多,所以我必须把短信通道抽象,并封装在一个公共接口,如果需要更换短信通道,我可能只需要更改一个配置文件就好了。

那么什么样的变化是不支持的?我不需要不停机就更换短信通道的功能,除非你在后台系统中提前配置好,或者是有明确的需要,我做出这么一个东西出来。往往在前期,不会用到。

一段代码(比如求两点距离),用到了两次以上,就要考虑写成一个函数调用。一个函数,在很多功能模块都要用到,就要考虑抽取成公共模块,供所有模块调用。