ONNX 模型库
返回模型

说明文档

漫画气泡分割模型

<div align="center"> <img src="https://img.shields.io/badge/YOLO-v8m--seg-00FFFF?style=for-the-badge&logo=yolo&logoColor=white" alt="YOLOv8m-seg"/> <img src="https://img.shields.io/badge/License-MIT-green?style=for-the-badge" alt="MIT License"/> <img src="https://img.shields.io/badge/Dataset-5K%20Images-orange?style=for-the-badge" alt="5K Images"/> <img src="https://img.shields.io/badge/Image%20Size-640x640-blue?style=for-the-badge" alt="640x640"/> </div>

📋 模型描述

漫画气泡分割 是基于 YOLOv8m-seg 架构 的专用分割模型,训练用于检测和分割漫画中的对话气泡。该模型能够准确识别不同类型气泡中的文本区域,适用于以下应用:

  • 📚 漫画翻译 - 自动化漫画翻译流程
  • 🎨 内容编辑 - 编辑和清理气泡
  • 🔍 文本提取 - 从漫画中提取文本
  • 🤖 OCR 流水线 - 文字识别的预处理
  • 📖 数字漫画处理 - 处理数字漫画

🎯 主要特性

  • 精确分割漫画中的对话气泡
  • YOLOv8m-seg 架构 - 速度与精度的平衡
  • 640x640 分辨率 - 针对漫画页面优化
  • 5,000 张训练图像 - 多样化数据集
  • 100 个训练周期 - 模型已完全收敛
  • 预训练权重 - 即开即用
  • MIT 许可证 - 免费用于商业用途

📊 数据集信息

数据集: khanhromvn/manga_bubble_dataset

数据集划分 图像数量 比例
训练集 4,500 90.0%
验证集 350 7.0%
测试集 150 3.0%
总计 5,000 100%

数据集特点

  • 📖 5,000 张高质量漫画页面
  • 💬 文本气泡具有多样化的样式
  • 🎭 多种漫画类型 (少年漫画、少女漫画、青年漫画等)
  • 📝 气泡中的日语文本
  • 🎨 多种绘画风格

🏷️ 类别

模型检测以下气泡类型:

  • 对话气泡 - 普通对话气泡
  • 思考气泡 - 表示思考的气泡
  • 旁白框 - 叙述性文本框
  • 音效文字 - 音效效果(可能)

⚙️ 训练配置

参数
架构 YOLOv8m-seg
预训练
训练周期 100
图像大小 640x640
批次大小 自动 (-1)
工作线程 4
保存周期 每 10 个周期
设备 自动 (GPU/CPU)
优化器 AdamW

🚀 使用指南

安装

pip install ultralytics
pip install huggingface_hub
pip install opencv-python
pip install pillow

基础推理

from ultralytics import YOLO
from huggingface_hub import hf_hub_download

# 从 Hugging Face 下载模型
model_path = hf_hub_download(
    repo_id="khanhromvn/manga_bubble_seg",
    filename="best.pt"
)

# 加载模型
model = YOLO(model_path)

# 在漫画图像上运行推理
results = model("manga_page.jpg")

# 显示结果
results[0].show()

# 保存结果
results[0].save("output_segmented.jpg")

处理多页漫画

import os
from pathlib import Path

# 漫画文件夹路径
manga_folder = "manga_chapter_01"
output_folder = "segmented_output"

# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)

# 处理所有图像
image_files = list(Path(manga_folder).glob("*.jpg")) + \
              list(Path(manga_folder).glob("*.png"))

for img_path in image_files:
    results = model(str(img_path))
    output_path = os.path.join(output_folder, img_path.name)
    results[0].save(output_path)
    print(f"已处理: {img_path.name}")

提取气泡掩码

import numpy as np
import cv2

# 运行推理
results = model("manga_page.jpg")

# 获取掩码
masks = results[0].masks.data.cpu().numpy()  # 形状: (N, H, W)
boxes = results[0].boxes.data.cpu().numpy()  # 边界框
classes = results[0].boxes.cls.cpu().numpy()  # 类别 ID

# 处理每个气泡
for i, mask in enumerate(masks):
    # 将掩码调整为原始图像大小
    mask_resized = cv2.resize(mask, (original_width, original_height))
    
    # 创建二进制掩码
    mask_binary = (mask_resized > 0.5).astype(np.uint8) * 255
    
    # 保存掩码
    cv2.imwrite(f"bubble_mask_{i}.png", mask_binary)
    
    # 从原始图像裁剪气泡区域
    x1, y1, x2, y2 = boxes[i][:4].astype(int)
    bubble_crop = original_image[y1:y2, x1:x2]
    cv2.imwrite(f"bubble_crop_{i}.png", bubble_crop)

高级推理参数

# 自定义推理参数
results = model.predict(
    source="manga_page.jpg",
    conf=0.25,        # 置信度阈值 (降低以检测更多)
    iou=0.7,          # NMS 的 IoU 阈值
    imgsz=640,        # 输入图像大小
    device="cuda:0",  # 使用 GPU
    save=True,        # 自动保存结果
    show_labels=True, # 显示类别标签
    show_conf=True,   # 显示置信度分数
    augment=False,    # 测试时增强
    agnostic_nms=False # 类别无关的 NMS
)

📈 评估结果

主要指标

指标
mAP50 待定
mAP50-95 待定
精确率 待定
召回率 待定
推理时间 (GPU) ~15ms/图像
推理时间 (CPU) ~80ms/图像

注意: 详细指标将在测试集上完成完整评估后更新。

模型能力

  • ✅ 在黑白漫画中准确检测气泡
  • ✅ 能够处理多种不同的绘画风格
  • ✅ 在密集文本气泡中表现良好
  • ✅ 精确分割气泡边界
  • ✅ 实时推理

🎓 模型训练

从头开始训练

from ultralytics import YOLO

# 加载预训练的 YOLOv8m-seg
model = YOLO("yolov8m-seg.pt")

# 在漫画数据集上训练
results = model.train(
    data="manga_bubble.yaml",
    epochs=100,
    imgsz=640,
    batch=-1,        # 自动批次大小
    workers=4,       # 工作线程数
    save_period=10,  # 每 10 个周期保存检查点
    device="auto",   # 自动检测 GPU/CPU
    project="manga_training",
    name="bubble_seg_v1"
)

微调模型

# 加载此模型进行微调
model = YOLO("khanhromvn/manga_bubble_seg")

# 在自己的数据集上微调
results = model.train(
    data="your_manga_dataset.yaml",
    epochs=50,
    imgsz=640,
    batch=-1,
    workers=4
)

数据集配置 (manga_bubble.yaml)

# 数据集路径
path: ./manga_dataset
train: images/train
val: images/val
test: images/test

# 类别
names:
  0: speech_bubble
  1: thought_bubble
  2: narration_box
  3: sound_effect

📁 模型文件结构

manga_bubble_seg/
├── best.pt              # 最佳权重
├── last.pt              # 最后一个周期的权重
├── weights/             # 检查点 (周期 10, 20, 30...)
│   ├── epoch10.pt
│   ├── epoch20.pt
│   └── ...
├── config.yaml          # 训练配置
└── README.md            # 本文件

🔧 系统要求

ultralytics>=8.0.0
torch>=2.0.0
torchvision>=0.15.0
opencv-python>=4.8.0
numpy>=1.23.0
Pillow>=9.5.0
huggingface_hub>=0.16.0

💡 使用案例

1. 自动漫画翻译流水线

from ultralytics import YOLO
import easyocr

# 加载模型
bubble_model = YOLO("khanhromvn/manga_bubble_seg")
reader = easyocr.Reader(['ja', 'en'])

def process_manga_page(image_path):
    # 1. 检测气泡
    results = bubble_model(image_path)
    
    # 2. 从每个气泡中提取文本
    for i, mask in enumerate(results[0].masks.data):
        bubble_region = extract_bubble(mask)
        
        # 3. OCR
        text = reader.readtext(bubble_region)
        
        # 4. 翻译文本 (使用翻译 API)
        translated = translate(text, target='vi')
        
        # 5. 在气泡上绘制翻译后的文本
        draw_text_on_bubble(bubble_region, translated)
    
    return processed_image

2. 清理气泡 (文本移除)

import cv2
import numpy as np

def clean_bubble(image, model):
    results = model(image)
    
    for mask in results[0].masks.data:
        # 创建二进制掩码
        mask_np = mask.cpu().numpy()
        
        # 使用修复技术删除文本
        cleaned = cv2.inpaint(
            image, 
            mask_np.astype(np.uint8), 
            inpaintRadius=3,
            flags=cv2.INPAINT_TELEA
        )
    
    return cleaned

3. 为 OCR 训练提取文本区域

def extract_text_regions(manga_folder, output_folder):
    model = YOLO("khanhromvn/manga_bubble_seg")
    
    for img_path in Path(manga_folder).glob("*.jpg"):
        results = model(str(img_path))
        image = cv2.imread(str(img_path))
        
        for i, box in enumerate(results[0].boxes.data):
            x1, y1, x2, y2 = box[:4].int().tolist()
            
            # 裁剪气泡区域
            bubble = image[y1:y2, x1:x2]
            
            # 保存用于 OCR 训练
            output_path = f"{output_folder}/{img_path.stem}_bubble_{i}.jpg"
            cv2.imwrite(output_path, bubble)

📝 引用

如果您在研究或项目中使用此模型,请引用:

@misc{manga-bubble-seg,
  author = {khanhromvn},
  title = {Manga Bubble Segmentation Model},
  year = {2024},
  publisher = {Hugging Face},
  howpublished = {\url{https://huggingface.co/khanhromvn/manga_bubble_seg}},
}

🤝 贡献

非常欢迎任何贡献! 如果您发现错误或有建议:

  1. 在仓库中开启 issue
  2. 提交改进的 pull request
  3. 分享您的结果和使用案例

📧 联系方式

📜 许可证

此模型以 MIT 许可证发布。详见 LICENSE 文件。

您有权:

  • ✅ 商业使用
  • ✅ 修改
  • ✅ 分发
  • ✅ 私人使用

🙏 致谢

  • Ultralytics 提供优秀的 YOLOv8 框架
  • Hugging Face 提供模型托管平台
  • 漫画社区 的支持和反馈
  • 数据集贡献者 的数据准备工作

🔍 限制与注意事项

  • 模型在黑白漫画上表现最佳(非彩色)
  • 线条复杂的漫画中精度可能下降
  • 大型装饰性音效可能无法准确检测
  • 多个重叠的气泡可能给分割带来困难

🎯 路线图

  • [ ] 支持彩色漫画
  • [ ] 更详细的分类(更多气泡类型)
  • [ ] 将数据集规模增加到 10K+
  • [ ] 针对移动端部署进行优化
  • [ ] 提供 Web 演示以进行直接推理

<div align="center"> <strong>⭐ 如果此模型对您有帮助,请给一个 star! ⭐</strong> </div>

khanhromvn/manga_bubble_seg

作者 khanhromvn

image-segmentation ultralytics
↓ 0 ♥ 1

创建时间: 2025-11-07 12:54:37+00:00

更新时间: 2025-11-13 09:09:07+00:00

在 Hugging Face 上查看

文件 (4)

.gitattributes
README.md
config.yaml
manga_bubble_seg.onnx ONNX