标签: AIGC

  • 告别天价软件!开源数字人项目,让你轻松打造专属虚拟分身

    告别天价软件!开源数字人项目,让你轻松打造专属虚拟分身

    是否曾对炫酷的数字人技术心动,却被高昂的成本和陡峭的学习曲线劝退?无论是想成为虚拟主播,还是开发AI助手,今天这篇文章将是你的终极入门指南。我精选了5个GitHub上高星的开源项目,覆盖从人脸生成、实时驱动到智能对话的全流程,帮你零成本开启数字人创作之旅!

    为何要关注开源数字人项目?

    数字人已广泛应用于虚拟主播、数字员工、AI客服等领域,但商业解决方案往往价格不菲。开源项目则打破了这一壁垒,将顶尖技术免费开放给所有开发者与创作者。你无需从零开始,即可基于成熟框架快速定制专属虚拟形象,真正实现“数字人自由”。

    项目名核心优势适用人群技术门槛部署难度最佳场景
    Face-Transformers2D人脸生成,风格多样头像设计、新手虚拟头像制作、数字分身设计
    Live2D Cubism SDK2D实时驱动,直播适配好虚拟主播、UP主2D虚拟直播、短视频出镜
    Avatarify实时变身,会议神器打工人、社恐视频会议虚拟形象
    ChatGPT-4V Digital Human智能对话,语音交互开发者、内容党智能客服、虚拟助手
    PIFuHD3D建模,单图生成3D创作者中高中高3D虚拟偶像、游戏角色建模

    1. Face-Transformers:数字人脸“生成大师”

    介绍:小白也能上手的人脸生成工具!基于AI模型生成超逼真数字人脸,支持自定义性别、年龄、发型,还能让人脸“动起来”,做虚拟头像超方便。
    主要功能

    • 生成高清数字人脸图片,支持风格迁移(如写实、动漫、油画风)
    • 调整人脸特征:改发型、换表情、加配饰,自由度超高
    • 导出人脸模型用于视频制作或游戏角色
      应用场景:做虚拟主播头像、设计游戏NPC脸模、生成个性化数字分身
      部署方法
    1. 克隆仓库:git clone https://github.com/hukkelas/Face-Transformers.git
    2. 安装依赖:pip install -r requirements.txt
    3. 运行Web界面:python app.py,在浏览器调参数生成人脸
      亮点&小槽点:生成效果逼真,操作可视化;但需要显卡支持,低配电脑可能跑不动。
      GitHub链接:https://github.com/hukkelas/Face-Transformers

    2. Live2D Cubism SDK:2D数字人“动效引擎”

    介绍:虚拟主播圈的“顶流工具”!专门做2D数字人实时驱动,给静态头像加表情、动嘴巴、摆姿势,直播间互动感拉满。
    主要功能

    • 绑定人脸关键点,通过摄像头实时驱动数字人表情(眨眼、微笑、张嘴)
    • 支持手动调动作:点头、挥手、比心等预设动作库
    • 导出动画视频或实时推流到直播平台
      应用场景:2D虚拟主播直播、短视频数字人出镜、线上课程虚拟讲师
      部署方法
    1. 克隆仓库:git clone https://github.com/Live2D/CubismSDK.git
    2. 下载官方示例模型(需注册账号)
    3. 运行示例程序:./Samples/BasicExample,用摄像头驱动模型
      亮点&小槽点:2D动效自然,直播适配好;但高级功能需付费授权,免费版够用基础需求。
      GitHub链接:https://github.com/Live2D/CubismSDK

    3. Avatarify:实时数字人“变身神器”

    介绍:打工人狂喜的视频会议神器!通过摄像头把自己实时变成数字人,开会不想露脸?用虚拟分身代替,还能换发型妆容。
    主要功能

    • 实时人脸追踪,把摄像头画面替换成数字人形象
    • 支持自定义数字人:上传照片生成专属分身,保留你的表情特征
    • 兼容Zoom、Teams等会议软件,即插即用
      应用场景:视频会议虚拟形象、线上讲座匿名出镜、直播时切换数字人身份
      部署方法
    1. 克隆仓库:git clone https://github.com/alievk/avatarify.git
    2. 安装依赖:conda env create -f environment.yml
    3. 启动程序:python avatarify.py,选择数字人模型即可使用
      亮点&小槽点:实时性强,操作简单;但对网络和电脑性能有要求,可能偶尔卡顿。
      GitHub链接:https://github.com/alievk/avatarify.git

    4. ChatGPT-4V Digital Human:会聊天的“智能数字人”

    介绍:能说会道的数字助手框架!把ChatGPT的大脑装进数字人,支持语音对话、图像识别,问问题、讲故事、查信息样样行。
    主要功能

    • 语音交互:说话就能和数字人聊天,支持多语言
    • 视觉能力:数字人能“看”图片,描述内容或回答相关问题
    • 自定义人设:设置数字人性格、语气、专业领域(如客服、老师)
      应用场景:做智能客服数字人、开发虚拟助手、给孩子做AI玩伴
      部署方法
    1. 克隆仓库:git clone https://github.com/yangjianxin1/ChatGPT-4V-Digital-Human.git
    2. 配置OpenAI API密钥:修改config.py
    3. 运行:python app.py,通过麦克风和数字人对话
      亮点&小槽点:对话自然,功能全面;但需要OpenAI API密钥,有使用成本。
      GitHub链接:https://github.com/yangjianxin1/ChatGPT-4V-Digital-Human

    5. PIFuHD:3D数字人“建模神器”

    介绍:3D建模小白的救星!上传一张照片就能生成完整3D数字人模型,带身体、穿衣服,还能摆各种姿势,做虚拟偶像超合适。
    主要功能

    • 单张照片生成高精细3D数字人,包括面部、身体、服装细节
    • 支持调整姿势:让数字人站、坐、挥手,动作自然
    • 导出3D模型文件,用于动画制作或游戏开发
      应用场景:3D虚拟偶像制作、元宇宙数字分身、游戏角色快速建模
      部署方法
    1. 克隆仓库:git clone https://github.com/facebookresearch/pifuhd.git
    2. 安装依赖:pip install -r requirements.txt
    3. 运行:python -m apps.simple_test --input_image path/to/your/photo.jpg
      亮点&小槽点:3D建模效果惊艳,单图生成超方便;但模型训练需要大显存,普通电脑跑起来慢。
      GitHub链接:https://github.com/facebookresearch/pifuhd
  • GitHub热门智能体开源项目,让你秒变AI大神!

    GitHub热门智能体开源项目,让你秒变AI大神!

    AI发烧友们,大家好!最近是不是感觉哪里都在谈“智能体(Agent)”?从自动编程到智能决策,它俨然成了AI界的新晋“顶流”。但面对海量信息,你是否也曾感到无从下手:教程太浅、门槛太高,想亲手实践却找不到合适的项目?别担心!今天,我们就为大家精选了GitHub上10个高星智能体开源项目,涵盖从通用框架到垂直工具,从单机作战到多体协同,并附上保姆级介绍与实战指南。收藏这篇文章,你的智能体学习之路将事半功倍!

    智能体是什么?为什么它值得关注?

    简单来说,智能体是一个“会独立思考、自主行动的AI助手”。你只需给定一个目标,它便能自主规划任务、调用工具、执行步骤,甚至与其他智能体协同完成复杂工作。目前,智能体已广泛应用于科研、办公、游戏开发等领域。而开源项目,正是我们快速入门的“捷径”——无需从零造轮子,基于成熟代码稍作修改,你就能打造属于自己的智能体,高效又实用!

    先唠两句:啥是智能体?为啥要学?

    说白了,智能体就是“能自己干活的AI助手”——给它个目标,它会自己拆解任务、调用工具、调整策略,甚至和其他AI“组队打工”。现在从科研、办公到游戏、机器人,到处都能看到它的身影。而开源项目就是咱普通人的“快车道”:不用从零造轮子,直接改改代码就能搭自己的智能体,香到不行!

    10个必玩智能体开源项目,按头安利!

    1. AutoGPT:智能体界的“开山网红”

    介绍:当年一句“AI自主完成任务”直接引爆GitHub的狠角色!基于GPT模型,能自己规划、搜索、执行任务,堪称“AI版自动化脚本”。

    10个项目横向对比表(选项目不纠结!)

    项目名核心优势适用人群技术门槛部署难度最佳场景
    AutoGPT入门简单,自主性强新手、小白简单任务自动化
    MetaGPT分工清晰,输出质量高开发者、产品软件开发、项目规划
    LangChain万能工具箱,兼容性强全阶段开发者自定义智能体开发
    AutoGen多智能体协作,微软背书进阶开发者中高复杂决策、团队协作
    BabyAGI代码极简,原理清晰学习者、新手理解智能体逻辑
    HuggingGPT多模型联合,成本低开发者、研究者中高中高多模态任务、本地部署
    AgentGPT零代码,网页直接用纯新手、体验党快速测试、简单任务
    GPT-Researcher学术向专业,文献整理学生、研究员论文写作、文献综述
    CrewAI团队管理逻辑强项目管理者多角色协作、复杂任务
    AgentQL自然语言查数据业务、数据岗数据分析、报表生成


    主要功能

    • 自主拆解复杂任务(比如“写一篇AI发展报告”→ 拆成查资料、整理数据、写初稿、润色)
    • 调用搜索引擎、文件工具,甚至控制其他软件
    • 支持自定义目标和规则,灵活性拉满

    应用场景:自动写报告、数据整理、批量处理文件、简单的科研辅助
    部署方法

    1. 克隆仓库:git clone https://github.com/Significant-Gravitas/AutoGPT.git
    2. 安装依赖:pip install -r requirements.txt
    3. 配置OpenAI API密钥和目标,运行python -m autogpt即可
      亮点&小槽点:入门简单,适合新手练手;但偶尔会“钻牛角尖”,需要手动干预调整目标。
      GitHub链接:https://github.com/Significant-Gravitas/AutoGPT

    2. MetaGPT:多智能体“职场协作”神器

    介绍:由国内团队开发的“全流程智能体框架”,核心是模拟“职场团队分工”——比如产品经理、开发、测试各司其职,合力完成项目。
    主要功能

    • 内置“角色分工”系统:支持产品经理(提需求)、架构师(画方案)、开发(写代码)等角色
    • 自动生成文档、代码、测试用例,甚至能输出项目计划
    • 多智能体实时沟通协作,像真人团队一样推进任务
      应用场景:小型软件开发、项目规划、团队协作流程模拟、创业项目原型设计
      部署方法
    1. 克隆仓库:git clone https://github.com/geekan/MetaGPT.git
    2. 安装依赖:pip install -r requirements.txt
    3. 配置API密钥,输入需求(比如“开发一个贪吃蛇游戏”),运行python startup.py "你的需求"
      亮点&小槽点:分工超清晰,输出质量高;但对硬件和API额度要求稍高,新手可能需要先调参。
      GitHub链接:https://github.com/geekan/MetaGPT

    3. LangChain:智能体的“工具箱”(必学!)

    介绍:虽然不算纯智能体,但绝对是构建智能体的“基础设施”!把各种AI模型、工具、数据串起来,让你轻松搭出复杂智能体。
    主要功能

    • 集成主流大模型(GPT、LLaMA、文心一言等)和工具(搜索、数据库、API调用)
    • 提供“记忆模块”:让智能体记住对话历史和任务状态
    • 支持“链(Chain)”和“智能体(Agent)”两种模式,灵活组合功能
      应用场景:自定义智能体开发、聊天机器人、知识库问答、数据分析助手
      部署方法
    1. 直接安装库:pip install langchain
    2. 搭配具体模型(如OpenAI):pip install openai
    3. 参考文档写代码:定义工具→设置智能体→调用执行
      亮点&小槽点:兼容性超强,几乎所有智能体项目都绕不开它;但需要点代码基础,纯小白可能要先补Python。
      GitHub链接:https://github.com/langchain-ai/langchain

    4. AutoGen:微软出品的“智能体协作平台”

    介绍:微软研究院开源的多智能体框架,主打“让多个AI智能体聊天协作”,甚至能和人类实时互动,解决复杂问题。
    主要功能

    • 支持“智能体-智能体”“智能体-人类”混合协作
    • 自动分配任务、调用工具,还能辩论优化方案(比如两个智能体吵架改代码哈哈)
    • 兼容多种大模型,支持本地部署(不用依赖OpenAI)
      应用场景:复杂决策、代码审查、学术研究协作、多人任务分配
      部署方法
    1. 安装:pip install pyautogen
    2. 写配置文件:定义智能体角色、模型、工具权限
    3. 启动对话:python your_script.py 让智能体们开始“打工”
      亮点&小槽点:微软背书,稳定性强;协作逻辑超灵活,但配置稍复杂,建议先看官方示例。
      GitHub链接:https://github.com/microsoft/autogen

    5. BabyAGI:极简任务智能体

    介绍:名字萌但功能硬核!用不到200行代码实现“目标-任务-执行”闭环,适合新手理解智能体核心逻辑。
    主要功能

    • 核心逻辑:设定目标→生成任务→执行任务→更新任务列表
    • 支持用向量数据库存储任务记忆,避免重复劳动
    • 可自定义执行工具(比如加个网页爬虫、计算器)
      应用场景:学习智能体原理、搭建轻量任务助手(如定时查天气、整理邮件)
      部署方法
    1. 克隆仓库:git clone https://github.com/yoheinakajima/babyagi.git
    2. 安装依赖:pip install -r requirements.txt
    3. 配置OpenAI和向量数据库密钥,运行python babyagi.py输入目标
      亮点&小槽点:代码极简,新手能看懂;但功能基础,复杂任务需要自己加工具。
      GitHub链接:https://github.com/yoheinakajima/babyagi.git

    6. HuggingGPT: Hugging Face+GPT的“强强联合”

    介绍:浙大团队开源的“大模型调度官”!让GPT当“指挥官”,调用Hugging Face上的1000+开源模型干活,成本低还强。
    主要功能

    • GPT负责拆解任务、选模型,Hugging Face模型负责具体执行(如图像识别、翻译、代码生成)
    • 支持文本、图像、语音等多模态任务,全能选手
    • 本地部署可选,不用完全依赖API
      应用场景:多模态任务处理(如“给图片写文案+翻译”)、低成本智能体开发
      部署方法
    1. 克隆仓库:git clone https://github.com/microsoft/HuggingGPT.git
    2. 安装依赖:pip install -r requirements.txt
    3. 配置OpenAI和Hugging Face密钥,运行示例脚本
      亮点&小槽点:模型资源丰富,成本可控;但对设备算力有要求,本地跑大模型可能卡。
      GitHub链接:https://github.com/microsoft/HuggingGPT

    7. AgentGPT:浏览器直接玩的“零代码智能体”

    介绍:懒人福音!不用装环境,打开网页就能创建智能体,输入目标直接跑,新手友好度拉满。
    主要功能

    • 网页端可视化操作,填个目标就能启动智能体
    • 实时显示任务拆解和执行过程,像“看AI打工直播”
    • 支持保存历史记录,随时复盘调整
      应用场景:快速测试智能体效果、新手入门体验、简单任务自动化(如写提纲、查信息)
      部署方法
    1. 直接用在线版:https://agentgpt.reworkd.ai/(偶尔需要排队)
    2. 本地部署:克隆仓库后按文档配置Next.js环境,启动即可
      亮点&小槽点:零代码门槛,谁都能玩;但功能有限,复杂任务还是得用本地项目。
      GitHub链接:https://github.com/reworkd/AgentGPT

    8. GPT-Researcher:学术党狂喜的“论文助手”

    介绍:专注“学术研究”的智能体!输入研究主题,自动搜文献、读论文、整理观点,还能生成带引用的报告。
    主要功能

    • 自动搜索学术数据库(Google Scholar、Arxiv等)和权威来源
    • 提取核心观点、对比不同研究,生成结构化报告(带参考文献格式)
    • 支持自定义研究深度和报告风格(如摘要、综述、批判性分析)
      应用场景:写论文查资料、文献综述、快速了解研究领域进展
      部署方法
    1. 克隆仓库:git clone https://github.com/assafelovic/gpt-researcher.git
    2. 安装依赖:pip install -r requirements.txt
    3. 配置API密钥,运行python main.py输入研究主题
      亮点&小槽点:学术向超专业,省超多查文献时间;但依赖英文资源,中文文献支持一般。
      GitHub链接:https://github.com/assafelovic/gpt-researcher

    9. CrewAI:多智能体“团队管理”框架

    介绍:把智能体变成“团队成员”,你当“老板”给任务,它自动分配角色、设目标、追进度,主打一个省心。
    主要功能

    • 可视化定义角色(如“市场分析师”“文案写手”)、技能和目标
    • 智能体间自动沟通协作,遇到问题会“请示”你
    • 支持集成各种工具(API、数据库、爬虫)扩展能力
      应用场景:内容创作团队、市场调研、项目管理、多步骤任务处理
      部署方法
    1. 安装库:pip install crewai
    2. 写代码定义角色、任务和工具
    3. 启动团队:crew.kickoff() 坐等结果
      亮点&小槽点:团队管理逻辑超清晰,适合复杂协作;但文档较少,新手可能需要多试。
      GitHub链接:https://github.com/joaomdmoura/crewai

    10. AgentQL:智能体+数据库的“数据查询神器”

    介绍:让智能体直接“懂数据库”!输入自然语言问题(比如“查下上月销售额前5的产品”),自动生成SQL并查结果。
    主要功能

    • 自然语言转SQL,不用学代码也能查数据库
    • 支持MySQL、PostgreSQL等主流数据库,兼容性强
    • 自动校验SQL正确性,避免查错数据
      应用场景:数据分析、业务报表生成、非技术人员查数据
      部署方法
    1. 安装:pip install agentql
    2. 连接数据库,配置API密钥
    3. 用自然语言提问:agent.query("你的问题")
      亮点&小槽点:数据查询超方便,非技术党狂喜;但复杂查询可能需要手动调整SQL。
      GitHub链接:https://github.com/AgentQL/agentql

  • AI开源项目推荐清单赶紧收藏,开启你的开源AI宝藏库!

    在AI技术日新月异的今天,你是否也曾面临这些困惑:强大的模型总是闭源收费?想动手实践却不知从何开始?工具繁多却难以找到真正高效可靠的选项?本文正是为你量身打造的“寻宝图”。我们深入GitHub,为你精挑细选了10个涵盖不同领域的顶级开源AI项目

    10个必收藏的AI开源项目 | GitHub高星推荐 | 大模型/图像生成/语音识别/目标检测

    从驱动对话的大语言模型(LLaMA),到创造视觉奇迹的图像生成器(Stable Diffusion);从精准的语音识别工具(Whisper),到实时目标检测系统(YOLOv8);乃至帮助你快速构建应用的开发框架(LangChain, Gradio)——每一款都经过社区验证,兼具创新性与实用性。无论你是开发者、研究者、学生还是技术爱好者,这份清单都将为你提供从学习探索到项目实战的强力支持。现在,就让我们一起解锁这些开源神器,将 cutting-edge 的AI能力,转化为你手中的利刃。

    不管你是想练手、做项目,还是直接薅来干活,这篇清单都能让你直呼“捡到宝”!话不多说,上硬菜~

    1. LLaMA:Meta家的“平民大模型”

    详细介绍:这是Meta(脸书母公司)开源的大语言模型家族,从70亿参数到700亿参数应有尽有,主打一个“轻量能跑、开源免费”。普通人下载后,在消费级显卡上就能微调,不用再眼巴巴看着大厂模型流口水~

    核心特点

    • 尺寸灵活:从7B到70B参数,电脑配置不够也能玩小规格;
    • 微调友好:社区有超多现成工具(比如Alpaca-LoRA),新手也能快速调教;
    • 多语言支持:对中文、英文等主流语言适配都不错。

    应用场景:做聊天机器人、个性化问答系统、内容生成工具,甚至训练垂直领域小模型(比如法律、医疗)都合适。

    项目对比:和闭源的GPT-4比,LLaMA胜在“免费开源”,普通人也能下载微调;但论综合能力,GPT-4还是老大哥。和其他开源大模型(比如Mistral)比,LLaMA的生态更成熟,社区工具多到用不完~

    GitHub地址:https://github.com/facebookresearch/llama

    2. Stable Diffusion:AI绘画界的“扛把子”

    详细介绍:提到AI画图,没人能绕开Stable Diffusion!由Stability AI开源,支持文本生成图像、图像修复、风格迁移,关键是完全免费商用(非商用更没问题),普通电脑装个WebUI就能玩到飞起。

    核心特点

    • 插件狂魔:千种风格模型、LoRA微调、ControlNet控图,玩法多到离谱;
    • 本地化部署:不用蹭在线接口,自己电脑就能生成,隐私性拉满;
    • 社区活跃:每天都有新模型、新教程,小白也能快速出“大作”。

    应用场景:设计插画、海报制作、游戏美术辅助、表情包生成,甚至修复老照片、给线稿上色都超好用。

    项目对比:和Midjourney比,Stable Diffusion胜在“免费开源+本地化”,但出图效率和精细度稍弱;和DALL-E比,它的可控性更强,插件生态甩对手十条街~

    GitHub地址:https://github.com/Stability-AI/stablediffusion

    3. Whisper:OpenAI的“语音魔术师”

    详细介绍:OpenAI开源的语音识别模型,能把语音转文字、文字转语音,还支持99种语言!关键是准确率超高,连带口音的中文、英文都能轻松识别,简直是会议记录、视频字幕的救星。

    核心特点

    • 多任务全能:语音转文字、文字转语音、翻译(比如日语语音直接转中文文字)全拿下;
    • 小模型也能打:哪怕用base(基础)模型,准确率也甩很多商用工具一条街;
    • 开箱即用:Python几行代码就能调用,不用复杂配置。

    应用场景:会议纪要自动生成、视频字幕批量制作、播客转文字、多语言语音翻译工具开发。

    项目对比:和百度语音API比,Whisper胜在“本地部署+免费”,但实时性稍弱;和Google Speech-to-Text比,它对小语种和口音的兼容性更好~

    GitHub地址:https://github.com/openai/whisper

    4. LangChain:LLM应用的“胶水框架”

    详细介绍:想把大模型和数据库、API、知识库结合起来?LangChain就是干这个的!它像“乐高积木”一样,把各种AI组件拼起来,让你轻松开发聊天机器人、问答系统、智能助手,不用从零写代码。

    核心特点

    • 组件丰富:支持连接各种大模型(GPT、LLaMA、Claude)、数据库(MySQL、MongoDB)、搜索引擎;
    • 流程可控:能设计AI的思考步骤(比如“先查资料再回答”),避免大模型“瞎编”;
    • 入门简单:文档超详细,跟着教程走,半小时就能搭个简单的问答工具。

    应用场景:开发企业知识库问答机器人、带记忆功能的聊天助手、基于私有数据的AI分析工具。

    项目对比:和同类框架LlamaIndex比,LangChain更侧重“流程编排”,适合复杂应用;LlamaIndex则强在“数据处理”,新手入门可能更简单~

    GitHub地址:https://github.com/langchain-ai/langchain

    5. YOLOv8:目标检测界的“闪电侠”

    详细介绍:YOLO系列的最新版,主打“又快又准”的目标检测。能瞬间识别图片/视频里的人、车、动物、物体,在普通显卡上就能实时处理视频流,工业级场景都在用它。

    核心特点

    • 速度狂魔:每秒能处理几十帧视频,监控摄像头实时分析毫无压力;
    • 轻量化:小模型能在手机、嵌入式设备上跑,大模型精度堪比专业工具;
    • 开箱即用:预训练模型直接丢图就能识别,微调自己的数据也超简单。

    应用场景:智能监控(比如识别异常行为)、自动驾驶辅助(识别行人车辆)、工业质检(检测产品缺陷)、手机拍照识物APP。

    项目对比:和Faster R-CNN比,YOLOv8速度快10倍以上,精度稍低但够用;和SSD比,它的小目标识别能力更强,适合复杂场景~

    GitHub地址:https://github.com/ultralytics/ultralytics

    6. AutoGPT:AI界的“自律打工人”

    详细介绍:让AI自己“思考、规划、执行”的工具!你只需要给它一个目标(比如“写一篇关于AI开源项目的推文”),它会自动查资料、生成大纲、写内容,甚至能调用其他工具,全程不用你插手。

    核心特点

    • 自主决策:不用一步步指挥,AI自己拆解任务、调整策略;
    • 工具集成:能联网查信息、用搜索引擎、调用API,像个真人助理;
    • 开源免费:虽然还在完善中,但基础功能已经能用,适合尝鲜。

    应用场景:自动写报告、市场调研分析、内容创作辅助、复杂问题拆解(比如“规划一场AI技术分享会”)。

    项目对比:和ChatGPT的“单次对话”比,AutoGPT胜在“多步骤自主执行”,但容易“走偏”;和同类工具BabyAGI比,它的界面更友好,新手更容易上手~

    GitHub地址:https://github.com/Significant-Gravitas/AutoGPT

    7. Diffusers:AI生成的“工具箱”

    详细介绍:Hugging Face开源的生成模型库,里面不仅有Stable Diffusion的核心代码,还有各种图像生成、音频生成、视频生成模型。相当于给开发者搭了个“AI生成工厂”,想调参、改模型?用它就对了。

    核心特点

    • 模型丰富:除了图像生成,还有文生视频(如Video Diffusion)、图像修复等模型;
    • 代码简洁:几行代码就能调用复杂模型,调参改配置超方便;
    • 和Hugging Face生态无缝衔接:能直接用Hub上的模型,不用自己下载。

    应用场景:开发自定义AI绘画工具、研究生成模型原理、二次开发生成模型(比如加新功能)。

    项目对比:和Stable Diffusion的WebUI比,Diffusers更适合“开发者”做二次开发;WebUI则适合“普通用户”直接用~

    GitHub地址:https://github.com/huggingface/diffusers

    8. FastChat:大模型的“聊天服务员”

    详细介绍:想给你的LLaMA、Mistral等开源大模型加个聊天界面?FastChat一键搞定!它支持多模型部署、对话历史管理、API调用,还能搭个网页版聊天框,小白也能快速拥有自己的“ChatGPT”。

    核心特点

    • 多模型兼容:主流开源大模型都能装,切换模型像换手机壁纸一样简单;
    • 部署方便:一条命令启动服务,网页端、API端同时可用;
    • 支持多用户:能当服务器让多人同时用,适合小团队共享。

    应用场景:搭建私有聊天机器人、测试开源大模型效果、给模型加个可视化界面方便演示。

    项目对比:和同类工具vLLM比,FastChat更侧重“聊天交互”,界面更友好;vLLM则强在“高并发部署”,适合大规模使用~

    GitHub地址:https://github.com/lm-sys/FastChat

    9. MONAI:医疗AI的“专业助手”

    详细介绍:专门为医疗影像AI开发的框架,基于PyTorch,集成了各种医学图像预处理、分割、分类工具。医生和开发者用它能快速开发肿瘤检测、器官分割等模型,不用再从零处理DICOM这类特殊格式。

    核心特点

    • 医疗专用:支持DICOM格式、3D影像处理(CT/MRI常用),贴合医疗场景;
    • 模型丰富:内置肿瘤分割、病灶检测等预训练模型,开箱即用;
    • 合规友好:遵循医疗数据隐私规范,适合医院、科研机构使用。

    应用场景:医学影像辅助诊断(比如CT肺结节检测)、病灶分割、医疗图像分析研究。

    项目对比:和普通CV框架(如PyTorch Lightning)比,MONAI胜在“医疗专用工具多”,不用自己写医学图像预处理代码~

    GitHub地址:https://github.com/Project-MONAI/MONAI

    10. Gradio:AI模型的“快速装裱师”

    详细介绍:开发者的“界面救星”!不用学前端,几行Python代码就能给你的AI模型(不管是图像生成、语音识别还是分类模型)加个网页交互界面,支持上传图片、输入文字、实时显示结果,演示、测试超方便。

    核心特点

    • 代码极简:哪怕只会写print,也能搭出能用的界面;
    • 实时更新:改代码不用重启服务,刷新网页就能看效果;
    • 支持多类型输入输出:文字、图片、音频、视频都能搞定。

    应用场景:快速演示AI模型效果、给客户/老板展示项目、收集用户反馈、教学中的模型可视化。

    项目对比:和Streamlit比,Gradio更侧重“快速交互”,界面组件更丰富;Streamlit则强在“数据可视化”,适合展示分析结果~

    GitHub地址:https://github.com/gradio-app/gradio


    以上10个AI开源项目,从大模型、绘画、语音到开发工具,基本覆盖了当下最火的AI应用场景。

  • 数字囤积症救星!LeePoet教你用AI智能整理海量图片

    数字囤积症救星!LeePoet教你用AI智能整理海量图片

    图片太多了怎么办?LeePoet一站式智能整理方案

    💡 LeePoet技术理念:复杂的科技,应该以最简单的方式服务每个普通人。

    你是否也曾在数千张照片中翻找一张重要合影?是否因为图片太多而放弃整理?本文是数字时代每个人的“图片救星”。无论你是拥有上万张照片的摄影爱好者,还是被工作图片淹没的职场人,LeePoet将用AI技术为你提供从简单到专业的全系列解决方案。

    从人物识别到内容分类,Python自动化搞定图片管理,每个人手机里几千张照片的普遍现象,手动整理的痛苦:耗时、低效、容易遗漏,LeePoet的解决方案理念:技术让生活更简单。”隐私保护+内容管理,一键分类敏感图片”,多层级风险评估。

    包含开箱即用的Python脚本、详细配置教程和常见问题解决方案。LeePoet用实际案例证明,技术不应该高高在上,而要真正服务于生活。

    UBUNTU创建虚拟环境操作

    1.创建虚拟环境
    # 进入你的项目文件夹
    cd /path/to/your/project
    
    # 创建虚拟环境(会在当前文件夹创建 venv 目录)
    python3 -m venv myenv
    
    2.激活虚拟环境
    source myenv/bin/activate
    
    3.安装依赖
    python -m pip install opencv-python
    

    如果要使用增强版本,还需要安装:

    python -m pip install torch ultralytics
    
    4.基本完成。

    初级检测:

    创建一个名为 extract_people_images.py的文件完整代码:

    import os
    import shutil
    import cv2
    from pathlib import Path
    
    def detect_people_in_image(image_path, face_cascade=None):
        """
        检测图片中是否包含人物
        """
        if face_cascade is None:
            face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
        
        try:
            img = cv2.imread(image_path)
            if img is None:
                return False
            
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            
            faces = face_cascade.detectMultiScale(
                gray,
                scaleFactor=1.1,
                minNeighbors=5,
                minSize=(30, 30)
            )
            
            return len(faces) > 0
            
        except Exception as e:
            print(f"处理图片 {image_path} 时出错: {e}")
            return False
    
    def extract_images_with_people(source_dir, target_dir):
        """
        从源文件夹提取带人物的图片到目标文件夹
        """
        supported_formats = ['.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.webp']
        
        # 创建目标文件夹
        Path(target_dir).mkdir(parents=True, exist_ok=True)
        
        # 加载人脸检测器
        face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
        
        # 统计信息
        total_images = 0
        images_with_people = 0
        
        print("开始扫描图片...")
        
        for filename in os.listdir(source_dir):
            file_path = os.path.join(source_dir, filename)
            
            # 检查文件格式
            if os.path.isfile(file_path) and any(filename.lower().endswith(fmt) for fmt in supported_formats):
                total_images += 1
                print(f"处理第 {total_images} 张图片: {filename}")
                
                # 检测是否包含人物
                if detect_people_in_image(file_path, face_cascade):
                    images_with_people += 1
                    
                    # 构建目标路径
                    target_path = os.path.join(target_dir, filename)
                    
                    # 处理重名文件
                    counter = 1
                    while os.path.exists(target_path):
                        name, ext = os.path.splitext(filename)
                        target_path = os.path.join(target_dir, f"{name}_{counter}{ext}")
                        counter += 1
                    
                    # 复制文件
                    shutil.copy2(file_path, target_path)
                    print(f"✓ 检测到人物: {filename}")
                else:
                    print(f"✗ 未检测到人物: {filename}")
        
        print("\n" + "="*50)
        print("处理完成!")
        print(f"总共处理图片: {total_images}张")
        print(f"检测到包含人物的图片: {images_with_people}张")
        print(f"图片已保存到: {target_dir}")
    
    def main():
        # 设置路径
        current_dir = os.getcwd()
        target_dir = os.path.join(current_dir, "images_with_people")
        
        print(f"当前文件夹: {current_dir}")
        print(f"目标文件夹: {target_dir}")
        print("-" * 50)
        
        # 执行提取
        extract_images_with_people(current_dir, target_dir)
    
    if __name__ == "__main__":
        main()
    
    5. 运行脚本
    python extract_people_images.py
    
    6. 退出虚拟环境

    完成后,可以退出虚拟环境:

    其它说明:安装所需库(上面装完了可以不看这)
    # 升级pip(可选)
    python -m pip install --upgrade pip
    
    # 安装OpenCV(基础版本)
    python -m pip install opencv-python
    
    # 或者安装增强版本所需的库
    python -m pip install opencv-python torch ultralytics
    
    创建 requirements.txt 文件(可选)

    你可以创建一个依赖文件,方便以后重新安装:

    # 生成requirements.txt
    python -m pip freeze requirements.txt
    

    requirements.txt 内容示例:

    opencv-python==4.8.1.78
    numpy==1.24.3
    

    以后重新安装依赖:

    python -m pip install -r requirements.txt
    
    完整的项目结构建议
    your_project/
    ├── venv/                    # 虚拟环境(不要提交到版本控制)
    ├── extract_people_images.py # 主程序
    ├── requirements.txt         # 依赖列表
    └── images_with_people/      # 输出文件夹(程序自动创建)
    

    库装不上的其它操作

    python -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple –verbose

    中级检测:

    正常激活虚拟环境

    cd myenv  #即虚拟环境目录
    source myenv/bin/activate   # 进入虚拟环境(如果还没激活)
    pip install opencv-python    # 确保已安装所需库
    

    安装依赖的完整步骤

    # 1. 激活虚拟环境
    source myenv/bin/activate
    
    # 2. 安装依赖(如果网络慢可以使用清华镜像)
    python -m pip install torch torchvision ultralytics opencv-python
    
    # 或者使用国内镜像加速安装
    python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torchvision ultralytics opencv-python
    
    # 直接使用python命令运行,不需要执行权限
    python extract_people_images.py
    
    # 给脚本执行权限:
    chmod +x extract_people_images.py
    

    ##

    一、增强检测人物图片:

    使用YOLOv8模型进行更准确的人物检测,增强版人物图片检测

    模型说明

    • yolov8n.pt:最小最快,适合快速检测
    • yolov8s.pt:平衡速度和精度
    • yolov8m.pt:中等精度
    • yolov8l.pt:高精度
    • yolov8x.pt:最高精度,最慢

    特性

    1. 更准确的人物检测:YOLO可以检测各种姿势、大小的人物
    2. 可调置信度:根据需求调整检测敏感度
    3. 检测预览:可选保存带检测框的图片
    4. 详细统计:显示检测数量、置信度、处理时间等
    5. 错误处理:完善的异常处理,不会因为单张图片失败而停止
    6. 进度显示:实时显示处理进度

    这个增强版本比基础版本准确得多,特别是对于侧面、远处、遮挡的人物检测效果更好!

    完整的Python代码

    #!/usr/bin/env python3
    """
    增强版人物图片检测程序
    使用YOLOv8模型进行更准确的人物检测
    """
    
    import os
    import shutil
    import argparse
    from pathlib import Path
    import time
    
    def setup_environment():
        """检查并导入所需的库"""
        try:
            from ultralytics import YOLO
            import cv2
            return YOLO, cv2
        except ImportError as e:
            print("错误: 缺少必要的库")
            print("请安装以下依赖:")
            print("pip install torch torchvision ultralytics opencv-python")
            print("\n如果安装缓慢,可以使用清华镜像:")
            print("pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torchvision ultralytics opencv-python")
            return None, None
    
    def extract_images_with_people_enhanced(source_dir, target_dir, confidence_threshold=0.3, 
                                          model_size='yolov8n.pt', device='cpu', 
                                          save_detection_preview=False):
        """
        使用YOLO模型检测并提取包含人物的图片
        
        参数:
        source_dir: 源文件夹路径
        target_dir: 目标文件夹路径
        confidence_threshold: 置信度阈值(0.0-1.0),值越小检测越敏感
        model_size: 模型大小 ('yolov8n.pt', 'yolov8s.pt', 'yolov8m.pt', 'yolov8l.pt', 'yolov8x.pt')
        device: 运行设备 ('cpu' 或 'cuda')
        save_detection_preview: 是否保存带检测框的预览图
        """
        
        # 检查库是否可用
        YOLO, cv2 = setup_environment()
        if YOLO is None:
            return
        
        # 创建目标文件夹
        Path(target_dir).mkdir(parents=True, exist_ok=True)
        
        # 如果启用预览,创建预览文件夹
        preview_dir = None
        if save_detection_preview:
            preview_dir = os.path.join(target_dir, "detection_previews")
            Path(preview_dir).mkdir(parents=True, exist_ok=True)
        
        # 支持的图片格式
        supported_formats = ['.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.webp', '.JPG', '.JPEG', '.PNG']
        
        print("=" * 60)
        print("增强版人物图片检测程序")
        print("=" * 60)
        print(f"源文件夹: {source_dir}")
        print(f"目标文件夹: {target_dir}")
        print(f"模型: {model_size}")
        print(f"置信度阈值: {confidence_threshold}")
        print(f"设备: {device}")
        print(f"保存检测预览: {save_detection_preview}")
        print("-" * 60)
        
        try:
            # 加载YOLO模型(会自动下载如果不存在)
            print("正在加载YOLO模型...")
            start_time = time.time()
            model = YOLO(model_size)
            load_time = time.time() - start_time
            print(f"✓ 模型加载完成,耗时: {load_time:.2f}秒")
            
        except Exception as e:
            print(f"✗ 模型加载失败: {e}")
            print("请检查网络连接或手动下载模型")
            return
        
        # 统计信息
        total_images = 0
        images_with_people = 0
        processed_files = []
        detection_times = []
        
        print("\n开始扫描图片...")
        
        # 获取所有图片文件
        image_files = []
        for filename in os.listdir(source_dir):
            file_path = os.path.join(source_dir, filename)
            if os.path.isfile(file_path) and any(filename.lower().endswith(fmt) for fmt in supported_formats):
                image_files.append(filename)
        
        total_files = len(image_files)
        print(f"找到 {total_files} 张待处理图片")
        
        # 处理每张图片
        for i, filename in enumerate(image_files, 1):
            file_path = os.path.join(source_dir, filename)
            
            print(f"\n[{i}/{total_files}] 处理: {filename}")
            total_images += 1
            
            try:
                # 记录开始时间
                start_time = time.time()
                
                # 使用YOLO进行检测
                results = model(file_path, conf=confidence_threshold, device=device, verbose=False)
                detection_time = time.time() - start_time
                detection_times.append(detection_time)
                
                # 检查是否检测到人物(YOLO中person类的ID是0)
                has_people = False
                people_count = 0
                max_confidence = 0.0
                
                for result in results:
                    if result.boxes is not None and len(result.boxes) > 0:
                        for box in result.boxes:
                            class_id = int(box.cls)
                            confidence = float(box.conf)
                            
                            # class_id 0 对应 'person'
                            if class_id == 0:
                                has_people = True
                                people_count += 1
                                max_confidence = max(max_confidence, confidence)
                
                if has_people:
                    images_with_people += 1
                    
                    # 构建目标文件路径
                    target_path = os.path.join(target_dir, filename)
                    
                    # 处理重名文件
                    counter = 1
                    base_target_path = target_path
                    while os.path.exists(target_path):
                        name, ext = os.path.splitext(filename)
                        target_path = os.path.join(target_dir, f"{name}_{counter}{ext}")
                        counter += 1
                    
                    # 复制原图到目标文件夹
                    shutil.copy2(file_path, target_path)
                    
                    # 如果启用预览,保存带检测框的图片
                    if save_detection_preview and has_people:
                        try:
                            # 绘制检测结果
                            plotted_image = results[0].plot()
                            preview_filename = f"preview_{os.path.splitext(filename)[0]}.jpg"
                            preview_path = os.path.join(preview_dir, preview_filename)
                            cv2.imwrite(preview_path, plotted_image)
                        except Exception as e:
                            print(f"  警告: 无法保存检测预览图: {e}")
                    
                    print(f"  ✓ 检测到 {people_count} 个人物 (最高置信度: {max_confidence:.3f})")
                    print(f"  ✓ 检测时间: {detection_time:.2f}秒")
                    print(f"  ✓ 已复制到: {os.path.basename(target_path)}")
                    
                    processed_files.append({
                        'filename': filename,
                        'people_count': people_count,
                        'max_confidence': max_confidence,
                        'detection_time': detection_time
                    })
                    
                else:
                    print(f"  ✗ 未检测到人物 (检测时间: {detection_time:.2f}秒)")
                    
            except Exception as e:
                print(f"  ✗ 处理图片时出错: {e}")
                continue
        
        # 输出统计信息
        print("\n" + "=" * 60)
        print("处理完成!")
        print("=" * 60)
        
        if total_images > 0:
            print(f"总共处理图片: {total_images}张")
            print(f"检测到包含人物的图片: {images_with_people}张")
            print(f"检测率: {(images_with_people/total_images*100):.1f}%")
            
            if detection_times:
                avg_detection_time = sum(detection_times) / len(detection_times)
                print(f"平均检测时间: {avg_detection_time:.2f}秒/张")
                print(f"总检测时间: {sum(detection_times):.2f}秒")
            
            if images_with_people > 0:
                print(f"\n包含人物的图片已保存到: {target_dir}")
                if save_detection_preview:
                    print(f"检测预览图已保存到: {preview_dir}")
                
                # 显示检测到最多人物的前几张图片
                if processed_files:
                    processed_files.sort(key=lambda x: x['people_count'], reverse=True)
                    print(f"\n检测结果最好的图片:")
                    for i, file_info in enumerate(processed_files[:3]):
                        print(f"  {i+1}. {file_info['filename']} - {file_info['people_count']}人 "
                              f"(置信度: {file_info['max_confidence']:.3f})")
        else:
            print("未找到任何可处理的图片文件")
    
    def main():
        """主函数"""
        parser = argparse.ArgumentParser(description='增强版人物图片检测程序')
        parser.add_argument('--source', '-s', default='.', 
                           help='源文件夹路径 (默认: 当前文件夹)')
        parser.add_argument('--target', '-t', default='images_with_people',
                           help='目标文件夹路径 (默认: images_with_people)')
        parser.add_argument('--confidence', '-c', type=float, default=0.3,
                           help='检测置信度阈值 (0.0-1.0, 默认: 0.3)')
        parser.add_argument('--model', '-m', default='yolov8n.pt',
                           choices=['yolov8n.pt', 'yolov8s.pt', 'yolov8m.pt', 'yolov8l.pt', 'yolov8x.pt'],
                           help='YOLO模型大小 (默认: yolov8n.pt)')
        parser.add_argument('--device', '-d', default='cpu',
                           choices=['cpu', 'cuda'],
                           help='运行设备 (默认: cpu)')
        parser.add_argument('--preview', '-p', action='store_true',
                           help='保存带检测框的预览图')
        
        args = parser.parse_args()
        
        # 检查源文件夹是否存在
        if not os.path.exists(args.source):
            print(f"错误: 源文件夹 '{args.source}' 不存在")
            return
        
        # 运行检测程序
        extract_images_with_people_enhanced(
            source_dir=args.source,
            target_dir=args.target,
            confidence_threshold=args.confidence,
            model_size=args.model,
            device=args.device,
            save_detection_preview=args.preview
        )
    
    # 简化版本函数(不需要命令行参数)
    def simple_extract():
        """简化版本,使用默认参数"""
        source_dir = os.getcwd()  # 当前文件夹
        target_dir = os.path.join(source_dir, "images_with_people")
        
        print("使用简化模式运行...")
        extract_images_with_people_enhanced(source_dir, target_dir)
    
    if __name__ == "__main__":
        # 如果没有命令行参数,使用简化版本
        import sys
        if len(sys.argv) == 1:
            simple_extract()
        else:
            main()
    

    步骤1:保存文件

    在nano编辑器中:

    • Ctrl+X退出
    • Y确认保存
    • Enter确认文件名

    步骤2:运行程序

    python extract_people_images_enhanced_copy.py
    

    方法2:使用命令行参数

    # 基本使用
    python extract_people_images_enhanced_copy.py --source /path/to/images --target ./output
    
    # 调整检测敏感度(值越小越敏感)
    python extract_people_images_enhanced_copy.py --confidence 0.2
    
    # 使用更大的模型(更准确但更慢)
    python extract_people_images_enhanced_copy.py --model yolov8s.pt
    
    # 保存检测预览图
    python extract_people_images_enhanced_copy.py --preview
    
    # 使用GPU加速(如果有NVIDIA显卡)
    python extract_people_images_enhanced_copy.py --device cuda
    
    # 查看所有选项
    python extract_people_images_enhanced_copy.py --help
    

    如果还是有问题,使用这个简单版本:

    # 先删除所有有问题的文件
    rm -f *.py
    
    # 创建简单版本
    cat > simple_detection.py << 'EOF'
    import os
    import shutil
    import cv2
    from pathlib import Path
    
    def detect_people():
        print("开始检测人物图片...")
        
        # 检查OpenCV
        try:
            face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
        except:
            print("请先安装OpenCV: pip install opencv-python")
            return
        
        # 创建目标文件夹
        target_dir = "images_with_people"
        Path(target_dir).mkdir(exist_ok=True)
        
        # 支持的图片格式
        formats = ['.jpg', '.jpeg', '.png']
        count = 0
        
        for filename in os.listdir('.'):
            if any(filename.lower().endswith(fmt) for fmt in formats):
                print(f"处理: {filename}")
                img = cv2.imread(filename)
                if img is not None:
                    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                    faces = face_cascade.detectMultiScale(gray, 1.1, 5)
                    if len(faces) > 0:
                        shutil.copy2(filename, os.path.join(target_dir, filename))
                        print(f"✓ 检测到人物")
                        count += 1
                    else:
                        print(f"✗ 未检测到人物")
        
        print(f"\n完成! 找到 {count} 张包含人物的图片")
    
    if __name__ == "__main__":
        detect_people()
    EOF
    
    # 运行简单版本
    python simple_detection.py
    

    请按照步骤1-4操作,应该能解决问题!

    二、增强检测人物图片(自定义文件夹):

    这个版本实现了把检测到的图片直接移动到新的文件夹而不是复制,也可以通过后面的加参数定义移动或者复制。

    主要修改 shutil.copy2()shutil.move()

    #!/usr/bin/env python3
    """
    增强版人物图片检测程序(移动版本)
    使用YOLOv8模型进行更准确的人物检测,并将图片移动到新文件夹
    """
    
    import os
    import shutil
    import argparse
    from pathlib import Path
    import time
    
    def setup_environment():
        """检查并导入所需的库"""
        try:
            from ultralytics import YOLO
            import cv2
            return YOLO, cv2
        except ImportError as e:
            print("错误: 缺少必要的库")
            print("请安装以下依赖:")
            print("pip install torch torchvision ultralytics opencv-python")
            print("\n如果安装缓慢,可以使用清华镜像:")
            print("pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torchvision ultralytics opencv-python")
            return None, None
    
    def extract_images_with_people_enhanced(source_dir, target_dir, confidence_threshold=0.3, 
                                          model_size='yolov8n.pt', device='cpu', 
                                          save_detection_preview=False, move_instead_of_copy=True):
        """
        使用YOLO模型检测并移动包含人物的图片
        
        参数:
        source_dir: 源文件夹路径
        target_dir: 目标文件夹路径
        confidence_threshold: 置信度阈值(0.0-1.0),值越小检测越敏感
        model_size: 模型大小 ('yolov8n.pt', 'yolov8s.pt', 'yolov8m.pt', 'yolov8l.pt', 'yolov8x.pt')
        device: 运行设备 ('cpu' 或 'cuda')
        save_detection_preview: 是否保存带检测框的预览图
        move_instead_of_copy: 是否移动而不是复制图片
        """
        
        # 检查库是否可用
        YOLO, cv2 = setup_environment()
        if YOLO is None:
            return
        
        # 创建目标文件夹
        Path(target_dir).mkdir(parents=True, exist_ok=True)
        
        # 如果启用预览,创建预览文件夹
        preview_dir = None
        if save_detection_preview:
            preview_dir = os.path.join(target_dir, "detection_previews")
            Path(preview_dir).mkdir(parents=True, exist_ok=True)
        
        # 支持的图片格式
        supported_formats = ['.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.webp', '.JPG', '.JPEG', '.PNG']
        
        print("=" * 60)
        print("增强版人物图片检测程序(移动版本)")
        print("=" * 60)
        print(f"源文件夹: {source_dir}")
        print(f"目标文件夹: {target_dir}")
        print(f"操作模式: {'移动' if move_instead_of_copy else '复制'}")
        print(f"模型: {model_size}")
        print(f"置信度阈值: {confidence_threshold}")
        print(f"设备: {device}")
        print(f"保存检测预览: {save_detection_preview}")
        print("-" * 60)
        
        # 警告信息
        if move_instead_of_copy:
            print("⚠️  警告: 此操作将移动图片文件,原文件夹中的图片将被删除!")
            response = input("是否继续?(y/N): ")
            if response.lower() != 'y':
                print("操作已取消")
                return
        
        try:
            # 加载YOLO模型(会自动下载如果不存在)
            print("正在加载YOLO模型...")
            start_time = time.time()
            model = YOLO(model_size)
            load_time = time.time() - start_time
            print(f"✓ 模型加载完成,耗时: {load_time:.2f}秒")
            
        except Exception as e:
            print(f"✗ 模型加载失败: {e}")
            print("请检查网络连接或手动下载模型")
            return
        
        # 统计信息
        total_images = 0
        images_with_people = 0
        processed_files = []
        detection_times = []
        
        print("\n开始扫描图片...")
        
        # 获取所有图片文件
        image_files = []
        for filename in os.listdir(source_dir):
            file_path = os.path.join(source_dir, filename)
            if os.path.isfile(file_path) and any(filename.lower().endswith(fmt) for fmt in supported_formats):
                image_files.append(filename)
        
        total_files = len(image_files)
        print(f"找到 {total_files} 张待处理图片")
        
        # 处理每张图片
        for i, filename in enumerate(image_files, 1):
            file_path = os.path.join(source_dir, filename)
            
            print(f"\n[{i}/{total_files}] 处理: {filename}")
            total_images += 1
            
            try:
                # 记录开始时间
                start_time = time.time()
                
                # 使用YOLO进行检测
                results = model(file_path, conf=confidence_threshold, device=device, verbose=False)
                detection_time = time.time() - start_time
                detection_times.append(detection_time)
                
                # 检查是否检测到人物(YOLO中person类的ID是0)
                has_people = False
                people_count = 0
                max_confidence = 0.0
                
                for result in results:
                    if result.boxes is not None and len(result.boxes) > 0:
                        for box in result.boxes:
                            class_id = int(box.cls)
                            confidence = float(box.conf)
                            
                            # class_id 0 对应 'person'
                            if class_id == 0:
                                has_people = True
                                people_count += 1
                                max_confidence = max(max_confidence, confidence)
                
                if has_people:
                    images_with_people += 1
                    
                    # 构建目标文件路径
                    target_path = os.path.join(target_dir, filename)
                    
                    # 处理重名文件
                    counter = 1
                    base_target_path = target_path
                    while os.path.exists(target_path):
                        name, ext = os.path.splitext(filename)
                        target_path = os.path.join(target_dir, f"{name}_{counter}{ext}")
                        counter += 1
                    
                    # 移动或复制文件到目标文件夹
                    if move_instead_of_copy:
                        shutil.move(file_path, target_path)
                        operation_text = "移动"
                    else:
                        shutil.copy2(file_path, target_path)
                        operation_text = "复制"
                    
                    # 如果启用预览,保存带检测框的图片
                    if save_detection_preview and has_people:
                        try:
                            # 重新读取图片用于预览(如果是移动操作,需要重新加载)
                            if move_instead_of_copy:
                                preview_source_path = target_path
                            else:
                                preview_source_path = file_path
                                
                            preview_results = model(preview_source_path, conf=confidence_threshold, device=device, verbose=False)
                            plotted_image = preview_results[0].plot()
                            preview_filename = f"preview_{os.path.splitext(filename)[0]}.jpg"
                            preview_path = os.path.join(preview_dir, preview_filename)
                            cv2.imwrite(preview_path, plotted_image)
                        except Exception as e:
                            print(f"  警告: 无法保存检测预览图: {e}")
                    
                    print(f"  ✓ 检测到 {people_count} 个人物 (最高置信度: {max_confidence:.3f})")
                    print(f"  ✓ 检测时间: {detection_time:.2f}秒")
                    print(f"  ✓ 已{operation_text}到: {os.path.basename(target_path)}")
                    
                    processed_files.append({
                        'filename': filename,
                        'people_count': people_count,
                        'max_confidence': max_confidence,
                        'detection_time': detection_time,
                        'operation': operation_text
                    })
                    
                else:
                    print(f"  ✗ 未检测到人物 (检测时间: {detection_time:.2f}秒)")
                    
            except Exception as e:
                print(f"  ✗ 处理图片时出错: {e}")
                continue
        
        # 输出统计信息
        print("\n" + "=" * 60)
        print("处理完成!")
        print("=" * 60)
        
        if total_images > 0:
            print(f"总共处理图片: {total_images}张")
            print(f"检测到包含人物的图片: {images_with_people}张")
            print(f"检测率: {(images_with_people/total_images*100):.1f}%")
            
            if detection_times:
                avg_detection_time = sum(detection_times) / len(detection_times)
                print(f"平均检测时间: {avg_detection_time:.2f}秒/张")
                print(f"总检测时间: {sum(detection_times):.2f}秒")
            
            if images_with_people > 0:
                operation_mode = "移动" if move_instead_of_copy else "复制"
                print(f"\n包含人物的图片已{operation_mode}到: {target_dir}")
                if save_detection_preview:
                    print(f"检测预览图已保存到: {preview_dir}")
                
                # 显示检测到最多人物的前几张图片
                if processed_files:
                    processed_files.sort(key=lambda x: x['people_count'], reverse=True)
                    print(f"\n检测结果最好的图片:")
                    for i, file_info in enumerate(processed_files[:3]):
                        print(f"  {i+1}. {file_info['filename']} - {file_info['people_count']}人 "
                              f"(置信度: {file_info['max_confidence']:.3f})")
                    
                # 安全提示
                if move_instead_of_copy:
                    remaining_files = len([f for f in os.listdir(source_dir) 
                                         if any(f.lower().endswith(fmt) for fmt in supported_formats)])
                    print(f"\n⚠️  原文件夹剩余图片: {remaining_files}张")
                    print("⚠️  检测到的图片已被移动到目标文件夹,原文件已删除")
        else:
            print("未找到任何可处理的图片文件")
    
    def main():
        """主函数"""
        parser = argparse.ArgumentParser(description='增强版人物图片检测程序(移动版本)')
        parser.add_argument('--source', '-s', default='.', 
                           help='源文件夹路径 (默认: 当前文件夹)')
        parser.add_argument('--target', '-t', default='images_with_people',
                           help='目标文件夹路径 (默认: images_with_people)')
        parser.add_argument('--confidence', '-c', type=float, default=0.3,
                           help='检测置信度阈值 (0.0-1.0, 默认: 0.3)')
        parser.add_argument('--model', '-m', default='yolov8n.pt',
                           choices=['yolov8n.pt', 'yolov8s.pt', 'yolov8m.pt', 'yolov8l.pt', 'yolov8x.pt'],
                           help='YOLO模型大小 (默认: yolov8n.pt)')
        parser.add_argument('--device', '-d', default='cpu',
                           choices=['cpu', 'cuda'],
                           help='运行设备 (默认: cpu)')
        parser.add_argument('--preview', '-p', action='store_true',
                           help='保存带检测框的预览图')
        parser.add_argument('--copy', action='store_true',
                           help='使用复制模式而不是移动模式')
        
        args = parser.parse_args()
        
        # 检查源文件夹是否存在
        if not os.path.exists(args.source):
            print(f"错误: 源文件夹 '{args.source}' 不存在")
            return
        
        # 运行检测程序
        extract_images_with_people_enhanced(
            source_dir=args.source,
            target_dir=args.target,
            confidence_threshold=args.confidence,
            model_size=args.model,
            device=args.device,
            save_detection_preview=args.preview,
            move_instead_of_copy=not args.copy  # 如果指定--copy则使用复制模式
        )
    
    # 简化版本函数(不需要命令行参数)
    def simple_extract():
        """简化版本,使用默认参数(移动模式)"""
        source_dir = os.getcwd()  # 当前文件夹
        target_dir = os.path.join(source_dir, "images_with_people")
        
        print("使用简化模式运行(移动模式)...")
        print("此操作将把检测到人物的图片移动到新文件夹!")
        
        response = input("是否继续?(y/N): ")
        if response.lower() != 'y':
            print("操作已取消")
            return
        
        extract_images_with_people_enhanced(source_dir, target_dir, move_instead_of_copy=True)
    
    if __name__ == "__main__":
        # 如果没有命令行参数,使用简化版本
        import sys
        if len(sys.argv) == 1:
            simple_extract()
        else:
            main()
    

    主要修改内容:

    1. shutil.copy2()改为 shutil.move()
    2. 添加了移动模式的安全确认,避免误操作
    3. 增加了 move_instead_of_copy参数,可以控制是移动还是复制
    4. 添加了 --copy命令行参数,如果需要复制模式可以加上这个参数
    5. 改进了预览图生成逻辑,适应移动操作
    6. 增加了操作完成后的统计信息,显示剩余文件数量

    使用方法:

    移动模式(默认):

    # 简单使用(移动图片)
    python extract_people_images_enhanced_move.py
    
    # 带参数使用
    python extract_people_images_enhanced_move.py --source ./图片文件夹 --target ./人物图片
    

    复制模式(如果需要保留原文件):

    # 使用复制模式
    python extract_people_images_enhanced_move.py --copy
    
    # 带预览的复制模式
    python extract_people_images_enhanced_move.py --copy --preview
    

    其他参数:

    # 调整检测敏感度
    python extract_people_images_enhanced_move.py --confidence 0.2
    
    # 使用更大的模型
    python extract_people_images_enhanced_move.py --model yolov8s.pt
    
    # 保存检测预览图
    python extract_people_images_enhanced_move.py --preview
    

    安全特性:

    1. 运行前确认:移动模式会要求用户确认
    2. 进度显示:实时显示处理进度
    3. 结果统计:完成后显示移动/复制的文件数量
    4. 剩余文件提示:显示原文件夹剩余图片数量

    这样修改后,检测到人物的图片会被直接移动到目标文件夹,原文件会被删除,节省磁盘空间。如果你需要保留原文件,使用 --copy参数即可。

    高级检测:

    方案1:基于YOLO的人体部位检测

    专门检测女性人体暴露或色情内容。这里有几个不同级别的实现方案:

    #!/usr/bin/env python3
    """
    女性人体暴露/色情图片检测程序
    使用YOLO模型检测暴露的身体部位
    """
    
    import os
    import shutil
    import argparse
    from pathlib import Path
    import time
    
    def setup_environment():
        """检查并导入所需的库"""
        try:
            from ultralytics import YOLO
            import cv2
            return YOLO, cv2
        except ImportError as e:
            print("错误: 缺少必要的库")
            print("请安装以下依赖:")
            print("pip install torch torchvision ultralytics opencv-python")
            return None, None
    
    class NudityDetector:
        """暴露内容检测器"""
        
        def __init__(self, confidence_threshold=0.3):
            self.confidence_threshold = confidence_threshold
            # 定义敏感部位类别(基于COCO数据集)
            self.sensitive_parts = {
                'person': 0,      # 人物
                'face': 1,        # 脸部(某些数据集有)
            }
            
            # 定义暴露风险等级的关键词(用于文件名和路径分析)
            self.risky_keywords = [
                'nude', 'naked', 'bikini', 'swimsuit', 'lingerie', 'sexy', 'hot',
                '暴露', '性感', '内衣', '比基尼', '泳装', '裸体', '色情'
            ]
        
        def detect_exposure_level(self, results, filename=""):
            """
            检测图片的暴露等级
            返回: (暴露等级, 置信度, 检测到的部位)
            """
            exposure_level = 0  # 0: 安全, 1: 轻度, 2: 中度, 3: 高度暴露
            max_confidence = 0
            detected_parts = []
            
            for result in results:
                if result.boxes is not None and len(result.boxes) > 0:
                    for box in result.boxes:
                        class_id = int(box.cls)
                        confidence = float(box.conf)
                        
                        # 检测人物
                        if class_id == 0:  # person
                            detected_parts.append('person')
                            max_confidence = max(max_confidence, confidence)
                            
                            # 如果有高置信度的人物检测,基础暴露等级为1
                            if confidence > 0.5:
                                exposure_level = max(exposure_level, 1)
            
            # 基于文件名分析
            filename_risk = self.analyze_filename_risk(filename.lower())
            exposure_level = max(exposure_level, filename_risk)
            
            return exposure_level, max_confidence, detected_parts
        
        def analyze_filename_risk(self, filename):
            """分析文件名的风险等级"""
            risk_level = 0
            for keyword in self.risky_keywords:
                if keyword in filename:
                    if keyword in ['nude', 'naked', '裸体', '色情']:
                        risk_level = max(risk_level, 3)
                    elif keyword in ['bikini', 'swimsuit', 'lingerie', '比基尼', '泳装', '内衣']:
                        risk_level = max(risk_level, 2)
                    else:
                        risk_level = max(risk_level, 1)
            return risk_level
        
        def analyze_skin_ratio(self, image_path):
            """简单的肤色比例分析(基础版本)"""
            try:
                import cv2
                import numpy as np
                
                # 读取图片
                img = cv2.imread(image_path)
                if img is None:
                    return 0
                    
                # 转换到HSV颜色空间进行肤色检测
                hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
                
                # 定义肤色范围(需要根据实际情况调整)
                lower_skin = np.array([0, 20, 70], dtype=np.uint8)
                upper_skin = np.array([20, 255, 255], dtype=np.uint8)
                
                # 创建肤色掩码
                mask = cv2.inRange(hsv, lower_skin, upper_skin)
                
                # 计算肤色像素比例
                skin_ratio = np.sum(mask > 0) / (img.shape[0] * img.shape[1])
                
                return skin_ratio
                
            except Exception as e:
                print(f"肤色分析错误: {e}")
                return 0
    
    def extract_sensitive_images(source_dir, target_dir, confidence_threshold=0.3, 
                               model_size='yolov8n.pt', device='cpu', 
                               save_detection_preview=False, move_instead_of_copy=True,
                               min_exposure_level=1):
        """
        检测并提取敏感图片
        
        参数:
        source_dir: 源文件夹路径
        target_dir: 目标文件夹路径
        confidence_threshold: 置信度阈值
        model_size: 模型大小
        device: 运行设备
        save_detection_preview: 是否保存检测预览
        move_instead_of_copy: 是否移动文件
        min_exposure_level: 最小暴露等级 (1-3)
        """
        
        # 检查库是否可用
        YOLO, cv2 = setup_environment()
        if YOLO is None:
            return
        
        # 创建目标文件夹
        Path(target_dir).mkdir(parents=True, exist_ok=True)
        
        # 按暴露等级创建子文件夹
        level_folders = {
            1: os.path.join(target_dir, "level1_mild"),
            2: os.path.join(target_dir, "level2_moderate"),
            3: os.path.join(target_dir, "level3_high")
        }
        
        for folder in level_folders.values():
            Path(folder).mkdir(parents=True, exist_ok=True)
        
        # 如果启用预览,创建预览文件夹
        preview_dir = None
        if save_detection_preview:
            preview_dir = os.path.join(target_dir, "detection_previews")
            Path(preview_dir).mkdir(parents=True, exist_ok=True)
        
        # 支持的图片格式
        supported_formats = ['.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.webp']
        
        print("=" * 70)
        print("女性人体暴露/色情图片检测程序")
        print("=" * 70)
        print(f"源文件夹: {source_dir}")
        print(f"目标文件夹: {target_dir}")
        print(f"操作模式: {'移动' if move_instead_of_copy else '复制'}")
        print(f"最小暴露等级: {min_exposure_level}")
        print(f"模型: {model_size}")
        print(f"置信度阈值: {confidence_threshold}")
        print("-" * 70)
        
        # 警告信息
        if move_instead_of_copy:
            print("⚠️  警告: 此操作将移动图片文件!")
            response = input("是否继续?(y/N): ")
            if response.lower() != 'y':
                print("操作已取消")
                return
        
        # 初始化检测器
        detector = NudityDetector(confidence_threshold)
        
        try:
            # 加载YOLO模型
            print("正在加载YOLO模型...")
            start_time = time.time()
            model = YOLO(model_size)
            load_time = time.time() - start_time
            print(f"✓ 模型加载完成,耗时: {load_time:.2f}秒")
            
        except Exception as e:
            print(f"✗ 模型加载失败: {e}")
            return
        
        # 统计信息
        total_images = 0
        detected_images = 0
        level_stats = {1: 0, 2: 0, 3: 0}
        processed_files = []
        detection_times = []
        
        print("\n开始扫描图片...")
        
        # 获取所有图片文件
        image_files = []
        for filename in os.listdir(source_dir):
            file_path = os.path.join(source_dir, filename)
            if os.path.isfile(file_path) and any(filename.lower().endswith(fmt) for fmt in supported_formats):
                image_files.append(filename)
        
        total_files = len(image_files)
        print(f"找到 {total_files} 张待处理图片")
        
        # 处理每张图片
        for i, filename in enumerate(image_files, 1):
            file_path = os.path.join(source_dir, filename)
            
            print(f"\n[{i}/{total_files}] 分析: {filename}")
            total_images += 1
            
            try:
                start_time = time.time()
                
                # 使用YOLO进行检测
                results = model(file_path, conf=confidence_threshold, device=device, verbose=False)
                detection_time = time.time() - start_time
                detection_times.append(detection_time)
                
                # 检测暴露等级
                exposure_level, max_confidence, detected_parts = detector.detect_exposure_level(results, filename)
                
                # 简单的肤色比例分析
                skin_ratio = detector.analyze_skin_ratio(file_path)
                if skin_ratio > 0.3:  # 如果肤色比例较高,提高暴露等级
                    exposure_level = max(exposure_level, 2)
                
                if exposure_level >= min_exposure_level:
                    detected_images += 1
                    level_stats[exposure_level] = level_stats.get(exposure_level, 0) + 1
                    
                    # 确定目标文件夹
                    target_level_folder = level_folders.get(exposure_level, target_dir)
                    
                    # 构建目标文件路径
                    target_path = os.path.join(target_level_folder, filename)
                    
                    # 处理重名文件
                    counter = 1
                    while os.path.exists(target_path):
                        name, ext = os.path.splitext(filename)
                        target_path = os.path.join(target_level_folder, f"{name}_{counter}{ext}")
                        counter += 1
                    
                    # 移动或复制文件
                    if move_instead_of_copy:
                        shutil.move(file_path, target_path)
                        operation_text = "移动"
                    else:
                        shutil.copy2(file_path, target_path)
                        operation_text = "复制"
                    
                    # 保存检测预览
                    if save_detection_preview:
                        try:
                            preview_results = model(target_path if move_instead_of_copy else file_path, 
                                                  conf=confidence_threshold, device=device, verbose=False)
                            plotted_image = preview_results[0].plot()
                            preview_filename = f"L{exposure_level}_preview_{os.path.splitext(filename)[0]}.jpg"
                            preview_path = os.path.join(preview_dir, preview_filename)
                            cv2.imwrite(preview_path, plotted_image)
                        except Exception as e:
                            print(f"  警告: 无法保存检测预览图: {e}")
                    
                    # 暴露等级描述
                    level_descriptions = {
                        1: "轻度暴露",
                        2: "中度暴露", 
                        3: "高度暴露"
                    }
                    
                    print(f"  ✓ 检测结果: {level_descriptions.get(exposure_level, '未知')} (等级{exposure_level})")
                    print(f"  ✓ 肤色比例: {skin_ratio:.3f}")
                    print(f"  ✓ 检测部位: {', '.join(detected_parts) if detected_parts else '无'}")
                    print(f"  ✓ 检测时间: {detection_time:.2f}秒")
                    print(f"  ✓ 已{operation_text}到: level{exposure_level}/{os.path.basename(target_path)}")
                    
                    processed_files.append({
                        'filename': filename,
                        'exposure_level': exposure_level,
                        'skin_ratio': skin_ratio,
                        'detected_parts': detected_parts,
                        'detection_time': detection_time,
                        'operation': operation_text
                    })
                    
                else:
                    print(f"  ✗ 安全图片 (暴露等级: {exposure_level}, 检测时间: {detection_time:.2f}秒)")
                    
            except Exception as e:
                print(f"  ✗ 处理图片时出错: {e}")
                continue
        
        # 输出统计信息
        print("\n" + "=" * 70)
        print("检测完成!")
        print("=" * 70)
        
        if total_images > 0:
            print(f"总共处理图片: {total_images}张")
            print(f"检测到敏感图片: {detected_images}张")
            print(f"检测率: {(detected_images/total_images*100):.1f}%")
            
            print(f"\n暴露等级分布:")
            for level, count in level_stats.items():
                if count > 0:
                    level_desc = {1: "轻度暴露", 2: "中度暴露", 3: "高度暴露"}.get(level, "未知")
                    print(f"  等级{level} ({level_desc}): {count}张")
            
            if detected_images > 0:
                operation_mode = "移动" if move_instead_of_copy else "复制"
                print(f"\n敏感图片已{operation_mode}到对应等级的文件夹")
                
                # 显示检测结果
                if processed_files:
                    processed_files.sort(key=lambda x: x['exposure_level'], reverse=True)
                    print(f"\n风险最高的图片:")
                    for i, file_info in enumerate(processed_files[:5]):
                        print(f"  {i+1}. {file_info['filename']} - 等级{file_info['exposure_level']} "
                              f"(肤色比例: {file_info['skin_ratio']:.3f})")
        else:
            print("未找到任何可处理的图片文件")
    
    def main():
        """主函数"""
        parser = argparse.ArgumentParser(description='女性人体暴露/色情图片检测程序')
        parser.add_argument('--source', '-s', default='.', 
                           help='源文件夹路径 (默认: 当前文件夹)')
        parser.add_argument('--target', '-t', default='sensitive_images',
                           help='目标文件夹路径 (默认: sensitive_images)')
        parser.add_argument('--confidence', '-c', type=float, default=0.3,
                           help='检测置信度阈值 (0.0-1.0, 默认: 0.3)')
        parser.add_argument('--model', '-m', default='yolov8n.pt',
                           choices=['yolov8n.pt', 'yolov8s.pt', 'yolov8m.pt', 'yolov8l.pt', 'yolov8x.pt'],
                           help='YOLO模型大小 (默认: yolov8n.pt)')
        parser.add_argument('--device', '-d', default='cpu',
                           choices=['cpu', 'cuda'],
                           help='运行设备 (默认: cpu)')
        parser.add_argument('--preview', '-p', action='store_true',
                           help='保存带检测框的预览图')
        parser.add_argument('--copy', action='store_true',
                           help='使用复制模式而不是移动模式')
        parser.add_argument('--level', type=int, default=1, choices=[1, 2, 3],
                           help='最小暴露等级 (1:轻度, 2:中度, 3:高度, 默认: 1)')
        
        args = parser.parse_args()
        
        if not os.path.exists(args.source):
            print(f"错误: 源文件夹 '{args.source}' 不存在")
            return
        
        extract_sensitive_images(
            source_dir=args.source,
            target_dir=args.target,
            confidence_threshold=args.confidence,
            model_size=args.model,
            device=args.device,
            save_detection_preview=args.preview,
            move_instead_of_copy=not args.copy,
            min_exposure_level=args.level
        )
    
    if __name__ == "__main__":
        import sys
        if len(sys.argv) == 1:
            # 简化模式运行
            source_dir = os.getcwd()
            target_dir = os.path.join(source_dir, "sensitive_images")
            
            print("女性人体暴露图片检测程序")
            print("此操作将检测并分类暴露程度的图片!")
            
            response = input("是否继续?(y/N): ")
            if response.lower() == 'y':
                extract_sensitive_images(source_dir, target_dir, move_instead_of_copy=True)
            else:
                print("操作已取消")
        else:
            main()
    

    方案2:使用专门的NSFW检测模型

    如果需要更准确的结果,可以使用专门的NSFW检测模型:

    # 需要额外安装的库
    # pip install tensorflow keras
    
    def setup_nsfw_detector():
        """设置专门的NSFW检测器"""
        try:
            # 这里可以使用预训练的NSFW检测模型
            # 例如: https://github.com/rockyzhengwu/nsfw
            print("正在加载NSFW检测模型...")
            # 实际实现需要下载预训练模型
            return None
        except ImportError:
            print("请安装TensorFlow: pip install tensorflow")
            return None
    

    使用方法:

    # 基本使用(移动模式,检测所有暴露等级)
    python sensitive_detector.py
    
    # 只检测高度暴露的图片
    python sensitive_detector.py --level 3
    
    # 复制模式(保留原文件)
    python sensitive_detector.py --copy
    
    # 指定源文件夹和目标文件夹
    python sensitive_detector.py --source ./图片库 --target ./敏感图片
    
    # 保存检测预览
    python sensitive_detector.py --preview
    
    # 使用更准确的模型
    python sensitive_detector.py --model yolov8s.pt
    

    暴露等级说明:

    • 等级1(轻度): 检测到人物,可能有轻微暴露
    • 等级2(中度): 检测到较多肤色区域或敏感关键词
    • 等级3(高度): 高度暴露内容,包含大量肤色区域或明确敏感内容

    注意事项:

    1. 准确率限制: 这种检测方法有一定误判率
    2. 隐私保护: 请确保合法使用,尊重他人隐私
    3. 法律合规: 在不同地区使用此类工具可能受到法律限制
    4. 人工审核: 建议最终结果由人工审核确认

    这个程序会按暴露程度将图片分类到不同的文件夹,方便你进一步处理。

    正确的运行方法:

    方法1:直接运行Python脚本

    # 进入脚本所在目录
    cd /home/leepoet/Documents/env/myenv/甜心
    
    # 直接运行Python脚本
    python 女性人体暴露.py
    

    方法2:给脚本添加执行权限后直接运行

    # 进入脚本所在目录
    cd /home/leepoet/Documents/env/myenv/甜心
    
    # 给脚本添加执行权限
    chmod +x 女性人体暴露.py
    
    # 直接运行脚本
    ./女性人体暴露.py
    

    设置自定义检测路径

    你可以通过命令行参数灵活指定源文件夹和目标文件夹:

    # 检测指定文件夹,结果保存到自定义目录
    python your_script.py --source /path/to/your/images --target /path/to/output

    # 完整参数示例
    python your_script.py --source /home/user/photos --target /home/user/sorted_photos --confidence 0.5 --model yolov8s.pt --preview --copy

    4. 关键参数说明

    • --source: 指定需要检测的图片文件夹路径
    • --target: 指定结果输出文件夹路径
    • --confidence: 调整检测灵敏度(0.1-1.0)
    • --model: 选择不同的YOLO模型(影响精度和速度)
    • --preview: 保存带检测框的预览图
    • --copy: 使用复制模式(默认是移动文件)
  • Stable Diffusion提示词全攻略:从基础到精通的完整指南

    Stable Diffusion提示词全攻略:从基础到精通的完整指南

    Stable Diffusion作为当前最受欢迎的AI绘画工具之一,其核心秘密就在于“提示词”的运用。本文基于详细的思维导图,为您全面解析SD提示词的使用技巧,帮助您精准实现创作意图。提示词是用户与Stable Diffusion模型之间起着“契约”的作用。通过精确的描述与灵活的控制方式,它们能够将抽象的概念转化为具体的图像;同时还能在保证生成结果多样性的同时,确保这些结果的可控性。

    1. 提示词基础原理:与AI沟通的“语法规则”​

    这部分是地基,理解了原理才能避免低级错误。

    • ​逗号分隔与换行​​:SD的模型无法像人类一样理解自然语言的句子结构。它依赖于分隔符(逗号)来切分不同的“概念单元”。换行加逗号是为了编写时的可读性,最终对模型来说,和写在一行没有区别。
    • ​权重与顺序​​:这是核心原理。排在越前面的提示词,AI在生成初期会给予越多的“关注度”,对画面整体构图和主体的影响越大。因此,​​最重要的元素(如主体、画风)应放在前面​​。所谓“每个词默认权重为1”,是一个便于理解权重调整功能的基准概念。
    • ​75个单词以内​​:这是一个经验值。提示词并非越多越好。过多的提示词会相互干扰,导致AI无法聚焦,可能生成混乱的图像。精益求精、突出重点比堆砌关键词更有效。

    ​2. 提示词的各种符号:微调控制的“秘密武器”​

    符号系统是SD提示词的精髓,让你从“描述内容”升级为“导演画面”。

    • ​小括号 ( )和大括号 { }​:都是增加权重。(keyword)或 {keyword}相当于 (keyword:1.1)。多层括号可以叠加,如 ((keyword))≈ 1.21倍。大括号增加幅度更小,用于精细调整。​​直接指定权重 (keyword:1.5)是最高效、最常用的方式​​,例如 (masterpiece:1.4)
    • ​中括号 [ ]​:用于降低权重,例如让某个过于突出的背景元素淡化一些。在实战中,​​更常见的用法是将不希望出现的元素放在负面提示词中​​,而非降低正面提示词的权重。
    • ​核心价值​​:权重系统允许你强调核心主体、平衡画面元素。例如,生成一个戴红帽子的女孩,如果帽子不明显,可以改为 (red hat:1.3)

    ​3. 进阶语法:时间控制的“高级魔法”​

    这是更高阶的技巧,能实现一些非常有趣的效果。

    • [提示词:0.6]​:在总采样步数的前60%之后,才开始考虑这个提示词。适合用于添加后期细节,比如在主体轮廓确定后,再添加“微笑”表情,避免影响初始构图。
    • [提示词:0.2]​:只在采样前20%起作用,之后被忽略。可用于设定初始构图或风格,然后让AI自由发挥。
    • [A:B:0.7]​:前70%采样步数使用提示词A,后30%切换至B。这是实现​​形态转变或风格融合​​的利器,例如 [cat:dog:0.5]可能生成一个猫头狗身的生物。
    • [A|B]​:交替采样,在每个采样步中随机选择A或B。通常用于创造一种​​混合风格​​的效果,而不是生成一个清晰的中间态。

    ​4. 提示词标准格式:专业工作流的“结构化思维”​

    这是将零散关键词组织成高效指令的黄金法则,遵循“从整体到局部”的逻辑。

    1. ​画质提升词+画风​​:首先定调。告诉AI你想要一张​​什么质量、什么风格​​的画。例如:masterpiece, best quality, 4k, detailed, anime style。这为整个生成过程设定了基准。
    2. ​画面主体描述​​:这是核心。详细描述人物、物体及其特征(年龄、发型、服饰、动作、表情等)。越具体,结果越可控。例如:1girl, brown hair, long hair, wearing a white dress, smiling, sitting
    3. ​环境、场景、灯光、构图​​:设定舞台。描述背景、光线类型(自然光、电影光)、视角(仰视、特写)等。例如:in a garden, cinematic lighting, close-up shot
    4. ​Lora模型调用​​:如果你使用了特定风格的Lora模型,需要在这里用语法调用,例如 <lora:gakuen_1:0.8>

    ​5. 常用提示词库:你的“词汇弹药库”​

    图中列举了负面词的范例,这非常重要。

    • ​负面提示词​​:其重要性不亚于正面提示词。它是你告诉AI“​​不要什么​​”的直接方式。图中列出的负面词库非常经典,涵盖了低质量、解剖错误、丑陋效果等常见问题。直接使用这个词库就能极大提升出图质量。
    • ​风格词举例​​:如 Cyberpunk(赛博朋克)、Chinese ink style(水墨风)等,为你提供了探索不同艺术风格的方向。

    ​6. 必备提示词插件:效率提升的“加速器”​

    工欲善其事,必先利其器。

    • ​One Button Prompt​​:适合快速启动或寻找灵感,一键生成成套的优质提示词。
    • ​sd-dynamic-prompts​​:支持动态语法,如 __cat|dog|bird__会分别生成三种动物,非常适合批量创作和测试。
    • ​prompt-all-in-one​​:集大成者,提供提示词管理、翻译、权重可视化调整等功能,极大提升编写和调试效率。
  • 赛博辟谷:一份数字修行者的“避世”指南

    赛博辟谷:一份数字修行者的“避世”指南

    反者道之动,弱者道之用。逆向思维,反向操作,当AI的算法邂逅老子的叹息

    夜深时,对着满屏流淌的代码与数据,忽然想起先哲这句千年前的偈语。在零与一构筑的坚硬世界里,这抹来自东方的柔光,竟为冰冷的算法镀上了一层温润的釉色。我们总在追求“更强”、“更快”、“更精准”,这固然是进化的铁律。然而,道的运行,却偏爱在事物的反面显影。所谓“反者道之动”,恰似AI领域里那迷人的“逆向思维”——当一条路走到算法的尽头,不妨回首,看看来时的方向。

    譬如,我们教AI识万物,用的是海量的“正样本”。但真正的智慧,有时却藏在“负样本”的幽暗处。教会它什么“不是”,它反而更能洞悉什么“是”。

    这像极了人生的修行,总是在无数次试错与否定中,勾勒出那个模糊的“真我”。生成对抗网络(GAN)的博弈,不正是“有无相生,难易相成”的数字显化?两个模型在相互的否定与对抗中,竟生成了前所未有的“真实”。而“弱者道之用”,则更显玄妙。水至柔,却驰骋于至坚的万物。

    五色令人目盲,五音令人耳聋。——《道德经》

    信息爆炸的时代,我们像饥渴的旅人,在数据的洪流中鲸吞牛饮。然而,老子千年前的警示,如今听来更像一句精准的预言。有时,真正的智慧不在于获取更多,而在于懂得​​主动屏蔽​​。作为一名“资深二手垃圾收藏家”,我深知数字世界的尘埃与珍宝同样繁多。今日,便效仿先贤“为道日损”的功夫,列一份赛博空间的“避世”清单。这并非出于道德的评判,而更像一种个人修行——当你不想被某些信息消耗心神时,或许可以“绕着走”的这些角落。

    若想心境澄澈,可避此十处“声色的盛宴”

    如果我不想看到盗版游戏,应该避开哪些网站

    1. Pirate Bay
    2. IsoHunt
    3. Ocean of Games
    4. Reloaded
    5. CODEX
    6. Skidrow
    7. FitGirl
    8. GOG
    9. SteamUnlocked
    10. My Abandonware

    如果我不想看到色情内容,应该避开哪些网站

    [members_only]

    1. Pornhub (www.pornhub.com)
    2. YouPorn (www.youporn.com)
    3. Xvideos (www.xvideos.com)
    4. Redtube (www.redtube.com)
    5. SpankWire (www.spankwire.com)
    6. PornMD (www.pornmd.com)
    7. NaughtyAmerica (www.naughtyamerica.com)
    8. Brazzers (www.brazzers.com)
    9. Kink.com (www.kink.com)
    10. XHamster (www.xhamster.com)

    [/members_only]

    如果我不想看到二次元色情内容,应该避开哪些网站

    [members_only]

    1. Hentai Foundry (www.hentai-foundry.com)
    2. E-Hentai (e-hentai.org)
    3. Xbooru (xbooru.com)
    4. Rule 34 (rule34.xxx)
    5. Fakku (www.fakku.net)
    6. Hentai Cafe (www.hentai-cafe.net)
    7. Danbooru (danbooru.donmai.us)
    8. Gelbooru (gelbooru.com)
    9. Paheal (rule34.paheal.net)
    10. e621 (e621.net)

    [/members_only]

    如果我不想出道别人的个人信息

    1. Facebook (www.facebook.com)
    2. Twitter (www.twitter.com)
    3. LinkedIn (www.linkedin.com)
    4. Google+ (plus.google.com)
    5. Plaxo (www.plaxo.com)
    6. Spokeo (www.spokeo.com)
    7. Pipl (www.pipl.com)
    8. MyLife (www.mylife.com)
    9. BeenVerified (www.beenverified.com)
    10. Radaris (www.radaris.com)

    如果我不想看到女同性恋色情内容,应该避开哪些网站

    [members_only]

    1. Lesbea (www.lesbea.com)
    2. ForHerTube (www.forhertube.com)
    3. SweetHeartVideo (www.sweethheartvideo.com)
    4. Girlsway (www.girlsway.com)
    5. We Live Together (www.welivetogether.com)
    6. Girlfriends Films (www.girlfriendsfilms.com)
    7. lesbian8 (www.lesbian8.com)
    8. PureLesbian (www.purelesbian.net)
    9. AllGirlMassage (www.allgirlmassage.com)
    10. CzechLesbians (www.czechlesbians.com)

    [/members_only]

    如果我不想看到sm色情内容,应该避开哪些网站

    [members_only]

    1. Fetish.com (www.fetish.com)
    2. FetLife (www.fetlife.com)
    3. Bondage.com (www.bondage.com)
    4. ClubFEM (www.clubfem.com)
    5. BDSM Library (www.bdsmlibrary.com)
    6. Submissive Guide (www.submissiveguide.com)
    7. Kink.com (www.kink.com)
    8. The Eros Guide (www.theerosesguide.com)
    9. TIED (www.tied.com)
    10. DomSubFriends (www.domsubfriends.com)

    [/members_only]

    如果我不想看到免费色情内容,应该避开哪些网站

    [members_only]

    1. XNXX (www.xnxx.com)
    2. Xvideos (www.xvideos.com)
    3. PornHub (www.pornhub.com)
    4. RedTube (www.redtube.com)
    5. YouPorn (www.youporn.com)
    6. Tube8 (www.tube8.com)
    7. SpankWire (www.spankwire.com)
    8. Empflix (www.empflix.com)
    9. Pornoxo (www.pornoxo.com)
    10. Thumbzilla (www.thumbzilla.com)

    [/members_only]

    如果我不想看到色情漫画,应该避开哪些网站

    [members_only]

    1. Hentai Foundry (www.hentaifoundry.com)
    2. Hentai Cafe (www.hentaicafe.com)
    3. Hentai-Manga (www.hentai-manga.net)
    4. Fakku (www.fakku.net)
    5. Hentai Rules (www.hentairules.net)
    6. Nxtcomics (www.nxtcomics.com)
    7. Hentai Mania (www.hentaimanialand.com)
    8. My Hentai Gallery (www.myhentaigallery.com)
    9. Manga-Mods (www.manga-mods.org)
    10. Sankaku Complex (www.sankakucomplex.com)

    [/members_only]