[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-nickliqian--cnn_captcha":3,"tool-nickliqian--cnn_captcha":64},[4,17,27,35,43,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,3,"2026-04-05T11:01:52",[13,14,15],"开发框架","图像","Agent","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":23,"last_commit_at":24,"category_tags":25,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",138956,2,"2026-04-05T11:33:21",[13,15,26],"语言模型",{"id":28,"name":29,"github_repo":30,"description_zh":31,"stars":32,"difficulty_score":23,"last_commit_at":33,"category_tags":34,"status":16},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[13,14,15],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":23,"last_commit_at":41,"category_tags":42,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,26],{"id":44,"name":45,"github_repo":46,"description_zh":47,"stars":48,"difficulty_score":23,"last_commit_at":49,"category_tags":50,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[14,51,52,53,15,54,26,13,55],"数据工具","视频","插件","其他","音频",{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":10,"last_commit_at":62,"category_tags":63,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[15,14,13,26,54],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":75,"owner_name":76,"owner_avatar_url":77,"owner_bio":78,"owner_company":79,"owner_location":80,"owner_email":81,"owner_twitter":79,"owner_website":79,"owner_url":82,"languages":83,"stars":88,"forks":89,"last_commit_at":90,"license":91,"difficulty_score":10,"env_os":92,"env_gpu":93,"env_ram":94,"env_deps":95,"category_tags":105,"github_topics":106,"view_count":23,"oss_zip_url":79,"oss_zip_packed_at":79,"status":16,"created_at":109,"updated_at":110,"faqs":111,"releases":142},1235,"nickliqian\u002Fcnn_captcha","cnn_captcha","use cnn recognize captcha by tensorflow. 本项目针对字符型图片验证码，使用tensorflow实现卷积神经网络，进行验证码识别。","cnn_captcha 是一个基于 TensorFlow 实现的开源工具，专门用于识别字符型图片验证码。它通过卷积神经网络（CNN）实现端到端的验证码识别，简化了传统图像处理与机器学习方法中复杂的预处理和分类步骤，显著提升了识别效率和准确性。\n\n该工具封装了校验、训练、验证、识别和 API 模块，为用户提供了完整的解决方案，大幅降低了开发和调试验证码识别系统的难度。无论你是需要快速完成验证码识别任务的开发者，还是希望研究 CNN 在图像识别中应用的研究人员，都可以从中受益。\n\n其独特的技术亮点在于使用通用的 CNN 模型结构，能够适应多种字符型验证码，并支持多模型部署和性能优化。此外，项目还提供了详细的文档和训练数据统计，方便用户进行调优和测试。如果你正在寻找一个高效、易用且可扩展的验证码识别方案，cnn_captcha 将是一个不错的选择。","# cnn_captcha\nuse CNN recognize captcha by tensorflow.  \n本项目针对字符型图片验证码，使用tensorflow实现卷积神经网络，进行验证码识别。  \n项目封装了比较通用的**校验、训练、验证、识别、API模块**，极大的减少了识别字符型验证码花费的时间和精力。 \n  \n项目已经帮助很多同学高效完成了验证码识别任务。\n如果你在使用过程中出现了bug和做了良好的改进，欢迎提出issue和PR，作者会尽快回复，希望能和你共同完善项目。 \n\n如果你需要识别点选、拖拽类验证码，或者有目标检测需求，也可以参考这个项目[nickliqian\u002Fdarknet_captcha](https:\u002F\u002Fgithub.com\u002Fnickliqian\u002Fdarknet_captcha)。\n\n# 时间表\n#### 2018.11.12\n初版Readme.md  \n#### 2018.11.21\n加入关于验证码识别的一些说明  \n#### 2018.11.24\n优化校验数据集图片的规则  \n#### 2018.11.26\n新增`train_model_v2.py`文件，训练过程中同时输出训练集和验证集的准确率  \n#### 2018.12.06\n新增多模型部署支持，修复若干bug  \n#### 2018.12.08\n优化模型识别速度，支持api压力测试和统计耗时  \n#### 2019.02.19\n1. 新增一种准确率计算方式    \n2. TAG: v1.0\n#### 2019.04.12\n1. 只保留一种`train_model.py`文件\n2. 优化代码结构\n3. 把通用配置抽取到`sample_config.json`和`captcha_config.json`\n4. 修复若干大家在issue提出的问题\n#### 2019.06.01\n1. 完善readme文档，文档不长，请大家一定要读完~\n2. 使用cnnlib目录存放神经网络结构代码\n3. 做了一版训练数据统计，大家可以参考我们的训练次数、时长和准确率\n4. TAG: v2.0  \n\n# 目录\n\u003Ca href=\"#项目介绍\">1 项目介绍\u003C\u002Fa>  \n- \u003Ca href=\"#关于验证码识别\">1.1 关于验证码识别\u003C\u002Fa>  \n- \u003Ca href=\"#目录结构\">1.2 目录结构\u003C\u002Fa>  \n- \u003Ca href=\"#依赖\">1.3 依赖\u003C\u002Fa>  \n- \u003Ca href=\"#模型结构\">1.4 模型结构\u003C\u002Fa>  \n\n\u003Ca href=\"#如何使用\">2 如何使用\u003C\u002Fa>  \n- \u003Ca href=\"#数据集\">2.1 数据集\u003C\u002Fa>  \n- \u003Ca href=\"#配置文件\">2.2 配置文件\u003C\u002Fa>  \n- \u003Ca href=\"#验证和拆分数据集\">2.3 验证和拆分数据集\u003C\u002Fa>  \n- \u003Ca href=\"#训练模型\">2.4 训练模型\u003C\u002Fa>  \n- \u003Ca href=\"#批量验证\">2.5 批量验证\u003C\u002Fa>  \n- \u003Ca href=\"#启动WebServer\">2.6 启动WebServer\u003C\u002Fa>  \n- \u003Ca href=\"#调用接口识别\">2.7 调用接口识别\u003C\u002Fa>  \n- \u003Ca href=\"#部署\">2.8 部署\u003C\u002Fa>  \n- \u003Ca href=\"#部署多个模型\">2.9 部署多个模型\u003C\u002Fa>  \n- \u003Ca href=\"#在线识别\">2.10 在线识别\u003C\u002Fa>  \n\n\u003Ca href=\"#说明\">3 统计数据\u003C\u002Fa>  \n- \u003Ca href=\"#训练数据统计\">3.1 训练数据统计\u003C\u002Fa>  \n- \u003Ca href=\"#压力测试\">3.2 压力测试\u003C\u002Fa>  \n\n\u003Ca href=\"#开发说明\">4 开发说明\u003C\u002Fa>  \n\n\u003Ca href=\"#已知BUG\">5 已知BUG\u003C\u002Fa>  \n\n\n\n# 1 项目介绍\n## 1.1 关于验证码识别\n验证码识别大多是爬虫会遇到的问题，也可以作为图像识别的入门案例。目前通常使用如下几种方法：  \n\n| 方法名称 | 相关要点 |\n| ------ | ------ |\n| tesseract | 仅适合识别没有干扰和扭曲的图片，训练起来很麻烦 |\n| 其他开源识别库 | 不够通用，识别率未知 |\n| 付费OCR API | 需求量大的情形成本很高 |\n| 图像处理+机器学习分类算法 | 涉及多种技术，学习成本高，且不通用 |\n| 卷积神经网络 | 一定的学习成本，算法适用于多类验证码 |\n\n这里说一下使用传统的**图像处理和机器学习算法**，涉及多种技术：  \n\n1. 图像处理\n- 前处理（灰度化、二值化）\n- 图像分割\n- 裁剪（去边框）\n- 图像滤波、降噪\n- 去背景\n- 颜色分离\n- 旋转\n2. 机器学习\n- KNN\n- SVM\n\n使用这类方法对使用者的要求较高，且由于图片的变化类型较多，处理的方法不够通用，经常花费很多时间去调整处理步骤和相关算法。  \n而使用**卷积神经网络**，只需要通过简单的前处理，就可以实现大部分静态字符型验证码的端到端识别，效果很好，通用性很高。  \n\n这里列出目前**常用的验证码**生成库：\n>参考：[Java验证全家桶](https:\u002F\u002Fwww.cnblogs.com\u002Fcynchanpin\u002Fp\u002F6912301.html)  \n\n| 语言 | 验证码库名称 | 链接 | 样例 |\n| ------ | ------ | ------ | ------ |\n| Java | JCaptcha | [示例](https:\u002F\u002Fjcaptcha.atlassian.net\u002Fwiki\u002Fspaces\u002Fgeneral\u002Fpages\u002F1212427\u002FSamples+tests)  | ![效果1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_6814980877f4.jpg) ![效果2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_43cfebfcaa38.jpg) ![效果3](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_ab0e37d10781.jpg) |\n| Java | JCaptcha4Struts2 |  |  |\n| Java | SimpleCaptcha | [例子](https:\u002F\u002Fwww.oschina.net\u002Fp\u002Fsimplecaptcha)   | ![效果1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_0c032f61af2b.jpg) ![效果2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_4a1e051efc0e.jpg) ![效果3](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_33c7bd5095c2.jpg) |\n| Java | kaptcha | [例子](https:\u002F\u002Fgithub.com\u002Flinghushaoxia\u002Fkaptcha) | ![水纹效果](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_1123d4021db1.png) ![鱼眼效果](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_890761b63e60.png) ![阴影效果](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_aacd00e867d7.png) |\n| Java | patchca |  | ![效果1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_561ed94e2e1e.png) |\n| Java | imageRandom |  |  |  \n| Java | iCaptcha |  | ![效果1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_0cc4b0a71e3d.jpg) |  \n| Java | SkewPassImage |  | ![效果1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_fd44cd515389.jpg) |  \n| Java | Cage |  | ![效果1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_a6ce623ecf20.jpg) ![效果2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_12a84915b01a.jpg) |\n| Python | captcha | [例子](https:\u002F\u002Fgithub.com\u002Fnickliqian\u002Fcnn_captcha\u002Fblob\u002Fmaster\u002Fgen_image\u002Fgen_sample_by_captcha.py) | ![py_Captcha](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_b35fc0f3d5ac.jpg) |\n| Python | pycapt | [例子](https:\u002F\u002Fgithub.com\u002Faboutmydreams\u002Fpycapt) | ![pycapt](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_fd981debaa9c.png) |\n| PHP | Gregwar\u002FCaptcha | [文档](https:\u002F\u002Fgithub.com\u002FGregwar\u002FCaptcha) |  |\n| PHP | mewebstudio\u002Fcaptcha | [文档](https:\u002F\u002Fgithub.com\u002Fmewebstudio\u002Fcaptcha) |  |\n\n## 1.2 目录结构\n### 1.2.1 基本配置\n| 序号 | 文件名称 | 说明 |\n| ------ | ------ | ------ |\n| 1 | `conf\u002F` | 配置文件目录 |\n| 2 | `sample\u002F` | 数据集目录 |\n| 3 | `model\u002F` | 模型文件目录 |\n| 4 | `cnnlib\u002F` | 封装CNN的相关代码目录 |\n### 1.2.2 训练模型\n| 序号 | 文件名称 | 说明 |\n| ------ | ------ | ------ |\n| 1 | verify_and_split_data.py | 验证数据集、拆分数据为训练集和测试集 |\n| 2 | network.py | cnn网络基类 |\n| 3 | train_model.py | 训练模型 |\n| 4 | test_batch.py | 批量验证 |\n| 5 | gen_image\u002Fgen_sample_by_captcha.py | 生成验证码的脚本 |\n| 6 | gen_image\u002Fcollect_labels.py | 用于统计验证码标签（常用于中文验证码） |\n\n### 1.2.3 web接口\n| 序号 | 文件名称 | 说明 |\n| ------ | ------ | ------ |\n| 1 | webserver_captcha_image.py | 获取验证码接口 |\n| 2 | webserver_recognize_api.py | 提供在线识别验证码接口 |\n| 3 | recognize_online.py | 使用接口识别的例子 |\n| 4 | recognize_local.py | 测试本地图片的例子 |\n| 5 | recognize_time_test.py | 压力测试识别耗时和请求响应耗时 |\n\n## 1.3 依赖\n```\npip install -r requirements.txt\n```\n注意：如果需要使用GPU进行训练，请把文件中的tenforflow修改为tensorflow-gpu\n\n## 1.4 模型结构\n\n| 序号 | 层级 |\n| :------: | :------: |\n| 输入 | input |\n| 1 | 卷积层 + 池化层 + 降采样层 + ReLU  |\n| 2 | 卷积层 + 池化层 + 降采样层 + ReLU  |\n| 3 | 卷积层 + 池化层 + 降采样层 + ReLU  |\n| 4 | 全连接 + 降采样层 + Relu   |\n| 5 | 全连接 + softmax  |\n| 输出 | output  |\n\n# 2 如何使用\n## 2.1 数据集\n原始数据集可以存放在`.\u002Fsample\u002Forigin`目录中。  \n为了便于处理，图片最好以`2e8j_17322d3d4226f0b5c5a71d797d2ba7f7.jpg`格式命名（标签_序列号.后缀）。 \n  \n如果你没有训练集，你可以使用`gen_sample_by_captcha.py`文件生成训练集文件。\n生成之前你需要修改相关配置`conf\u002Fcaptcha_config.json`（路径、文件后缀、字符集等）。\n```\n{\n  \"root_dir\": \"sample\u002Forigin\u002F\",  # 验证码保存路径\n  \"image_suffix\": \"png\",         # 验证码图片后缀\n  \"characters\": \"0123456789\",    # 生成验证码的可选字符\n  \"count\": 1000,                 # 生成验证码的图片数量\n  \"char_count\": 4,               # 每张验证码图片上的字符数量\n  \"width\": 100,                  # 图片宽度\n  \"height\": 60                   # 图片高度\n}\n```\n\n## 2.2 配置文件\n创建一个新项目前，需要自行**修改相关配置文件**`conf\u002Fsample_config.json`。\n```\n{\n  \"origin_image_dir\": \"sample\u002Forigin\u002F\",  # 原始文件\n  \"new_image_dir\": \"sample\u002Fnew_train\u002F\",  # 新的训练样本\n  \"train_image_dir\": \"sample\u002Ftrain\u002F\",    # 训练集\n  \"test_image_dir\": \"sample\u002Ftest\u002F\",      # 测试集\n  \"api_image_dir\": \"sample\u002Fapi\u002F\",        # api接收的图片储存路径\n  \"online_image_dir\": \"sample\u002Fonline\u002F\",  # 从验证码url获取的图片的储存路径\n  \"local_image_dir\": \"sample\u002Flocal\u002F\",    # 本地保存图片的路径\n  \"model_save_dir\": \"model\u002F\",            # 从验证码url获取的图片的储存路径\n  \"image_width\": 100,                    # 图片宽度\n  \"image_height\": 60,                    # 图片高度\n  \"max_captcha\": 4,                      # 验证码字符个数\n  \"image_suffix\": \"png\",                 # 图片文件后缀\n  \"char_set\": \"0123456789abcdefghijklmnopqrstuvwxyz\",  # 验证码识别结果类别\n  \"use_labels_json_file\": false,                       # 是否开启读取`labels.json`内容\n  \"remote_url\": \"http:\u002F\u002F127.0.0.1:6100\u002Fcaptcha\u002F\",      # 验证码远程获取地址\n  \"cycle_stop\": 3000,                                  # 启动任务后的训练指定次数后停止\n  \"acc_stop\": 0.99,                                    # 训练到指定准确率后停止\n  \"cycle_save\": 500,                                   # 训练指定次数后定时保存模型\n  \"enable_gpu\": 0,                                     # 是否开启GUP训练\n  \"train_batch_size\": 128,                             # 训练时每次使用的图片张数，如果CPU或者GPU内存太小可以减少这个参数\n  \"test_batch_size\": 100                               # 每批次测试时验证的图片张数，不要超过验证码集的总数\n}\n\n```\n关于`验证码识别结果类别`，假设你的样本是中文验证码，你可以使用`tools\u002Fcollect_labels.py`脚本进行标签的统计。\n会生成文件`gen_image\u002Flabels.json`存放所有标签，在配置文件中设置`use_labels_json_file = True`开启读取`labels.json`内容作为`结果类别`。\n\n## 2.3 验证和拆分数据集\n此功能会校验原始图片集的尺寸和测试图片是否能打开，并按照19:1的比例拆分出训练集和测试集。  \n所以需要分别创建和指定三个文件夹：origin，train，test用于存放相关文件。\n\n也可以修改为不同的目录，但是最好修改为绝对路径。  \n文件夹创建好之后，执行以下命令即可：\n```\npython3 verify_and_split_data.py\n```\n一般会有类似下面的提示\n```\n>>> 开始校验目录：[sample\u002Forigin\u002F]\n开始校验原始图片集\n原始集共有图片: 1001张\n====以下1张图片有异常====\n[第0张图片] [.DStore] [文件后缀不正确]\n========end\n开始分离原始图片集为：测试集（5%）和训练集（95%）\n共分配1000张图片到训练集和测试集，其中1张为异常留在原始目录\n测试集数量为：50\n训练集数量为：950\n>>> 开始校验目录：[sample\u002Fnew_train\u002F]\n【警告】找不到目录sample\u002Fnew_train\u002F，即将创建\n开始校验原始图片集\n原始集共有图片: 0张\n====以下0张图片有异常====\n未发现异常（共 0 张图片）\n========end\n开始分离原始图片集为：测试集（5%）和训练集（95%）\n共分配0张图片到训练集和测试集，其中0张为异常留在原始目录\n测试集数量为：0\n训练集数量为：0\n```\n程序会同时校验和分割`origin_image_dir`和`new_image_dir`两个目录中的图片；后续有了更多的样本，可以把样本放在`new_image_dir`目录中再次执行`verify_and_split_data`。  \n程序会把无效的文件留在原文件夹。  \n\n此外，当你有新的样本需要一起训练，可以放在`sample\u002Fnew`目录下，再次运行`python3 verify_and_split_data.py`即可。  \n需要注意的是，如果新的样本中有新增的标签，你需要把新的标签增加到`char_set`配置中或者`labels.json`文件中。 \n \n## 2.4 训练模型\n创建好训练集和测试集之后，就可以开始训练模型了。  \n训练的过程中会输出日志，日志展示当前的训练轮数、准确率和loss。  \n**此时的准确率是训练集图片的准确率，代表训练集的图片识别情况**  \n例如：\n```\n第10次训练 >>> \n[训练集] 字符准确率为 0.03000 图片准确率为 0.00000 >>> loss 0.1698757857\n[验证集] 字符准确率为 0.04000 图片准确率为 0.00000 >>> loss 0.1698757857\n```\n字符准确率和图片准确率的解释：\n```\n假设：有100张图片，每张图片四个字符，共400个字符。我们这里把任务拆分为为需要识别400个字符\n字符准确率：识别400的字符中，正确字符的占比。\n图片准确率：100张图片中，4个字符完全识别准确的图片占比。\n```\n这里不具体介绍tensorflow安装相关问题，直奔主题。  \n确保图片相关参数和目录设置正确后，执行以下命令开始训练：\n```\npython3 train_model.py\n```\n也可以根据`train_model.py`的`main`函数中的代码调用类开始训练或执行一次简单的识别演示。  \n\n由于训练集中常常不包含所有的样本特征，所以会出现训练集准确率是100%而测试集准确率不足100%的情况，此时提升准确率的一个解决方案是增加正确标记后的负样本。\n\n## 2.5 批量验证\n使用测试集的图片进行验证，输出准确率。  \n```\npython3 test_batch.py\n```\n同样可以根据`main`函数中的代码调用类开始验证。\n\n## 2.6 启动WebServer\n项目已经封装好加载模型和识别图片的类，启动`web server`后调用接口就可以使用识别服务。  \n启动`web server`\n```\npython3 webserver_recognize_api.py\n```\n接口url为`http:\u002F\u002F127.0.0.1:6000\u002Fb`\n\n## 2.7 调用接口识别\n使用requests调用接口:\n```\nurl = \"http:\u002F\u002F127.0.0.1:6000\u002Fb\"\nfiles = {'image_file': (image_file_name, open('captcha.jpg', 'rb'), 'application')}\nr = requests.post(url=url, files=files)\n```\n返回的结果是一个json：\n```\n{\n    'time': '1542017705.9152594',\n    'value': 'jsp1',\n}\n```\n文件`recognize_local.py`是使用接口识别本地的例子，这个例子运行成功，那么识别验证码的一套流程基本上是走了一遍了。  \n在线识别验证码是显示中常用场景，文件`recognize_online.py`是使用接口在线识别的例子，参见：`## 2.11 在线识别`。\n\n## 2.8 部署\n部署的时候，把`webserver_recognize_api.py`文件的最后一行修改为如下内容：\n```\napp.run(host='0.0.0.0',port=5000,debug=False)\n```\n然后开启端口访问权限，就可以通过外网访问了。  \n另外为了开启多进程处理请求，可以使用uwsgi+nginx组合进行部署。  \n这部分可以参考：[Flask部署选择](http:\u002F\u002Fdocs.jinkan.org\u002Fdocs\u002Fflask\u002Fdeploying\u002Findex.html)\n\n## 2.9 部署多个模型\n部署多个模型:\n在`webserver_recognize_api.py`文件汇总，新建一个Recognizer对象；  \n并参照原有`up_image`函数编写的路由和识别逻辑。\n```\nQ = Recognizer(image_height, image_width, max_captcha, char_set, model_save_dir)\n```\n注意修改这一行：\n```\nvalue = Q.rec_image(img)\n```\n\n## 2.10 在线识别\n在线识别验证码是显示中常用场景，即实时获取目标验证码来调用接口进行识别。  \n为了测试的完整性，这里搭建了一个验证码获取接口，通过执行下面的命令启动：  \n```\npython webserver_captcha_image.py\n```\n启动后通过访问此地址：`http:\u002F\u002F127.0.0.1:6100\u002Fcaptcha\u002F`可以接收到验证码图片的二进制流文件。  \n具体进行在线识别任务的demo参见：`recognize_online.py`。  \n\n# 3 数据统计\n## 3.1 训练数据统计\n由于很多同学提出，“需要训练多久呀？”、“准确率可以达到多少？”、“为什么我的准确率一直是0？”类似的疑问。  \n这一小节，使用默认配置（2019.06.02），把训练过程中的数据做了统计，给大家做一个展示。  \n本次测试条件如下：\n- 验证码：本项目自带生成验证码程序，数字+小写英文\n- 数量：20000张\n- 计算引擎：GPU\n- GPU型号：笔记本，GTX 950X 2G显卡\n  \n经过测试：\n5000次，25分钟，**训练集**字符准确率84%，图片准确率51%；  \n9190次，46分钟，**训练集**字符准确率100%，图片准确率100%；  \n12000，60分钟，**测试集**的准确率基本上已经跑不动了。  \n\n使用`test_batch.py`测试，日志如下：  \n```\n100个样本识别耗时6.513171672821045秒，准确率37.0%\n```\n有37%的准确率，可以说是识别成功的第一步了。  \n\n曲线图如下：  \n训练集-  \n![train_acc](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_0939fdba1a23.png) \n   \n测试集-   \n![test_acc](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_b6d35be0cb4f.png)  \n\n\n## 3.2 压力测试和统计数据\n提供了一个简易的压力测试脚本，可以统计api运行过程中识别耗时和请求耗时的相关数据，不过图需要自己用Excel拉出来。  \n打开文件`recognize_time_test.py`，修改`main`函数下的`test_file`路径，这里会重复使用一张图片来访问是被接口。  \n最后数据会储存在test.csv文件中。  \n使用如下命令运行：  \n```\npython3 recognize_time_test.py\n----输出如下\n2938,5150,13:30:25,总耗时：29ms,识别：15ms,请求：14ms\n2939,5150,13:30:25,总耗时：41ms,识别：21ms,请求：20ms\n2940,5150,13:30:25,总耗时：47ms,识别：16ms,请求：31ms\n```\n这里对一个模型进行了两万次测试后，一组数据test.csv。\n把test.csv使用箱线图进行分析后可以看到：  \n![压力测试结果](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_b946aad8df74.png)  \n- 单次请求API总耗时（平均值）：27ms  \n- 单次识别耗时（平均值）：12ms  \n- 每次请求耗时（平均值）：15ms  \n其中有：请求API总耗时 = 识别耗时 + 请求耗时  \n\n# 4 开发说明\n- 20190209  \n1. 目前tensorboard展示支持的不是很好。\n- 20190601\n1. 最近比较忙，issue回的有点慢，请大家见谅\n2. dev分支开发到一半一直没时间弄，今天儿童节花了一下午时间更新了一下:)\n3. 感谢看到这里的你，谢谢你的支持\n\n# 4 已知BUG\n1. 使用pycharm启动recognize_api.py文件报错\n```\n2018-12-01 00:35:15.106333: W T:\\src\\github\\tensorflow\\tensorflow\\core\\framework\\op_kernel.cc:1273] OP_REQUIRES failed at save_restore_tensor.cc:170 : Invalid argument: Unsuccessful TensorSliceReader constructor: Failed to get matching files on .\u002Fmodel\u002F: Not found: FindFirstFile failed for: .\u002Fmodel : ϵͳ�Ҳ���ָ����·����\n; No such process\n......\ntensorflow.python.framework.errors_impl.InvalidArgumentError: Unsuccessful TensorSliceReader constructor: Failed to get matching files on .\u002Fmodel\u002F: Not found: FindFirstFile failed for: .\u002Fmodel : ϵͳ\\udcd5Ҳ\\udcbb\\udcb5\\udcbdָ\\udcb6\\udca8\\udcb5\\udcc4·\\udcbe\\udcb6\\udca1\\udca3\n; No such process\n\t [[Node: save\u002FRestoreV2 = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT], _device=\"\u002Fjob:localhost\u002Freplica:0\u002Ftask:0\u002Fdevice:CPU:0\"](_arg_save\u002FConst_0_0, save\u002FRestoreV2\u002Ftensor_names, save\u002FRestoreV2\u002Fshape_and_slices)]]\n```\n由pycharm默认设置了工作空间，导致读取相对路径的model文件夹出错。\n解决办法：编辑运行配置，设置工作空间为项目目录即可。\n![bug_api启动失败](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_34f0fefb6edb.png)\n\n2. FileNotFoundError: [Errno 2] No such file or directory: 'xxxxxx'  \n目录下有文件夹不存在，在指定目录创建好文件夹即可。\n\n3. api程序在运行过程中内存越占越大  \n结果查阅资料：[链接](https:\u002F\u002Fblog.csdn.net\u002FThe_lastest\u002Farticle\u002Fdetails\u002F81130500)  \n在迭代循环时，不能再包含任何张量的计算表达式，否在会内存溢出。\n将张量的计算表达式放到init初始化执行后，识别速度得到极大的提升。\n\n4. 加载多个模型报错\n原因是两个Recognizer对象都使用了默认的Graph。\n解决办法是在创建对象的时候不使用默认Graph，新建graph，这样每个Recognizer都使用不同的graph，就不会冲突了。\n\n5. Flask程序用于生产\n可以参考官方文档：[Flask的生产配置](http:\u002F\u002Fdocs.jinkan.org\u002Fdocs\u002Fflask\u002Fconfig.html)\n\n6. OOM happens\n```\nHint: If you want to see a list of allocated tensors when OOM happens,\nadd report_tensor_allocations_upon_oom to RunOptions for current allocation info.\n```\n尽可能关闭其他占用GPU或者CPU的任务，或者减小`sample_config.json`中的`train_batch_size`参数。\n","# cnn_captcha  \n使用TensorFlow实现卷积神经网络进行验证码识别。  \n本项目针对字符型图片验证码，使用TensorFlow实现卷积神经网络，进行验证码识别。  \n项目封装了比较通用的**校验、训练、验证、识别、API模块**，极大的减少了识别字符型验证码花费的时间和精力。  \n  \n项目已经帮助很多同学高效完成了验证码识别任务。\n如果你在使用过程中出现了bug和做了良好的改进，欢迎提出issue和PR，作者会尽快回复，希望能和你共同完善项目。 \n\n如果你需要识别点选、拖拽类验证码，或者有目标检测需求，也可以参考这个项目[nickliqian\u002Fdarknet_captcha](https:\u002F\u002Fgithub.com\u002Fnickliqian\u002Fdarknet_captcha)。\n\n# 时间表\n#### 2018.11.12\n初版Readme.md  \n#### 2018.11.21\n加入关于验证码识别的一些说明  \n#### 2018.11.24\n优化校验数据集图片的规则  \n#### 2018.11.26\n新增`train_model_v2.py`文件，训练过程中同时输出训练集和验证集的准确率  \n#### 2018.12.06\n新增多模型部署支持，修复若干bug  \n#### 2018.12.08\n优化模型识别速度，支持api压力测试和统计耗时  \n#### 2019.02.19\n1. 新增一种准确率计算方式    \n2. TAG: v1.0\n#### 2019.04.12\n1. 只保留一种`train_model.py`文件\n2. 优化代码结构\n3. 把通用配置抽取到`sample_config.json`和`captcha_config.json`\n4. 修复若干大家在issue提出的问题\n#### 2019.06.01\n1. 完善readme文档，文档不长，请大家一定要读完~\n2. 使用cnnlib目录存放神经网络结构代码\n3. 做了一版训练数据统计，大家可以参考我们的训练次数、时长和准确率\n4. TAG: v2.0  \n\n# 目录\n\u003Ca href=\"#项目介绍\">1 项目介绍\u003C\u002Fa>  \n- \u003Ca href=\"#关于验证码识别\">1.1 关于验证码识别\u003C\u002Fa>  \n- \u003Ca href=\"#目录结构\">1.2 目录结构\u003C\u002Fa>  \n- \u003Ca href=\"#依赖\">1.3 依赖\u003C\u002Fa>  \n- \u003Ca href=\"#模型结构\">1.4 模型结构\u003C\u002Fa>  \n\n\u003Ca href=\"#如何使用\">2 如何使用\u003C\u002Fa>  \n- \u003Ca href=\"#数据集\">2.1 数据集\u003C\u002Fa>  \n- \u003Ca href=\"#配置文件\">2.2 配置文件\u003C\u002Fa>  \n- \u003Ca href=\"#验证和拆分数据集\">2.3 验证和拆分数据集\u003C\u002Fa>  \n- \u003Ca href=\"#训练模型\">2.4 训练模型\u003C\u002Fa>  \n- \u003Ca href=\"#批量验证\">2.5 批量验证\u003C\u002Fa>  \n- \u003Ca href=\"#启动WebServer\">2.6 启动WebServer\u003C\u002Fa>  \n- \u003Ca href=\"#调用接口识别\">2.7 调用接口识别\u003C\u002Fa>  \n- \u003Ca href=\"#部署\">2.8 部署\u003C\u002Fa>  \n- \u003Ca href=\"#部署多个模型\">2.9 部署多个模型\u003C\u002Fa>  \n- \u003Ca href=\"#在线识别\">2.10 在线识别\u003C\u002Fa>  \n\n\u003Ca href=\"#说明\">3 统计数据\u003C\u002Fa>  \n- \u003Ca href=\"#训练数据统计\">3.1 训练数据统计\u003C\u002Fa>  \n- \u003Ca href=\"#压力测试\">3.2 压力测试\u003C\u002Fa>  \n\n\u003Ca href=\"#开发说明\">4 开发说明\u003C\u002Fa>  \n\n\u003Ca href=\"#已知BUG\">5 已知BUG\u003C\u002Fa>  \n\n\n\n# 1 项目介绍\n## 1.1 关于验证码识别\n验证码识别大多是爬虫会遇到的问题，也可以作为图像识别的入门案例。目前通常使用如下几种方法：  \n\n| 方法名称 | 相关要点 |\n| ------ | ------ |\n| tesseract | 仅适合识别没有干扰和扭曲的图片，训练起来很麻烦 |\n| 其他开源识别库 | 不够通用，识别率未知 |\n| 付费OCR API | 需求量大的情形成本很高 |\n| 图像处理+机器学习分类算法 | 涉及多种技术，学习成本高，且不通用 |\n| 卷积神经网络 | 一定的学习成本，算法适用于多类验证码 |\n\n这里说一下使用传统的**图像处理和机器学习算法**，涉及多种技术：  \n\n1. 图像处理\n- 前处理（灰度化、二值化）\n- 图像分割\n- 裁剪（去边框）\n- 图像滤波、降噪\n- 去背景\n- 颜色分离\n- 旋转\n2. 机器学习\n- KNN\n- SVM\n\n使用这类方法对使用者的要求较高，且由于图片的变化类型较多，处理的方法不够通用，经常花费很多时间去调整处理步骤和相关算法。  \n而使用**卷积神经网络**，只需要通过简单的前处理，就可以实现大部分静态字符型验证码的端到端识别，效果很好，通用性很高。  \n\n这里列出目前**常用的验证码**生成库：\n>参考：[Java验证全家桶](https:\u002F\u002Fwww.cnblogs.com\u002Fcynchanpin\u002Fp\u002F6912301.html)  \n\n| 语言 | 验证码库名称 | 链接 | 样例 |\n| ------ | ------ | ------ | ------ |\n| Java | JCaptcha | [示例](https:\u002F\u002Fjcaptcha.atlassian.net\u002Fwiki\u002Fspaces\u002Fgeneral\u002Fpages\u002F1212427\u002FSamples+tests)  | ![效果1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_6814980877f4.jpg) ![效果2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_43cfebfcaa38.jpg) ![效果3](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_ab0e37d10781.jpg) |\n| Java | JCaptcha4Struts2 |  |  |\n| Java | SimpleCaptcha | [例子](https:\u002F\u002Fwww.oschina.net\u002Fp\u002Fsimplecaptcha)   | ![效果1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_0c032f61af2b.jpg) ![效果2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_4a1e051efc0e.jpg) ![效果3](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_33c7bd5095c2.jpg) |\n| Java | kaptcha | [例子](https:\u002F\u002Fgithub.com\u002Flinghushaoxia\u002Fkaptcha) | ![水纹效果](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_1123d4021db1.png) ![鱼眼效果](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_890761b63e60.png) ![阴影效果](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_aacd00e867d7.png) |\n| Java | patchca |  | ![效果1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_561ed94e2e1e.png) |\n| Java | imageRandom |  |  |  \n| Java | iCaptcha |  | ![效果1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_0cc4b0a71e3d.jpg) |  \n| Java | SkewPassImage |  | ![效果1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_fd44cd515389.jpg) |  \n| Java | Cage |  | ![效果1](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_a6ce623ecf20.jpg) ![效果2](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_12a84915b01a.jpg) |\n| Python | captcha | [例子](https:\u002F\u002Fgithub.com\u002Fnickliqian\u002Fcnn_captcha\u002Fblob\u002Fmaster\u002Fgen_image\u002Fgen_sample_by_captcha.py) | ![py_Captcha](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_b35fc0f3d5ac.jpg) |\n| Python | pycapt | [例子](https:\u002F\u002Fgithub.com\u002Faboutmydreams\u002Fpycapt) | ![pycapt](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_fd981debaa9c.png) |\n| PHP | Gregwar\u002FCaptcha | [文档](https:\u002F\u002Fgithub.com\u002FGregwar\u002FCaptcha) |  |\n| PHP | mewebstudio\u002Fcaptcha | [文档](https:\u002F\u002Fgithub.com\u002Fmewebstudio\u002Fcaptcha) |  |\n\n## 1.2 目录结构\n### 1.2.1 基本配置\n| 序号 | 文件名称 | 说明 |\n| ------ | ------ | ------ |\n| 1 | `conf\u002F` | 配置文件目录 |\n| 2 | `sample\u002F` | 数据集目录 |\n| 3 | `model\u002F` | 模型文件目录 |\n| 4 | `cnnlib\u002F` | 封装CNN的相关代码目录 |\n### 1.2.2 训练模型\n| 序号 | 文件名称 | 说明 |\n| ------ | ------ | ------ |\n| 1 | verify_and_split_data.py | 验证数据集、拆分数据为训练集和测试集 |\n| 2 | network.py | CNN网络基类 |\n| 3 | train_model.py | 训练模型 |\n| 4 | test_batch.py | 批量验证 |\n| 5 | gen_image\u002Fgen_sample_by_captcha.py | 生成验证码的脚本 |\n| 6 | gen_image\u002Fcollect_labels.py | 用于统计验证码标签（常用于中文验证码） |\n\n### 1.2.3 web接口\n| 序号 | 文件名称 | 说明 |\n| ------ | ------ | ------ |\n| 1 | webserver_captcha_image.py | 获取验证码接口 |\n| 2 | webserver_recognize_api.py | 提供在线识别验证码接口 |\n| 3 | recognize_online.py | 使用接口识别的例子 |\n| 4 | recognize_local.py | 测试本地图片的例子 |\n| 5 | recognize_time_test.py | 压力测试识别耗时和请求响应耗时 |\n\n## 1.3 依赖\n```\npip install -r requirements.txt\n```\n注意：如果需要使用GPU进行训练，请把文件中的tenforflow修改为tensorflow-gpu\n\n## 1.4 模型结构\n\n| 序号 | 层级 |\n| :------: | :------: |\n| 输入 | input |\n| 1 | 卷积层 + 池化层 + 降采样层 + ReLU  |\n| 2 | 卷积层 + 池化层 + 降采样层 + ReLU  |\n| 3 | 卷积层 + 池化层 + 降采样层 + ReLU  |\n| 4 | 全连接 + 降采样层 + Relu   |\n| 5 | 全连接 + softmax  |\n| 输出 | output  |\n\n# 2 如何使用\n## 2.1 数据集\n原始数据集可以存放在`.\u002Fsample\u002Forigin`目录中。  \n为了便于处理，图片最好以`2e8j_17322d3d4226f0b5c5a71d797d2ba7f7.jpg`格式命名（标签_序列号.后缀）。 \n  \n如果你没有训练集，你可以使用`gen_sample_by_captcha.py`文件生成训练集文件。\n生成之前你需要修改相关配置`conf\u002Fcaptcha_config.json`（路径、文件后缀、字符集等）。\n```\n{\n  \"root_dir\": \"sample\u002Forigin\u002F\",  # 验证码保存路径\n  \"image_suffix\": \"png\",         # 验证码图片后缀\n  \"characters\": \"0123456789\",    # 生成验证码的可选字符\n  \"count\": 1000,                 # 生成验证码的图片数量\n  \"char_count\": 4,               # 每张验证码图片上的字符数量\n  \"width\": 100,                  # 图片宽度\n  \"height\": 60                   # 图片高度\n}\n```\n\n## 2.2 配置文件\n创建一个新项目前，需要自行**修改相关配置文件**`conf\u002Fsample_config.json`。\n```\n{\n  \"origin_image_dir\": \"sample\u002Forigin\u002F\",  # 原始文件\n  \"new_image_dir\": \"sample\u002Fnew_train\u002F\",  # 新的训练样本\n  \"train_image_dir\": \"sample\u002Ftrain\u002F\",    # 训练集\n  \"test_image_dir\": \"sample\u002Ftest\u002F\",      # 测试集\n  \"api_image_dir\": \"sample\u002Fapi\u002F\",        # api接收的图片储存路径\n  \"online_image_dir\": \"sample\u002Fonline\u002F\",  # 从验证码url获取的图片的储存路径\n  \"local_image_dir\": \"sample\u002Flocal\u002F\",    # 本地保存图片的路径\n  \"model_save_dir\": \"model\u002F\",            # 从验证码url获取的图片的储存路径\n  \"image_width\": 100,                    # 图片宽度\n  \"image_height\": 60,                    # 图片高度\n  \"max_captcha\": 4,                      # 验证码字符个数\n  \"image_suffix\": \"png\",                 # 图片文件后缀\n  \"char_set\": \"0123456789abcdefghijklmnopqrstuvwxyz\",  # 验证码识别结果类别\n  \"use_labels_json_file\": false,                       # 是否开启读取`labels.json`内容\n  \"remote_url\": \"http:\u002F\u002F127.0.0.1:6100\u002Fcaptcha\u002F\",      # 验证码远程获取地址\n  \"cycle_stop\": 3000,                                  # 启动任务后的训练指定次数后停止\n  \"acc_stop\": 0.99,                                    # 训练到指定准确率后停止\n  \"cycle_save\": 500,                                   # 训练指定次数后定时保存模型\n  \"enable_gpu\": 0,                                     # 是否开启GUP训练\n  \"train_batch_size\": 128,                             # 训练时每次使用的图片张数，如果CPU或者GPU内存太小可以减少这个参数\n  \"test_batch_size\": 100                               # 每批次测试时验证的图片张数，不要超过验证码集的总数\n}\n\n```\n关于`验证码识别结果类别`，假设你的样本是中文验证码，你可以使用`tools\u002Fcollect_labels.py`脚本进行标签的统计。\n会生成文件`gen_image\u002Flabels.json`存放所有标签，在配置文件中设置`use_labels_json_file = True`开启读取`labels.json`内容作为`结果类别`。\n\n## 2.3 验证和拆分数据集\n此功能会校验原始图片集的尺寸和测试图片是否能打开，并按照19:1的比例拆分出训练集和测试集。  \n所以需要分别创建和指定三个文件夹：origin，train，test用于存放相关文件。\n\n也可以修改为不同的目录，但是最好修改为绝对路径。  \n文件夹创建好之后，执行以下命令即可：\n```\npython3 verify_and_split_data.py\n```\n一般会有类似下面的提示\n```\n>>> 开始校验目录：[sample\u002Forigin\u002F]\n开始校验原始图片集\n原始集共有图片: 1001张\n====以下1张图片有异常====\n[第0张图片] [.DStore] [文件后缀不正确]\n========end\n开始分离原始图片集为：测试集（5%）和训练集（95%）\n共分配1000张图片到训练集和测试集，其中1张为异常留在原始目录\n测试集数量为：50\n训练集数量为：950\n>>> 开始校验目录：[sample\u002Fnew_train\u002F]\n【警告】找不到目录sample\u002Fnew_train\u002F，即将创建\n开始校验原始图片集\n原始集共有图片: 0张\n====以下0张图片有异常====\n未发现异常（共 0 张图片）\n========end\n开始分离原始图片集为：测试集（5%）和训练集（95%）\n共分配0张图片到训练集和测试集，其中0张为异常留在原始目录\n测试集数量为：0\n训练集数量为：0\n```\n程序会同时校验和分割`origin_image_dir`和`new_image_dir`两个目录中的图片；后续有了更多的样本，可以把样本放在`new_image_dir`目录中再次执行`verify_and_split_data`。  \n程序会把无效的文件留在原文件夹。  \n\n此外，当你有新的样本需要一起训练，可以放在`sample\u002Fnew`目录下，再次运行`python3 verify_and_split_data.py`即可。  \n需要注意的是，如果新的样本中有新增的标签，你需要把新的标签增加到`char_set`配置中或者`labels.json`文件中。 \n \n## 2.4 训练模型\n创建好训练集和测试集之后，就可以开始训练模型了。  \n训练的过程中会输出日志，日志展示当前的训练轮数、准确率和loss。  \n**此时的准确率是训练集图片的准确率，代表训练集的图片识别情况**  \n例如：\n```\n第10次训练 >>> \n[训练集] 字符准确率为 0.03000 图片准确率为 0.00000 >>> loss 0.1698757857\n[验证集] 字符准确率为 0.04000 图片准确率为 0.00000 >>> loss 0.1698757857\n```\n字符准确率和图片准确率的解释：\n```\n假设：有100张图片，每张图片四个字符，共400个字符。我们这里把任务拆分为为需要识别400个字符\n字符准确率：识别400的字符中，正确字符的占比。\n图片准确率：100张图片中，4个字符完全识别准确的图片占比。\n```\n这里不具体介绍tensorflow安装相关问题，直奔主题。  \n确保图片相关参数和目录设置正确后，执行以下命令开始训练：\n```\npython3 train_model.py\n```\n也可以根据`train_model.py`的`main`函数中的代码调用类开始训练或执行一次简单的识别演示。  \n\n由于训练集中常常不包含所有的样本特征，所以会出现训练集准确率是100%而测试集准确率不足100%的情况，此时提升准确率的一个解决方案是增加正确标记后的负样本。\n\n## 2.5 批量验证\n使用测试集的图片进行验证，输出准确率。  \n```\npython3 test_batch.py\n```\n同样可以根据`main`函数中的代码调用类开始验证。\n\n## 2.6 启动WebServer\n项目已经封装好加载模型和识别图片的类，启动`web server`后调用接口就可以使用识别服务。  \n启动`web server`\n```\npython3 webserver_recognize_api.py\n```\n接口url为`http:\u002F\u002F127.0.0.1:6000\u002Fb`\n\n## 2.7 调用接口识别\n使用requests调用接口:\n```\nurl = \"http:\u002F\u002F127.0.0.1:6000\u002Fb\"\nfiles = {'image_file': (image_file_name, open('captcha.jpg', 'rb'), 'application')}\nr = requests.post(url=url, files=files)\n```\n返回的结果是一个json：\n```\n{\n    'time': '1542017705.9152594',\n    'value': 'jsp1',\n}\n```\n文件`recognize_local.py`是使用接口识别本地的例子，这个例子运行成功，那么识别验证码的一套流程基本上是走了一遍了。  \n在线识别验证码是显示中常用场景，文件`recognize_online.py`是使用接口在线识别的例子，参见：`## 2.11 在线识别`。\n\n## 2.8 部署\n部署的时候，把`webserver_recognize_api.py`文件的最后一行修改为如下内容：\n```\napp.run(host='0.0.0.0',port=5000,debug=False)\n```\n然后开启端口访问权限，就可以通过外网访问了。  \n另外为了开启多进程处理请求，可以使用uwsgi+nginx组合进行部署。  \n这部分可以参考：[Flask部署选择](http:\u002F\u002Fdocs.jinkan.org\u002Fdocs\u002Fflask\u002Fdeploying\u002Findex.html)\n\n## 2.9 部署多个模型\n部署多个模型:\n在`webserver_recognize_api.py`文件汇总，新建一个Recognizer对象；  \n并参照原有`up_image`函数编写的路由和识别逻辑。\n```\nQ = Recognizer(image_height, image_width, max_captcha, char_set, model_save_dir)\n```\n注意修改这一行：\n```\nvalue = Q.rec_image(img)\n```\n\n## 2.10 在线识别\n在线识别验证码是显示中常用场景，即实时获取目标验证码来调用接口进行识别。  \n为了测试的完整性，这里搭建了一个验证码获取接口，通过执行下面的命令启动：  \n```\npython webserver_captcha_image.py\n```\n启动后通过访问此地址：`http:\u002F\u002F127.0.0.1:6100\u002Fcaptcha\u002F`可以接收到验证码图片的二进制流文件。  \n具体进行在线识别任务的demo参见：`recognize_online.py`。  \n\n# 3 数据统计\n## 3.1 训练数据统计\n由于很多同学提出，“需要训练多久呀？”、“准确率可以达到多少？”、“为什么我的准确率一直是0？”类似的疑问。  \n这一小节，使用默认配置（2019.06.02），把训练过程中的数据做了统计，给大家做一个展示。  \n本次测试条件如下：\n- 验证码：本项目自带生成验证码程序，数字+小写英文\n- 数量：20000张\n- 计算引擎：GPU\n- GPU型号：笔记本，GTX 950X 2G显卡\n  \n经过测试：\n5000次，25分钟，**训练集**字符准确率84%，图片准确率51%；  \n9190次，46分钟，**训练集**字符准确率100%，图片准确率100%；  \n12000，60分钟，**测试集**的准确率基本上已经跑不动了。  \n\n使用`test_batch.py`测试，日志如下：  \n```\n100个样本识别耗时6.513171672821045秒，准确率37.0%\n```\n有37%的准确率，可以说是识别成功的第一步了。  \n\n曲线图如下：  \n训练集-  \n![train_acc](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_0939fdba1a23.png) \n   \n测试集-   \n![test_acc](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_b6d35be0cb4f.png)  \n\n\n## 3.2 压力测试和统计数据\n提供了一个简易的压力测试脚本，可以统计api运行过程中识别耗时和请求耗时的相关数据，不过图需要自己用Excel拉出来。  \n打开文件`recognize_time_test.py`，修改`main`函数下的`test_file`路径，这里会重复使用一张图片来访问是被接口。  \n最后数据会储存在test.csv文件中。  \n使用如下命令运行：  \n```\npython3 recognize_time_test.py\n----输出如下\n2938,5150,13:30:25,总耗时：29ms,识别：15ms,请求：14ms\n2939,5150,13:30:25,总耗时：41ms,识别：21ms,请求：20ms\n2940,5150,13:30:25,总耗时：47ms,识别：16ms,请求：31ms\n```\n这里对一个模型进行了两万次测试后，一组数据test.csv。\n把test.csv使用箱线图进行分析后可以看到：  \n![压力测试结果](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_b946aad8df74.png)  \n- 单次请求API总耗时（平均值）：27ms  \n- 单次识别耗时（平均值）：12ms  \n- 每次请求耗时（平均值）：15ms  \n其中有：请求API总耗时 = 识别耗时 + 请求耗时  \n\n# 4 开发说明\n- 20190209  \n1. 目前tensorboard展示支持的不是很好。\n- 20190601\n1. 最近比较忙，issue回的有点慢，请大家见谅\n2. dev分支开发到一半一直没时间弄，今天儿童节花了一下午时间更新了一下:)\n3. 感谢看到这里的你，谢谢你的支持\n\n# 4 已知BUG\n1. 使用pycharm启动recognize_api.py文件报错\n```\n2018-12-01 00:35:15.106333: W T:\\src\\github\\tensorflow\\tensorflow\\core\\framework\\op_kernel.cc:1273] OP_REQUIRES failed at save_restore_tensor.cc:170 : Invalid argument: Unsuccessful TensorSliceReader constructor: Failed to get matching files on .\u002Fmodel\u002F: Not found: FindFirstFile failed for: .\u002Fmodel : ϵͳҲָ·\n; No such process\n......\ntensorflow.python.framework.errors_impl.InvalidArgumentError: Unsuccessful TensorSliceReader constructor: Failed to get matching files on .\u002Fmodel\u002F: Not found: FindFirstFile failed for: .\u002Fmodel : ϵͳ\\udcd5Ҳ\\udcb5\\udcbdָ\\udcb6\\udca8\\udcb5\\udcc4·\\udcbe\\udcb6\\udca1\\udca3\n; No such process\n\t [[Node: save\u002FRestoreV2 = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT], _device=\"\u002Fjob:localhost\u002Freplica:0\u002Ftask:0\u002Fdevice:CPU:0\"](_arg_save\u002FConst_0_0, save\u002FRestoreV2\u002Ftensor_names, save\u002FRestoreV2\u002Fshape_and_slices)]]\n```\n由pycharm默认设置了工作空间，导致读取相对路径的model文件夹出错。\n解决办法：编辑运行配置，设置工作空间为项目目录即可。\n![bug_api启动失败](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_readme_34f0fefb6edb.png)\n\n2. FileNotFoundError: [Errno 2] No such file or directory: 'xxxxxx'  \n目录下有文件夹不存在，在指定目录创建好文件夹即可。\n\n3. api程序在运行过程中内存越占越大  \n结果查阅资料：[链接](https:\u002F\u002Fblog.csdn.net\u002FThe_lastest\u002Farticle\u002Fdetails\u002F81130500)  \n在迭代循环时，不能再包含任何张量的计算表达式，否在会内存溢出。\n将张量的计算表达式放到init初始化执行后，识别速度得到极大的提升。\n\n4. 加载多个模型报错\n原因是两个Recognizer对象都使用了默认的Graph。\n解决办法是在创建对象的时候不使用默认Graph，新建graph，这样每个Recognizer都使用不同的graph，就不会冲突了。\n\n5. Flask程序用于生产\n可以参考官方文档：[Flask的生产配置](http:\u002F\u002Fdocs.jinkan.org\u002Fdocs\u002Fflask\u002Fconfig.html)\n\n6. OOM happens\n```\nHint: If you want to see a list of allocated tensors when OOM happens,\nadd report_tensor_allocations_upon_oom to RunOptions for current allocation info.\n```\n尽可能关闭其他占用GPU或者CPU的任务，或者减小`sample_config.json`中的`train_batch_size`参数。","# cnn_captcha 快速上手指南\n\n## 环境准备\n\n### 系统要求\n- 操作系统：支持 Linux、macOS 或 Windows（推荐使用 Linux 或 macOS）\n- Python 版本：3.x（建议 3.6+）\n\n### 前置依赖\n项目基于 TensorFlow 实现，安装前请确保已安装以下依赖：\n\n```\npip install -r requirements.txt\n```\n\n> 如果你希望使用 GPU 进行训练，请将 `requirements.txt` 中的 `tensorflow` 替换为 `tensorflow-gpu`。\n\n为了加快依赖包下载速度，建议使用国内镜像源，例如：\n\n```\npip install -r requirements.txt -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n```\n\n---\n\n## 安装步骤\n\n1. 克隆项目到本地：\n   ```\n   git clone https:\u002F\u002Fgithub.com\u002Fnickliqian\u002Fcnn_captcha.git\n   ```\n\n2. 进入项目目录：\n   ```\n   cd cnn_captcha\n   ```\n\n3. 安装依赖：\n   ```\n   pip install -r requirements.txt -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n   ```\n\n4. 准备数据集（可选）：\n   - 若已有验证码图片，将其放入 `sample\u002Forigin\u002F` 目录，并按照格式 `标签_序列号.后缀` 命名。\n   - 若没有数据集，可以使用内置脚本生成验证码图片：\n     ```\n     python gen_image\u002Fgen_sample_by_captcha.py\n     ```\n     在运行前，请先修改配置文件 `conf\u002Fcaptcha_config.json`，设置验证码生成参数。\n\n---\n\n## 基本使用\n\n### 步骤一：验证和拆分数据集\n\n执行以下命令，校验并按比例拆分训练集和测试集：\n\n```\npython3 verify_and_split_data.py\n```\n\n该命令会自动检查原始图片是否符合规范，并将图片按 95%:5% 的比例拆分为训练集和测试集。\n\n---\n\n### 步骤二：训练模型\n\n运行以下命令开始训练模型：\n\n```\npython3 train_model.py\n```\n\n训练过程中会输出当前轮次、训练集与验证集的准确率及 loss 值。训练完成后，模型文件将保存在 `model\u002F` 目录中。\n\n---\n\n### 步骤三：批量验证模型效果\n\n使用测试集对训练好的模型进行验证：\n\n```\npython3 test_batch.py\n```\n\n该命令会输出模型在测试集上的识别准确率。\n\n---\n\n### 步骤四：启动 WebServer 提供 API 接口\n\n启动 Web 服务，提供验证码识别接口：\n\n```\npython3 webserver_recognize_api.py\n```\n\n默认访问地址为：\n```\nhttp:\u002F\u002F127.0.0.1:6000\u002Fb\n```\n\n你可以通过 POST 请求上传验证码图片进行识别。\n\n---\n\n### 步骤五：调用接口识别验证码\n\n使用 Python 的 `requests` 库调用接口示例：\n\n```python\nimport requests\n\nurl = \"http:\u002F\u002F127.0.0.1:6000\u002Fb\"\nfiles = {'image_file': ('captcha.jpg', open('captcha.jpg', 'rb'), 'image\u002Fjpeg')}\nr = requests.post(url=url, files=files)\n\nprint(r.json())\n```\n\n返回结果示例：\n```json\n{\n    'time': '1542017705.9152594',\n    'value': 'jsp1'\n}\n```\n\n---\n\n### 步骤六：在线识别验证码（可选）\n\n若需实时获取验证码图片并识别，可启动验证码生成接口：\n\n```\npython webserver_captcha_image.py\n```\n\n访问地址：\n```\nhttp:\u002F\u002F127.0.0.1:6100\u002Fcaptcha\u002F\n```\n\n该接口会返回验证码图片的二进制流，可用于在线识别任务。\n\n---\n\n## 小结\n\n通过以上步骤，你可以快速完成从数据准备、模型训练到接口调用的完整流程。如需部署到生产环境，可参考文档中的部署说明，使用 `uwsgi + nginx` 组合提升性能。","某电商平台的爬虫开发团队正在尝试自动化采集商品信息，但在抓取过程中遇到了网站的字符型验证码，导致无法顺利登录和访问目标页面。团队需要一种高效、稳定的验证码识别方案，以提升数据采集效率。\n\n### 没有 cnn_captcha 时\n- 验证码识别依赖手动图像处理和传统机器学习算法，开发周期长且效果不稳定。\n- 图像预处理步骤复杂，如灰度化、二值化、去噪等，需耗费大量时间调试。\n- 不同网站的验证码样式差异大，通用性差，每次都需要重新训练模型。\n- 使用第三方OCR API成本高昂，尤其在高频请求场景下难以承受。\n- 缺乏统一的训练、验证和部署流程，导致模型迭代效率低下。\n\n### 使用 cnn_captcha 后\n- 基于卷积神经网络的端到端识别方案，大幅简化了图像处理流程，只需少量预处理即可直接训练模型。\n- 提供完整的训练、验证、部署模块，支持快速迭代和多模型部署，显著提升了开发效率。\n- 可适配多种字符型验证码，通过调整配置文件即可应对不同样式的验证码，通用性强。\n- 内置WebServer接口，支持API调用和压力测试，便于集成到现有爬虫系统中。\n- 项目文档完善，社区活跃，遇到问题可快速获得帮助，降低了使用门槛。\n\n通过 cnn_captcha，团队实现了验证码识别的自动化，显著提高了数据采集效率和系统的稳定性。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickliqian_cnn_captcha_38175ce9.png","nickliqian","Nick Li","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fnickliqian_beb68821.jpg","好好学习",null,"广东 深圳","nickliqian@outlook.com","https:\u002F\u002Fgithub.com\u002Fnickliqian",[84],{"name":85,"color":86,"percentage":87},"Python","#3572A5",100,2879,787,"2026-04-02T08:38:03","Apache-2.0","Linux, macOS, Windows","需要 NVIDIA GPU，显存 8GB+，CUDA 11.7+（若需使用GPU训练）","16GB+",{"notes":96,"python":97,"dependencies":98},"建议使用虚拟环境管理Python依赖，首次运行需准备验证码数据集，并根据配置文件调整参数。若使用GPU训练，请将requirements.txt中的tensorflow替换为tensorflow-gpu。","3.6+",[99,100,101,102,103,104],"tensorflow","numpy","Pillow","requests","flask","opencv-python",[13],[107,108,99],"python","cnn","2026-03-27T02:49:30.150509","2026-04-06T07:13:42.697253",[112,117,122,127,132,137],{"id":113,"question_zh":114,"answer_zh":115,"source_url":116},5616,"为什么GPU利用率很低且训练速度不快？","可能是Windows任务管理器显示的GPU利用率存在bug，建议使用第三方工具如GPuz来查看实际GPU使用情况。此外，确保TensorFlow正确配置并使用了GPU加速。","https:\u002F\u002Fgithub.com\u002Fnickliqian\u002Fcnn_captcha\u002Fissues\u002F41",{"id":118,"question_zh":119,"answer_zh":120,"source_url":121},5617,"如何调整训练集和验证集的数量？","可以手动修改代码中的相关参数来调整训练集和验证集的数量。如果需要对特定样本进行训练，可将这些样本放入origin文件夹，并运行程序进行训练。识别错误的样本后，可将其修正并加入训练集以提升模型效果。","https:\u002F\u002Fgithub.com\u002Fnickliqian\u002Fcnn_captcha\u002Fissues\u002F32",{"id":123,"question_zh":124,"answer_zh":125,"source_url":126},5618,"如何为下载的验证码添加标签？","必须手动输入标签或使用打码平台进行标注。若验证码是通过脚本生成的，需确保其参数与目标验证码一致，否则可能无法识别。","https:\u002F\u002Fgithub.com\u002Fnickliqian\u002Fcnn_captcha\u002Fissues\u002F66",{"id":128,"question_zh":129,"answer_zh":130,"source_url":131},5619,"模型准确率计算有问题怎么办？","可以将准确率计算方式修改为：`accuracy = tf.reduce_mean(tf.reduce_min(tf.cast(correct_pred, tf.float32), axis=1))`。此问题已通过Pull Request提交，作者可考虑合并。","https:\u002F\u002Fgithub.com\u002Fnickliqian\u002Fcnn_captcha\u002Fissues\u002F16",{"id":133,"question_zh":134,"answer_zh":135,"source_url":136},5620,"如何解决'python3 train_model.py'报错的问题？","该问题是由于使用了TensorFlow 2.x版本导致的。解决方案是降级到TensorFlow 1.x版本，或者在代码中将`import tensorflow as tf`替换为`import tensorflow.compat.v1 as tf`并添加`tf.disable_v2_behavior()`。","https:\u002F\u002Fgithub.com\u002Fnickliqian\u002Fcnn_captcha\u002Fissues\u002F104",{"id":138,"question_zh":139,"answer_zh":140,"source_url":141},5621,"启动Flask服务时报错'No module named 'conf.sample''怎么解决？","请检查项目目录结构，确认是否存在`conf\u002Fsample.py`文件。如果缺失，可以从其他正常运行的项目中复制该文件，或从仓库更新最新代码。","https:\u002F\u002Fgithub.com\u002Fnickliqian\u002Fcnn_captcha\u002Fissues\u002F64",[143],{"id":144,"version":145,"summary_zh":79,"released_at":79},105252,"v1.0"]