云容笔谈·东方红颜影像生成系统Python爬虫实战:自动化采集素材与数据清洗
云容笔谈·东方红颜影像生成系统Python爬虫实战:自动化采集素材与数据清洗
最近在捣鼓一个挺有意思的项目,叫“云容笔谈·东方红颜影像生成系统”。简单说,这是一个能生成东方美学风格人像的AI工具。但玩过这类工具的朋友都知道,效果好不好,很大程度上取决于你喂给它的“素材”质量如何。为了生成一张有神韵的古典美人图,你可能需要收集成百上千张高质量的参考图——这活儿,手动干起来简直能让人崩溃。
我就在想,能不能让这个过程自动化一点?比如,让程序自动去网上帮我找图、下载、整理,最后直接导入系统里用。这不就是Python爬虫的拿手好戏吗?今天,我就来聊聊怎么把这两者结合起来,打造一个专为“东方红颜”系统服务的自动化素材流水线。
1. 为什么需要自动化素材采集?
在做这个项目之前,我的素材收集流程是这样的:打开几个常去的图库网站,输入“汉服”、“古风”、“工笔画”之类的关键词,然后一张张点开大图,右键另存为,再手动重命名,最后还得筛选掉那些不相关或者质量差的图片。一套流程下来,半天时间就没了,效率低得令人发指。
更头疼的是数据清洗。下载下来的图片,文件名乱七八糟,有的带水印,有的分辨率太低,还有的根本不是东方美学风格,只是混在搜索结果里的现代写真。这些“脏数据”如果直接扔给生成系统,不仅训练效果差,还可能带偏模型。
所以,自动化采集和清洗的核心目标就两个:一是把我从重复的体力劳动里解放出来;二是确保喂给AI的“粮食”是干净、优质、对路的。用上Python爬虫之后,整个过程就变成了:写好规则,一键运行,泡杯茶的功夫,几百张筛选好的高清素材就已经躺在指定文件夹里,按规则命名好了,随时可以导入系统使用。
2. 构建定向爬虫:精准捕获东方美学素材
爬虫不是漫无目的地瞎抓,我们的目标是东方美学图像,所以必须“定向”。这里的关键在于,选择合适的源网站和制定精准的抓取规则。
2.1 选择合适的图片源
不是所有网站都适合爬。我优先选择那些图片质量高、分类清晰、且对爬虫相对友好的平台。比如一些专业的摄影社区、壁纸网站、或者设计素材库。这些地方的作品往往经过审核,质量有保障,并且标签系统比较完善,方便我们通过关键词定位。
在代码里,我们会从一个起始页面(通常是某个关键词的搜索结果页或特定分类页)开始。
import requests from bs4 import BeautifulSoup import time import os # 基础配置 BASE_URL = "https://example-gallery.com/search" # 替换为目标网站实际地址 KEYWORD = "汉服 人像" # 搜索关键词 SAVE_DIR = "./dongfang_meixue_images" HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } # 创建保存目录 os.makedirs(SAVE_DIR, exist_ok=True) def get_search_page(page=1): """获取搜索列表页""" params = {'q': KEYWORD, 'page': page} try: resp = requests.get(BASE_URL, params=params, headers=HEADERS, timeout=10) resp.raise_for_status() return resp.text except requests.RequestException as e: print(f"获取第{page}页失败: {e}") return None2.2 解析并提取图片详情页链接
列表页通常只包含缩略图和链接。我们需要解析出每个图片作品的详情页地址,因为高清大图一般都在详情页里。
def parse_list_page(html_content): """从列表页解析出详情页链接""" if not html_content: return [] soup = BeautifulSoup(html_content, 'html.parser') detail_links = [] # 这里需要根据目标网站的实际HTML结构来调整选择器 # 例如,可能所有作品链接都在 class='work-item' 的a标签里 for item in soup.select('a.work-item'): link = item.get('href') if link and link.startswith('/'): # 拼接成完整URL full_url = f"https://example-gallery.com{link}" detail_links.append(full_url) elif link and link.startswith('http'): detail_links.append(link) print(f"解析到 {len(detail_links)} 个详情页链接") return detail_links2.3 从详情页下载高清图片
进入详情页后,目标是找到分辨率最高的那个图片文件地址。有些网站会直接提供,有些则需要一点技巧。
def download_image_from_detail(detail_url): """从详情页下载图片""" try: detail_resp = requests.get(detail_url, headers=HEADERS, timeout=10) detail_resp.raise_for_status() except requests.RequestException as e: print(f"访问详情页 {detail_url} 失败: {e}") return detail_soup = BeautifulSoup(detail_resp.text, 'html.parser') # 策略1: 查找明确的高清图链接(如img标签的data-src、data-original等属性) img_elem = detail_soup.find('img', {'class': 'high-res'}) # 根据网站实际调整 if not img_elem: # 策略2: 查找页面中最大的图片(通常是主图) all_imgs = detail_soup.find_all('img') if not all_imgs: return # 简单通过尺寸关键词过滤,实际可能需要更复杂的逻辑 potential_imgs = [img for img in all_imgs if 'main' in img.get('class', []) or 'large' in img.get('src', '')] img_elem = potential_imgs[0] if potential_imgs else all_imgs[0] img_src = img_elem.get('data-src') or img_elem.get('data-original') or img_elem.get('src') if not img_src: print(f"在 {detail_url} 中未找到图片地址") return # 处理可能的相对路径 if img_src.startswith('//'): img_url = 'https:' + img_src elif img_src.startswith('/'): img_url = 'https://example-gallery.com' + img_src else: img_url = img_src # 下载图片 try: img_data = requests.get(img_url, headers=HEADERS, timeout=15).content # 生成文件名:使用详情页标题或ID,避免重复 file_name = os.path.basename(img_url).split('?')[0] # 去掉URL参数 if not file_name.lower().endswith(('.jpg', '.jpeg', '.png', '.webp')): file_name += '.jpg' # 默认补全扩展名 save_path = os.path.join(SAVE_DIR, file_name) with open(save_path, 'wb') as f: f.write(img_data) print(f"图片已保存: {save_path}") time.sleep(1) # 礼貌性延迟,避免给服务器造成压力 except Exception as e: print(f"下载图片失败 {img_url}: {e}")通过这几步,一个基础的定向爬虫骨架就搭好了。运行它,就能开始批量抓取特定主题的图片。但这只是第一步,抓下来的图片还是“毛坯”,接下来才是让素材真正能用的关键——智能清洗。
3. 智能过滤与数据清洗:从“毛坯”到“精装”
下载下来的图片堆里,什么都有。我们的任务是自动把那些不符合“东方红颜”要求的图片踢出去,并把剩下的整理好。
3.1 基于规则的初步过滤
首先,我们可以用一些简单的规则进行快速筛选。
import shutil from PIL import Image import hashlib def basic_filter_and_deduplicate(image_folder): """基础过滤与去重:尺寸、格式、重复文件""" valid_images = [] seen_hashes = set() for filename in os.listdir(image_folder): filepath = os.path.join(image_folder, filename) # 检查文件格式 if not filename.lower().endswith(('.png', '.jpg', '.jpeg', '.webp')): os.remove(filepath) print(f"移除非图片文件: {filename}") continue try: with Image.open(filepath) as img: width, height = img.size # 规则1: 过滤尺寸过小的图片(例如宽度小于500像素) if width < 500 or height < 500: os.remove(filepath) print(f"移除尺寸过小图片({width}x{height}): {filename}") continue # 规则2: 计算文件哈希值进行去重 with open(filepath, 'rb') as f: file_hash = hashlib.md5(f.read()).hexdigest() if file_hash in seen_hashes: os.remove(filepath) print(f"移除重复图片: {filename}") continue seen_hashes.add(file_hash) valid_images.append((filepath, img)) except Exception as e: print(f"处理图片 {filename} 时出错,已移除: {e}") os.remove(filepath) print(f"初步过滤后剩余 {len(valid_images)} 张图片") return valid_images # 返回(路径,PIL图像对象)列表3.2 引入AI进行内容过滤(进阶)
规则过滤能解决尺寸、格式、重复的问题,但判断一张图是否属于“东方美学”,就需要点“智能”了。这里我们可以轻量级地利用一些预训练的AI模型。
一种方法是使用图像分类模型。我们可以找一个在“场景和物体分类”上表现不错的轻量级模型(比如MobileNet),但需要微调或者用提示词工程来让它理解“古风”、“汉服”这类概念。更直接一点的方法,是使用现有的图像标签生成服务或本地模型,为每张图生成描述性关键词,然后通过关键词匹配来过滤。
# 假设我们使用一个本地化的CLIP模型或类似的视觉-语言模型来打分 # 以下为概念性代码,实际需要安装相应的库(如transformers)和模型 from transformers import pipeline # 或使用其他轻量级视觉特征提取+相似度比较的方案 def ai_content_filter(image_path_list, positive_concepts=["古风", "汉服", "古典", "工笔画", "仕女图"]): """使用视觉模型对图片内容进行过滤""" # 此处简化流程:实际应用中需要加载模型,计算图片特征与文本概念的相似度 filtered_list = [] print("正在进行AI内容过滤(此步骤可能较慢)...") # 概念性流程: # 1. 加载预训练模型(例如CLIP) # 2. 将positive_concepts编码为文本特征 # 3. 对每张图片,编码为图像特征 # 4. 计算图像特征与每个文本特征的相似度,取最高分 # 5. 设定一个阈值,高于阈值的保留 # 伪代码逻辑: # model = load_model() # text_features = encode_text(positive_concepts) # for img_path in image_path_list: # img = load_image(img_path) # image_feature = encode_image(img) # similarity_scores = calculate_similarity(image_feature, text_features) # max_score = max(similarity_scores) # if max_score > THRESHOLD: # filtered_list.append(img_path) # 由于模型加载和运行需要一定环境,这里先返回原列表作为示意 # 在实际项目中,这是提升素材相关性的核心步骤 print("AI过滤完成(此处为示意,实际需实现模型推理)。") return image_path_list # 实际应返回过滤后的列表3.3 自动化重命名与标注
清洗完后,一堆像asdf1234.jpg这样的文件名毫无意义。我们需要按规则重命名,并生成一个简单的标注文件,方便后续在“云容笔谈”系统中管理。
def rename_and_annotate(image_path_list, base_name="dongfang_meixue"): """对图片进行序列化重命名,并生成标注CSV文件""" import csv annotation_data = [] for idx, (img_path, img) in enumerate(image_path_list): # 生成新文件名 new_filename = f"{base_name}_{idx+1:04d}.jpg" new_path = os.path.join(os.path.dirname(img_path), new_filename) # 重命名文件 os.rename(img_path, new_path) # 收集标注信息:文件名、原始名(可选)、尺寸、可能的关键词 width, height = img.size annotation_data.append({ "id": idx+1, "filename": new_filename, "original_name": os.path.basename(img_path), "width": width, "height": height, "tags": "古风,人像", # 这里可以尝试用AI模型预测的标签,或留空手动补全 "source": "auto_crawled" }) img.close() # 关闭PIL图像对象 # 写入CSV标注文件 csv_path = os.path.join(os.path.dirname(image_path_list[0][0]), "annotations.csv") with open(csv_path, 'w', newline='', encoding='utf-8') as f: writer = csv.DictWriter(f, fieldnames=["id", "filename", "original_name", "width", "height", "tags", "source"]) writer.writeheader() writer.writerows(annotation_data) print(f"重命名完成,共处理{len(annotation_data)}张图片。") print(f"标注文件已生成: {csv_path}") return annotation_data4. 与生成系统对接:打造端到端流水线
素材清洗整理好了,最后一步就是把它喂给“云容笔谈·东方红颜”系统。不同的系统导入方式不同,但思路相通。
4.1 素材目录标准化
首先,确保你的素材文件夹结构符合系统的要求。通常,系统会要求图片放在特定的train或input目录下,并且可能需要对应的描述文件。
def prepare_for_ai_system(cleaned_image_folder, annotation_csv_path, target_system_input_dir): """将处理好的素材准备并移动到AI系统的输入目录""" import pandas as pd # 读取标注文件 df = pd.read_csv(annotation_csv_path) # 在系统输入目录下创建本次导入的子文件夹(按时间或批次) import datetime batch_name = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") batch_folder = os.path.join(target_system_input_dir, f"batch_{batch_name}") os.makedirs(batch_folder, exist_ok=True) # 移动图片文件 for _, row in df.iterrows(): src = os.path.join(cleaned_image_folder, row['filename']) dst = os.path.join(batch_folder, row['filename']) if os.path.exists(src): shutil.copy2(src, dst) # 使用copy2保留元数据 # 复制并可能转换标注文件为系统需要的格式(如JSON) # 这里假设系统需要与CSV结构类似的JSON annotation_json_path = os.path.join(batch_folder, "metadata.json") df.to_json(annotation_json_path, orient='records', indent=2, force_ascii=False) print(f"素材批次已准备就绪,位于: {batch_folder}") print(f"包含 {len(df)} 张图片及其标注信息。") return batch_folder4.2 自动化触发与集成
你可以将这个Python脚本设置为定时任务(例如每周一早上运行),或者将其集成到一个简单的图形界面里,点一下按钮就开始“采集-清洗-导入”的全流程。
更进阶一点,你甚至可以写一个监听脚本,当“云容笔谈”系统的训练数据目录为空或需要更新时,自动触发这个爬虫流程,实现全自动的素材补给。
5. 一些实践中的心得与建议
折腾完这一套,确实效率提升了不少。不过也有些经验之谈,可以帮你少走点弯路。
首先,尊重版权与网站规则。这是红线。在爬取任何网站前,务必查看其robots.txt文件,遵守爬取频率限制(代码里的time.sleep就是干这个的),不要对服务器造成压力。最好用于个人学习和研究,如果用于商业项目,请确保你拥有素材的合法使用权。
其次,爬虫代码需要维护。网站结构经常会变,今天能用的选择器,明天可能就失效了。所以你的解析代码(BeautifulSoup选择器那部分)最好写得灵活一些,并且定期检查。可以把核心的图片链接提取逻辑多写几个备选方案,一个失败了尝试另一个。
关于过滤效果,纯规则的过滤是快,但不够精准。AI模型过滤效果好,但速度慢,而且需要一定的技术门槛去部署和调试。在实际项目中,我建议分两步走:先用严格的规则(如必须包含某些关键词的标题、特定的尺寸比例)快速过滤掉明显不相关的,再用AI模型对剩下的“疑似”图片进行精细判断,这样在效率和效果上能取得不错的平衡。
最后,数据质量重于数量。不要盲目追求爬取几万张图片。对于“东方红颜”这类风格化很强的生成系统来说,100张高质量、风格统一的精品素材,远比10000张杂乱无章的图片有用。在清洗阶段,宁可严格一点,多删掉一些似是而非的图,也要保证最终入库的素材都是“精品”。
这套自动化流程跑起来之后,我花在素材准备上的时间从以前的几个小时缩短到了现在的几乎零投入(维护脚本的时间除外)。更重要的是,素材库的质量变得稳定可控,这直接反映在了最终生成图像的效果上。如果你也在为AI创作准备素材而头疼,不妨试试这个思路,从最简单的定向爬虫开始,逐步叠加智能清洗和自动化流程,相信也能帮你打开一扇新的大门。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
