开发者说|自动驾驶标注工具
下面是由社区开发者—王方浩提供的文章,本文主要分析 自动驾驶标注工具。
自动驾驶感知目前主流的方法都是深度学习,需要用到大量的标注数据集来训练模型,所以能够更快更高效生成大量的标注数据,是无人驾驶感知的关键。
大部分的开源数据集,都是请第三方外包公司来完成这项工作,目前数据标注是一个新兴行业,基本是靠廉价的人工,手动完成标注。开源的标注工具很多,大部分都是业余开发,没有在实践中进行改进,并不能支持大规模的标注。
做自动驾驶数据集的标注工作,机械式的去标注效率可能不高。如果能够自动标注后再由人去检查数据,进行调整,这样则可以大大提高效率。
若想尽量简单地实现这个方案,首先需要支持自动标注,然后需要支持多人协同标注。下面整理下具体的思路:
自动标注功能可以在网上找到训练好的模型,然后网页端加载模型,通过前端框架执行后,展示标好的数据。前端的神经网络框架有很多好处,主要优势是可视化,跨平台,而且web端支持多人协作也很方便,只需要一个浏览器,就可以进行标注。
第一步:选定前端深度学习框架
优秀的框架有很多,决定选择TensorFlow.js,选TensorFlow.js的好处是可以导入模型,教程丰富,并且可以把Python模型转成js模型进行导入。
第二步,前端框架选择借鉴MIT开源图片标注工具Labelme
能调节图片的对比度,在阴影或光照不好的情况下,调节对比度可以很好的找到标注物体的轮廓 右键自动闭合,省去了每次都要移动鼠标到起点的过程 支持Label层级,比如标注了一个汽车,又要标注汽车的车窗,可以设置层级,让车窗属于汽车的标注,这在一些需要二次识别的场景中很管用 支持语义分割的标注。 数据保存格式很完善,包括标注人、标注时间、各种Label、备注等
黑科技太多,集合PHP、Perl、Nodejs、HTML多项技术,最可怕的是还用到了C++转js的技术 前端技术栈比较老旧,布局不支持Flex
建议先在Labelme上实现相应的功能,把相关的功能了解后,再开发一个更Cool的项目。下面以识别汽车为例,如何用TensorFlow.js实现标注图片中的汽车,用的模型是coco-ssd。
加载前端机器学习框架TensorFlow.js,如果不想本地安装编译,可直接用编译好的文件,在HTML中增加:
//加载tensorflow模型
<!-- Load TensorFlow.js. This is required to use coco-ssd model. -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"> </script>
<!-- Load the coco-ssd model. -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/coco-ssd"> </script>
//获取图片
const img = document.getElementById('img');
// Load the model.
cocoSsd.load().then(model => {
// detect objects in the image.
model.detect(img).then(predictions => {
//识别出的对象
console.log('Predictions: ', predictions);
});
});
Predictions的格式为:
bbox: [x,y,w,h] //4个元素的数组,x,y为矩形左上角坐标,w为宽,h为高
class: "car" //识别的类别
score: 0.99 //可信度
上述例子可参考TensorFlow.js的例子(TensorFlow/tfjs-models),这个模型可以识别的目标包括汽车、人和交通灯。
如果需要更强大的模型,可以选择专门针对KITTI数据集的模型,在Tensorflow模型动物园中可以找到Python版本,但需要转换成js版本。开始下载的时候文件有400多兆,如果模型太大,可以考虑用服务的方式实现,而不是前端加载,下面还是以coco-ssd为例,这个模型比较简单,主要用在嵌入式和手机设备。
LabelMe
自动标注演示:
点击最上面工具栏的笑脸图标 开始加载模型,并且显示动画(由于网络原因可能会加载模型失败,一般第一次加载完成后就比较快了) 最后画出标注好的框
代码可见: