SUPER COLORIZER数据管道构建:使用爬虫与清洗工具自动化构建训练数据集

SUPER COLORIZER数据管道构建:使用爬虫与清洗工具自动化构建训练数据集 SUPER COLORIZER数据管道构建使用爬虫与清洗工具自动化构建训练数据集最近在做一个图像上色的项目发现最大的瓶颈不是模型本身而是数据。网上能找到的现成数据集要么质量参差不齐要么风格不统一要么就是数量太少。手动收集和整理那简直是噩梦效率低不说还容易出错。后来我们摸索出了一套方法用爬虫自动抓取图片再用一些工具进行清洗和配对最终构建了一个高质量、风格统一的训练数据集。整个过程自动化程度很高效果也不错今天就来分享一下我们的具体做法。1. 为什么需要自动化数据管道做图像上色模型尤其是像SUPER COLORIZER这种希望效果惊艳的模型对数据的要求非常高。你需要大量的“线稿-彩色图”配对数据。线稿要清晰、干净彩色图要色彩丰富、质量高而且两者在内容上必须严格对应。如果靠手工你会面临几个头疼的问题。首先是来源分散漫画、插画、设计稿散落在各个网站。其次是格式混乱有的带水印有的分辨率极低有的根本不是线稿。最后是配对困难找到一张彩色图还得手动去画或者找它的线稿版本工作量巨大。我们构建自动化管道核心目标就三个省时、保质、可重复。用程序代替人工去完成重复的收集和清洗工作确保每一批入库的数据都符合统一标准并且这套流程下次换个主题还能直接用。2. 第一步用爬虫定向获取原始图像数据管道的源头是爬虫。我们的策略不是漫无目的地全网抓取而是针对性地选择几个高质量、风格符合我们需求的平台。2.1 选择合适的源网站我们主要瞄准了几类网站艺术分享平台比如Pixiv、DeviantArt上面有大量高质量的动漫、插画作品很多作者会同时发布线稿和成稿。设计资源站一些专门提供UI套件、游戏素材的网站里面的图标、角色设计往往有分层文件容易分离出线稿。特定主题社区比如专注于水墨风、赛博朋克风格的论坛或画廊方便我们构建垂直领域的数据集。选择时有个小技巧优先选择那些能通过API接口或者结构规整的网站这样爬虫写起来稳定也不容易给人家服务器造成负担。2.2 编写稳健的爬虫脚本爬虫的核心任务是下载图片并且尽可能多地保存元信息。我们用的是Pythonrequests和BeautifulSoup组合就够用了遇到复杂点的用Selenium模拟浏览器。import requests from bs4 import BeautifulSoup import os import time def crawl_images_from_gallery(base_url, save_dir): 从一个图库列表页爬取图片 headers {User-Agent: 你的浏览器User-Agent} try: response requests.get(base_url, headersheaders, timeout10) response.raise_for_status() soup BeautifulSoup(response.content, html.parser) # 假设图片链接在特定的class的img标签里 img_tags soup.find_all(img, class_artwork-image) for i, img_tag in enumerate(img_tags): img_url img_tag.get(src) if not img_url.startswith(http): img_url https: img_url # 补全URL # 下载图片 img_data requests.get(img_url, headersheaders).content file_name fraw_{int(time.time())}_{i}.jpg file_path os.path.join(save_dir, file_name) with open(file_path, wb) as f: f.write(img_data) print(f已下载: {file_name}) time.sleep(1) # 礼貌性延迟避免请求过快 except Exception as e: print(f爬取过程中出错: {e}) # 使用示例 save_directory ./raw_images os.makedirs(save_directory, exist_okTrue) crawl_images_from_gallery(https://example-art-site.com/gallery, save_directory)这个脚本很简单但要点都包含了设置请求头模拟浏览器、解析页面结构、补全图片URL、保存文件以及加入延迟。在实际操作中你还需要处理分页、登录如果需要以及各种反爬机制。3. 第二步核心清洗与线稿提取下载下来的是一堆“毛坯”图片接下来就是精装修环节。这是整个管道最核心的部分直接决定数据质量。3.1 使用OpenCV进行线稿提取我们的目标是从彩色图中自动提取出清晰干净的线稿。这里用OpenCV的传统图像处理方法就非常有效速度快效果也稳定。基本思路是先将彩色图转灰度然后用高斯模糊消除细小噪声接着通过边缘检测算法如Canny找出轮廓最后进行二值化反转得到白底黑线的线稿。import cv2 import numpy as np import os def extract_lineart(color_img_path, output_path): 从彩色图像中提取线稿 # 读取彩色图像 img cv2.imread(color_img_path) if img is None: print(f无法读取图像: {color_img_path}) return False # 1. 转换为灰度图 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 2. 使用高斯模糊减少噪声 blurred cv2.GaussianBlur(gray, (5, 5), 0) # 3. 使用自适应阈值或Canny进行边缘检测 # 方法A: 自适应阈值对光照不均的图片效果好 # lineart cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 方法B: Canny边缘检测 二值化线条更连贯 edges cv2.Canny(blurred, 50, 150) _, lineart cv2.threshold(edges, 50, 255, cv2.THRESH_BINARY_INV) # 4. 可选形态学操作去除细小噪点或连接断线 kernel np.ones((2,2), np.uint8) lineart cv2.morphologyEx(lineart, cv2.MORPH_CLOSE, kernel) # 保存线稿 cv2.imwrite(output_path, lineart) print(f线稿已保存至: {output_path}) return True # 批量处理示例 raw_image_dir ./raw_images lineart_dir ./linearts os.makedirs(lineart_dir, exist_okTrue) for img_file in os.listdir(raw_image_dir): if img_file.endswith((.png, .jpg, .jpeg)): color_path os.path.join(raw_image_dir, img_file) lineart_path os.path.join(lineart_dir, fline_{img_file}) extract_lineart(color_path, lineart_path)你可以根据你的图片风格调整参数比如模糊的核大小、Canny的阈值、是否用形态学操作等。有时候针对特定风格比如水墨风可能需要更复杂的流程。3.2 自动化图像配对提取出线稿后需要和原彩色图配对。因为我们是从同一张图提取的所以配对信息可以记录在文件名或一个单独的JSON文件里。例如color_001.jpg对应line_color_001.jpg。更复杂的情况是你从不同地方分别爬取了线稿图和彩色图。这时就需要通过特征匹配如SIFT、ORB或基于哈希的图像相似度计算来配对。我们当时用了一个简单但有效的方法计算感知哈希pHash如果两张图的哈希值非常接近就认为是配对图。from PIL import Image import imagehash def pair_images_by_phash(color_dir, lineart_dir, threshold5): 通过感知哈希为彩色图和线稿图配对 pairs [] # 计算所有彩色图的哈希 color_hashes {} for c_file in os.listdir(color_dir): if c_file.endswith((.png, .jpg, .jpeg)): path os.path.join(color_dir, c_file) try: with Image.open(path) as img: hash_val imagehash.phash(img) color_hashes[c_file] hash_val except Exception as e: print(f处理{path}时出错: {e}) # 遍历线稿图寻找最匹配的彩色图 for l_file in os.listdir(lineart_dir): if l_file.endswith((.png, .jpg, .jpeg)): l_path os.path.join(lineart_dir, l_file) try: with Image.open(l_path) as img: l_hash imagehash.phash(img) # 找到哈希距离最小的彩色图 best_match None min_distance float(inf) for c_file, c_hash in color_hashes.items(): distance l_hash - c_hash if distance min_distance: min_distance distance best_match c_file # 如果距离小于阈值则认为配对成功 if best_match and min_distance threshold: pairs.append((best_match, l_file, min_distance)) print(f配对成功: {best_match} - {l_file} (距离: {min_distance})) else: print(f未找到匹配项: {l_file}) except Exception as e: print(f处理{l_path}时出错: {e}) return pairs4. 第三步质量筛选与噪声过滤不是所有自动处理出来的数据都是好的。我们需要设置一些过滤器把低质量的配对剔除出去。4.1 基于规则的质量过滤我们制定了几条简单的规则用OpenCV和PIL就能快速检查分辨率过滤剔除长或宽小于512像素的图片。上色模型需要一定的细节。线稿纯度检查计算线稿图中非纯白/纯黑的像素比例。如果线稿太“脏”灰色像素过多可能提取效果不好。色彩丰富度检查对彩色图计算颜色直方图的方差。方差过小可能图片本身就是灰度图或色彩单一训练价值低。文件大小过滤剔除那些被过度压缩、文件大小异常小的图片。def filter_by_quality(color_path, lineart_path, min_size512, max_lineart_noise0.05): 根据规则过滤低质量图像对 # 检查分辨率 with Image.open(color_path) as img: width, height img.size if width min_size or height min_size: return False, 分辨率过低 # 检查线稿噪声非纯黑/纯白像素占比 lineart_img cv2.imread(lineart_path, cv2.IMREAD_GRAYSCALE) if lineart_img is None: return False, 无法读取线稿 # 将图像二值化非0即255 _, binary cv2.threshold(lineart_img, 127, 255, cv2.THRESH_BINARY) # 计算非纯黑(0)非纯白(255)的像素比例 noise_pixels np.sum((binary 0) (binary 255)) total_pixels binary.size noise_ratio noise_pixels / total_pixels if noise_ratio max_lineart_noise: return False, f线稿噪声过高: {noise_ratio:.3f} return True, 通过4.2 人工审核与快速标注自动化过滤能解决大部分问题但有些“感觉”上的问题比如线稿美感、色彩搭配是否协调还是需要人眼把关。我们开发了一个简单的Web界面把待审核的图片对彩色图、线稿并排显示审核者只需要按“通过”或“拒绝”键结果会自动记录到数据库。这样一小时能审核成百上千张图效率比一张张手动处理高太多了。5. 第四步构建可复用的数据处理管道把上面所有步骤串起来就形成了一条完整的管道。我们使用Makefile或简单的Python脚本调度整个流程确保每一步的输出都是下一步的输入并且中间结果都可以缓存和复查。一个简化的管道流程是这样的爬取阶段运行爬虫脚本将原始图片存入./data/raw/。提取阶段运行线稿提取脚本读取./data/raw/输出线稿到./data/linearts/并生成一个初步的配对清单pairs_preliminary.json。清洗阶段运行质量过滤脚本读取配对清单和图片将合格的对移动到./data/cleaned/并更新最终配对清单pairs_final.json被拒绝的图片移到./data/rejected/并记录原因。审核阶段启动审核工具从./data/cleaned/加载图片供人工审核审核结果更新到数据库。打包阶段将最终通过审核的图片对打包成模型训练直接可用的格式如TFRecord或简单的文件夹结构。这样做的好处是任何一步出了问题都可以从那里重新开始而不用从头再来。而且如果你想换一个绘画风格的数据集只需要调整爬虫的源网站和清洗阶段的某些参数整个管道依然适用。6. 总结走完这一整套流程我们最终得到了一个数量可观、质量可控的图像上色训练数据集。回过头看最大的收获不是数据本身而是这套方法。它把我们从繁琐重复的劳动中解放了出来让我们能把精力更多集中在模型调优和效果评估上。实际跑下来自动化清洗能过滤掉大约30%-40%的不合格数据再经过一轮快速人工审核最终数据集的质量就非常高了。这套管道的代码和思路稍加修改也可以用在其他需要图像配对的任务上比如风格迁移、图像修复等。如果你也在为数据发愁不妨试试搭建自己的自动化管道。一开始可能会花点时间但一旦跑通后续的迭代和扩展就会非常顺畅。从一堆杂乱无章的图片到规整干净的高质量数据集这个转变的过程本身就很有成就感。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。