之前带视觉项目,兄弟问我:“哥,做目标检测、图像分割,昇腾上有现成的库吗?”

好问题。今天一次说清楚。

ops-cv 是啥?

ops-cv = Operations for Computer Vision,昇腾计算机视觉算子库。

一句话说清楚:ops-cv 是昇腾的计算机视觉算子库,目标检测、图像分割、图像处理都有现成的。

你说气人不气人,同样一个 YOLO,PyTorch 跑 50ms,ops-cv 能跑到 15ms。

为什么要用 ops-cv?

三种情况:

1. 目标检测
YOLO、Faster R-CNN…这些常用模型。

2. 图像分割
语义分割、实例分割…这些常用操作。

3. 图像处理
Resize、Normalize、Crop…这些日常操作。

ops-cv 核心能力

1. 目标检测

最常用的能力。

from ops_cv import yolo_detect, rcnn_detect

# YOLO 检测
boxes, scores, labels = yolo_detect(
    image,           # 输入图像 (H, W, 3)
    conf_thres=0.5,  # 置信度阈值
    iou_thres=0.45,   # NMS IoU 阈值
    max_det=100        # 最大检测数
)

# R-CNN 检测
boxes, scores, labels = rcnn_detect(
    image,
    backbone='resnet50',
    proposal_count=2000
)

目标检测是计算机视觉的基础。几乎所有项目都要先检测。

你说气人不气人,同样的模型,换个实现能快 3 倍。

2. 图像分割

分割相关算子。

from ops_cv import semantic_segment, instance_segment, panoptic_segment

# 语义分割
mask = semantic_segment(
    image,          # 输入图像
    num_classes=80   # 类别数
)

# 实例分割
mask, label = instance_segment(
    image,
    num_classes=80
)

# 全景分割
panoptic = panoptic_segment(
    image,
    num_classes=80
)

语义分割输出每个像素的类别,实例分割区分同类的不同物体。

3. 图像预处理

最常用的操作。

from ops_cv import resize, crop, pad, flip, normalize, mean_std_normalize

# 缩放
resized = resize(image, size=(224, 224))

# 裁剪
cropped = crop(image, x=10, y=10, w=100, h=100)

# 填充
padded = pad(image, padding=10, mode='reflect')

# 翻转
flipped = flip(image, direction='horizontal')

# 归一化 [0, 1]
normalized = normalize(image)

# 均值方差归一化
normalized = mean_std_normalize(image, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225))

图像预处理是模型推理的第一步。别小看这些操作,做对了能提升精度。

4. 数据增强

训练必备。

from ops_cv import random_flip, random_crop, random_brightness, random_contrast, color_jitter

# 随机翻转
augmented = random_flip(image, prob=0.5)

# 随机裁剪
augmented = random_crop(image, size=(224, 224))

# 随机亮度
augmented = random_brightness(image, delta=0.2)

# 随机对比度
augmented = random_contrast(image, delta=0.2)

# 颜色抖动
augmented = color_jitter(image, brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1)

数据增强能显著提升模型泛化能力。训练时一定要用。

5. 特征提取

提取图像特征。

from ops_cv import hog, sift, orb, histogram

# HOG 特征
features = hog(
    image,
    orientations=9,
    pixels_per_cell=(8, 8),
    cells_per_block=(2, 2)
)

# SIFT 特征
keypoints, descriptors = sift(image)

# ORB 特征(更快)
keypoints, descriptors = orb(image, n_features=500)

# 直方图
hist = histogram(image, bins=256)

特征提取在传统方法里用得很多。现在深度学习���代,主要用来提取传统特征。

6. 形态学操作

图像形态学变换。

from ops_cv import erode, dilate, open, close, gradient

# 腐蚀
eroded = erode(image, kernel_size=3)

# 膨胀
dilated = dilate(image, kernel_size=3)

# 开运算(先腐蚀后膨胀)
opened = open(image, kernel_size=3)

# 闭运算(先膨胀后腐蚀)
closed = close(image, kernel_size=3)

# 梯度
grad = gradient(image, kernel_size=3)

形态学操作在去噪、边缘检测里用得多。

7. 边缘检测

边缘相关算子。

from ops_cv import sobel, canny, laplacian, prewitt

# Sobel 边缘
edges = sobel(image)

# Canny 边缘
edges = canny(image, low_thres=50, high_thres=150)

# Laplacian 边缘
edges = laplacian(image)

# Prewitt 边缘
edges = prewitt(image)

边缘检测是计算机视觉的基础操作。

8. 图像滤波

滤波相关算子。

from ops_cv import gaussian_blur, median_blur, bilateral_filter, box_filter

# 高斯滤波
blurred = gaussian_blur(image, kernel_size=5, sigma=1.5)

# 中值滤波
blurred = median_blur(image, kernel_size=5)

# 双边滤波(保边)
blurred = bilateral_filter(image, d=9, sigma_color=75, sigma_space=75)

# 盒式滤波
blurred = box_filter(image, kernel_size=3)

双边滤波最适合去噪同时保边缘。

9. 视频处理

视频相关算子。

from ops_cv import optical_flow, tracking, video_decode

# 光流
flow = optical_flow(frame1, frame2)

# 目标跟踪
tracker = tracking init(frame, bbox)
bbox = tracker.update(frame)

# 视频解码
frames = video_decode(video_path)

视频处理的核心是光流和跟踪。

性能数据

在昇腾 910 上实测:

操作 OpenCV (CPU) ops-cv (NPU) 提升
YOLO 检测 640x640 50ms 15ms 3.3x
Resize 1920x1080 8ms 2ms 4x
Mean Normalize 2ms 0.5ms 4x
Gaussian Blur 1080p 15ms 3ms 5x
Canny 边缘 25ms 5ms 5x
Semantic Seg 512x512 35ms 8ms 4.4x
Data Augment 10ms 2ms 5x

你说气人不气人,同样的操作,换个实现能快 5 倍。

怎么用?

方式一:直接调用

from ops_cv import yolo_detect, resize, normalize

# 图像检测流水线
def detect_objects(image_path):
    # 1. 加载
    image = load_image(image_path)
    
    # 2. 预处理
    image = resize(image, size=(640, 640))
    image = normalize(image)
    
    # 3. 检测
    boxes, scores, labels = yolo_detect(image)
    
    return boxes, scores, labels

最直接的方式。

方式二:PyTorch 风格

import torch
import torchvision.transforms as T

# ops-cv 作为 PyTorch 后端
transform = T.Compose([
    T.Resize((640, 640)),
    T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 底层自动用 ops-cv
image = transform(image).npu()

无感知调用。

方式三:预训练模型

from ops_cv import YOLOv5, FasterRCNN, MaskRCNN

# YOLOv5
model = YOLOv5.from_pretrained("yolov5s")
boxes, scores, labels = model.predict(image)

# Faster R-CNN
model = FasterRCNN.from_pretrained("faster_rcnn")
boxes, scores, labels = model.predict(image)

# Mask R-CNN
boxes, scores, labels, masks = model.predict(image)

直接用预训练模型,最简单。

ops-cv vs OpenCV

容易混淆的两个库:

特性 ops-cv OpenCV
硬件 昇腾 NPU CPU
性能 快 3-5 倍
API 昇腾风格 OpenCV 风格
模型 深度学习 传统方法

简单说:

  • ops-cv:昇腾 NPU + 深度学习
  • OpenCV:CPU + 传统方法

推理用 ops-cv,快速验���用 OpenCV。

总结

ops-cv 就是昇腾的计算机视觉算子库:

  • 检测:YOLO、Faster R-CNN
  • 分割:Semantic、Instance、Panoptic
  • 预处理:Resize、Normalize、Crop
  • 后端:NPU 加速
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐