前言
几个月前接触到了Meta AI做的Segment-Anything这个项目,只能说碉堡了,像下图一样的风景照,往水面一点就把水面分割出来了。要是在以往的CV方法滤色,过滤水面是很麻烦的事情。
那么有了这么一个神器,就可以做更多的视觉分割的操作了(比如分割监控画面中的水域,搭配YOLO来检测危险等等)。
限制与新的设想
但是官方放出来的最小模型ViT-B SAM model也有358MB,默认模型更是高达2.4GB,在性能凑合,内存不大的边缘设备(比如树莓派或更小的Linux嵌入式系统)上的运行是一种灾难。
所以我萌生了一种想法,将Segment-Anything封装成API,在带GPU的云服务器上运行,边缘设备只需要发送图像和标记点就可以获得语义分割后的掩膜。
我使用Flask写了一个HTTP服务,在服务器上运行后,客户端只需要先发送OpenCV图像到服务器进行分析,然后发送标记点即可返回掩膜。简单的opencv-python程序演示如下:
用法
使用起来十分简单,只需在服务器部署服务端,然后客户端通过简单的HTTP请求即可获得语义分割后的掩膜,不需要边缘设备有高AI算力与大内存。
部署服务端
在服务器安装标准的Segment-Anything,然后部署这个flask服务(代码仓库在文末)。
客户端使用
-
用opencv-python发送图像给Segment-Anything进行分析:
import cv2 import requests img = cv2.imread(img_path) img_byte = cv2.imencode('.jpg', img)[1].tobytes() requests.post(f'{server_address}/setimg', img_byte).content
-
发送标点给服务,即可返回编码后的掩膜,并解析:
import cv2 import requests img = cv2.imread(img_path) img_byte = cv2.imencode('.jpg', img)[1].tobytes() requests.post(f'{server_address}/setimg', img_byte).content
这样就获得了一个掩膜的numpy矩阵(矩阵内数据类型为numpy.bool)。
服务端代码我放在GitHub:https://github.com/Huge-Lee/segment-anything-flask,希望这个小项目能给大家的边缘AI开发提供帮助。