--- license: agpl-3.0 base_model: - facebook/sam2.1-hiera-large - facebook/sam2.1-hiera-small - facebook/sam2.1-hiera-tiny tags: - rknn --- # Segment Anything 2.1 RKNN2 ## (English README see below) 在RK3588上运行强大的Segment Anything 2.1图像分割模型! - 推理速度(RK3588): - Encoder(Tiny)(单NPU核): 3s - Encoder(Small)(单NPU核): 3.5s - Encoder(Large)(单NPU核): 12s - Decoder(CPU): 0.1s - 内存占用(RK3588): - Encoder(Tiny): 0.95GB - Encoder(Small): 1.1GB - Encoder(Large): 4.1GB - Decoder: 非常小, 可以忽略不计 ## 使用方法 1. 克隆或者下载此仓库到本地. 模型较大, 请确保有足够的磁盘空间. 2. 安装依赖 ```bash pip install numpy<2 pillow matplotlib opencv-python onnxruntime rknn-toolkit-lite2 ``` 3. 运行 ```bash python test_rknn.py ``` 你可以修改`test_rknn.py`中这一部分 ```python def main(): # 1. 加载原始图片 path = "dog.jpg" orig_image, input_image, (scale, offset_x, offset_y) = load_image(path) decoder_path = "sam2.1_hiera_small_decoder.onnx" encoder_path = "sam2.1_hiera_small_encoder.rknn" ... ``` 来测试不同的模型和图片. 注意, 和SAM1不同, 这里的encoder和decoder必须使用同一个版本的模型. ## 模型转换 1. 安装依赖 ```bash pip install numpy<2 onnxslim onnxruntime rknn-toolkit2 sam2 ``` 2. 下载SAM2.1的pt模型文件. 可以从[这里](https://github.com/facebookresearch/sam2?tab=readme-ov-file#model-description)下载. 3. 转换pt模型到onnx模型. 以Tiny模型为例: ```bash python ./export_onnx.py --model_type sam2.1_hiera_tiny --checkpoint ./sam2.1_hiera_tiny.pt --output_encoder ./sam2.1_hiera_tiny_encoder.onnx --output_decoder sam2.1_hiera_tiny_decoder.onnx ``` 4. 将onnx模型转换为rknn模型. 以Tiny模型为例: ```bash python ./convert_rknn.py sam2.1_hiera_tiny ``` 如果在常量折叠时报错, 请尝试更新onnxruntime到最新版本. ## 已知问题 - 只实现了图片分割, 没有实现视频分割. - 由于RKNN-Toolkit2的问题, decoder模型在转换时会报错, 暂时需要使用CPU onnxruntime运行, 会略微增加CPU占用. ## 参考 - [samexporter/export_sam21_cvat.py](https://github.com/hashJoe/samexporter/blob/cvat/samexporter/export_sam21_cvat.py) - [SAM 2](https://github.com/facebookresearch/sam2) ## English README Run the powerful Segment Anything 2.1 image segmentation model on RK3588! - Inference Speed (RK3588): - Encoder(Tiny)(Single NPU Core): 3s - Encoder(Small)(Single NPU Core): 3.5s - Encoder(Large)(Single NPU Core): 12s - Decoder(CPU): 0.1s - Memory Usage (RK3588): - Encoder(Tiny): 0.95GB - Encoder(Small): 1.1GB - Encoder(Large): 4.1GB - Decoder: Negligible ## Usage 1. Clone or download this repository. Models are large, please ensure sufficient disk space. 2. Install dependencies ```bash pip install numpy<2 pillow matplotlib opencv-python onnxruntime rknn-toolkit-lite2 ``` 3. Run ```bash python test_rknn.py ``` You can modify this part in `test_rknn.py` ```python def main(): # 1. Load original image path = "dog.jpg" orig_image, input_image, (scale, offset_x, offset_y) = load_image(path) decoder_path = "sam2.1_hiera_small_decoder.onnx" encoder_path = "sam2.1_hiera_small_encoder.rknn" ... ``` to test different models and images. Note that unlike SAM1, the encoder and decoder must use the same version of the model. ## Model Conversion 1. Install dependencies ```bash pip install numpy<2 onnxslim onnxruntime rknn-toolkit2 sam2 ``` 2. Download SAM2.1 pt model files. You can download them from [here](https://github.com/facebookresearch/sam2?tab=readme-ov-file#model-description). 3. Convert pt models to onnx models. Taking Tiny model as an example: ```bash python ./export_onnx.py --model_type sam2.1_hiera_tiny --checkpoint ./sam2.1_hiera_tiny.pt --output_encoder ./sam2.1_hiera_tiny_encoder.onnx --output_decoder sam2.1_hiera_tiny_decoder.onnx ``` 4. Convert onnx models to rknn models. Taking Tiny model as an example: ```bash python ./convert_rknn.py sam2.1_hiera_tiny ``` If you encounter errors during constant folding, try updating onnxruntime to the latest version. ## Known Issues - Only image segmentation is implemented, video segmentation is not supported. - Due to issues with RKNN-Toolkit2, the decoder model conversion will fail. Currently, it needs to run on CPU using onnxruntime, which will slightly increase CPU usage. ## References - [samexporter/export_sam21_cvat.py](https://github.com/hashJoe/samexporter/blob/cvat/samexporter/export_sam21_cvat.py) - [SAM 2](https://github.com/facebookresearch/sam2)