说明文档
漫画气泡分割模型
<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}},
}
🤝 贡献
非常欢迎任何贡献! 如果您发现错误或有建议:
- 在仓库中开启 issue
- 提交改进的 pull request
- 分享您的结果和使用案例
📧 联系方式
- 作者: khanhromvn
- 数据集: khanhromvn/manga_bubble_dataset
- 模型: khanhromvn/manga_bubble_seg
📜 许可证
此模型以 MIT 许可证发布。详见 LICENSE 文件。
您有权:
- ✅ 商业使用
- ✅ 修改
- ✅ 分发
- ✅ 私人使用
🙏 致谢
- Ultralytics 提供优秀的 YOLOv8 框架
- Hugging Face 提供模型托管平台
- 漫画社区 的支持和反馈
- 数据集贡献者 的数据准备工作
🔍 限制与注意事项
- 模型在黑白漫画上表现最佳(非彩色)
- 在线条复杂的漫画中精度可能下降
- 大型装饰性音效可能无法准确检测
- 多个重叠的气泡可能给分割带来困难
🎯 路线图
- [ ] 支持彩色漫画
- [ ] 更详细的分类(更多气泡类型)
- [ ] 将数据集规模增加到 10K+
- [ ] 针对移动端部署进行优化
- [ ] 提供 Web 演示以进行直接推理
<div align="center"> <strong>⭐ 如果此模型对您有帮助,请给一个 star! ⭐</strong> </div>
khanhromvn/manga_bubble_seg
作者 khanhromvn
创建时间: 2025-11-07 12:54:37+00:00
更新时间: 2025-11-13 09:09:07+00:00
在 Hugging Face 上查看