[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-kerlomz--captcha_trainer":3,"tool-kerlomz--captcha_trainer":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},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,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},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 真正成长为懂上",157379,2,"2026-04-15T23:32:42",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},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 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",108322,"2026-04-10T11:39:34",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},6121,"gemini-cli","google-gemini\u002Fgemini-cli","gemini-cli 是一款由谷歌推出的开源 AI 命令行工具，它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言，它提供了一条从输入提示词到获取模型响应的最短路径，无需切换窗口即可享受智能辅助。\n\n这款工具主要解决了开发过程中频繁上下文切换的痛点，让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用，还是执行复杂的 Git 操作，gemini-cli 都能通过自然语言指令高效处理。\n\n它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口，具备出色的逻辑推理能力；内置 Google 搜索、文件操作及 Shell 命令执行等实用工具；更独特的是，它支持 MCP（模型上下文协议），允许用户灵活扩展自定义集成，连接如图像生成等外部能力。此外，个人谷歌账号即可享受免费的额度支持，且项目基于 Apache 2.0 协议完全开源，是提升终端工作效率的理想助手。",100752,"2026-04-10T01:20:03",[52,13,15,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":32,"last_commit_at":59,"category_tags":60,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":67,"readme_en":68,"readme_zh":69,"quickstart_zh":70,"use_case_zh":71,"hero_image_url":72,"owner_login":73,"owner_name":74,"owner_avatar_url":75,"owner_bio":74,"owner_company":76,"owner_location":77,"owner_email":78,"owner_twitter":74,"owner_website":74,"owner_url":79,"languages":80,"stars":85,"forks":86,"last_commit_at":87,"license":88,"difficulty_score":10,"env_os":89,"env_gpu":90,"env_ram":91,"env_deps":92,"category_tags":98,"github_topics":99,"view_count":32,"oss_zip_url":74,"oss_zip_packed_at":74,"status":17,"created_at":104,"updated_at":105,"faqs":106,"releases":142},7990,"kerlomz\u002Fcaptcha_trainer","captcha_trainer","[验证码识别-训练] This project is based on CNN\u002FResNet\u002FDenseNet+GRU\u002FLSTM+CTC\u002FCrossEntropy to realize verification code identification. This project is only for training the model.","captcha_trainer 是一款基于深度学习的开源工具，专门用于训练图像验证码识别模型。它能有效应对字符粘连、重叠、透视变形、模糊及噪声干扰等复杂场景，不仅适用于各类验证码破解，也能拓展至其他 OCR 文字识别任务。\n\n该工具核心解决了传统验证码识别中模型构建门槛高、定制开发耗时长的痛点。通过可视化配置界面，用户无需修改任何代码，即可根据样本特征自动生成模型配置文件，实现从数据准备到模型训练的全流程管理。其独特的“项目化”管理模式支持多任务并行与热插拔部署，极大提升了复用效率。\n\n在技术架构上，captcha_trainer 灵活组合了 CNN（如 ResNet、DenseNet）提取图像特征，配合 RNN（如 GRU、LSTM）序列预测，并采用 CTC 或交叉熵损失函数进行转录输出。它支持不定长输入、智能参数推荐以及丰富的数据增广策略，确保模型在多样化数据下的鲁棒性。\n\n无论是希望快速落地生产环境的中小企业、需要灵活调整网络结构的算法工程师，还是零编程基础但急需解决方案的个人用户，都能通过其提供的 Windows GPU 编译版轻松上手。只需简单配置，即可将复杂的深度学习技术转","captcha_trainer 是一款基于深度学习的开源工具，专门用于训练图像验证码识别模型。它能有效应对字符粘连、重叠、透视变形、模糊及噪声干扰等复杂场景，不仅适用于各类验证码破解，也能拓展至其他 OCR 文字识别任务。\n\n该工具核心解决了传统验证码识别中模型构建门槛高、定制开发耗时长的痛点。通过可视化配置界面，用户无需修改任何代码，即可根据样本特征自动生成模型配置文件，实现从数据准备到模型训练的全流程管理。其独特的“项目化”管理模式支持多任务并行与热插拔部署，极大提升了复用效率。\n\n在技术架构上，captcha_trainer 灵活组合了 CNN（如 ResNet、DenseNet）提取图像特征，配合 RNN（如 GRU、LSTM）序列预测，并采用 CTC 或交叉熵损失函数进行转录输出。它支持不定长输入、智能参数推荐以及丰富的数据增广策略，确保模型在多样化数据下的鲁棒性。\n\n无论是希望快速落地生产环境的中小企业、需要灵活调整网络结构的算法工程师，还是零编程基础但急需解决方案的个人用户，都能通过其提供的 Windows GPU 编译版轻松上手。只需简单配置，即可将复杂的深度学习技术转化为可用的识别服务，显著降低技术应用成本。","\n# 1. 项目介绍\n\n基于深度学习的图片验证码的解决方案 - 该项目能够秒杀字符粘连重叠\u002F透视变形\u002F模糊\u002F噪声等各种干扰情况，足以解决市面上绝大多数复杂的[验证码场景](#jump)，目前也被用于其他OCR场景。 \n\u003Cdiv align=center>\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkerlomz_captcha_trainer_readme_cb50213c1b66.png\" style=\"zoom:70%;\" \u002F>\n\u003C\u002Fdiv>\n\n\u003Cdiv align=center>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer\u002Fblob\u002Fmaster\u002FLICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg\">\u003C\u002Fa>\n\u003C\u002Fdiv>\n\n该项目基于 TensorFlow 1.14 开发，旨在帮助中小企业或个人用户快速构建图像分类模型并投入生产环境使用，降低技术应用门槛。\n\n面向算法工程师：提供了可拓展的结构支持，允许通过源码灵活方便的添加自己设计的网络结构及其他组件。\n\n面向零基础用户：有需求？但是不会编程？时间就是金钱，学习成本太高我想白嫖。它简直为你而生！\n\n面向需求频繁者：同样的类型的需求一天10个，它的复用程度让您无需一份代码一个需求，一套服务全部搞定。\n\n\n\n> **编译版下载地址：** https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer\u002Freleases\u002F\n\n------\n\n其使用的网络结构主要包含三部分，从下至上依次为：\n\u003Cdiv align=center>\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkerlomz_captcha_trainer_readme_359bb1513510.png\" style=\"zoom:80%;\" \u002F>\n\u003C\u002Fdiv>\n>  输入OP:  **input** ， 输出OP:   **dense_decoded** \n\n\n\n卷积层：从输入图像中提取特征序列;\n\n循环层，预测从卷积层获取的特征序列的标签（真实值）分布;\n\n转录层，把从循环层获取的标签分布通过去重整合等操作转换成最终的识别结果;\n\n\n\n## 1. 可视化模型配置\n\n为每个图像分类任务创建一个独立的项目，每个项目拥有完全独立的管理空间，方便多任务切换和管理。**全程无需修改一行代码**，根据模板生成模型配置，生成的配置文件可直接用模型部署服务。\n\n本项目对应的部署服务支持同时部署多套模型，模型支持热拔插，版本迭代等，业务层可拓展颜色提取，算术运算等常见的验证码解决方案。详情可以移步：https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_platform \n\u003Cdiv align=center>\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkerlomz_captcha_trainer_readme_4c7cd2e84130.png\" style=\"zoom:80%;\" \u002F>\n\u003C\u002Fdiv>\n\n## 2. 特性\n\n1. 目前支持Windows平台的GPU编译版，无需安装环境，0基础建模。\n2. 项目化管理，适合容易被任务优先级安排的程序员们，同一份代码，不同的项目，随心切换，互不干扰。\n3. 新增样本集无需重新打包，可直接增量添加新的样本集，每个训练任务支持加载多个TFRecords文件。\n4. 解除循环层依赖的必须性，支持CNN5\u002FResNet50\u002FDenseNet+CrossEntropy的怀旧组合模式。\n5. 提供智能建议性配置功能，选择样本源路径时可根据样本特性自动推荐字符集，设置尺寸，标签数等。\n6. 支持不定宽[-1, HEIGHT]的网络输入，在样本尺寸多样的场景下自动按比例缩放。\n7. 支持训练中的数据增广，如：指定范围的二值化\u002F模糊\u002F旋转\u002F椒盐噪声等。\n\n\n\n## 3. 模板参数介绍\n\n```yaml\n# - requirement.txt  -  GPU: tensorflow-gpu, CPU: tensorflow\n# - If you use the GPU version, you need to install some additional applications.\n# MemoryUsage: 显存占用率，推荐0.6-0.8之间\nSystem:\n  MemoryUsage: {MemoryUsage}\n  Version: 2\n\n# CNNNetwork: [CNN5, ResNet50, DenseNet] \n# RecurrentNetwork: [CuDNNBiLSTM, CuDNNLSTM, CuDNNGRU, BiLSTM, LSTM, GRU, BiGRU, NoRecurrent]\n# - 推荐配置为 不定长问题：CNN5+GRU ，定长：CNN5\u002FDenseNet\u002FResNet50\n# UnitsNum: RNN层的单元数 [16, 64, 128, 256, 512] \n# - 神经网络在隐层中使用大量神经元，就是做升维，将纠缠在一起的特征或概念分开。\n# Optimizer: 优化器算法 [AdaBound, Adam, Momentum]\n# OutputLayer: [LossFunction, Decoder]\n# - LossFunction: 损失函数 [CTC, CrossEntropy] \n# - Decoder: 解码器 [CTC, CrossEntropy] \nNeuralNet:\n  CNNNetwork: {CNNNetwork}\n  RecurrentNetwork: {RecurrentNetwork}\n  UnitsNum: {UnitsNum}\n  Optimizer: {Optimizer}\n  OutputLayer:\n    LossFunction: {LossFunction}\n    Decoder: {Decoder}\n\n\n# ModelName: 模型名\u002F项目名，同时也对应编译后的pb模型文件名\n# ModelField: 模型处理的数据类型，目前只支持图像 [Image, Text]\n# ModelScene: 模型处理的场景类型，目前只支持分类场景 [Classification]\n# - 目前只支持 “图像分类” 这一种场景.\nModel:\n  ModelName: {ModelName}\n  ModelField: {ModelField}\n  ModelScene: {ModelScene}\n\n# FieldParam 分为 Image, Text 两种，不同数据类型时可配置的参数不同，目前只提供 Image 一种。\n# ModelField 为 Image 时:\n# - Category: 提供默认的内置解决方案:\n# -- [ALPHANUMERIC（含大小写英文数字）, ALPHANUMERIC_LOWER（小写英文数字）, \n# -- ALPHANUMERIC_UPPER（大写英文数字）,NUMERIC（数字）, ALPHABET_LOWER（小写字母）, \n# -- ALPHABET_UPPER（大写字母）, ALPHABET（大小写字母）, \n# -- ALPHANUMERIC_CHS_3500_LOWER（小写字母数字混合中文常用3500）]\n# - 或者可以自定义指定分类集如下（中文亦可）:\n# -- ['Cat', 'Lion', 'Tiger', 'Fish', 'BigCat']\n# - Resize: 重置尺寸，对应网络的输入： [ImageWidth, ImageHeight\u002F-1, ImageChannel]\n# - ImageChannel: 图像通道，3为原图，1为灰度 [1, 3]\n# - 为了配合部署服务根据图片尺寸自动选择对应的模型，由此诞生以下参数（ImageWidth，ImageHeight）:\n# -- ImageWidth: 图片宽度.\n# -- ImageHeight: 图片高度.\n# - MaxLabelNum: 该参数在使用CTC损失函数时将被忽略，仅用于使用交叉熵作为损失函数\u002F标签数固定时使用\n# ModelField 为 Text 时:\n# - 该类型暂时不支持\nFieldParam:\n  Category: {Category}\n  Resize: {Resize}\n  ImageChannel: {ImageChannel}\n  ImageWidth: {ImageWidth}\n  ImageHeight: {ImageHeight}\n  MaxLabelNum: {MaxLabelNum}\n  OutputSplit: {OutputSplit}\n\n\n# 该配置应用于数据源的标签获取.\n# LabelFrom: 标签来源，目前只支持 从文件名提取 [FileName, XML, LMDB]\n# ExtractRegex: 正则提取规则，对应于 从文件名提取 方案 FileName:\n# - 默认匹配形如 apple_20181010121212.jpg 的文件.\n# - 默认正则为 .*?(?=_.*\\.)\n# LabelSplit: 该规则仅用于 从文件名提取 方案:\n# - 文件名中的分割符形如: cat&big cat&lion_20181010121212.png，那么分隔符为 &\n# - The Default is null.\nLabel:\n  LabelFrom: {LabelFrom}\n  ExtractRegex: {ExtractRegex}\n  LabelSplit: {LabelSplit}\n\n\n# DatasetPath: [Training\u002FValidation], 打包为TFRecords格式的训练集\u002F验证集的本地绝对路径。\n# SourcePath:  [Training\u002FValidation], 未打包的训练集\u002F验证集源文件夹的本地绝对路径。\n# ValidationSetNum: 验证集数目，仅当未配置验证集源文件夹时用于系统随机抽样用作验证集使用。\n# - 该选项用于懒人训练模式，当样本极度不均衡时建议手动设定合理的验证集。\n# SavedSteps: 当 Session.run() 被执行一次为一步（1.x版本），保存训练过程的步数，默认为100。\n# ValidationSteps: 用于计算准确率，验证模型的步数，默认为每500步验证一次。\n# EndAcc: 结束训练的条件之准确率 [EndAcc*100]% 到达该条件时结束任务并编译模型。\n# EndCost: 结束训练的条件之Cost值 EndCost 到达该条件时结束任务并编译模型。\n# EndEpochs: 结束训练的条件之样本训练轮数 Epoch 到达该条件时结束任务并编译模型。\n# BatchSize: 批次大小，每一步用于训练的样本数量，不宜过大或过小，建议64。\n# ValidationBatchSize: 验证集批次大小，每个验证准确率步时，用于验证的样本数量。\n# LearningRate: 学习率 [0.1, 0.01, 0.001, 0.0001] fine-tuning 时选用较小的学习率。\nTrains:\n  DatasetPath:\n    Training: {DatasetTrainsPath}\n    Validation: {DatasetValidationPath}\n  SourcePath:\n    Training: {SourceTrainPath}\n    Validation: {SourceValidationPath}\n  ValidationSetNum: {ValidationSetNum}\n  SavedSteps: {SavedSteps}\n  ValidationSteps: {ValidationSteps}\n  EndAcc: {EndAcc}\n  EndCost: {EndCost}\n  EndEpochs: {EndEpochs}\n  BatchSize: {BatchSize}\n  ValidationBatchSize: {ValidationBatchSize}\n  LearningRate: {LearningRate}\n\n# 以下为数据增广的配置\n# Binaryzation: 该参数为 list 类型，包含二值化的上界和下界，值为 int 类型，参数为 -1 表示未启用。\n# MedianBlur: 该参数为 int 类型，参数为 -1 表示未启用。\n# GaussianBlur: 该参数为 int 类型，参数为 -1 表示未启用。\n# EqualizeHist: 该参数为 bool 类型。\n# Laplace: 该参数为 bool 类型。\n# WarpPerspective: 该参数为 bool 类型。\n# Rotate: 该参数为大于 0 的 int 类型，参数为 -1 表示未启用。\n# PepperNoise: 该参数为小于 1 的 float 类型，参数为 -1 表示未启用。\n# Brightness: 该参数为 bool 类型。\n# Saturation: 该参数为 bool 类型。\n# Hue: 该参数为 bool 类型。\n# Gamma: 该参数为 bool 类型。\n# ChannelSwap: 该参数为 bool 类型。\n# RandomBlank: 该参数为大于 0 的 int 类型，参数为 -1 表示未启用。\n# RandomTransition: 该参数为大于 0 的 int 类型，参数为 -1 表示未启用。\nDataAugmentation:\n  Binaryzation: {DA_Binaryzation}\n  MedianBlur: {DA_MedianBlur}\n  GaussianBlur: {DA_GaussianBlur}\n  EqualizeHist: {DA_EqualizeHist}\n  Laplace: {DA_Laplace}\n  WarpPerspective: {DA_WarpPerspective}\n  Rotate: {DA_Rotate}\n  PepperNoise: {DA_PepperNoise}\n  Brightness: {DA_Brightness}\n  Saturation: {DA_Saturation}\n  Hue: {DA_Hue}\n  Gamma: {DA_Gamma}\n  ChannelSwap: {DA_ChannelSwap}\n  RandomBlank: {DA_RandomBlank}\n  RandomTransition: {DA_RandomTransition}\n  \n# 以下为预处理的配置 \n# Binaryzation: 该参数为 list 类型，包含二值化的上界和下界，值为 int 类型，参数为 -1 表示未启用。\n# ReplaceTransparent: 使用白色替换透明背景\n# HorizontalStitching: 水平拆分拼接，适用于上下分层\n# ConcatFrames: 根据帧索引列表水平合并帧\n# BlendFrames: 根据帧索引列表融合帧内容\nPretreatment:\n  Binaryzation: {Pre_Binaryzation}\n  ReplaceTransparent: {Pre_ReplaceTransparent}\n  HorizontalStitching: {Pre_HorizontalStitching}\n  ConcatFrames: {Pre_ConcatFrames}\n  BlendFrames: {Pre_BlendFrames}\n\n```\n\n\n\n# 2. 基本操作流程介绍\n\n\n\n## 2.1 GPU环境\n\n**注意：如果你使用笔者编译好的版本，只需更新显卡驱动至最新，可以无视2.1、2.2的环境安装步骤。**\n\n如果你准备使用GPU训练，请先更新显卡驱动并安装CUDA和cuDNN，可以了解下官方测试过的编译版本对应:\nhttps:\u002F\u002Fwww.tensorflow.org\u002Finstall\u002Finstall_sources#tested_source_configurations\n\nGithub上可以下载到第三方编译好的TensorFlow的WHL安装包：\n\n- Windows : https:\u002F\u002Fgithub.com\u002Ffo40225\u002Ftensorflow-windows-wheel\n- Linux: https:\u002F\u002Fgithub.com\u002Fmind\u002Fwheels\n\nCUDA下载地址：https:\u002F\u002Fdeveloper.nvidia.com\u002Fcuda-downloads\n\ncuDNN下载地址：https:\u002F\u002Fdeveloper.nvidia.com\u002Frdp\u002Fform\u002Fcudnn-download-survey （需要注册账号）\n\n*笔者使用的版本为：```CUDA11.4.1 + cuDNN8.2 + TensorFlow 2.8-DEV```，此种组合可使用pip安装无需下载第三方编译的whl安装包。*\n\n```shell\npip install tf-nightly-gpu==2.8.0.dev20211021\n```\n\n\n\n## 2.2 Python环境\n\n1. 安装Python 3.8 环境（包含pip），可用conda替换。\n\n2. 安装虚拟环境 virtualenv ```pip3 install virtualenv```\n\n3. 为该项目创建独立的虚拟环境:\n\n   ```bash\n   virtualenv -p \u002Fusr\u002Fbin\u002Fpython3 venv # venv is the name of the virtual environment.\n   cd venv\u002F # venv is the name of the virtual environment.\n   source bin\u002Factivate # to activate the current virtual environment.\n   cd captcha_trainer # captcha_trainer is the project path.\n   ```\n\n4. 安装本项目的依赖列表：```pip install -r requirements.txt```\n\n5. 建议开发者们使用 PyCharm 作为Python IDE\n\n   \n\n## 2.3 采集标注样本\n\n笔者这个项目的初衷其实是爬虫遭遇各种验证码，验证码无处不在且需求堆积如山，由此，懒诞生了创造力。\n\n图像分类问题，以验证码为例，用深度学习来解决无非就是训练标注样本。那么样本从何而来？这就是建模流程的第一步。\n\n\n\u003Cdiv align=center>\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkerlomz_captcha_trainer_readme_3fbcb59f23af.png\" style=\"zoom:50%;\" \u002F>\n\u003C\u002Fdiv>\n\n\n\n**采集样本：** 一般可以通过抓包得到对方网站的接口请求及参数，通过构造请求采集样本。\n\n**标注样本：** 标注渠道是有一定讲究的，一般采用多个渠道组合，因为现在大多是机器识别，导致保存过滤下来的正确样本可能存在特征缺失，举个例子，这个渠道把所有的b都识别成a，为了避免这种情况建议通过多个渠道组合采集样本，以此保证图片特征的覆盖率。\n\n**验证样本**：如何提交验证？比如如何从登录页面中获取样本，其实大多时候后端设计都会为了避免过多恶意的数据库访问而先验证验证码的准确性，例如可以提交明显错误的信息，输入不存在的用户名，将对方网站返回的“用户名不存在”作为验证码正确性的判断条件，当验证码错误时如返回“验证码错误”，则验证样本的流程便成立了。\n\n## 2.2 打包样本\n\n本框架喂数据只接收从TFRecords中读取，也就是样本需要先打包成TFRecords文件格式，样本打包的源目录路径关联的参数为：\n\n```yaml\nSourcePath:\n    Training: {SourceTrainPath}\n    Validation: {SourceValidationPath}\n```\n\n打包完的TFRecords文件的路径关联的参数为：\n\n```yaml\nDatasetPath:\n  Training: {DatasetTrainsPath}\n  Validation: {DatasetValidationPath}\n```\n\n**项目配置好之后** ，可通过两种方法进行打包\n\n- **make_dataset.py 打包**\n\n  运行```python make_dataset.py 项目名``` 方式打包，则需要加启动参数指定训练项目，请确保 projects\u002F项目名 路径下存放各个项目的 model.yaml 配置文件。\n\n- **app.py训练：**\n\n  在界面中选择欲使用的网络结构，输入项目名并[回车]或者点击空白处 **创建一个新项目** 或者 **选择一个已有的项目** ，通过 [Browse]  **选择训练集路径** 后，点击 [Make Dataset]  **开始打包** ，中途若终止进程文件将损坏，需要手动至项目路径中删除其未打包完成的样本集，[Validation Path] 可以不选，如若不选，系统将根据 [Validation Set Num] 配置的参数自动分配该数量的验证集，\n\n*注意：手动配置训练集的时候请保证验证集的随机性以及特征覆盖率，如若不明笔者所语，请勿手动配置*\n\n  \n\n### 2.3 设置训练配置\n\n使用app.py运行的界面化配置生成器在选择样本源的时候会自动进行基本的配置如：[Resize]，[Size]，[Label Num] 等。至于 [Label Num] 只在使用CrossEntropy为损失函数时有效。\n\n#### Resize的使用\n\n因为网络为多标签而设计，卷积层的输出 outputs 经过了以下变换：\n\n```python\nReshape([label_num, int(outputs_shape[1] \u002F label_num)])\n```\n\n为了保证运算 int(outputs_shape[1] \u002F label_num) 能够取得正整数，也意味着他们之间存在某种关系，对于CNN5+Cross Entropy的网络结构，Conv2D层的步长皆为1，那么需要保证以下关系成立：\n\n\n$$\nmod(\\frac{输入宽度\\times输入高度\\times输出层参数}{池化步长^{池化层数}\\times标签数})= 0\n$$\n\n所以有时候需要Resize网络输入的Shape\n\n| 网络     | 池化步长^池化层数 | 输出层参数 |\n| -------- | ----------------- | ---------- |\n| CNN5     | 16                | 64         |\n| CNNX     | 8                 | 64         |\n| ResNet50 | 16                | 1024       |\n| DenseNet | 32                | 2048       |\n\n例如使用CNN5+CrossEntropy组合，则输入宽度与输入高度需要满足：\n$$\nmod(\\frac{输入宽度\\times输入高度\\times64}{16\\times标签数})= 0\n$$\n同理如果CNN5+RNN+CTC，卷积层之后的输出经过以下变换：\n\n```python\nReshape([-1, outputs_shape[2] * outputs_shape[3]])\n```\n\n原输出(batch_size, outputs_shape[1], outputs_shape[2], outputs_shape[3])，RNN层的输入输出要求为(batch, timesteps, num_classes)，为了接入RNN经过以上操作，那么又引出一个Time Step的概念，所以timesteps的值也是 outputs_shape[1]，而CTC Loss要求的输入为 [batch_size, frames, num_labels]，若是 timesteps 小于标签数则无法计算损失，也就无法找损失函数中找到极小值，梯度何以下降。timesteps 最合理的值一般是标签数的2倍，为了达到目的，也可以通过Resize网络输入的Shape解决，一般情况timesteps直接关联于图片宽度。\n\n#### ExtractRegex 参数：\n\n正则匹配，请各位采集样本的时候，尽量和我给的示例保持一致吧，正则问题请谷歌，如果是为1111.jpg这种命名的话，这里提供了一个批量转换的代码：\n\n```python\nimport re\nimport os\nimport hashlib\n\n# 训练集路径\nroot = r\"D:\\TrainSet\\***\"\nall_files = os.listdir(root)\n\nfor file in all_files:\n    old_path = os.path.join(root, file)\n    \n    # 已被修改过忽略\n    if len(file.split(\".\")[0]) > 32:\n        continue\n    \n    # 采用标注_文件md5码.图片后缀 进行命名\n    with open(old_path, \"rb\") as f:\n        _id = hashlib.md5(f.read()).hexdigest()\n    new_path = os.path.join(root, file.replace(\".\", \"_{}.\".format(_id)))\n    \n    # 重复标签的时候会出现形如：abcd (1).jpg 这种形式的文件名\n    new_path = re.sub(\" \\(\\d+\\)\", \"\", new_path)\n    print(new_path)\n    os.rename(old_path, new_path)\n```\n\n\n\n### 2.4 开始训练\n\n- **trains.py训练：**\n\n  如果单独调用 ```python trains.py 项目名``` 方式训练，则需要加启动参数指定训练项目，请确保 projects\u002F项目名 路径下存放各个项目的 model.yaml 配置文件。\n\n- **app.py训练：**\n\n  在界面中配置好参数后，点击 [Start Training] 开始训练，中途若需终止训练可点击 [Stop] 停止，若是未达到结束条件而终止任务，可以手动点击 [Compile] 编译。\n\n\n\n# 3. 项目结构\n\n```\n|-- fc\t\t\t\t\t\t\t\t\t\t\u002F\u002F 全连接层\n|   |-- cnn.py\t\t\t\t\t\t\t\t\t\u002F\u002F 卷积层的全连接\n|   `-- rnn.py\t\t\t\t\t\t\t\t\t\u002F\u002F 循环层的全连接\n|-- logs\t\t\t\t\t\t\t\t\t\u002F\u002F Tensor Board 日志\n|-- network\t\t\t\t\t\t\t\t\t\u002F\u002F 神经网络实现\n|   |   |-- CNN.py\t\t\t\t\t\t\t\t\u002F\u002F CNN5\u002FCNNX\n|   |   |-- DenseNet.py\t\t\t\t\t\t\t\t\u002F\u002F DenseNet\n|   |   |-- GRU.py\t\t\t\t\t\t\t\t\u002F\u002F GRU\u002FBiBRU\u002FGRUcuDNN\n|   |   |-- LSTM.py\t\t\t\t\t\t\t\t\u002F\u002F LSTM\u002FBiLSTM\u002FLSTMcuDNN\n|   |   |-- ResNet.py\t\t\t\t\t\t\t\t\u002F\u002F ResNet50\n|   |   `-- utils.py\t\t\t\t\t\t\t\t\u002F\u002F 各种网络 block 的实现\n|-- optimizer\t\t\t\t\t\t\t\t\t\u002F\u002F 优化器\n|   |   `-- AdaBound.py\t\t\t\t\t\t\t\t\u002F\u002F AdaBound 优化算法实现\n|-- projects\t\t\t\t\t\t\t\t\t\u002F\u002F 项目存放路径\n|   `-- demo\t\t\t\t\t\t\t\t\t\u002F\u002F 项目名\n|       |-- dataset \t\t\t\t\t\t\t\t\u002F\u002F 数据集存放\n|       |-- model\t\t\t\t\t\t\t\t\u002F\u002F 训练过程记录存放\n|       `-- out\t\t\t\t\t\t\t\t\t\u002F\u002F 模型编译输出\n|           |-- graph\t\t\t\t\t\t\t\t\u002F\u002F 存放编译pb模型\n|           `-- model\t\t\t\t\t\t\t\t\u002F\u002F 存放编译yaml配置\n|-- resource\t\t\t\t\t\t\t\t\t\u002F\u002F 资源：图标，README 所需图片\n|-- tools\n|   `-- package.py\t\t\t\t\t\t\t\t\u002F\u002F PyInstaller编译脚本\n|-- utils\n|   |-- data.py\t\t\t\t\t\t\t\t\t\u002F\u002F 数据加载工具类\n|   `-- sparse.py\t\t\t\t\t\t\t\t\u002F\u002F 稀疏矩阵处理工具类\n|-- app.py\t\t\t\t\t\t\t\t\t\u002F\u002F GUI配置生成器\n|-- app.spec\t\t\t\t\t\t\t\t\t\u002F\u002F PyInstaller编译配置文件\n|-- category.py\t\t\t\t\t\t\t\t\t\u002F\u002F 内置类别模块\n|-- config.py\t\t\t\t\t\t\t\t\t\u002F\u002F 配置实体模块\n|-- constants.py\t\t\t\t\t\t\t\t\u002F\u002F 各种枚举类\n|-- core.py\t\t\t\t\t\t\t\t\t\u002F\u002F 神经网络模块\n|-- decoder.py\t\t\t\t\t\t\t\t\t\u002F\u002F 解码器\n|-- encoder.py\t\t\t\t\t\t\t\t\t\u002F\u002F 编码器\n|-- exception.py\t\t\t\t\t\t\t\t\u002F\u002F 异常模块\n|-- loss.py\t\t\t\t\t\t\t\t\t\u002F\u002F 损失函数\n|-- make_dataset.py\t\t\t\t\t\t\t\t\u002F\u002F 样本集打包\n|-- model.template\t\t\t\t\t\t\t\t\u002F\u002F 配置模板\n|-- predict_testing.py\t\t\t\t\t\t\t\t\u002F\u002F 预测测试\n|-- pretreatment.py\t\t\t\t\t\t\t\t\u002F\u002F 预处理\n|-- requirements.txt\t\t\t\t\t\t\t\t\u002F\u002F 项目依赖\n|-- trains.py\t\t\t\t\t\t\t\t\t\u002F\u002F 训练模块\n`-- validation.py\t\t\t\t\t\t\t\t\u002F\u002F 验证模块\n```\n\n\n\n# 4. 注意事项\n\n1. **如何使用CPU训练：**\n\n   本项目默认安装TensorFlow-GPU版，建议使用GPU进行训练，如需换用CPU训练请替换 ```requirements.txt``` 文件中的```tensorflow-gpu``` 为```tensorflow```，其他无需改动。\n\n2. **参数修改：**\n\n   切记，[ModelName] 是绑定一个模型的唯一标志，如果修改了训练参数如：[Resize]，[Category]，[CNNNetwork]，[RecurrentNetwork]，[UnitsNum] 这类影响计算图的参数，需要删除model路径下的旧文件，重新训练，或者使用新的 [ModelName] 重新训练，否则默认作为断点续练。\n   \n   在可视化版本中，[Neural Net] 组中的配置，除了学习率 [Learning Rate] 和图片尺寸 [Size] 设置以外，任何改动都需要先 [Reset History]\n   \n\n\n\n# 7. 附言\n\n\u003Cspan id=\"jump\"> \u003C\u002Fspan>\n\n\u003Cdiv align=center>\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkerlomz_captcha_trainer_readme_1e82f20ac80a.png\" \u002F>\n\u003C\u002Fdiv>\n\n\n\n**问题一：** 有人问，验证码是什么，简单送上一幅图，验证码早已不是Tesseract能解决的时代了，为什么选择验证码作为图像分类的入门，其一因为随处可见，对于深度学习样本不可或缺，验证码的采集难度及成本低。其二，现在的验证码越来越难也越来越具备研究价值，因为它本为安全而生，各种人为的干扰甚至于机器学习对抗等等，也在不断促进图像识别的发展。\n\n**问题二：** 部署识别也需要GPU吗？我的答案是，完全没必要。理想中是用GPU训练，使用CPU部署识别服务，部署如果也需要这么高的成本，那还有什么现实意义和应用场景呢，实测CNN5网络，我的i7-9700k大约1-15ms之间 (图片尺寸60x60-200x200)。\n\n\n\n**此项目以研究学习为目的，禁止用于非法用途，本项目永久开源，笔者将持续维护此项目，并逐步扩展其成为一个完善的深度学习框架。**\n\n\n\n**如有需要欢迎进群交流，落魄算法，在线答疑：**\n\n图像识别技术：857149419 (群已满)\u002F 934889548(2群)\n\n数据矿工：778910502\n\n思知人工智能：90780053","# 1. 项目介绍\n\n基于深度学习的图片验证码解决方案——该项目能够秒杀字符粘连重叠、透视变形、模糊、噪声等各种干扰情况，足以解决市面上绝大多数复杂的[验证码场景](#jump)，目前也被用于其他OCR场景。 \n\u003Cdiv align=center>\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkerlomz_captcha_trainer_readme_cb50213c1b66.png\" style=\"zoom:70%;\" \u002F>\n\u003C\u002Fdiv>\n\n\u003Cdiv align=center>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer\u002Fblob\u002Fmaster\u002FLICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg\">\u003C\u002Fa>\n\u003C\u002Fdiv>\n\n该项目基于 TensorFlow 1.14 开发，旨在帮助中小企业或个人用户快速构建图像分类模型并投入生产环境使用，降低技术应用门槛。\n\n面向算法工程师：提供了可拓展的结构支持，允许通过源码灵活方便的添加自己设计的网络结构及其他组件。\n\n面向零基础用户：有需求？但是不会编程？时间就是金钱，学习成本太高我想白嫖。它简直为你而生！\n\n面向需求频繁者：同样的类型的需求一天10个，它的复用程度让您无需一份代码一个需求，一套服务全部搞定。\n\n\n\n> **编译版下载地址：** https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer\u002Freleases\u002F\n\n------\n\n其使用的网络结构主要包含三部分，从下至上依次为：\n\u003Cdiv align=center>\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkerlomz_captcha_trainer_readme_359bb1513510.png\" style=\"zoom:80%;\" \u002F>\n\u003C\u002Fdiv>\n>  输入OP:  **input** ， 输出OP:   **dense_decoded** \n\n\n\n卷积层：从输入图像中提取特征序列;\n\n循环层，预测从卷积层获取的特征序列的标签（真实值）分布;\n\n转录层，把从循环层获取的标签分布通过去重整合等操作转换成最终的识别结果;\n\n\n\n## 1. 可视化模型配置\n\n为每个图像分类任务创建一个独立的项目，每个项目拥有完全独立的管理空间，方便多任务切换和管理。**全程无需修改一行代码**，根据模板生成模型配置，生成的配置文件可直接用模型部署服务。\n\n本项目对应的部署服务支持同时部署多套模型，模型支持热拔插，版本迭代等，业务层可拓展颜色提取，算术运算等常见的验证码解决方案。详情可以移步：https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_platform \n\u003Cdiv align=center>\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkerlomz_captcha_trainer_readme_4c7cd2e84130.png\" style=\"zoom:80%;\" \u002F>\n\u003C\u002Fdiv>\n\n## 2. 特性\n\n1. 目前支持Windows平台的GPU编译版，无需安装环境，0基础建模。\n2. 项目化管理，适合容易被任务优先级安排的程序员们，同一份代码，不同的项目，随心切换，互不干扰。\n3. 新增样本集无需重新打包，可直接增量添加新的样本集，每个训练任务支持加载多个TFRecords文件。\n4. 解除循环层依赖的必须性，支持CNN5\u002FResNet50\u002FDenseNet+CrossEntropy的怀旧组合模式。\n5. 提供智能建议性配置功能，选择样本源路径时可根据样本特性自动推荐字符集，设置尺寸，标签数等。\n6. 支持不定宽[-1, HEIGHT]的网络输入，在样本尺寸多样的场景下自动按比例缩放。\n7. 支持训练中的数据增广，如：指定范围的二值化\u002F模糊\u002F旋转\u002F椒盐噪声等。\n\n\n\n## 3. 模板参数介绍\n\n```yaml\n# - requirement.txt  -  GPU: tensorflow-gpu, CPU: tensorflow\n# - If you use the GPU version, you need to install some additional applications.\n# MemoryUsage: 显存占用率，推荐0.6-0.8之间\nSystem:\n  MemoryUsage: {MemoryUsage}\n  Version: 2\n\n# CNNNetwork: [CNN5, ResNet50, DenseNet] \n# RecurrentNetwork: [CuDNNBiLSTM, CuDNNLSTM, CuDNNGRU, BiLSTM, LSTM, GRU, BiGRU, NoRecurrent]\n# - 推荐配置为 不定长问题：CNN5+GRU ，定长：CNN5\u002FDenseNet\u002FResNet50\n# UnitsNum: RNN层的单元数 [16, 64, 128, 256, 512] \n# - 神经网络在隐层中使用大量神经元，就是做升维，将纠缠在一起的特征或概念分开。\n# Optimizer: 优化器算法 [AdaBound, Adam, Momentum]\n# OutputLayer: [LossFunction, Decoder]\n# - LossFunction: 损失函数 [CTC, CrossEntropy] \n# - Decoder: 解码器 [CTC, CrossEntropy] \nNeuralNet:\n  CNNNetwork: {CNNNetwork}\n  RecurrentNetwork: {RecurrentNetwork}\n  UnitsNum: {UnitsNum}\n  Optimizer: {Optimizer}\n  OutputLayer:\n    LossFunction: {LossFunction}\n    Decoder: {Decoder}\n\n\n# ModelName: 模型名\u002F项目名，同时也对应编译后的pb模型文件名\n# ModelField: 模型处理的数据类型，目前只支持图像 [Image, Text]\n# ModelScene: 模型处理的场景类型，目前只支持分类场景 [Classification]\n# - 目前只支持 “图像分类” 这一种场景.\nModel:\n  ModelName: {ModelName}\n  ModelField: {ModelField}\n  ModelScene: {ModelScene}\n\n# FieldParam 分为 Image, Text 两种，不同数据类型时可配置的参数不同，目前只提供 Image 一种。\n# ModelField 为 Image 时:\n# - Category: 提供默认的内置解决方案:\n# -- [ALPHANUMERIC（含大小写英文数字）, ALPHANUMERIC_LOWER（小写英文数字）, \n# -- ALPHANUMERIC_UPPER（大写英文数字）,NUMERIC（数字）, ALPHABET_LOWER（小写字母）, \n# -- ALPHABET_UPPER（大写字母）, ALPHABET（大小写字母）, \n# -- ALPHANUMERIC_CHS_3500_LOWER（小写字母数字混合中文常用3500）]\n# - 或者可以自定义指定分类集如下（中文亦可）:\n# -- ['Cat', 'Lion', 'Tiger', 'Fish', 'BigCat']\n# - Resize: 重置尺寸，对应网络的输入： [ImageWidth, ImageHeight\u002F-1, ImageChannel]\n# - ImageChannel: 图像通道，3为原图，1为灰度 [1, 3]\n# - 为了配合部署服务根据图片尺寸自动选择对应的模型，由此诞生以下参数（ImageWidth，ImageHeight）:\n# -- ImageWidth: 图片宽度.\n# -- ImageHeight: 图片高度.\n# - MaxLabelNum: 该参数在使用CTC损失函数时将被忽略，仅用于使用交叉熵作为损失函数\u002F标签数固定时使用\n# ModelField 为 Text 时:\n# - 该类型暂时不支持\nFieldParam:\n  Category: {Category}\n  Resize: {Resize}\n  ImageChannel: {ImageChannel}\n  ImageWidth: {ImageWidth}\n  ImageHeight: {ImageHeight}\n  MaxLabelNum: {MaxLabelNum}\n  OutputSplit: {OutputSplit}\n\n\n# 该配置应用于数据源的标签获取.\n# LabelFrom: 标签来源，目前只支持 从文件名提取 [FileName, XML, LMDB]\n# ExtractRegex: 正则提取规则，对应于 从文件名提取 方案 FileName:\n# - 默认匹配形如 apple_20181010121212.jpg 的文件.\n# - 默认正则为 .*?(?=_.*\\.)\n# LabelSplit: 该规则仅用于 从文件名提取 方案:\n# - 文件名中的分割符形如: cat&big cat&lion_20181010121212.png，那么分隔符为 &\n# - The Default is null.\nLabel:\n  LabelFrom: {LabelFrom}\n  ExtractRegex: {ExtractRegex}\n  LabelSplit: {LabelSplit}\n\n\n# DatasetPath: [Training\u002FValidation], 打包为TFRecords格式的训练集\u002F验证集的本地绝对路径。\n# SourcePath:  [Training\u002FValidation], 未打包的训练集\u002F验证集源文件夹的本地绝对路径。\n# ValidationSetNum: 验证集数目，仅当未配置验证集源文件夹时用于系统随机抽样用作验证集使用。\n# - 该选项用于懒人训练模式，当样本极度不均衡时建议手动设定合理的验证集。\n# SavedSteps: 当 Session.run() 被执行一次为一步（1.x版本），保存训练过程的步数，默认为100。\n# ValidationSteps: 用于计算准确率，验证模型的步数，默认为每500步验证一次。\n# EndAcc: 结束训练的条件之准确率 [EndAcc*100]% 到达该条件时结束任务并编译模型。\n# EndCost: 结束训练的条件之Cost值 EndCost 到达该条件时结束任务并编译模型。\n# EndEpochs: 结束训练的条件之样本训练轮数 Epoch 到达该条件时结束任务并编译模型。\n# BatchSize: 批次大小，每一步用于训练的样本数量，不宜过大或过小，建议64。\n# ValidationBatchSize: 验证集批次大小，每个验证准确率步时，用于验证的样本数量。\n# LearningRate: 学习率 [0.1, 0.01, 0.001, 0.0001] fine-tuning 时选用较小的学习率。\nTrains:\n  DatasetPath:\n    Training: {DatasetTrainsPath}\n    Validation: {DatasetValidationPath}\n  SourcePath:\n    Training: {SourceTrainPath}\n    Validation: {SourceValidationPath}\n  ValidationSetNum: {ValidationSetNum}\n  SavedSteps: {SavedSteps}\n  ValidationSteps: {ValidationSteps}\n  EndAcc: {EndAcc}\n  EndCost: {EndCost}\n  EndEpochs: {EndEpochs}\n  BatchSize: {BatchSize}\n  ValidationBatchSize: {ValidationBatchSize}\n  LearningRate: {LearningRate}\n\n# 以下为数据增广的配置\n# Binaryzation: 该参数为 list 类型，包含二值化的上界和下界，值为 int 类型，参数为 -1 表示未启用。\n# MedianBlur: 该参数为 int 类型，参数为 -1 表示未启用。\n# GaussianBlur: 该参数为 int 类型，参数为 -1 表示未启用。\n# EqualizeHist: 该参数为 bool 类型。\n# Laplace: 该参数为 bool 类型。\n# WarpPerspective: 该参数为 bool 类型。\n# Rotate: 该参数为大于 0 的 int 类型，参数为 -1 表示未启用。\n# PepperNoise: 该参数为小于 1 的 float 类型，参数为 -1 表示未启用。\n# Brightness: 该参数为 bool 类型。\n# Saturation: 该参数为 bool 类型。\n# Hue: 该参数为 bool 类型。\n# Gamma: 该参数为 bool 类型。\n# ChannelSwap: 该参数为 bool 类型。\n# RandomBlank: 该参数为大于 0 的 int 类型，参数为 -1 表示未启用。\n# RandomTransition: 该参数为大于 0 的 int 类型，参数为 -1 表示未启用。\nDataAugmentation:\n  Binaryzation: {DA_Binaryzation}\n  MedianBlur: {DA_MedianBlur}\n  GaussianBlur: {DA_GaussianBlur}\n  EqualizeHist: {DA_EqualizeHist}\n  Laplace: {DA_Laplace}\n  WarpPerspective: {DA_WarpPerspective}\n  Rotate: {DA_Rotate}\n  PepperNoise: {DA_PepperNoise}\n  Brightness: {DA_Brightness}\n  Saturation: {DA_Saturation}\n  Hue: {DA_Hue}\n  Gamma: {DA_Gamma}\n  ChannelSwap: {DA_ChannelSwap}\n  RandomBlank: {DA_RandomBlank}\n  RandomTransition: {DA_RandomTransition}\n  \n# 以下为预处理的配置 \n# Binaryzation: 该参数为 list 类型，包含二值化的上界和下界，值为 int 类型，参数为 -1 表示未启用。\n# ReplaceTransparent: 使用白色替换透明背景\n# HorizontalStitching: 水平拆分拼接，适用于上下分层\n# ConcatFrames: 根据帧索引列表水平合并帧\n# BlendFrames: 根据帧索引列表融合帧内容\nPretreatment:\n  Binaryzation: {Pre_Binaryzation}\n  ReplaceTransparent: {Pre_ReplaceTransparent}\n  HorizontalStitching: {Pre_HorizontalStitching}\n  ConcatFrames: {Pre_ConcatFrames}\n  BlendFrames: {Pre_BlendFrames}\n\n```\n\n\n\n# 2. 基本操作流程介绍\n\n## 2.1 GPU环境\n\n**注意：如果你使用笔者编译好的版本，只需更新显卡驱动至最新，可以无视2.1、2.2的环境安装步骤。**\n\n如果你准备使用GPU训练，请先更新显卡驱动并安装CUDA和cuDNN，可以了解下官方测试过的编译版本对应:\nhttps:\u002F\u002Fwww.tensorflow.org\u002Finstall\u002Finstall_sources#tested_source_configurations\n\nGithub上可以下载到第三方编译好的TensorFlow的WHL安装包：\n\n- Windows : https:\u002F\u002Fgithub.com\u002Ffo40225\u002Ftensorflow-windows-wheel\n- Linux: https:\u002F\u002Fgithub.com\u002Fmind\u002Fwheels\n\nCUDA下载地址：https:\u002F\u002Fdeveloper.nvidia.com\u002Fcuda-downloads\n\ncuDNN下载地址：https:\u002F\u002Fdeveloper.nvidia.com\u002Frdp\u002Fform\u002Fcudnn-download-survey （需要注册账号）\n\n*笔者使用的版本为：```CUDA11.4.1 + cuDNN8.2 + TensorFlow 2.8-DEV```，此种组合可使用pip安装无需下载第三方编译的whl安装包。*\n\n```shell\npip install tf-nightly-gpu==2.8.0.dev20211021\n```\n\n\n\n## 2.2 Python环境\n\n1. 安装Python 3.8 环境（包含pip），可用conda替换。\n\n2. 安装虚拟环境 virtualenv ```pip3 install virtualenv```\n\n3. 为该项目创建独立的虚拟环境:\n\n   ```bash\n   virtualenv -p \u002Fusr\u002Fbin\u002Fpython3 venv # venv is the name of the virtual environment.\n   cd venv\u002F # venv is the name of the virtual environment.\n   source bin\u002Factivate # to activate the current虚拟环境.\n   cd captcha_trainer # captcha_trainer is the project path.\n   ```\n\n4. 安装本项目的依赖列表：```pip install -r requirements.txt```\n\n5. 建议开发者们使用 PyCharm 作为Python IDE\n\n   \n\n## 2.3 采集标注样本\n\n笔者这个项目的初衷其实是爬虫遭遇各种验证码，验证码无处不在且需求堆积如山，由此，懒诞生了创造力。\n\n图像分类问题，以验证码为例，用深度学习来解决无非就是训练标注样本。那么样本从何而来？这就是建模流程的第一步。\n\n\n\u003Cdiv align=center>\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkerlomz_captcha_trainer_readme_3fbcb59f23af.png\" style=\"zoom:50%;\" \u002F>\n\u003C\u002Fdiv>\n\n\n\n**采集样本：** 一般可以通过抓包得到对方网站的接口请求及参数，通过构造请求采集样本。\n\n**标注样本：** 标注渠道是有一定讲究的，一般采用多个渠道组合，因为现在大多是机器识别，导致保存过滤下来的正确样本可能存在特征缺失，举个例子，这个渠道把所有的b都识别成a，为了避免这种情况建议通过多个渠道组合采集样本，以此保证图片特征的覆盖率。\n\n**验证样本**：如何提交验证？比如如何从登录页面中获取样本，其实大多时候后端设计都会为了避免过多恶意的数据库访问而先验证验证码的准确性，例如可以提交明显错误的信息，输入不存在的用户名，将对方网站返回的“用户名不存在”作为验证码正确性的判断条件，当验证码错误时如返回“验证码错误”，则验证样本的流程便成立了。\n\n## 2.2 打包样本\n\n本框架喂数据只接收从TFRecords中读取，也就是样本需要先打包成TFRecords文件格式，样本打包的源目录路径关联的参数为：\n\n```yaml\nSourcePath:\n    Training: {SourceTrainPath}\n    Validation: {SourceValidationPath}\n```\n\n打包完的TFRecords文件的路径关联的参数为：\n\n```yaml\nDatasetPath:\n  Training: {DatasetTrainsPath}\n  Validation: {DatasetValidationPath}\n```\n\n**项目配置好之后** ，可通过两种方法进行打包\n\n- **make_dataset.py 打包**\n\n  运行```python make_dataset.py 项目名``` 方式打包，则需要加启动参数指定训练项目，请确保 projects\u002F项目名 路径下存放各个项目的 model.yaml 配置文件。\n\n- **app.py训练：**\n\n  在界面中选择欲使用的网络结构，输入项目名并[回车]或者点击空白处 **创建一个新项目** 或者 **选择一个已有的项目** ，通过 [Browse]  **选择训练集路径** 后，点击 [Make Dataset]  **开始打包** ，中途若终止进程文件将损坏，需要手动至项目路径中删除其未打包完成的样本集，[Validation Path] 可以不选，如若不选，系统将根据 [Validation Set Num] 配置的参数自动分配该数量的验证集，\n\n*注意：手动配置训练集的时候请保证验证集的随机性以及特征覆盖率，如若不明笔者所语，请勿手动配置*\n\n  \n\n### 2.3 设置训练配置\n\n使用app.py运行的界面化配置生成器在选择样本源的时候会自动进行基本的配置如：[Resize]，[Size]，[Label Num] 等。至于 [Label Num] 只在使用CrossEntropy为损失函数时有效。\n\n#### Resize的使用\n\n因为网络为多标签而设计，卷积层的输出 outputs 经过了以下变换：\n\n```python\nReshape([label_num, int(outputs_shape[1] \u002F label_num)])\n```\n\n为了保证运算 int(outputs_shape[1] \u002F label_num) 能够取得正整数，也意味着他们之间存在某种关系，对于CNN5+Cross Entropy的网络结构，Conv2D层的步长皆为1，那么需要保证以下关系成立：\n\n\n$$\nmod(\\frac{ 输入宽度×输入高度×输出层参数}{池化步长^{池化层数}×标签数})= 0\n$$\n\n所以有时候需要Resize网络输入的Shape\n\n| 网络     | 池化步长^池化层数 | 输出层参数 |\n| -------- | ----------------- | ---------- |\n| CNN5     | 16                | 64         |\n| CNNX     | 8                 | 64         |\n| ResNet50 | 16                | 1024       |\n| DenseNet | 32                | 2048       |\n\n例如使用CNN5+CrossEntropy组合，则输入宽度与输入高度需要满足：\n$$\nmod(\\frac{ 输入宽度×输入高度×64}{16×标签数})= 0\n$$\n同理如果CNN5+RNN+CTC，卷积层之后的输出经过以下变换：\n\n```python\nReshape([-1, outputs_shape[2] * outputs_shape[3]])\n```\n\n原输出(batch_size, outputs_shape[1], outputs_shape[2], outputs_shape[3])，RNN层的输入输出要求为(batch, timesteps, num_classes)，为了接入RNN经过以上操作，那么又引出一个Time Step的概念，所以timesteps的值也是 outputs_shape[1]，而CTC Loss要求的输入为 [batch_size, frames, num_labels]，若是 timesteps 小于标签数则无法计算损失，也就无法找损失函数中找到极小值，梯度何以下降。timesteps 最合理的值一般是标签数的2倍，为了达到目的，也可以通过Resize网络输入的Shape解决，一般情况timesteps直接关联于图片宽度。\n\n#### ExtractRegex 参数：\n\n正则匹配，请各位采集样本的时候，尽量和我给的示例保持一致吧，正则问题请谷歌，如果是为1111.jpg这种命名的话，这里提供了一个批量转换的代码：\n\n```python\nimport re\nimport os\nimport hashlib\n\n# 训练集路径\nroot = r\"D:\\TrainSet\\***\"\nall_files = os.listdir(root)\n\nfor file in all_files:\n    old_path = os.path.join(root, file)\n    \n    # 已被修改过忽略\n    if len(file.split(\".\")[0]) > 32:\n        continue\n    \n    # 采用标注_文件md5码.图片后缀 进行命名\n    with open(old_path, \"rb\") as f:\n        _id = hashlib.md5(f.read()).hexdigest()\n    new_path = os.path.join(root, file.replace(\".\", \"_{}.\".format(_id)))\n    \n    # 重复标签的时候会出现形如：abcd (1).jpg 这种形式的文件名\n    new_path = re.sub(\" \\(\\d+\\)\", \"\", new_path)\n    print(new_path)\n    os.rename(old_path, new_path)\n```\n\n\n\n### 2.4 开始训练\n\n- **trains.py训练：**\n\n  如果单独调用 ```python trains.py 项目名``` 方式训练，则需要加启动参数指定训练项目，请确保 projects\u002F项目名 路径下存放各个项目的 model.yaml 配置文件。\n\n- **app.py训练：**\n\n  在界面中配置好参数后，点击 [Start Training] 开始训练，中途若需终止训练可点击 [Stop] 停止，若是未达到结束条件而终止任务，可以手动点击 [Compile] 编译。\n\n\n\n# 3. 项目结构\n\n```\n|-- fc\t\t\t\t\t\t\t\t\t\t\u002F\u002F 全连接层\n|   |-- cnn.py\t\t\t\t\t\t\t\t\t\u002F\u002F 卷积层的全连接\n|   `-- rnn.py\t\t\t\t\t\t\t\t\t\u002F\u002F 循环层的全连接\n|-- logs\t\t\t\t\t\t\t\t\t\u002F\u002F Tensor Board 日志\n|-- network\t\t\t\t\t\t\t\t\t\u002F\u002F 神经网络实现\n|   |   |-- CNN.py\t\t\t\t\t\t\t\t\u002F\u002F CNN5\u002FCNNX\n|   |   |-- DenseNet.py\t\t\t\t\t\t\t\t\u002F\u002F DenseNet\n|   |   |-- GRU.py\t\t\t\t\t\t\t\t\u002F\u002F GRU\u002FBiBRU\u002FGRUcuDNN\n|   |   |-- LSTM.py\t\t\t\t\t\t\t\t\u002F\u002F LSTM\u002FBiLSTM\u002FLSTMcuDNN\n|   |   |-- ResNet.py\t\t\t\t\t\t\t\t\u002F\u002F ResNet50\n|   |   `-- utils.py\t\t\t\t\t\t\t\t\u002F\u002F 各种网络 block 的实现\n|-- optimizer\t\t\t\t\t\t\t\t\t\u002F\u002F 优化器\n|   |   `-- AdaBound.py\t\t\t\t\t\t\t\t\u002F\u002F AdaBound 优化算法实现\n|-- projects\t\t\t\t\t\t\t\t\t\u002F\u002F 项目存放路径\n|   `-- demo\t\t\t\t\t\t\t\t\t\u002F\u002F 项目名\n|       |-- dataset \t\t\t\t\t\t\t\t\u002F\u002F 数据集存放\n|       |-- model\t\t\t\t\t\t\t\t\u002F\u002F 训练过程记录存放\n|       `-- out\t\t\t\t\t\t\t\t\t\u002F\u002F 模型编译输出\n|           |-- graph\t\t\t\t\t\t\t\t\u002F\u002F 存放编译pb模型\n|           `-- model\t\t\t\t\t\t\t\t\u002F\u002F 存放编译yaml配置\n|-- resource\t\t\t\t\t\t\t\t\t\u002F\u002F 资源：图标，README 所需图片\n|-- tools\n|   `-- package.py\t\t\t\t\t\t\t\t\u002F\u002F PyInstaller编译脚本\n|-- utils\n|   |-- data.py\t\t\t\t\t\t\t\t\t\u002F\u002F 数据加载工具类\n|   `-- sparse.py\t\t\t\t\t\t\t\t\u002F\u002F 稀疏矩阵处理工具类\n|-- app.py\t\t\t\t\t\t\t\t\t\u002F\u002F GUI配置生成器\n|-- app.spec\t\t\t\t\t\t\t\t\t\u002F\u002F PyInstaller编译配置文件\n|-- category.py\t\t\t\t\t\t\t\t\t\u002F\u002F 内置类别模块\n|-- config.py\t\t\t\t\t\t\t\t\t\u002F\u002F 配置实体模块\n|-- constants.py\t\t\t\t\t\t\t\t\u002F\u002F 各种枚举类\n|-- core.py\t\t\t\t\t\t\t\t\t\u002F\u002F 神经网络模块\n|-- decoder.py\t\t\t\t\t\t\t\t\t\u002F\u002F 解码器\n|-- encoder.py\t\t\t\t\t\t\t\t\t\u002F\u002F 编码器\n|-- exception.py\t\t\t\t\t\t\t\t\u002F\u002F 异常模块\n|-- loss.py\t\t\t\t\t\t\t\t\t\u002F\u002F 损失函数\n|-- make_dataset.py\t\t\t\t\t\t\t\t\u002F\u002F 样本集打包\n|-- model.template\t\t\t\t\t\t\t\t\u002F\u002F 配置模板\n|-- predict_testing.py\t\t\t\t\t\t\t\t\u002F\u002F 预测测试\n|-- pretreatment.py\t\t\t\t\t\t\t\t\u002F\u002F 预处理\n|-- requirements.txt\t\t\t\t\t\t\t\t\u002F\u002F 项目依赖\n|-- trains.py\t\t\t\t\t\t\t\t\t\u002F\u002F 训练模块\n`-- validation.py\t\t\t\t\t\t\t\t\u002F\u002F 验证模块\n```\n\n\n\n# 4. 注意事项\n\n1. **如何使用CPU训练：**\n\n   本项目默认安装TensorFlow-GPU版，建议使用GPU进行训练，如需换用CPU训练请替换 ```requirements.txt``` 文件中的```tensorflow-gpu``` 为```tensorflow```，其他无需改动。\n\n2. **参数修改：**\n\n   切记，[ModelName] 是绑定一个模型的唯一标志，如果修改了训练参数如：[Resize]，[Category]，[CNNNetwork]，[RecurrentNetwork]，[UnitsNum] 这类影响计算图的参数，需要删除model路径下的旧文件，重新训练，或者使用新的 [ModelName] 重新训练，否则默认作为断点续练。\n   \n   在可视化版本中，[Neural Net] 组中的配置，除了学习率 [Learning Rate] 和图片尺寸 [Size] 设置以外，任何改动都需要先 [Reset History]\n\n# 7. 附言\n\n\u003Cspan id=\"jump\"> \u003C\u002Fspan>\n\n\u003Cdiv align=center>\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkerlomz_captcha_trainer_readme_1e82f20ac80a.png\" \u002F>\n\u003C\u002Fdiv>\n\n\n\n**问题一：** 有人问，验证码是什么，简单送上一幅图，验证码早已不是Tesseract能解决的时代了，为什么选择验证码作为图像分类的入门，其一因为随处可见，对于深度学习样本不可或缺，验证码的采集难度及成本低。其二，现在的验证码越来越难也越来越具备研究价值，因为它本为安全而生，各种人为的干扰甚至于机器学习对抗等等，也在不断促进图像识别的发展。\n\n**问题二：** 部署识别也需要GPU吗？我的答案是，完全没必要。理想中是用GPU训练，使用CPU部署识别服务，部署如果也需要这么高的成本，那还有什么现实意义和应用场景呢，实测CNN5网络，我的i7-9700k大约1-15ms之间 (图片尺寸60x60-200x200)。\n\n\n\n**此项目以研究学习为目的，禁止用于非法用途，本项目永久开源，笔者将持续维护此项目，并逐步扩展其成为一个完善的深度学习框架。**\n\n\n\n**如有需要欢迎进群交流，落魄算法，在线答疑：**\n\n图像识别技术：857149419 (群已满)\u002F 934889548(2群)\n\n数据矿工：778910502\n\n思知人工智能：90780053","# captcha_trainer 快速上手指南\n\n`captcha_trainer` 是一个基于深度学习的图像验证码识别训练工具，能够高效处理字符粘连、透视变形、噪声干扰等复杂场景。本项目支持可视化配置，无需修改代码即可构建模型，适合从零开始快速搭建验证码识别服务。\n\n## 1. 环境准备\n\n### 系统要求\n- **操作系统**: Windows (推荐 GPU 编译版) 或 Linux\n- **Python 版本**: Python 3.8\n- **硬件要求**: \n  - CPU 模式：无特殊要求\n  - GPU 模式：NVIDIA 显卡，需安装对应的 CUDA 和 cuDNN\n    - 推荐组合：`CUDA 11.4.1 + cuDNN 8.2 + TensorFlow 2.8`\n\n### 前置依赖\n若使用源码运行（非编译版），需手动安装以下环境：\n\n1. **更新显卡驱动** (仅 GPU 用户)\n   前往 NVIDIA 官网下载最新驱动。\n\n2. **安装 CUDA 和 cuDNN** (仅 GPU 用户)\n   - CUDA: https:\u002F\u002Fdeveloper.nvidia.com\u002Fcuda-downloads\n   - cuDNN: https:\u002F\u002Fdeveloper.nvidia.com\u002Frdp\u002Fform\u002Fcudnn-download-survey\n\n3. **安装 Python 虚拟环境工具**\n   ```bash\n   pip3 install virtualenv\n   ```\n\n> **提示**：如果你下载的是官方发布的**编译版 **(Release)，只需更新显卡驱动即可跳过上述环境配置步骤，直接运行。\n\n## 2. 安装步骤\n\n### 方式一：源码安装 (适合开发者)\n\n1. **创建并激活虚拟环境**\n   ```bash\n   virtualenv -p \u002Fusr\u002Fbin\u002Fpython3 venv\n   # Windows 下激活命令:\n   # venv\\Scripts\\activate\n   # Linux\u002FMac 下激活命令:\n   source venv\u002Fbin\u002Factivate\n   ```\n\n2. **克隆项目并进入目录**\n   ```bash\n   git clone https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer.git\n   cd captcha_trainer\n   ```\n\n3. **安装依赖库**\n   \n   *GPU 版本 (推荐):*\n   ```bash\n   pip install tf-nightly-gpu==2.8.0.dev20211021\n   pip install -r requirements.txt\n   ```\n   *(注：国内用户可使用清华源加速：`pip install ... -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple`)*\n\n   *CPU 版本:*\n   ```bash\n   pip install tensorflow\n   pip install -r requirements.txt\n   ```\n\n### 方式二：编译版使用 (适合零基础\u002F快速部署)\n\n1. 访问 [Releases 页面](https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer\u002Freleases\u002F) 下载最新的 Windows GPU 编译包。\n2. 解压后无需安装任何 Python 环境，直接运行内置程序即可。\n\n## 3. 基本使用流程\n\n本工具采用“项目化管理”模式，全程可通过图形界面或配置文件操作，无需修改代码。\n\n### 第一步：准备样本数据\n将采集到的验证码图片整理为文件夹，命名格式建议为：`标签_随机字符串.jpg` (例如：`a3b9_x7y2z.jpg`)。\n- **训练集**: 放入一个文件夹 (如 `train_data`)\n- **验证集**: 放入另一个文件夹 (可选，若不提供系统将自动从训练集划分)\n\n### 第二步：启动可视化界面\n在项目根目录下运行：\n```bash\npython app.py\n```\n*(编译版用户直接运行对应的 `.exe` 启动程序)*\n\n### 第三步：创建项目与配置\n在打开的界面中执行以下操作：\n\n1. **新建项目**: 输入项目名称 (如 `my_captcha`)，按回车或点击空白处创建。\n2. **选择路径**: 点击 `[Browse]` 选择你的训练集文件夹路径。\n3. **自动生成配置**: 系统会根据样本自动推荐字符集 (`Category`)、图片尺寸 (`Resize`) 等参数。\n   - 如需自定义网络结构，可在界面上方选择 (推荐不定长验证码使用 `CNN5+GRU`，定长使用 `CNN5` 或 `ResNet50`)。\n4. **打包数据集**: 点击 `[Make Dataset]` 按钮。\n   - 系统将把图片转换为 `TFRecords` 格式，这是训练所需的输入格式。\n   - *注意：打包过程中请勿强制终止程序，否则需删除未完成的文件重新打包。*\n\n### 第四步：开始训练\n配置完成后，点击 `[Start Training]` 开始训练。\n- **监控**: 界面会实时显示准确率 (Acc) 和损失值 (Cost)。\n- **停止条件**: 当达到设定的准确率 (`EndAcc`) 或轮数 (`EndEpochs`) 时自动停止。\n- **手动停止**: 可随时点击 `[Stop]`，若未达结束条件但想保存模型，可点击 `[Compile]` 手动编译导出 `.pb` 模型文件。\n\n### 第五步：模型部署\n训练完成后，生成的模型文件位于 `projects\u002F项目名\u002F` 目录下。该模型可直接配合 [captcha_platform](https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_platform) 部署服务使用，支持热拔插和多模型并发。\n\n---\n**进阶提示**:\n- 所有配置均保存在 `projects\u002F项目名\u002Fmodel.yaml` 中，高级用户可直接编辑该 YAML 文件调整超参数（如学习率、数据增强策略等）。\n- 支持增量训练：新增样本无需重新打包所有数据，可直接添加新的 TFRecords 文件继续训练。","某电商风控团队需紧急上线一套新注册页面的验证码识别系统，以拦截机器批量注册攻击，但面临的验证码包含字符粘连、透视变形及高强度噪声干扰。\n\n### 没有 captcha_trainer 时\n- **开发门槛极高**：算法工程师需从零搭建 CNN+RNN+CTC 复杂网络架构，手动调试 TensorFlow 代码，耗时数周才能跑出基线模型。\n- **数据预处理繁琐**：面对尺寸不一的样本，需编写大量脚本进行人工裁剪和归一化，一旦新增样本类型，整个数据集需重新打包。\n- **泛化能力不足**：传统 OCR 库难以处理严重的字符重叠和模糊噪声，识别率低下，导致大量误拦正常用户或漏放黑产脚本。\n- **部署维护困难**：模型训练与生产环境割裂，每次迭代需重新编译部署，无法实现多模型热切换，运维成本高昂。\n\n### 使用 captcha_trainer 后\n- **零代码快速建模**：通过可视化界面选择\"ResNet50+GRU\"模板，智能推荐字符集与参数，无需修改一行代码即可生成针对粘连噪声优化的模型配置。\n- **增量训练高效便捷**：支持直接加载新的 TFRecords 样本文件进行增量训练，自动处理不定宽图像缩放，大幅缩短数据准备周期。\n- **抗干扰能力卓越**：内置二值化、模糊、旋转等数据增广策略，结合深度网络特征提取，轻松秒杀透视变形与高强度噪声场景，识别准确率显著提升。\n- **生产级无缝衔接**：生成的配置文件可直接用于部署服务，支持多模型并发与热拔插，业务层可灵活拓展算术运算等逻辑，实现从训练到上线的闭环。\n\ncaptcha_trainer 将原本需要资深算法团队数周的工作压缩至小时级，让中小企业也能以极低门槛拥有工业级的验证码识别能力。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fkerlomz_captcha_trainer_4c7cd2e8.png","kerlomz",null,"https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fkerlomz_e6b828d9.jpg","The University of Texas at Austin","Austin","kerlomz@utexas.edu","https:\u002F\u002Fgithub.com\u002Fkerlomz",[81],{"name":82,"color":83,"percentage":84},"Python","#3572A5",100,3195,826,"2026-04-14T07:02:27","Apache-2.0","Windows, Linux","训练可选：需要 NVIDIA GPU。官方测试组合为 CUDA 11.4.1 + cuDNN 8.2 + TensorFlow 2.8-DEV (tf-nightly-gpu)。提供无需安装环境的 Windows GPU 编译版。","未说明（配置文件中提及显存占用率推荐设为 0.6-0.8）",{"notes":93,"python":94,"dependencies":95},"1. 项目基于 TensorFlow 1.14 开发，但推荐使用 tf-nightly-gpu 2.8 版本。2. 提供 Windows 平台的 GPU 编译版，无需手动安装环境即可运行。3. 建议使用虚拟环境 (virtualenv) 或 conda 管理依赖。4. 数据需打包为 TFRecords 格式方可进行训练。5. 支持多种网络结构组合（如 CNN5+GRU, ResNet50+CTC 等）。","3.8",[96,97],"tensorflow-gpu==2.8.0.dev20211021 (或 tensorflow)","virtualenv",[15,14],[100,101,102,103],"captcha-recognition","tensorflow-tutorials","ocr","tensorflow","2026-03-27T02:49:30.150509","2026-04-16T10:47:23.300921",[107,112,117,122,127,132,137],{"id":108,"question_zh":109,"answer_zh":110,"source_url":111},35775,"训练过程中出现 MemoryError 或 CUDA out of memory 报错怎么办？","这通常是因为显存或内存不足。解决方法是在配置文件 `config.yaml` 中调整 `DeviceUsage` 参数，将其设置为较小的值（例如 `0.3`），以限制 GPU 显存的使用比例。虽然这可能会导致性能略有下降，但能有效避免显存溢出导致的程序崩溃。此外，也可以尝试减小批次大小（batch_size）。","https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer\u002Fissues\u002F3",{"id":113,"question_zh":114,"answer_zh":115,"source_url":116},35776,"遇到 'cannot import name loader from tf2onnx' 导入错误如何解决？","这是由于 `tf2onnx` 库的版本更新导致接口名称变更。解决方法是找到报错的代码文件，将导入语句中的 `loader` 修改为 `tf_loader` 即可解决该兼容性问题。","https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer\u002Fissues\u002F77",{"id":118,"question_zh":119,"answer_zh":120,"source_url":121},35773,"为什么识别结果中连续的相同字符容易被漏掉（例如将 ABCCDE 识别为 ABCDE）？","这是因为使用了 CTC 解码算法。CTC 编码要求两个相同字符之间必须插入空白符，如果池化层过多导致输入的时间步长（timestep）太短，可能没有足够的空间插入空白，从而导致相同字符合并。解决方案有：1. 改用 CrossEntropy 损失函数代替 CTC；2. 增加输入图像的长度或减少池化层数量；3. 在标注数据时，在重复字符中间人为加入分隔符（但这会增加标注复杂度）。","https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer\u002Fissues\u002F14",{"id":123,"question_zh":124,"answer_zh":125,"source_url":126},35774,"如何获取和处理验证码样本数据用于训练？","可以使用作者提供的爬虫项目 `captcha_spider` 来采集样本。参考地址：https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_spider。注意样本文件的命名必须规范（通常需包含标签信息），如果原始文件名仅为数字（如 0.png, 1.png），需要使用脚本将其修改为符合训练要求的格式（如 `标签_哈希值.jpg`），否则无法用于训练。","https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer\u002Fissues\u002F88",{"id":128,"question_zh":129,"answer_zh":130,"source_url":131},35777,"向训练集中加入新数据后，为什么准确率反而下降了？","准确率下降通常与新加入样本的质量有关。首先需确保新样本的标注 100% 正确，错误的标注会直接干扰模型学习。其次，需确认“准确率下降”是指验证集上的数值表现还是实际生产环境的测试结果。有时验证集数值下降可能是因为新加入的验证集包含了之前未覆盖的困难样本，但这反而可能提升模型在生产环境中的泛化能力。建议检查数据采集渠道和标注准确性。","https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer\u002Fissues\u002F57",{"id":133,"question_zh":134,"answer_zh":135,"source_url":136},35778,"muggle-ocr 的 pip 包还能安装吗？","该项目的 pip 包（muggle-ocr）已经下线，PyPI 页面返回 404 错误。用户无法再通过 `pip install muggle-ocr` 进行安装，需要寻找其他替代方案或从源码构建（如果源码可用）。","https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer\u002Fissues\u002F86",{"id":138,"question_zh":139,"answer_zh":140,"source_url":141},35779,"框架是否支持识别双行文字或特殊结构的验证码？","是的，虽然标准的 CRNN 网络架构主要针对单行文本，但该框架内部编写了特定的方法来顺带支持双行文字等特殊验证码的识别。用户可以直接尝试使用框架进行训练，无需额外修改核心架构即可处理此类情况。","https:\u002F\u002Fgithub.com\u002Fkerlomz\u002Fcaptcha_trainer\u002Fissues\u002F76",[]]