最近拿到一块CORE-3399PRO-JD4开发板,要在上面部署AI应用。这块板子搭载Rockchip RK3399Pro处理器,采用双核 Cortex-A72+四核 Cortex-A53构架,主频高达 1.8GHz,集成四核Mali-T864 GPU,并内置高性能NPU,号称性能优异。但是实际过程中,发现发热严重,要使用NPU需要把算法移植到Rockchip提供的RKNN-Toolkit开发套件。按照官方文档把板子刷成了ubuntu18.4,然后安装了RKNN,打算把现有模型转换一下,结果发现:

  • 适配的tensorflow版本较低(RKNN 1.3 支持tensorflow 1.10.1),2.0版本的模型无法转换。
  • ONNX版本模型转换失败,应该也是版本不对
  • pytorch干脆没有迁移到板子上,官方例程都跑不起来。

实在没办法,只能先不用NPU把应用跑起来试试。这里把编译在ARM Ubuntu18.04上编译pytorch和opencv的过程记录一下。

阅读全文 »

如何衡量目标检测算法的优劣

目标检测(object detection)问题相对于一般AI分类问题更加复杂,不仅检测出目标,输出目标的类别,还要定位出目标的位置。分类问题中的简单accuray指标已经不能反映出目标检测问题结果的准确度,而mAP (Mean Average Precision)就是被用来衡量目标检测算法优劣的常用指标。
要理解什么是mAP,需要先澄清什么是Precision(查准率)和Recall(查全率)。

Precision和Recall

定义

查准率和查全率是在信息检索、Web搜索等应用中经常出现的性能度量指标,在机器学习中,也可以用来度量“预测结果中有多少比例是用户感兴趣的”。对于二分类问题,可将样例根据其真实类别与预测类别的组合划分为:

阅读全文 »

定义

在模型预测阶段,我们先为图像生成多个锚框,并为这些锚框一一预测类别和偏移量。随后,我们根据锚框及其预测偏移量得到预测边界框。当锚框数量较多时,同一个目标上可能会输出较多相似的预测边界框。了使结果更加简洁,我们可以移除相似的预测边界框。常用的方法叫作非极大值抑制(non-maximum suppression,NMS)。

计算流程

非极大值抑制的流程如下:

  • 根据置信度得分进行排序
  • 选择置信度最高的比边界框添加到最终输出列表中,将其从边界框列表中删除
  • 计算所有边界框的面积
  • 计算置信度最高的边界框与其它候选框的IoU。
  • 删除IoU大于阈值的边界框
  • 重复上述过程,直至边界框列表为空。
    阅读全文 »

Docker on WSL

配置好了WLS后,最近慢慢的把以前在虚拟机上开发的项目都移到了WSL上,一切都像在原生的ubuntu下一样,只有一个用到docker的项目遇到了波折: 由于WSL 还不支持linux kernel的一些特性,在WSL下可以安装docker,但是 docker engine 的运行会有问题。Github和微软的feedback页面上有不少人都提出过这个问题 [1] [2] [3],但是WSL团队都没什么正面回答。能找到的就是WSL的PM、大帅哥Jack Hammons在Microsoft Build 2017上的回答提问时的一段话。

阅读全文 »

Windows subsystem for Linux

昨天晚上俄罗斯世界杯开踢了,看起来足球世界还是没怎么变,梅罗仍然统治世界,沙特仍然被欧洲球队打穿,中国队仍然四年一度的缺席……但是技术的世界却是日新月异,连微软都拥抱开源了,Windows subsystem for Linux (WSL) 简直是在赤裸裸的勾引程序员扔掉Mac投奔Windows。

既有Windows的桌面和Office套件,又可以方便的使用Linux的工具链,这样的生活不要太美好!当然前期坑是少不了的,经过两年时间的改进,wsl团队解决了不少问题(比如本文将提到的文件权限问题),个人觉得已经可以入坑了。当前时间节点18年6月,版本windows 10 1803, build 17134。

WSL的介绍和安装请看下这里:

加入到新团队后一直着手于建立统一的标准软件流程,现有的项目因为不同BU的影响,不仅流程各不相同,使用的工具也是五花八门,所以从年初制定KPI时,不仅是制定标准的软件流程,软件开发工具的统一也是一项重要内容。经过各种讨论评估,最终决定使用JIRA和Bitbucket,后续还会有Bamboo和Confluence的加入,最终凑齐Atlasssian全家桶, 完成软件开发从需求管理、任务管理、测试管理、代码管理、缺陷管理、持续集成、文档管理的全流程覆盖。

经过漫长的与sourcing和IT部门的扯皮,终于采购了JIRA和Bitbucket。然后由于IT部门的不作为,所有安装、配置、管理、维护都是自己动手,项目开发的任务之外又承担了配置管理员的角色,虽然这个我这个二把刀管理员搞出来的配置非常不专业,但是因为是自己的心血,还是很有必要记录一下的。

阅读全文 »

简介

头脑风暴是经常被使用的词汇,大众或多或少都知道这种讨论解决问题的方法,但是即使是在专业的项目管理者手中,头脑风暴也是经常被误用的一个工具。人们经常认为自己是在进行头脑风暴,但其实他们只是在进行讨论而已,真正的头脑风暴是一个正式的过程。在参加了很多各种各样的、或好或坏的头脑风暴后,觉得有必要做些总结。

头脑风暴(Brainstorming)在维基百科的定义:一种为激发创造力、强化思考力而设计出来的一种方法。此法是美国BBDO(Batten, Bcroton, Durstine and Osborn)广告公司创始人亚历克斯‧奥斯本(Alex F. Osborn)于1938年首创的。

头脑风暴作为一种群体决策工具在PMBOK的多个管理过程中被推荐使用,比如:项目整合管理,范围管理,时间管理,成本管理,质量管理,风险管理等。

头脑风暴主要目标大量收集解决问题的灵感和方案。为了最大限度的激发团队的创造力和思考力,过程中提倡自由发言、畅所欲言、发散思考,鼓励互相启发和激励,禁止评论和批评。

阅读全文 »

截取文件名和后缀

编写Shell脚本的过程中,经常会和文件名和文件路径打交道。如果用户输入了一个文件的全名(可能包含绝对路径和文件后缀),如何得到文件的路径名,文件名,文件后缀这些信息呢。Shell脚本拥有强大的字符串处理能力,如果把文件名当做字符串,我们不难使用cut或sed这样的工具得到我们想要的结果。

1
2
3
4
5
6
7
$fullfile=/the/path/foo.txt
$fullname=$(basename $fullfile)
$dir=$(dirname $fullfile)
$filename=$(echo $fullname | cut -d . -f1)
$extension=$(echo $fullname | cut -d . -f2)
$ echo $dir , $fullname , $filename , $extension
/the/path , foo.txt , foo , txt

这里使用basename命令可以直接得到包含后缀的文件名,而dirname命令可以得到路径名,然后就能简单的用cut截取文件名和后缀名。

阅读全文 »

万万没想到,有一天也会沦落到在一台4G内存的Win7笔记本上搞linux编程,还我的16核Z600……好吧,抱怨也是没有用的,和销售人员一样型号的13寸笔记本,标志着我的coding生涯从此全面进入虚拟机和SSH时代。

先不说外接键盘、鼠标、显示器的酸爽,作为开发编译环境的虚拟机就是个问题。放在某个server上,锁在大楼的某处,感觉蛮牢。直到一次急等着release一个feature时怎么也连不上,跑去一看,那台server已经被人大卸八块了……幸好最后装上还能用,着实惊出一身冷汗。这件事提醒我真的需要好好考虑怎么将开发环境管理好,减少重新配置环境的开销和风险,甚至为整个团队构建更高效的开发和测试环境,提高团队效率……

解放生产力的共产主义理想先不说,说起虚拟机的设置、部署和迁移,vagrant是鼎鼎大名了。按照官网的描述,vagrant是用于创建和配置轻量级、可复用、跨平台的开发环境的工具。

阅读全文 »