前言
夭寿了,公司要搞人工智能,首先试点的就是segment_anything,要将AI切图集成到我们现有的服务上去。作为一名nodejs开发,除了在网上CV过几段python代码,这玩意我是毛都没接触过啊,时间紧迫,也由不得学没学过了,只能硬着头皮上了。
这篇文章只会简单介绍如何使用,因为具体的逻辑我还没完全搞清楚,这段时间会集中精力去折腾几天,等大概搞清楚怎么回事了再来好好讲讲,可以关注一下等等后文。
什么是segment_anything
segment_anything(下面简称segment),号称能够智能分割出任何图片,且分割细度准得一批,包含了1100万张训练集,最重要的是免费,开源,简直赛博菩萨(不是那种菩萨)。然后,这是官网,这是代码。
环境准备
这里很关键,这个服务的某些依赖对python版本是有要求的,如果是小白到一定程度的话,建议使用3.9.13版本,因为我是用这个版本跑起来的,之前的3.10版本执行失败了。
关于下载python,我是在windows应用商店搜索下载的,我曾经下载安装包自己安装过,但总会有莫名其妙的问题,执行python命令没有反应,在这里建议有条件进商店的小白尽量不要自己折腾。
代码下载:
git clone git@github.com:facebookresearch/segment-anything.git
cd segment-anything; pip install -e .
注意第二行最后面有个 “.” ,别漏了。
安装依赖
pip install opencv-python pycocotools matplotlib onnxruntime onnx
如果安装完了发现依赖还是没有,建议使用:
python -m pip install opencv-python pycocotools matplotlib onnxruntime onnx
下载模型包:
default
orvit_h
: ViT-H SAM model.vit_l
: ViT-L SAM model.vit_b
: ViT-B SAM model.
建议使用第一个默认版本
编辑器我这里默认你用的是vscode了,因为我用的是这个
这时你打开大概是这样的
当然,你没有explorer.py
文件
手动创建一个,把下面这段代码复制进去
import numpy as np
import cv2
from segment_anything import sam_model_registry, SamPredictor
# checkpoint = "sam_vit_b_01ec64.pth"
checkpoint = "notebooks/sam_vit_h_4b8939.pth"
model_type = "vit_h"
sam = sam_model_registry[model_type](checkpoint=checkpoint)
sam.to(device='cuda')
predictor = SamPredictor(sam)
image_name = "图片文件名"
image = cv2.imread('notebooks/images/' + image_name)
predictor.set_image(image)
image_embedding = predictor.get_image_embedding().cpu().numpy()
np.save(image_name + ".npy", image_embedding)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
你也没有yarn.lock文件,这个文件你可以理解为在应用启动的时候创建的,在当前目录打开命令行,执行
cd demo
npm install --g yarn
如果你连npm也没有,建议找篇文章安装一下node环境
前面提到的模型文件下载好之后放在这个文件夹下面
点开文件夹下面的 ipynb 文件,编辑器会提示让你安装个什么插件,装就是了
安装完之后上面会有一栏这个,点全部运行
如果遇到"XX模块没有"之类的报错,用 pip install
或者 python -m pip install
安装就好了
如果装上了依赖依然报错,就在里面添加以下代码执行一下
import os
os.sys.executable
看看当前系统使用的python地址和你安装的地址是不是同一个
如果遇到 未使用 touch 模块的报错,查看一下当前用的torch版本是否是CUDA版本
import os
import torch
os.sys.executable
torch.__version__
在这里又涉及到你的CUDA版本号的问题了,如何知道你的CUDA版本号应该选择多少呢?
打开你的英伟达控制面板(什么你连显卡面板都没有?去英伟达官网自己下)
什么你连显卡都没有?或者说你用的是A卡?CUDA支持使用CPU运行,但是程序的代码得改,我看看有多少人没有N卡还想跑AI的,再考虑出个教程。
我这里提示的是 12.1.112 ,所以去到 pytouch官网选择对应的版本安装,这里注意pip3
如果不能用的话,还是用 pip
或者 python -m pip
去CUDA官网安装CUDA
之前的ipynb文件执行完成后,会在notebooks文件夹下生成两个onnx文件,复制到demo/model
文件夹下
启动
将你希望切割的图片放在notebooks/images
文件夹下,将图片完整名字(如:back.png)替换掉image_name
中的名字,在命令行中执行:
python .\explorer.py
执行完成后会在项目根目录下生成一个 npy
文件,将图片文件和npy文件放入 demo/src/assets/data
目录下,
修改src/App.tsx
文件,替换第21~23行的内容,改为你图片、npy和onnx文件的名字,如:
const IMAGE_PATH = "/assets/data/back.png";
const IMAGE_EMBEDDING = "/assets/data/back.png.npy";
const MODEL_DIR = "/model/sam_onnx_quantized_example.onnx";
修改完成后,命令行进入demo文件夹下,执行:
yarn && yarn start
你就可以在localhost:8080看到被裁剪的图片了