Skip to content

Latest commit

 

History

History

cat_finder

slug title
cat-finder
Cat Finder

猫猫围栏

一、功能概述

注册的猫猫离开围栏,会收到一条告警信息。未注册的不会报警。 CPU 配置已提供,没有 GPU 也可以运行。

三、软件安装

启动 redis-server

$ sudo apt install redis-server
$ redis-server &
...
756417:M 18 Aug 2021 17:46:14.641 * Ready to accept connections

安装 megengine(1.6.0 引入 lite 接口,简化推理并提供模型加密方案)

$ conda activate py38
$ python3 -m pip install --upgrade pip
$ python3 -m pip install megengine==1.6.0rc1 -f https://megengine.org.cn/whl/mge.html
$ python3
...
>>> import megengine as mge
>>> mge.__version__
'1.6.0'

此处 30xx 卡常见问题:Ampere 架构的卡安装 megengine,需要看这个 issue。解决 30xx 强依赖 cuda11 而 mge 又无法分发(EAR 约束)的问题。

四、图片注册

启动图片服务

$ cd ${path/to/MegFlow}/flow-python/examples/application
$ pip3 install -r requires.txt
$ megflow_run -c cat_finder/image_gpu.toml  -p cat_finder    # 有 GPU 的机器执行这个
$ megflow_run -c cat_finder/image_cpu.toml  -p cat_finder    # 无 GPU 的 laptop 执行这句

现在 8081 端口部署了“猫体注册”服务,只需要打开浏览器上传图片、猫咪名称即可。cat_finder/image_gpu.toml 详细解释见 how-to-add-graph 。这里只需要浏览器打开主机所在 8081 端口服务(如 http:https://127.0.0.1:8081/docs )。

测试图片在软链接后的 models/cat_finder_testdata 目录。打开浏览器 UI 中选择图片、填写名称,提交即可。成功后

  • 用 redis-cli keys *可查到对应 BASE64 特征
  • 前端展示检测框

此处 wsl2 常见问题:win10 wsl2 用 127.0.0.1 地址打不开服务,注意 127 是指物理机, wsl2 运行的是虚拟机,需要 wsl -- ifconfig 获取 ip,后面都用虚拟机的 ip。

此处 docker 常见问题:服务部署在 docker 里、客户端无法直连,这里提供一些方法:

1) 运行时容器使用端口映射。例如把内部容器的 8081 映射成外部物理机的 18081、把 8082 映射成 18082

$ docker run -p 18081:8081 -p 18082:8082  -it ubuntu /bin/bash

此时用docker ps可以看到 PORTS 映射关系

$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS                                                                                      NAMES
d4b5b563051e   ubuntu    "/bin/bash"   9 seconds ago   Up 8 seconds   0.0.0.0:18081->8081/tcp, :::18081->8081/tcp, 0.0.0.0:18082->8082/tcp, :::18082->8082/tcp   nostalgic_swartz

浏览器打开宿主机的 ip:18081 端口即可使用

2)在容器内用 cURL 发 HTTP POST 请求,不再用 web UI

$ curl http:https://127.0.0.1:8081/analyze/my_cat_name  -X POST --header "Content-Type:image/*"   --data-binary @test.jpeg  --output out.jpg

my_cat_name 是注册的猫咪名称;test.jpeg 是测试图片;output.jpg 是返回的可视化图片。

3)Python 提供了调用参照 image_client.py

五、准备视频识别

启动解析服务

$ cd ${path/to/MegFlow}/flow-python/examples/application
$ megflow_run -c cat_finder/video_gpu.toml  -p cat_finder  # 有 GPU 的机器
$ megflow_run -c cat_finder/video_cpu.toml  -p cat_finder  # 无 GPU 的设备用这句

浏览器打开 8082 端口服务(如 http:https://127.0.0.1:8082/docs ,注意区分物理机和虚拟机的对应 ip)

可以看到 MegFlow 提供了 4 个 API:启/停一路解析、消费当前解析结果、列出所有信息。

开启一路视频流解析需要流的 url,这里有两种方法:

1)离线文件方式。也就是在 WebUI 中输入类似/mnt/data/stream/file.ts 的路径。需要自行保证服务器可访问这个文件、并且格式是可以被 ffmpeg 解析的(例如 .ts/.mp4/.h264/.h265)。

2)在线流方式。准备一个 rtsp 视频流地址,做测试输入。模型包目录提供了测试视频,在 models/cat_finder_testdata,需要用户自行部署 live555 服务。最直接的办法:

$ wget https://github.com/aler9/rtsp-simple-server/releases/download/v0.17.2/rtsp-simple-server_v0.17.2_linux_amd64.tar.gz
$ 
$ tar xvf rtsp-simple-server_v0.17.2_linux_amd64.tar.gz && ./rtsp-simple-server 
$ ffmpeg -re -stream_loop -1 -i ${models}/cat_finder_testdata/test1.ts -c copy -f rtsp rtsp:https://127.0.0.1:8554/test1.ts
  • 想用 laptop/树莓派摄像头可搜索 Camera 推流教程
  • 也可以手机拍摄视频,再用 ffmpeg 转成 .ts 格式推到 live555 server

相关教程已整合在 如何生成自己的 rtsp 流地址

六、视频识别 FAQ

  • 如果用 wsl2 部署,注意区分物理机和虚拟机的 ip
  • 如果服务部署在 docker 里,同样可以把 8082 端口映射到宿主机端口

七、运行

1)WebUI 方式

try it out 其中的 /start/{url} 接口,输入 rtsp 地址(如“rtsp:https://127.0.0.1:8554/test1.ts”或者“/home/name/file.mp4”),会返回 stream_id(例如 0)。

  • 服务将打印相关日志
2021-08-30 15:17:30.361 | DEBUG    | cat_finder.shaper:exec:82 - shaper recv failed_ids [1]
2021-08-30 15:17:31.760 | DEBUG    | warehouse.detection_yolox.lite:inference:157 - YOLOX infer time: 0.4643s
2021-08-30 15:17:34.094 | INFO     | cat_finder.track:exec:27 - stream tracker finish
2021-08-30 15:17:34.094 | INFO     | cat_finder.shaper:exec:47 - stream shaper finish
2021-08-30 15:17:34.201 | DEBUG    | warehouse.reid_alignedreid.lite:inference:57 - ReID infer time: 0.1072s
2021-08-30 15:17:34.203 | INFO     | cat_finder.redis_proxy:search_key:72 - key: b'feature.laohu' dist: 0.7931023836135864
2021-08-30 15:17:34.203 | INFO     | cat_finder.redis_proxy:search_key:72 - key: b'feature.pingai' dist: 0.5928362607955933
  • 用 stream_id 做 /get_msgs/{id} 的入参,可拉取这路流的解析结果
  • redis-cli keys * 可看到报警信息
$ redis-cli 
127.0.0.1:6379> keys *
1) "feature.laohu"
2) "notification.cat_finder"
3) "feature.pingai"

rpop notification.cat_finder 可消费报警消息。

2)命令行方式

对应的 cURL 命令参考

$ curl  -X POST  'http:https://127.0.0.1:8082/start/rtsp%3A%2F%2F127.0.0.1%3A8554%2Ftest1.ts'  # start  rtsp:https://127.0.0.1:8554/test1.ts
start stream whose id is 2% 
$ curl 'http:https://127.0.0.1:8082/list'   # list all stream
[{"id":1,"url":"rtsp:https://10.122.101.175:8554/test1.ts"},{"id":0,"url":"rtsp:https://10.122.101.175:8554/test1.ts"}]%

路径中的 %2F%3AURL 的转义字符

3)Python 代码方式

参照 video_client.py 实现

八、 Web 实时展示解析结果

参考 tutorial04 操作说明