""" 生成《垃圾图像分类系统》课程项目书 Word 文档 运行: python generate_doc.py """ from docx import Document from docx.shared import Pt, Cm, Inches from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.oxml.ns import qn import os doc = Document() # ============================================================ # 全局样式设置 # ============================================================ style = doc.styles['Normal'] style.font.name = '宋体' style.font.size = Pt(12) style.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') style.paragraph_format.line_spacing = 1.5 style.paragraph_format.first_line_indent = Cm(0.74) def add_title(text, size=22, bold=True, center=True): """添加页面大标题""" p = doc.add_paragraph() p.alignment = WD_ALIGN_PARAGRAPH.CENTER if center else WD_ALIGN_PARAGRAPH.LEFT run = p.add_run(text) run.font.size = Pt(size) run.font.name = '宋体' run.bold = bold run.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') return p def add_heading_newpage(text, size=18): """添加分页的新章节标题""" doc.add_page_break() p = doc.add_paragraph() p.alignment = WD_ALIGN_PARAGRAPH.CENTER run = p.add_run(text) run.font.size = Pt(size) run.font.name = '宋体' run.bold = True run.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') return p def add_subheading(text, size=14): """添加小节标题""" p = doc.add_paragraph() p.alignment = WD_ALIGN_PARAGRAPH.LEFT run = p.add_run(text) run.font.size = Pt(size) run.font.name = '宋体' run.bold = True run.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') p.paragraph_format.first_line_indent = Cm(0) return p def add_body(text): """添加正文段落""" p = doc.add_paragraph() run = p.add_run(text) run.font.name = '宋体' run.font.size = Pt(12) run.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') p.paragraph_format.line_spacing = 1.5 p.paragraph_format.first_line_indent = Cm(0.74) return p def add_body_no_indent(text): """添加无缩进正文""" p = doc.add_paragraph() run = p.add_run(text) run.font.name = '宋体' run.font.size = Pt(12) run.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') p.paragraph_format.first_line_indent = Cm(0) return p # ============================================================ # 封面 # ============================================================ for _ in range(3): doc.add_paragraph() # 空行 add_title('电子信息技术工程基础训练', size=26) doc.add_paragraph() add_title('课 程 项 目 书', size=22) doc.add_paragraph() doc.add_paragraph() # 项目信息表 info_items = [ ('课题名称', '垃圾图像分类系统'), ('组员姓名(学号)', '23051073 张锐聪\n(手写)'), ('专业年级', '电子信息科学与技术专业2023级'), ('项目书分数', ''), ('评分教师', ''), ('评分日期', ''), ] for label, value in info_items: p = doc.add_paragraph() p.alignment = WD_ALIGN_PARAGRAPH.CENTER run = p.add_run(f'{label}:{value}') run.font.name = '宋体' run.font.size = Pt(14) run.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') p.paragraph_format.first_line_indent = Cm(0) # ============================================================ # 填写须知(新页) # ============================================================ doc.add_page_break() add_title('填 写 须 知', size=20) notes = [ '字体用小四号宋体,1.5倍行距,段落首字缩进2字符。项目书需提交一份纸质版。要求统一用A4纸单面印制。', '评分标准如下(课程项目书占期末总成绩的70%,个人心得占30%):', '(1)课题实施的目的、意义:描述该作品设计的意义,占15分。字数不少于400字。', '(2)研究内容:对该作品的组成,功能进行描述,需要给出系统组成框图,占30分。', '(3)项目实施的基础条件:描述实现该作品所具备的硬件、软件、技术条件等,占15分,字数不少于300字。', '(4)项目实施方案:描述设计该作品的技术路线及过程。占15分。', '(5)项目过程总结:描述在实现该项目过程中的团队成员分工,遇到的技术问题以及如何解决,以及该项目的实现效果的总结。占15分。', '(6)项目书格式:需要排版整齐再打印,格式分占10分。要求每个部分的标题(宋体,小二加粗),需在新一页的开头居中。', ] for note in notes: p = doc.add_paragraph() run = p.add_run(note) run.font.name = '宋体' run.font.size = Pt(12) run.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') p.paragraph_format.line_spacing = 1.5 p.paragraph_format.first_line_indent = Cm(0.74) # ============================================================ # 一、课题实施的目的、意义 # ============================================================ add_heading_newpage('一、课题实施的目的、意义', size=18) add_subheading('一、项目实施目的') add_body( '1. 随着城市化进程的加速和人们生活水平的提高,生活垃圾产生量急剧增加,' '垃圾分类成为城市管理中的重要课题。我国于2019年起逐步推行垃圾分类政策,' '但在实际执行过程中,普通居民对垃圾的正确分类存在困难,常常因为不清楚' '某物品属于哪类垃圾而投错垃圾桶。因此,开发一款能够自动识别垃圾类型并' '提示正确投放方式的智能系统,具有重要的现实意义。' ) add_body( '2. 本项目设计并实现了一款基于深度学习的垃圾图像分类系统。用户只需拍摄' '或上传垃圾照片,系统即可通过AI模型自动识别物品,并判断其属于可回收垃圾、' '有害垃圾、厨余垃圾还是其他垃圾,同时告知应投入什么颜色的垃圾桶。该系统' '能有效降低居民垃圾分类的学习成本,提高分类准确率,助力环保政策的落地实施。' ) add_body( '3. 针对传统图像分类模型在垃圾分类场景中精度不足的问题,本项目采用' 'DETR目标检测预处理 + CLIP零样本分类 + TrOCR文字识别的多阶段流水线架构,' '能够先定位图片中的主体物体,读取物品上的品牌文字,再进行精准分类,' '显著提升了对复杂场景下垃圾物品的识别准确率。' ) add_body( '4. 了解深度学习图像分类的基本原理,掌握CLIP零样本分类模型的部署与优化方法,' '熟悉FastAPI后端框架的搭建流程,以及前端移动端适配技术。' ) add_subheading('二、项目实施意义') add_body( '1. 随着环境保护意识的增强和垃圾分类政策的推广,居民对垃圾分类工具的需求' '日益增长。本系统通过AI技术为用户提供即时、准确的垃圾分类指导,降低了' '分类门槛,有助于提高全民垃圾分类的执行率,减少"混投乱放"现象,推动' '垃圾资源化利用和减量化处理。' ) add_body( '2. 传统的垃圾分类方式依赖居民的环保知识记忆,不同地区的分类标准也存在差异,' '导致分类准确率参差不齐。本系统利用AI视觉识别技术,无需用户具备专业知识,' '只需拍照即可获得分类结果,极大降低了使用门槛。同时系统支持手机拍照和' '相册上传两种方式,方便居民随时使用。' ) add_body( '3. 本项目设计的多阶段识别流水线——DETR检测主体、TrOCR识别文字、CLIP零样本分类——' '不仅提高了垃圾识别的准确率,还为图像分类技术在垂直领域的应用提供了' '可复用的技术方案。特别是OCR文字识别与物品分类的结合,使得系统能够' '识别出带有品牌标签的物体,输出如"一个FoYes的塑料杯"这样的自然描述,' '提升了用户体验。' ) add_body( '4. 通过本项目的开发,团队成员深入掌握了深度学习模型部署(Transformers/HuggingFace)、' 'Web服务开发(FastAPI)、前端界面设计(响应式HTML/CSS/JS)以及Docker容器化部署' '(HuggingFace Spaces)等全栈技术能力,为今后从事AI应用开发积累了宝贵经验。' ) # ============================================================ # 二、研究内容 # ============================================================ add_heading_newpage('二、研究内容', size=18) add_subheading('一、研究内容') add_body( '本系统针对居民日常生活中的垃圾分类难题,开发了一套基于深度学习的垃圾图像' '智能分类系统。系统采用B/S架构,用户通过手机浏览器即可访问。核心流程为:' '用户拍照或上传垃圾照片后,系统首先使用DETR目标检测模型扫描图片,定位并' '裁切出主体物体;随后使用TrOCR文字识别模型读取物品上的品牌文字或标签信息;' '接着使用CLIP零样本分类模型分别对物品进行通用识物和垃圾分类;最后输出' '物品名称、自然语言描述以及对应的四类垃圾类别和投放指南。系统还具备触觉' '震动反馈、毛玻璃UI动效等良好的移动端交互体验。' ) add_body_no_indent('          【系统组成框图】') add_body_no_indent('') add_body_no_indent(' ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐') add_body_no_indent(' │ 拍照/上传 │ -> │ DETR │ -> │ TrOCR │ -> │ CLIP │') add_body_no_indent(' │ 图片输入 │ │ 主体检测 │ │ 文字识别 │ │ 零样本 │') add_body_no_indent(' └──────────┘ └──────────┘ └──────────┘ └────┬─────┘') add_body_no_indent('                            │') add_body_no_indent('                            v') add_body_no_indent(' ┌──────────┐ ┌──────────┐ ┌──────────────────────┐') add_body_no_indent(' │ 垃圾分类 │ <- │ 智能描述 │ <- │ 识物 + 垃圾标签比对 │') add_body_no_indent(' │ 结果展示 │ │ 生成输出 │ │ │') add_body_no_indent(' └──────────┘ └──────────┘ └──────────────────────┘') add_body('') add_subheading('二、解决的关键问题') add_body( '1. 复杂背景下的垃圾识别问题:直接使用CLIP对整张图片进行分类时,背景中的' '干扰物会严重影响分类准确率。例如拍一个泡面桶在堆满物品的桌上,模型可能' '被周围的物体误导。本项目通过引入DETR目标检测模型先找出主体物体并裁切,' '再对裁切后的区域进行分类,有效排除了背景干扰。' ) add_body( '2. 相似物品的区分问题:废纸和纸巾在外观上相似但属于不同分类(纸类可回收,' '用过的纸巾是其他垃圾)。本系统通过详细化的英文标签描述(如"tissue paper ' 'and napkins used" vs "paper and cardboard for recycling")帮助CLIP模型' '做出更精准的区分。' ) add_body( '3. 物品品牌与文字识别:用户上传一个带有品牌标签的物体时,系统应能读出' '品牌名。本项目集成了TrOCR文字识别模型,能够从裁切后的物体图片中提取' '文字信息,生成如"一个FoYes的塑料杯"的自然描述,提升了识别结果的' '可理解性和可信度。' ) add_body( '4. 移动端的可用性问题:系统需要适配手机端的拍照流程、触屏交互和网络环境。' '前端采用响应式设计、viewport适配、触觉振动反馈(navigator.vibrate)' '和点击涟漪动效,确保移动端操作流畅自然。后端通过异步处理和模型延迟加载' '优化响应速度。' ) add_subheading('三、本项目所研究的模块分析') add_body('1. 软件部分') add_body( '(1)图像预处理模块:使用 Facebook 的 DETR(Detection Transformer)模型' '(detr-resnet-50)对输入图片进行目标检测。该模型基于Transformer架构,' '能够端到端地检测图片中的物体并输出边界框。系统会过滤掉人、动物等无关' '类别,选取置信度最高且与垃圾相关的物体,将其区域裁切出来并添加25%的' '边距保留上下文。置信度低于0.3时使用原图。' ) add_body( '(2)文字识别模块:使用 Microsoft 的 TrOCR(TrOCR-small-printed)模型' '对裁切后的图片进行文字识别。该模型基于Transformer的编解码架构,能够' '从图片中提取印刷体文字(如品牌名、标签文字)。识别结果与物体名称结合,' '生成自然语言描述。' ) add_body( '(3)零样本分类模块:使用 OpenAI 的 CLIP(ViT-B/32)模型进行零样本图像' '分类。系统维护了60个垃圾专用候选标签(如"instant noodle cup styrofoam ' 'cup with lid")和80个通用物品标签(如"water bottle"、"cell phone")。' 'CLIP模型计算图像与所有标签的语义相似度,取最匹配的标签作为识别结果。' '垃圾标签再映射到中国四分类标准(可回收/有害/厨余/其他)。' ) add_body( '(4)后端服务模块:基于 FastAPI 框架搭建REST API服务。核心端点 /api/classify ' '接收multipart/form-data格式的图片上传,依次调用DETR、TrOCR、CLIP模型,' '最终返回包含物品名称、描述、置信度、垃圾类别、投放指南等信息的JSON响应。' '服务支持CORS跨域访问,便于手机等外部设备连接。' ) add_body( '(5)前端展示模块:纯HTML/CSS/JS实现移动端响应式界面。采用暗色背景与' '毛玻璃(backdrop-filter: blur)设计风格,配合动态浮动光晕背景、加载动画、' '结果弹入动效等视觉效果。所有按钮和交互元素支持触觉震动反馈和点击涟漪动效。' '使用 Google Fonts(Noto Sans SC)提升中文字体显示品质。' ) # ============================================================ # 三、项目实施的基础条件 # ============================================================ add_heading_newpage('三、项目实施的基础条件', size=18) add_subheading('一、项目研究的基础条件') add_body( '1. 硬件条件:本项目主要基于软件开发和云端部署,对硬件要求较低。开发阶段' '使用个人笔记本电脑(Windows 11系统),部署阶段使用 HuggingFace Spaces ' '提供的云端服务器资源(2 vCPU / 16GB RAM / 无GPU),支撑DETR、CLIP、' 'TrOCR等深度学习模型的加载与推理运算。用户端仅需一部能拍照并上网的手机' '即可使用,无需安装任何额外App。' ) add_body( '2. 软件条件:项目后端基于Python 3.11开发,核心依赖包括PyTorch深度学习' '框架、HuggingFace Transformers库(提供DETR、CLIP、TrOCR模型的加载与推理)、' 'FastAPI Web框架、Pillow图像处理库等。前端无框架依赖,仅使用标准HTML5、' 'CSS3和JavaScript。开发工具为VS Code,版本控制使用Git,容器化部署使用' 'Docker。' ) add_body( '3. 技术条件:' ) add_body( '(1)深度学习模型方面,CLIP(Contrastive Language-Image Pre-training)' '是由OpenAI开发的零样本图像分类模型,通过4亿图文对训练而成,能够理解' '图像与自然语言描述之间的语义关系,无需针对垃圾分类任务重新训练即可' '进行零样本分类。DETR是Facebook AI开发的基于Transformer的目标检测模型,' '实现了端到端的物体检测,无需像传统方法那样依赖锚框和NMS后处理。TrOCR' '是微软出品的基于Transformer的OCR模型,将图片直接转化为文字序列。' ) add_body( '(2)Web部署方面,HuggingFace Spaces提供了免费的Docker容器托管服务,' '支持自动构建和HTTPS访问。项目使用Dockerfile定义环境,依赖在构建时自动' '安装,首次启动后模型被持久缓存,后续调用无需重复下载。' ) add_body( '(3)前端技术方面,响应式设计使用CSS媒体查询和flexbox布局,确保在' '各种屏幕尺寸下正常显示。CSS自定义属性(CSS Variables)实现主题一致性和' '动态颜色切换。Google Fonts提升字体品质。通过navigator.vibrate API' '实现移动端触觉反馈,无需额外依赖。' ) # ============================================================ # 四、项目实施方案 # ============================================================ add_heading_newpage('四、项目实施方案', size=18) add_body( '基于 DETR + CLIP + TrOCR 的智能垃圾分类系统的设计与实现,项目分四个阶段' '进行,最终形成一个完整可用的在线垃圾分类系统。' ) add_subheading('一、项目准备') add_body( '1. 了解CLIP零样本分类模型的基本原理和使用方式,学习HuggingFace Transformers' '库的pipeline API,掌握模型的加载、推理和部署方法。' ) add_body( '2. 了解DETR目标检测模型的原理和用法,研究如何将检测结果用于图片裁切预处理。' ) add_body( '3. 了解TrOCR文字识别模型的功能和局限,设计OCR结果与物品名称的组合策略。' ) add_body( '4. 学习FastAPI框架的基本用法,掌握文件上传、CORS配置、异步处理等Web开发技术。' ) add_body( '5. 学习移动端响应式界面设计,掌握触觉反馈API和CSS动效开发。' ) add_body( '6. 学习Docker容器化技术和HuggingFace Spaces的部署流程。' ) add_subheading('二、设计开发') add_body( '1. 设计系统整体架构:确定"拍照/上传→DETR检测→TrOCR识别→CLIP分类→结果展示"' '五步流水线架构,明确每个模块的输入输出接口和数据格式。' ) add_body( '2. 实现GarbageClassifier核心类:在model.py中封装DETR目标检测、TrOCR文字识别' '和CLIP零样本分类三个模型,均采用延迟加载模式(首次使用时才下载权重),' '确保服务快速启动。设计60个垃圾专用候选标签和80个通用物品标签,建立' '标签到中国四分类标准的完整映射。' ) add_body( '3. 实现FastAPI后端服务:搭建REST API,设计/api/classify(图片分类)、' '/api/health(健康检查)、/api/categories(分类信息)三个端点。配置CORS' '中间件允许跨域访问,实现文件验证、临时文件管理等辅助功能。' ) add_body( '4. 实现前端界面:采用暗色毛玻璃设计风格,设计拍照/相册/拖拽三种图片' '输入方式。实现触觉震动反馈(navigator.vibrate)、点击涟漪动效、加载动画' '三部曲(读取图片→AI识别→分类匹配)、结果卡片弹入动效等交互细节。' '结果页面按序展示:物品识别(含品牌文字描述)→ 垃圾类别徽章 → ' '垃圾桶信息 → 检测详情 → 其他可能分类。' ) add_body( '5. 实现部署配置:编写Dockerfile基于Python 3.11-slim构建镜像,配置' 'Tsinghua PyPI镜像加速依赖安装。使用Git部署到HuggingFace Spaces,' '实现一键推送、自动构建、HTTPS在线访问。' ) add_subheading('三、功能优化与测试') add_body( '1. 候选标签优化:针对初期测试中"泡面桶被识别为一次性筷子"的问题,' '优化了CLIP候选标签的描述方式,增加更具体、更具区分度的英语描述,' '如将"instant noodle cup"改为"instant noodle cup styrofoam cup with lid",' '将"disposable chopsticks"改为"disposable wooden chopsticks pair",' '使CLIP能更好地区分视觉上相似的物品。' ) add_body( '2. 主体检测效果优化:测试DETR在不同场景下的检测效果,调整过滤策略——' '自动排除人、动物等无关类别,设置置信度阈值0.3,裁切边距25%。' '对于检测失败的情况,自动回退到全图分类。' ) add_body( '3. 置信度阈值调优:根据测试结果设定置信度分级策略——>60%使用精确描述,' '30%-60%使用"可能是"等模糊措辞,<30%使用"一个类似…的物品"等保守表达。' '前端的置信度颜色也对应设置为绿色/黄色/红色,直观提示用户。' ) add_subheading('四、计划安排') # 表格方式展示计划 table = doc.add_table(rows=5, cols=3) table.style = 'Table Grid' # 表头 cells = table.rows[0].cells cells[0].text = '阶段' cells[1].text = '时间' cells[2].text = '成果' # 内容 stages = [ ('第一阶段', '2025年9月-2025年10月', '完成项目需求分析与技术方案设计,确定系统架构。学习CLIP、DETR、TrOCR模型原理,搭建开发环境。'), ('第二阶段', '2025年10月-2025年11月', '实现GarbageClassifier核心类,完成DETR检测+裁切、CLIP分类、TrOCR识别的集成与联调。'), ('第三阶段', '2025年11月-2025年12月', '搭建FastAPI后端服务与前端界面开发。完成暗色毛玻璃主题、触觉反馈、涟漪动效等交互设计。'), ('第四阶段', '2025年12月-2026年1月', '系统集成测试与优化。部署到HuggingFace Spaces,完成移动端适配测试。项目文档撰写与验收。'), ] for i, (stage, time, result) in enumerate(stages): row = table.rows[i + 1] row.cells[0].text = stage row.cells[1].text = time row.cells[2].text = result # ============================================================ # 五、项目过程总结 # ============================================================ add_heading_newpage('五、项目过程总结', size=18) add_body( '本项目的实施过程中,团队由一名成员独立完成全部开发工作。项目涵盖了' '深度学习模型部署、后端服务开发、前端界面设计、云端部署等多个技术领域,' '是一次完整的全栈AI应用开发实践。' ) add_body( '在技术实现方面,项目初始版本采用CLIP零样本分类模型直接对整张图片进行分类,' '但在测试中发现准确率不够理想,特别是当背景复杂或物品在画面中占比较小时,' '分类结果容易出错。针对这一问题,后续引入了DETR目标检测模型作为预处理步骤,' '先检测主体物体再裁切分类,显著提升了分类准确率。同时,为了提供更自然的' '识别结果描述,又集成了TrOCR文字识别模型,使系统能够读取物品上的品牌文字,' '生成如"一个FoYes的塑料杯"这样的自然语言描述。' ) add_body( '在前端交互方面,配合项目的环保主题,设计了暗色毛玻璃风格界面。引入了触觉' '震动反馈(navigator.vibrate)和点击涟漪动效,增强了移动端的使用体验。' '通过Google Fonts引入Noto Sans SC字体,提升了中文显示品质。整体设计追求' '简约高级感,同时通过动态浮动光晕、加载动画等细节让页面富有活力。' ) add_body( '在部署方面,项目初期使用ngrok进行临时公网穿透,后转为永久部署到HuggingFace ' 'Spaces。采用Docker容器化技术,配置了Tsinghua镜像加速以适应国内网络环境。' '模型采用延迟加载策略,用户首次使用时才下载权重文件(约760MB),后续请求' '使用缓存,响应速度大幅提升。' ) add_body( '项目过程中遇到的主要技术问题包括:(1)Windows环境下GBK编码问题导致中文' '输出异常,通过设置PYTHONIOENCODING=utf-8环境变量解决;(2)ngrok免费版' '不支持HTTP代理,需要在启动时清除HTTP_PROXY/HTTPS_PROXY环境变量;' '(3)HuggingFace Spaces首次构建需下载模型权重,耗时较长,后续通过模型缓存' '优化;(4)CLIP零样本模型对视觉相似物品区分度有限,通过优化候选标签描述' '词(增加具体语境修饰)得以改善。' ) add_body( '项目最终实现了一个功能完整的在线垃圾图像分类系统,部署在HuggingFace Spaces' '上,用户可通过手机浏览器随时访问。系统支持拍照和相册上传两种方式,能够' '识别60多种常见垃圾物品,分类准确率较初始版本有显著提升。后续可考虑引入' '更强大的CLIP模型(如ViT-L/14)进一步提升准确率,以及增加语音播报功能' '方便视力障碍人士使用。' ) # 团队信息 add_subheading('团队组成') table2 = doc.add_table(rows=2, cols=3) table2.style = 'Table Grid' table2.rows[0].cells[0].text = '姓名' table2.rows[0].cells[1].text = '学号' table2.rows[0].cells[2].text = '联系方式' table2.rows[1].cells[0].text = '张锐聪' table2.rows[1].cells[1].text = '23051073' table2.rows[1].cells[2].text = '' add_subheading('人员分工') table3 = doc.add_table(rows=2, cols=3) table3.style = 'Table Grid' table3.rows[0].cells[0].text = '姓名' table3.rows[0].cells[1].text = '负责工作' table3.rows[0].cells[2].text = '占比' table3.rows[1].cells[0].text = '张锐聪' table3.rows[1].cells[1].text = '系统架构设计、模型部署、后端开发、前端开发、部署运维(独立完成全部工作)' table3.rows[1].cells[2].text = '100%' # ============================================================ # 评分表 # ============================================================ doc.add_paragraph() add_subheading('评分表') table4 = doc.add_table(rows=7, cols=3) table4.style = 'Table Grid' scores = [ ('内容', '分值', '得分'), ('一、课题实施的目的、意义', '15', ''), ('二、研究内容', '30', ''), ('三、项目实施的基础条件', '15', ''), ('四、项目实施方案', '15', ''), ('五、项目过程总结', '15', ''), ('项目书格式', '10', ''), ] for i, row_data in enumerate(scores): table4.rows[i].cells[0].text = row_data[0] table4.rows[i].cells[1].text = row_data[1] table4.rows[i].cells[2].text = row_data[2] p = doc.add_paragraph() run = p.add_run('总分:100') run.font.name = '宋体' run.font.size = Pt(14) run.bold = True run.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') # ============================================================ # 保存 # ============================================================ output_path = os.path.join(os.path.dirname(__file__), '垃圾图像分类系统_课程项目书.docx') doc.save(output_path) print(f'✅ 项目书已生成: {output_path}') print(f' 文件大小: {os.path.getsize(output_path) / 1024:.1f} KB')