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

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

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 检测 640x64050ms15ms3.3x
Resize 1920x10808ms2ms4x
Mean Normalize2ms0.5ms4x
Gaussian Blur 1080p15ms3ms5x
Canny 边缘25ms5ms5x
Semantic Seg 512x51235ms8ms4.4x
Data Augment10ms2ms5x

你说气人不气人,同样的操作,换个实现能快 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-cvOpenCV
硬件昇腾 NPUCPU
性能快 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开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐