Skip to main content

OpenCV 轻量扩展(Unicode 路径/HALCON 缩放/形状匹配),可选 UNet 分割训练与推理

Project description

ydl2

ydl2 是对 OpenCV 的轻量补充:解决 Windows 中文路径 读写问题,提供与 HALCON 语义一致的灰度缩放算子,以及基于 HALCON 的形状模板匹配封装。

安装

# 核心(轻量,仅 numpy + opencv):中文路径、HALCON 缩放、形状匹配
pip install ydl2

# 额外解锁 UNet 分割训练与推理(会安装 torch 等)
pip install "ydl2[cnn]"

# 再额外需要 ONNX 导出/推理时
pip install "ydl2[cnn,cnn-onnx]"
# GPU 加速 ORT 推理
pip install onnxruntime-gpu

pip install ydl2 只有 HALCON / OpenCV 相关功能;只有 pip install ydl2[cnn] 之后, ydl2.cnn(UNet 分割训练/推理)才可用。

快速使用

Unicode 路径 & 灰度缩放

import ydl2

# Unicode 路径读写(Windows 中文路径)
img = ydl2.imread(r"D:\图片\测试.png")
ydl2.imwrite(r"D:\图片\输出.png", img)

# HALCON 等价算子
stretched = ydl2.scale_image_max(img)
inverted  = ydl2.scale_image(img, -1.0, 255.0)
mapped    = ydl2.scale_image_range(img, 100, 200)

形状模板匹配

import ydl2, cv2

model  = ydl2.read_shape_model(r"model.yyds")
mat    = cv2.imread(r"image.jpg")
b, g, r = cv2.split(mat)
handle = ydl2.any_to_tiyoo(r, g, b)

results = ydl2.find_shape_model(handle, model)
for res in results:
    print(res['row'], res['col'], res['score'])

# 后续帧原地更新(零内存分配)
handle = ydl2.any_to_tiyoo(r, g, b, handle=handle)

ydl2.clear_image(handle)
ydl2.clear_shape_model(model)

API

函数 说明
imread / imwrite / imshow 支持中文路径的读写与显示
scale_image_max 每通道 min/max 拉伸到 0–255
scale_image g' = g * Mult + Add
scale_image_range 区间线性映射
any_to_tiyoo numpy 数组 → Halcon 图像句柄(创建或原地更新)
tiyoo_to_any Halcon 图像句柄 → numpy 数组
read_image / write_image / clear_image Halcon 图像文件读写与释放
read_shape_model / clear_shape_model 加载 / 释放 Halcon 模板文件
find_shape_model 形状模板匹配,返回 [{'row', 'col', 'angle', 'score'}]

分割(CNN):UNet 训练与推理

ydl2.cnn 提供 YOLO 风格的极简分割接口(基于 PyTorch + segmentation-models-pytorch 的 UNet)。 需先安装 pip install ydl2[cnn];未安装时导入会给出中文安装提示,不影响核心包。

训练

from ydl2.cnn import Seg

# 用配置文件训练
Seg("cfg.yaml").train()

# 指定输出目录 / 断点续训
Seg("cfg.yaml").train(work_dir="runs/exp1")
Seg("cfg.yaml").train(resume="runs/exp1/checkpoints/last.pth")

配置文件示例见下方「训练配置」章节。训练已内置深度优化: AMP(bf16/fp16 自动选择)、channels_last、梯度累积、LR 线性预热、 权重 EMA、CUDA 流预取、GPU 端流式验证指标等,通过 runner / hooks 字段开关。

推理(PyTorch 后端)

from ydl2.cnn import Seg

m = Seg("best.pth", config="cfg.yaml", device="cuda")
m.warmup()                                           # 预热,消除首图冷启动

mask = m.predict("a.png")                            # 返回 mask[H,W] int64
vis, mask = m.predict("a.png", visualize=True)       # 叠加可视化 + mask
results = m.predict_batch(["a.png", "b.png"])        # 批量推理,返回 [(mask, RGB), ...]

m.release()                                          # 释放显存;也支持 with Seg(...) as m:

推理已启用 channels_last、inference_mode、autocast(bf16/fp16)、GPU 端最近邻还原尺寸等优化。

可选:torch.compile 长推理加速

# 需要 triton(Windows: pip install triton-windows)
# 适合固定尺寸、进程常驻、长时间连续推理;首次前向触发编译(~30 s),建议配合 warmup
m = Seg("best.pth", config="cfg.yaml", compile=True)
m.warmup()   # warmup 同时触发编译,之后推理即为稳态

ONNX 导出 & ORT 推理

# 需先安装:pip install "ydl2[cnn,cnn-onnx]"
# GPU 加速:pip install onnxruntime-gpu

# 1. 从 pth 导出 ONNX(嵌入 mean/std/类别名/输入尺寸等 meta)
Seg("best.pth", config="cfg.yaml").export("onnx", "model.onnx")
Seg("best.pth", config="cfg.yaml").export("onnx", "model.onnx", dynamic=True)  # 动态 batch

# 2. 加载 .onnx 走 ORT 推理(接口与 pth 完全一致)
m = Seg("model.onnx", config="cfg.yaml")   # 自动选 CUDA EP;无 GPU 则 CPU
m.warmup()
mask = m.predict("a.png")
vis, mask = m.predict("a.png", visualize=True)
m.release()

预热 / 保温 / 释放

针对「进程常驻但久未推理后,第一张图明显变慢(GPU 空闲自动降频)」的工业场景:

# batch_size 应与线上推理保持一致,让 cudnn autotune / compile 图命中同一缓存
m.warmup(n=3, batch_size=1)   # 单图推理
m.warmup(n=3, batch_size=4)   # predict_batch(4 张) 时用 batch_size=4

# 保温:低功耗脉冲(默认)
m.keep_warm(True, mode="pulse", interval=30, batch_size=1)
# 保温:锁频(首图最快、功耗较高,需要管理员权限锁 GPU 时钟)
m.keep_warm(True, mode="lock")
m.keep_warm(False)            # 关闭保温

m.release()                   # 停止保温线程并释放资源

保温设计要点:

  • 保温线程与推理共享同一把锁,脉冲用「非阻塞拿锁」,真实推理在跑时直接跳过本次脉冲,绝不阻塞业务;
  • 刚推理过的活跃期内不脉冲,省电;
  • pulse:每 interval 秒一次极短前向,增量功耗小;locknvidia-smi 锁时钟,首图最快,功耗高,锁频失败自动回退高频脉冲。

训练配置示例

work_dir: runs/bubble_seg

runner:
  max_epochs: 50
  device: cuda
  channels_last: true
  accumulate: 1         # 显存不足时调大
  compile: false        # Windows 需先 pip install triton-windows

model:
  type: Segmentor
  backbone:
    type: SMPUnetBackbone
    encoder_name: resnet34
    encoder_weights: imagenet
    in_channels: 3
    num_classes: 2      # 背景 + 1 类前景
  head:
    type: SegIdentityHead
  loss:
    type: CombinedLoss
    losses:
      - type: CrossEntropyLoss
        ignore_index: 255
      - type: DiceLoss
        ignore_index: 255
        exclude_background: true

optimizer:
  type: AdamW
  lr: 0.0005
  weight_decay: 0.0001

lr_scheduler:
  type: CosineAnnealingLR
  T_max: 50

data:
  samples_per_gpu: 8
  workers_per_gpu: 0
  auto_class_weights: true       # 自动按像素频率算 CE 权重,应对类别不均衡
  background_class_index: 0
  background_max_weight: 0.1
  train:
    type: SegFolderDataset
    image_dir: data/images
    mask_dir: data/masks
    num_classes: 2
    pipeline:
      - type: SegResize
        size: 512
      - type: SegRandomHorizontalFlip
        p: 0.5
      - type: SegToTensor
      - type: SegNormalize
        mean: [0.485, 0.456, 0.406]
        std:  [0.229, 0.224, 0.225]
  val:
    type: SegFolderDataset
    image_dir: data/val_images
    mask_dir: data/val_masks
    num_classes: 2
    pipeline:
      - type: SegResize
        size: 512
      - type: SegToTensor
      - type: SegNormalize
        mean: [0.485, 0.456, 0.406]
        std:  [0.229, 0.224, 0.225]

hooks:
  - type: LoggerHook
    interval: 10
    tensorboard: false
    progress_bar: true
  - type: AMPHook
  - type: LrSchedulerHook
    by_epoch: true
    warmup_iters: 20
    warmup_ratio: 0.1
  - type: EMAHook
    decay: 0.9999
    tau: 100
  - type: EvalHook
    interval: 1
  - type: CheckpointHook
    interval: 1
    best_metric: mIoU
    rule: max
    save_optimizer: false
    max_keep: 3

掩码格式:PNG 文件,像素值 = 类别索引(0 背景、1/2/… 前景),不支持 RGB 调色板掩码(请提前转为灰度索引图)。

依赖

  • Python >= 3.10
  • numpy >= 1.21
  • opencv-python >= 4.6
  • 分割功能(可选 [cnn]):torch >= 2.0、torchvision、segmentation-models-pytorch、pyyaml、addict、tqdm、pillow
  • ONNX(可选 [cnn-onnx]):onnx、onnxruntime

链接

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ydl2-0.3.0.tar.gz (96.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ydl2-0.3.0-py3-none-any.whl (124.3 kB view details)

Uploaded Python 3

File details

Details for the file ydl2-0.3.0.tar.gz.

File metadata

  • Download URL: ydl2-0.3.0.tar.gz
  • Upload date:
  • Size: 96.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.13

File hashes

Hashes for ydl2-0.3.0.tar.gz
Algorithm Hash digest
SHA256 fa5f8ae5cd96d1447a0195be621e8e104216838a7bbceddcba35a85f660c0cfc
MD5 4cbd06efe832b58d76ef603dbe354ecb
BLAKE2b-256 039669915a5325bb9463e3840a1ed1ce696e6b27f1112445e2ab6bd8d8c14bde

See more details on using hashes here.

File details

Details for the file ydl2-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: ydl2-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 124.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.13

File hashes

Hashes for ydl2-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 419a76550fbf068775e4dbd2fe2d7080033b90c313d45d2e2461e61e2f853f87
MD5 b80db7357813c2cf0d2c735b8202e404
BLAKE2b-256 b227d4446e16545142df6c274c1618359c81f12ff0601747d73f730a80507769

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page