2026/3/31 17:00:57
网站建设
项目流程
怎样才能增加网站,重庆传媒公司前十名,乒乓球网站建设目标,无形资产 网站建设DCT-Net人像卡通化代码实例#xff1a;Python批量处理文件夹人像照片
1. 为什么需要批量处理#xff1f;——从单张上传到自动化工作流
你试过用DCT-Net WebUI一张张上传照片吗#xff1f; 点开网页、选文件、等几秒、保存结果、再点……处理20张人像#xff0c;光点鼠标…DCT-Net人像卡通化代码实例Python批量处理文件夹人像照片1. 为什么需要批量处理——从单张上传到自动化工作流你试过用DCT-Net WebUI一张张上传照片吗点开网页、选文件、等几秒、保存结果、再点……处理20张人像光点鼠标就手酸。更别说团队要批量生成宣传素材、设计师要为上百个客户出卡通头像、或者教育机构要为班级学生统一制作趣味档案照。这时候Web界面就变成了“手动挡”而真正的效率来自“自动挡”——用Python脚本把整个文件夹的照片一次性喂给DCT-Net让它在后台默默跑完最后把所有卡通图整整齐齐存进指定文件夹。这不是理论是已经验证过的落地方式。本文不讲模型原理不堆参数配置只给你一段能直接复制粘贴、改两行路径就能跑通的Python代码配合你本地已部署好的DCT-Net服务端口8080实现真正的“拖进去、按一下、拿结果”。你不需要懂Flask怎么写路由也不用碰TensorFlow底层你只需要确认一件事浏览器能打开http://localhost:8080说明服务正在运行——剩下的交给我写的这段脚本。2. 前提准备确保服务已就绪再动手写代码在运行脚本前请花1分钟确认三件事。跳过这步90%的报错都发生在这里。2.1 确认DCT-Net服务正在运行打开终端执行ps aux | grep start-cartoon.sh如果看到类似/usr/local/bin/start-cartoon.sh的进程说明服务已启动。再用浏览器访问http://localhost:8080—— 能看到上传界面就代表一切正常。注意不要关闭启动服务的终端窗口。这个Flask服务是前台运行的关掉终端等于关掉服务。2.2 检查Python环境是否满足依赖脚本本身只依赖两个轻量库requests发HTTP请求和Pillow处理图片格式。它们和镜像内预装的Python 3.10完全兼容无需额外安装python3 -c import requests, PIL; print( 依赖就绪)如果提示ModuleNotFoundError只需一行命令补全pip install requests pillow2.3 准备好你的照片文件夹建一个纯英文路径的文件夹比如/home/yourname/cartoon_input/把所有待处理的人像照片JPG/PNG格式放进去。避免中文路径、空格、特殊符号——这是HTTP上传最常踩的坑。推荐命名person_001.jpg,person_002.png… 清晰、无空格、带序号后续排查问题一目了然。3. 核心代码60行搞定批量上传与结果保存下面这段代码就是你今天要复制的全部内容。它做了四件事① 扫描输入文件夹里的所有图片② 逐张构造HTTP表单请求发给http://localhost:8080/process③ 接收返回的卡通图二进制数据④ 按原名后缀保存到输出文件夹并打印进度。直接保存为batch_cartoon.py然后运行即可。#!/usr/bin/env python3 # -*- coding: utf-8 -*- DCT-Net人像卡通化批量处理脚本 支持 JPG / PNG 格式自动创建输出目录保留原始文件名 import os import time import requests from pathlib import Path from PIL import Image from io import BytesIO # 配置区只需修改这里 INPUT_DIR /home/yourname/cartoon_input # 改成你的输入文件夹路径 OUTPUT_DIR /home/yourname/cartoon_output # 改成你的输出文件夹路径 API_URL http://localhost:8080/process # 服务地址端口必须是8080 TIMEOUT 30 # 单张图超时时间秒 # def ensure_dir(path): 安全创建目录避免重复报错 Path(path).mkdir(parentsTrue, exist_okTrue) def get_image_files(folder): 获取文件夹内所有JPG/PNG图片按字母序排列保证顺序可重现 folder Path(folder) extensions {.jpg, .jpeg, .png} files [f for f in folder.iterdir() if f.is_file() and f.suffix.lower() in extensions] return sorted(files) def send_to_dctnet(image_path): 向DCT-Net API发送单张图片返回响应内容或None try: with open(image_path, rb) as f: files {image: (image_path.name, f, image/jpeg)} response requests.post(API_URL, filesfiles, timeoutTIMEOUT) if response.status_code 200: return response.content else: print(f❌ {image_path.name} → API返回错误码 {response.status_code}) return None except Exception as e: print(f❌ {image_path.name} → 请求失败{str(e)}) return None def save_cartoon_image(content, input_path, output_dir): 保存卡通图自动适配JPG/PNG格式添加_cartoon后缀 try: img Image.open(BytesIO(content)) stem Path(input_path).stem suffix Path(input_path).suffix.lower() output_path Path(output_dir) / f{stem}_cartoon{suffix} # PNG保持透明通道JPG转RGB避免保存异常 if suffix .png: img.save(output_path) else: if img.mode in (RGBA, LA, P): background Image.new(RGB, img.size, (255, 255, 255)) background.paste(img, maskimg.split()[-1] if img.mode RGBA else None) img background img.save(output_path, quality95) return str(output_path) except Exception as e: print(f❌ 保存失败 {input_path.name}{str(e)}) return None def main(): print( 开始批量处理人像卡通化...) print(f 输入目录{INPUT_DIR}) print(f 输出目录{OUTPUT_DIR}) print(f API地址{API_URL}) print(- * 50) ensure_dir(OUTPUT_DIR) image_files get_image_files(INPUT_DIR) if not image_files: print( 输入文件夹为空请检查路径是否正确) return print(f 共找到 {len(image_files)} 张图片) success_count 0 for i, img_path in enumerate(image_files, 1): print(f\n[{i}/{len(image_files)}] 正在处理{img_path.name}) cartoon_bytes send_to_dctnet(img_path) if cartoon_bytes: saved_path save_cartoon_image(cartoon_bytes, img_path, OUTPUT_DIR) if saved_path: print(f 已保存{Path(saved_path).name}) success_count 1 else: print(❌ 保存失败) else: print(❌ 转换失败) # 防抖动避免请求过于密集非必须但推荐 if i len(image_files): time.sleep(0.5) print(- * 50) print(f 批量任务完成成功 {success_count}/{len(image_files)} 张) if success_count 0: print(f 结果已存至{OUTPUT_DIR}) if __name__ __main__: main()3.1 运行方式三步到位修改路径用文本编辑器打开batch_cartoon.py把INPUT_DIR和OUTPUT_DIR改成你的真实路径注意Linux/macOS用正斜杠/Windows用双反斜杠\\或正斜杠均可终端执行python3 batch_cartoon.py看结果脚本会实时打印每张图的处理状态完成后自动告诉你成功多少张输出文件夹里就是一整套卡通图。小技巧想中途停止按CtrlC即可已处理的图片不会丢失。4. 实战效果真实人像对比与质量观察我们用一组实测案例说明效果——不是截图界面而是直接呈现原始图与卡通图的实质差异。4.1 典型人像处理效果文字描述版原图特征卡通图表现实际体验备注清晰正面半身照白衬衫自然光线条干净利落肤色过渡柔和保留眼镜框细节但弱化反光最佳输入几乎零失败侧脸头发遮挡部分额头轮廓识别准确发丝边缘有轻微毛边但整体神态保留度高可接受建议稍调亮原图多人合影2人同框主体人物卡通化完整背景人物简化为色块无明显畸变自动聚焦主面孔无需手动抠图低光照室内自拍噪点多卡通图降噪明显皮肤质感平滑但部分暗部纹理丢失建议先用手机自带“增强”功能提亮关键结论DCT-Net对单人、正面、光照充足的人像效果最稳多人/侧脸/弱光场景虽有小瑕疵但成品仍远超手工简笔画效率且风格统一。4.2 批量处理速度实测i5-1135G7 16GB内存10张 1080p JPG平均大小1.2MB总耗时约 42 秒含网络传输与服务内部推理平均单张 4.2 秒比WebUI手动操作约8–12秒/张快一倍以上CPU占用稳定在60%左右无卡死、无内存溢出这意味着处理100张图你喝杯咖啡的时间就完成了。5. 进阶用法三招提升实用性与容错性脚本已足够好用但如果你希望它更“工程级”可以轻松叠加以下改进——全部基于原脚本微调无需重写。5.1 加入失败重试机制防偶发超时在send_to_dctnet()函数中把请求部分改为for attempt in range(3): # 最多重试2次 try: response requests.post(API_URL, filesfiles, timeoutTIMEOUT) if response.status_code 200: return response.content except Exception as e: if attempt 2: print(f {image_path.name} 重试3次均失败{e}) else: time.sleep(1) # 每次失败后等1秒再试5.2 自动过滤非人像图节省无效请求用OpenCV快速检测人脸区域仅需加几行import cv2 face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml) def has_face(image_path): img cv2.imread(str(image_path)) if img is None: return False gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces face_cascade.detectMultiScale(gray, 1.1, 4) return len(faces) 0 # 在主循环中跳过无人脸的图 if not has_face(img_path): print(f {img_path.name} 未检测到人脸跳过) continue5.3 导出处理日志方便复盘与交付在main()结尾追加log_path Path(OUTPUT_DIR) / batch_log.txt with open(log_path, w, encodingutf-8) as f: f.write(f批处理时间{time.strftime(%Y-%m-%d %H:%M:%S)}\n) f.write(f输入总数{len(image_files)}\n) f.write(f成功数量{success_count}\n) f.write(详细记录\n) # 此处可写入每张图的耗时、状态等 print(f 日志已保存{log_path})这些都不是必需项但当你开始处理几百张图、交付给同事或客户时它们会让整个流程显得专业、可靠、可追溯。6. 常见问题与一句话解决方案新手跑脚本最容易卡在这几个点。我们把答案压缩成一句可执行的操作不绕弯。问题现象一句话解决ConnectionError: Max retries exceeded检查http://localhost:8080是否能打开网页没开就先运行/usr/local/bin/start-cartoon.shFileNotFoundError: [Errno 2] No such file or directory输入路径用了中文或空格换成纯英文路径如/home/user/input图片保存后打不开 / 显示损坏脚本里已做格式适配但若原图是WebP/BMP等格式请先用Photoshop或在线工具转为JPG/PNG处理中途报错ReadTimeout把脚本里TIMEOUT 30改成60尤其处理高清图或CPU负载高时输出图全是黑块或色块原图尺寸过大4000px用PIL先缩放在send_to_dctnet前加img.thumbnail((2000, 2000))没有“玄学问题”只有路径、权限、格式、服务状态四个维度。逐一对照5分钟内必解。7. 总结让AI能力真正长在你的工作流里DCT-Net本身很强大但它的价值不在于多炫酷的单张演示而在于能否无缝嵌入你真实的生产力场景。本文给你的不是一个“又一个教程”而是一套即插即用的自动化接口它不依赖GUI操作适合定时任务、CI/CD集成它不绑定特定框架纯Python标准库requests未来迁移到其他服务也只需改两行URL它设计克制60行代码解决核心问题没有抽象层、没有配置文件、没有学习成本。下次当你面对几十张人像要卡通化时请别再点开网页、上传、等待、右键另存为……把它们放进文件夹运行一行命令去做点别的事。回来时结果已在。这才是AI该有的样子安静、可靠、不知疲倦永远在你需要时准备好为你多做一点。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。