V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
uIPC
V2EX  ›  分享创造

撸猫神器 uIPCat!让闲置手机作为边缘视觉计算终端

  uIPC · 34 天前 · 5542 次点击
这是一个创建于 34 天前的主题,其中的信息可能已经有所发展或是发生改变。

背景

本人是一个搞嵌入式软件开发的铲屎官,外出时经常有远程撸猫的需求,之前尝试过各种市面上的网络摄像头,但大部分摄像头画质跟手机的比起来说还是有很大的差距,并且把一个摄像头放在家里也让人没有那么安全感。

现有产品

在一次冲浪过程中发现了有不少让手机充当网络摄像头的 APP ,刚好自己有一台闲置的 iPhone SE1 。试玩了一圈此类 APP , 大部分只能局域网内实时预览,比较成熟商业化的是一个台湾公司做的阿福管家,但在大陆使用延时和稳定性还是比较一般,并且免费使用的限制太多了,最终得到的画面可能还不如原来的网络摄像头。

实现

在各种的限制下,我就尝试自己开发一个,自己没客户端开发背景,自己有过 WebRTC 底层的调试移植开发经历,略懂上层的 JavaScript WebRTC 应用接口的。如果是基于客户端开发,有多个平台需要兼容,这学习成本有点高,搞不来。

于是我选中一个天生为跨平台而生的方案:Web APP

用浏览器去实现在一个 IPCamera 功能对应的技术栈如下:

  1. 实时预览:原生支持 WebRTC ,省掉流媒体接口和 P2P ICE 的开发调试
  2. 本地存储:基于 IndexedDB 做大容量视频存储
  3. 云端储存:很方便实现第三方对象云存储
  4. 本地 CV:基于 TensorFlow.js ,在浏览器端就可以实现对象识别录像和报警
  5. 端到端加密:借助 URI fragment 特性可实现本地密钥生成,无需经过服务端传输和存储

最终实现效果:https://uipcat.com/

实时视频流预览: image

当然,也可以用来摸鱼: image

只需要扫码即刻部署: image

如何使用

无需注册,在主预览设备打开 https://uipcat.com/,用手机扫码即可作为摄像头节点,保存预览设备跳转到的 URL 作为访问摄像头的唯一权限。

本地 CV

市场上大部分的网络摄像头产品提供了对象侦测功能,但他们的实现基本是需要将图片传到厂家服务端上识别。手机主芯片的算力是远超网络摄像头芯片,所以可以在直接在手机浏览器本地拍对象侦测模型。uIPCat 在本地默认集成了 MediaPipe 的通用对象侦测模型,可以满足绝大部分识别任务,后续开加上自定义模型,部署自己训练的模型,定制识别自己关注的对象。

image

在对象识别的前置,加了一个画面变化侦测,如有画面变化超过了定义的阈值,才会触发识别处理。

image

目前开放了绝大部分参数的自定义,后面会简化这个配置。

视频存储

目前默认使用本地存储,数据会被存储在本地浏览器的 IndexedDB ,它本不是完全可靠的存储方案,各浏览器有些许差异。云存储适配了 AList v3 的 API 接口,可以通过 AList 将数据间接存到各个主流的如 S3 等主流储存或云盘方案,支持的存储列表

HomeKit 支持

通过 go2rtc 开源项目接入 HomeKit 平台,该功能目前正在测试中,后续开放。 image

隐私安全

对于大部分人来说,隐私安全是一个网络摄像头的重中之重。现有市面上的网络摄像头设备,你的隐私安全大部分是基于你对品牌厂家的信任,从实现的技术角度上说,他们是有权限可以直接访问你的摄像头,更别说大部分厂家提供了云存储直接分析处理识别你图片或视频的服务。

uIPCat 基于 WebRTC 链路本身就是基于 DTLS 和 SRTP 加密标准了,重点在于保障信令的安全。uIPCat 信令采用端到端加密方案,在主预览设备本地生成密钥,加密方法 AES-GCM ,密钥附带到 URI fragment 通过二维码线下传输到摄像头节点,加密后的信令数据通过 MQTT 通道传输。

image

URI fragment 既上图 # 号后字段,它不会传递给服务器端。

开发计划

  • 接入 Home Assistant ,通过自定义 MQTT 推送对象侦测报警
  • 开放设备接入 SDK ,可自行接入如树莓派、ESP32 等 DIY 设备。
  • 开放摄像头节点 API 能力,作为多模态大模型的前置边缘视觉处理器(正如标题党那样)
  • 自定义模型,提供在线模型训练方法
  • 更多类型的云存储 API 接入
第 1 条附言  ·  34 天前

在 Settings 可以设置选择摄像头: image

72 条回复    2024-06-29 11:46:22 +08:00
wensonsmith
    1
wensonsmith  
   34 天前
666, 不错的项目啊
shyrock
    2
shyrock  
   34 天前
感兴趣。
Ericality
    3
Ericality  
   34 天前
耳目一新的感觉 马一下回家试试
GeekGao
    4
GeekGao  
   34 天前
非常可以
dapang1221
    5
dapang1221  
   34 天前
太强了,一堆旧手机有用了
forvvvv123
    6
forvvvv123  
   34 天前
nb 啊
Ziuc
    7
Ziuc  
   34 天前
很强,学习了
uIPC
    8
uIPC  
OP
   34 天前
感谢各位大佬支持,之前一直是自用,首次公开放出来,欢迎大家试用多提意见。
moonbeama
    9
moonbeama  
   34 天前
只能使用前置摄像头吗?
uIPC
    10
uIPC  
OP
   34 天前
@moonbeama 在 Settings 里可以改变摄像头
amber0317
    11
amber0317  
   34 天前
技术很强,完成度也很高,支持一波
Yukineko
    12
Yukineko  
   34 天前
不错噢,之前也有想法训练个模型通过摄像头识别猫是否在喝水/吃饭
outcastveron
    13
outcastveron  
   34 天前
非常 nb 的项目,支持!!
jazz1988
    14
jazz1988  
   34 天前
厉害,非常棒
BQsummer
    15
BQsummer  
   34 天前
手机长时间插电源会不会鼓包完全看人品
cincout
    16
cincout  
   34 天前
太厉害了
uIPC
    17
uIPC  
OP
   34 天前
@Yukineko 完全可以!如果直接扔到多模态大模型里,甚至都可以不用训练专用模型,猫是否在睡觉,吃东西还是拉翔,都可以直接高识别率识别出来,配合 Home Assistant 可以做很多原来难以实现的智能家居场景联动。
shyling
    18
shyling  
   34 天前
有点东西!
7gugu
    19
7gugu  
   34 天前
有点牛逼,下班试试看
uIPC
    20
uIPC  
OP
   34 天前
@BQsummer 是的,发热是导致鼓包主要原因,我花了很多时间优化本地 CV 发热问题,现在已经好很多了。如果不开本地画面侦测,CPU 占用极低,基本只需要维持一路 MQTT 在线就好了,摄像头不工作时可以处于休眠状态。
duffercn
    21
duffercn  
   34 天前
这个太酷了!
Jesmora
    22
Jesmora  
   34 天前
我比较笨,iOS 如何切换到后置摄像头
fenghao0108
    23
fenghao0108  
   34 天前
这方案吊炸天啊
uIPC
    24
uIPC  
OP
   34 天前
@Jesmora 哈,是我体验没做好,在 Settings 可以设置选择摄像头,我后面优化下这个设置的位置。
povsister
    25
povsister  
   34 天前 via iPhone
厉害,抽空研究看看
yinghu183
    26
yinghu183  
   34 天前 via iPhone
牛逼的项目,期待接入 homeassistant 。
PqgpNgA0wk
    27
PqgpNgA0wk  
   34 天前
感觉这个项目已经做的挺全,还有 us 链路
uIPC
    28
uIPC  
OP
   34 天前
@PqgpNgA0wk 部署了中国区和美国区两个 MQTT 信令节点,还两个 coturn P2P 打洞和 TURN 中继节点。
uIPC
    29
uIPC  
OP
   34 天前   ❤️ 1
@yinghu183 已经在开发了,我自己也是重度的 homeassistant 用户,一定会支持好的。
Sniper000
    30
Sniper000  
   34 天前
一个手机扫码后 可以看到画面了 但是没有看到 setting 在哪里 另外 怎么用另外一个手机查看呢
1044523901
    31
1044523901  
   34 天前
蹲开源
ixwen
    32
ixwen  
   34 天前
@uIPC #24 这个感觉放在首页 切换主体旁边会方便点
Sniper000
    33
Sniper000  
   34 天前
好像有点问题 另外一个手机查看的时候 看不到画面
uIPC
    34
uIPC  
OP
   34 天前
@Sniper000 在预览端设置,摄像头节点扫完码就可以不用动了,设置都在另外一个手机完成的。
uIPC
    35
uIPC  
OP
   34 天前
@1044523901 会先开源设备接入 SDK ,主站的前端是我现学现用的,后面代码成熟见得了人了可以考虑开源。
uIPC
    36
uIPC  
OP
   34 天前
@ixwen 好主意,我看下怎么比较好的放到主页,现在控制栏被按钮占满了,原来是在那里的。
uIPC
    37
uIPC  
OP
   34 天前
@Sniper000 正常是支持多设备同时看一个摄像头节点的,你方便把浏览器版本信息发我下吗?我看下测下是不是兼容问题。
1423
    38
1423  
   34 天前
神了
lucifer9
    39
lucifer9  
   34 天前
主要问题还是手机不好固定啊
尤其是要兼顾视角和充电的位置
wuzzispacelake
    40
wuzzispacelake  
   34 天前
手机当监控最大的问题是过热,所以还是得上专门的摄像头
chancat
    41
chancat  
   34 天前 via Android
我用阿福管家
swordspoet
    42
swordspoet  
   34 天前
厉害了
Michelangelono
    43
Michelangelono  
   33 天前
可以搞个大屏视图,就是一个界面同时显示多个监控画面
brianinzz
    44
brianinzz  
   33 天前
厉害!
Admstor
    45
Admstor  
   33 天前
手机扫描二维码后
打开的网页
手机也是一片黑,PC 也停留在二维码,貌似没有任何用
gosby
    46
gosby  
   33 天前 via Android
马赛克砖块儿好像用的是 UTC 时间比实际会慢 8 个小时
stefwoo
    47
stefwoo  
   32 天前 via Android
长期插电怕鼓包,可以把电池改成大电容,我改过一个。
uIPC
    48
uIPC  
OP
   32 天前
@Michelangelono 嗯嗯,这个计划搞,类似虚拟 NVR 。
uIPC
    49
uIPC  
OP
   32 天前
@stefwoo 是的,淘宝有那个去掉电池的电芯 ic 可以换。
uIPC
    50
uIPC  
OP
   32 天前
@gosby 这个是热力图组件的一个 bug ,设置时区不生效,我关注下。
uIPC
    51
uIPC  
OP
   32 天前
@wuzzispacelake 如果手机充电本身不发热,其实也还好,各有各的应用场景吧,你可以当作软路由和硬路由的区别。
CharlesRey
    52
CharlesRey  
   32 天前
或许是我这个手机太旧了,并不支持😂😂😂😂😂😂![IMG_4840.JPG]( https://p0.meituan.net/dpplatform/3a2f60d206a28538b7a54290cf4a89c07091115.jpg)
CharlesRey
    53
CharlesRey  
   32 天前
或许是我这个手机太旧了,并不支持😂😂😂😂😂😂![]( https://p0.meituan.net/dpplatform/3a2f60d206a28538b7a54290cf4a89c07091115.jpg)
CharlesRey
    54
CharlesRey  
   32 天前
或许是我这个手机太旧了,并不支持😂😂😂😂😂😂[]( https://p0.meituan.net/dpplatform/3a2f60d206a28538b7a54290cf4a89c07091115.jpg)
stefwoo
    55
stefwoo  
   32 天前 via Android
nokia 。哈哈哈哈。
uIPC
    56
uIPC  
OP
   32 天前
@CharlesRey 牛逼,可以装 chrome 吗?至少是浏览器支持了 WebRTC 才可以,目前主流的都支持。
Xushet
    57
Xushet  
   31 天前
@BQsummer #15 手机设置智能断充就好了
midpoint
    58
midpoint  
   31 天前
很有意思,不错的想法
stonesirsir
    59
stonesirsir  
   30 天前
@BQsummer 这个确实也算一个问题
52lvqiang
    60
52lvqiang  
   29 天前
非常棒,感谢分享!
stefwoo
    61
stefwoo  
   26 天前 via Android
node 可以息屏吗?目前我只要息屏,浏览器就停止工作了。
stefwoo
    62
stefwoo  
   26 天前 via Android
我还有一个旧手机报错,系统是安卓 4.4 ,浏览器是 chrome 。

500
b.replaceAll is not a function

@uIPC
uIPC
    63
uIPC  
OP
   26 天前
@stefwoo hi
#62 安卓在 5.0 之后才开始支持 WebRTC ,所以 4.4 无法原生支持。
#61 绝大部分的手机在息屏时会直接把摄像头硬件级别的休眠了,所以只能尝试把屏幕亮度降到最低保持常亮。
stefwoo
    64
stefwoo  
   26 天前 via Android
@uIPC 哦。
那太容易烧屏了。
Fred0410
    65
Fred0410  
   25 天前
@CharlesRey 诺基亚都出来了,6
liuw666
    66
liuw666  
   24 天前 via iPhone
@uIPC #63 replaceAll 不存在 加个 polyfill 应该就可以吧
simo
    67
simo  
   24 天前
这个牛啊
johnwonderful
    68
johnwonderful  
   24 天前
这么厉害,有空试试
zyhedwards
    69
zyhedwards  
   20 天前
@uIPC 部署 mqtt 节点需要费用吗?成本大概多少
uIPC
    70
uIPC  
OP
   20 天前
@zyhedwards 需要的,如果连接数在 1000 以下,国内的那种 99 元一年的小机就够了。
zyhedwards
    71
zyhedwards  
   20 天前
@uIPC 感谢解答。 成功打洞获取节点数据后,后续是不是就走 P2P 了?这样看其实带宽流量成本也不是很高?
uIPC
    72
uIPC  
OP
   19 天前
@zyhedwards #71 网络类型的不同,P2P 有一定的打通失败率,这时候就需要 TURN 中继,但如果能打得通,就不需要服务端有流量成本了。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1762 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 42ms · UTC 16:37 · PVG 00:37 · LAX 09:37 · JFK 12:37
Developed with CodeLauncher
♥ Do have faith in what you're doing.