前言
一天一篇文章太难了没得发了,我把我先前做的一个雷达识别项目的笔记分享给你们吧(其实那个时候我还在打下手,原谅我吹牛逼了。)有点乱,其实我也屡不清楚了,看着有用就拿着用别客气。
![bdcdb91d4f761e273144b37f5ba4c6ee.png](https://i-blog.csdnimg.cn/blog_migrate/88a68e17e5eb38f834468eb26f20c907.jpeg)
雷达识别项目实战日志
回顾一
- SVM 一定不要忘记Normalize,而且要注意用training set的norms 和 mean 来 normalize testing set。特别是要注意二者的先后顺序要统一,如果training set是先norm后mean,那么test set也要先norm 后 mean。sklearn.preprocessing.normalize得到的norm要开方!
- 正确的标注非常重要
- joblib可以储存object,特别是训练好的classifier,pickle也可以做到,但是效率不如Joblib
- 不仅要分析正确率,还要分析false positive和false negative,因为当negative sample非常多的时候,比如positive:negative = 1:10,那么即使所有的prediction都是0,正确率也大于90%。
- 在对于SVM这样的分类器调参数的时候,可以用spreadsheet记下来调参数的过程。
- Python无法选择传引用还是传递值,默认的传引用,除非是不能更改的变量。
- Python的等号在赋值包含其他元素的变量(比如list)的时候,只是将同一个内存单元的指针指向了新的变量名,改变旧变量名所指向的内存单元的值会改变新变量。
- Python 的变量传递规则结合到对feature进行的normalize,就有可能会重复normalize
- 可以将标记为positive的像素点overlay到radar image上,来看是否标记了正确的groundtruth。
回顾二
- 做可视化的时候,如果想要从图片生成视频,最好把每个图片都按照0001,0002,0003 这样固定的位数排序,否则在用os.listdir(dir_path)这种口令时候,会按照从高到低位的数字来排序,比如1,100,1000
- 注意不同传感器的坐标之间的转换
- ros的quaternion与别的系统顺序不同
- 用新的python环境要pip install rospkg
- 不同物体的bounding box不是按照marker points的序号排列的,而是按照marker points的颜色排列的,所以用相机来做annotation的时候,要筛选bounding box的颜色。
- hard negatives are very important
- 写一个helper的脚本,每天下班后让电脑跑一遍cross-validation
- 循环引用package的问题:可以在使用该package的地方(比如函数内)使用import,避免循环引用
- 用TSNE(t-distributed stochastic neighboring embedding)可以可视化高维向量。
- tsne的运算量很大,可以先用pca把数据降维到50
- line_profiler 可以计算代码的耗时,用来寻找hotspot
回顾三
- 程序的实现远比想象中难,比如把雷达从极坐标remap到直角坐标生成一个新的矩阵,矩阵中每个新的cell的物理尺度就不再随着距离而变化了,但是这个warp是不直观的。所以,在真正编程实现之前,一定要想好究竟这样做是不是合理的。比如插值的问题,最开始认为把原来的16个角度remap到笛卡尔坐标系就行了,没想到只map这么少的点是难以做插值的,忘记考虑数据稳定性的问题了。
- 程序一定要尽可能地模块化,采集数据时候,数据的导出格式一定要尽可能固定,在最早的、最简单的数据时候,就把这个格式想好,把所有可能的情况都考虑到。比如:一个帧有一个detection就要考虑到未来一个帧有多个detection时候的情况,以及多个detection的label不同的情况。
- 关于雷达的16个beam的角度与实际物理空间不对应的问题,应该在得到radar cube之后直接转换,而不是在visualization时候才转换。
- 对数据的清洗太重要了,比如说SSD只能独立地检测bike和human,但我要的是cyclist和human,要想办法把距离bike的detection最近的human的detection删掉,但又要确保这个Human足够近从而不会勿删。有两套逻辑,第一套是删掉所有距离自行车在一定的threshold之下的行人,第二套是根据自行车的数量n删掉最多n个行人,而这n个行人是距离每个自行车最近、且在threshold以下的行人。选第二个吧,fuck。如果这时候SSD在同一个地方predicts出两个bbx怎么办?
- 为什么我们的相机检测node用的是SSD?应该主要是考虑到效率。但是SSD的准确性确实不是很高。
- 取negative samples的方法也要改变,之前我们只有一个行人,只要不在那个行人的位置取,其他的位置都可以,现在我们有多个行人,取点就不能在某一个行人的位置外任意取了。
- SSD对于纵向的自行车检测效果很差,SSD在自行车被其他行人挡住时候无法检测到。
- 现在有了内存占用的问题,学校的工作站是64G,可以不考虑,但我的台式机内存是8G的,我的谷歌云instance是15G的,在后两种内存容量下,均会出现内存占用太高导致程序中断的问题。我把存储成npy的文件分成了若干个小的npy,结果还是不行,最后发现问题是我之前用来上取样原始240 x 16雷达数据的上采样因子太大了,把这个因子变小就可以了。
- 判断一个数是不是None可以用
if value is None:
pass
- 先插值再相加与先相加再插值是不一样的效果,另外插值只根据位置,不根据Doppler bins,因此还是一个2D插值
- 每次做demo还是应该从一张图的prediction开始。
- 今天开始把之前的python脚本全部都归档到modules
- 需要项目的顶层文件夹的时候,可以import一个cfg文件
![d0892f1177d9b5319ca715e82cb49eb6.png](https://i-blog.csdnimg.cn/blog_migrate/76a323940484966f18ca6f0a04ff824f.jpeg)
最后
告诉你们一个好消息老大和一家公司谈妥了合作教学,1月10日试讲。再告诉你们一个坏消息,老大说我技术不过关让我自己一边做项目玩泥巴去,哎!少了一次当祖国园丁的机会真烦。有需要加入到人工智能这个行业的老铁私信我。(什么基础(数学理论基础和编程基础)都没有的就不要来了,其实我比较适合当劝退专家。)