不用拥有摄像机也能开发固件
我们的模拟器已经超出了它的名字所涵盖的范围。除了 HiSilicon,它现在还包含 Xiongmai、Goke、Anyka、SigmaStar 和 Novatek——共 69 台机器——项目也从 qemu-hisilicon 改名为 qemu-bench。它能启动未经修改的固件,无论我们的还是厂商的,一直启动到完整的 Linux 用户空间。
本周,模拟的 Novatek 已经能运行厂商自己的神经网络。一个分类器能说出它看到的是什么;自带的检测器能找到人、车辆和人脸;另一个网络能找到猫和狗;人脸识别把那些人人都拿来测试的标准样张正确地归回了各自的主人。真实音频也来了,还有 MIPI DSI 面板,以及 NT98332 上的 H.264 和 H.265 视频。一台新的 SigmaStar SSC375 机器运行 Dahua 摄像机的转储,并向它自己的 RTSP 服务器提供视频。
厂商没有公开这些的任何一部分,全部是逆向工程得来的。这正是我们构建数字孪生的目的:模型必须与真实摄像机逐帧一致,而且这一点在每次推送时都会自动检验,而不是在报告里口头承诺。
新项目:vigil,面向视频录像机
OpenIPC 不再只关乎摄像机。vigil 是运行在廉价硬件上的视频录像机开源软件。它把摄像机以二乘二的画面显示在 HDMI 上并写入磁盘:通过 RTSP 或 NETIP 接入的网络摄像机,H.264 和 H.265,录像时不重新编码,只要板卡上有解码器就用硬件解码来显示。带模拟输入的录像机上,这些输入也会被显示和录制。录像写入一个个可以独立播放的分段,磁盘写满时最旧的分段会被删除。
Hi3536DV100 已在真实硬件上验证,RK3588 已获支持,Hi3520DV200 仍处于实验阶段,任何 Linux 主机都可以录像。
摄像机能读取你的水电表
把它对准水表、燃气表或电表,告诉它数字在哪里,它就会报告数字本身而不是数字的照片。滚轮由摄像机自身 CPU 上的一个小型神经网络读取,所以任何数据都不会离开摄像机,也不涉及云端。水表用来计量升数的小红指针表盘通过指针的方向读取,并把最后一个滚轮之后的数字加进去。
读数放在 /metrics 和 /api/v1/meters 上,每分钟刷新一次,所以任何已经在抓取这台摄像机数据的监控系统都可以绘制用量曲线或在漏水时报警。如果有人挪动了摄像机,它会察觉并报告,而不是继续去读一块墙皮。电子显示屏目前还不能读取。
摄像机能发现自己传感器玻璃上的灰尘
一粒灰尘位于焦平面前方不到一毫米处,所以它看起来从来不像一粒灰尘:镜头把它画成一块横跨几十个像素的柔和污斑,它带走同样比例的光线,而且从不随场景移动。大多数人多年都不会注意到它,直到有什么东西把画面拉伸——一次强烈的去雾、一次对比度提升、一片灰色的天空。
摄像机现在可以自己从实时画面中寻找它们,不需要测试卡,也不需要有人站在镜头前。它还能区分红外滤光片上的灰尘和盖板玻璃上的灰尘:它移动滤光片,观察什么跟着一起动。它还能回答清洁之后真正重要的问题——脏东西是没了,还是只是被你挪了个位置?
内核和文件系统移进了同一个分区
闪存过去用固定槽位存放它们,每个镜像必须塞进自己的槽位,哪怕隔壁的槽位空着也一样。现在它们背靠背放在一起,只需要两者的总和放得下。
这在 Goke V300 上带来的好处,在今天的构建版本上实测。在一台 8 MB 闪存的摄像机上,lite 系统占用 5099 KiB,而槽位是 5 MiB——距离上限只剩 21 KiB。再加一个软件包,构建版本就干脆放不下了。新布局没有这样的上限,而且设置的空间也顺带从 704 KiB 增长到了 832 KiB。
在 16 MB 的摄像机上差距更大。ultimate 系统占用 6775 KiB,而槽位是 10 MiB,也就是说有 3.4 MiB 一直闲置在那里,无处可用。现在这部分给了设置:之前是 3776 KiB,之后是 7360 KiB,几乎翻倍。
而且产出的镜像任何 U-Boot 都能启动,包括出厂的那个,这意味着你可以不动引导加载程序就装上 OpenIPC。
另外
- Novatek。 快照、
/mjpeg和/video.mp4现在在这些芯片上可用了,重新加载设置时码流也不再中断。我们还写了一份从厂商自己的引导加载程序首次安装的分步指南。 - 人流统计进入了摄像机本身。 一周前它还只是网页界面里的一个页面;现在警戒线、区域、停留时间和按小时统计的历史都由固件来计算了。
- 目录中的每一块板卡都有了自己的页面可以链接,地址是 /cameras/boards。而且你可以通过固件的名字查找板卡,当你手里只有一个从摄像机上拉下来的文件时,这很有用。
- Club 现在按摄像机而不是按报告计星。 关于同一台摄像机的五份报告算一台摄像机,而不是五台。
- 我们单独发布了用于计数摄像机的行人和车辆检测器,放在 xmnpu-models 里。
- 我们打开了 Xiongmai 的编码器。 XM530 上的 H.264 压缩完全不依赖厂商库:我们为它的 Hantro 8290 编写的驱动与出厂模块的 ioctl ABI 逐个调用完全一致,固件察觉不到这个替换。代码在 openxiongmai。
- 我们继续整理 Xiongmai 支持。 在 XM510 上,红外滤光片由 SoC 自己的模块驱动,而不是 majestic 的夜间代码;看门狗的行为与其他所有芯片一致;Pins 页面改由 ipctool 的 pad 表绘制,不再提供内核已经占用的 pad。
- Goke 板卡的主码流增加了省内存模式,快照也不再为自己预留帧。宽幅传感器现在能装进 64 MB 的板卡。