garbage-classifier / generate_doc.py
zhangruicong-ai
@
9361732
Raw
History Blame Contribute Delete
27.5 kB
"""
生成《垃圾图像分类系统》课程项目书 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')