从零构建:利用ddddocr定位与Siamese网络分类的图标验证码识别方案
1. 开篇当图标验证码遇上AI我们如何优雅地“破解”大家好我是老张在AI和爬虫这块摸爬滚打了十来年。今天想跟大家聊聊一个非常具体、也非常有挑战性的问题图标验证码识别。你可能遇到过那种让你“点击图中所有的自行车”或者“按顺序点击图标”的验证码这种就是典型的图标验证码。对于自动化程序来说这玩意儿简直就是拦路虎。传统的OCR光学字符识别在这里完全派不上用场因为人家根本不是文字。手动标注效率太低遇到新花样就得重来。所以我们需要一套更智能、更通用的方案。我最近在一个项目里就成功用ddddocr和Siamese网络孪生神经网络搭建了一套从识别到分类的完整流程实测下来效果非常稳准确率能到95%以上。这套方案的核心思路其实很清晰就像玩“找不同”和“连连看”两个游戏。第一步用ddddocr这个神器像鹰眼一样在验证码大图中精准定位每一个小图标的位置并把它们一个个“抠”出来。第二步把这些抠出来的图标喂给Siamese网络去学习让它学会判断两个图标是不是同一个东西。这样一来无论验证码里的图标是猫是狗是飞机还是汽车只要我们的模型见过它就能认出来。整个流程从环境搭建、数据准备到模型训练、部署测试我都会手把手带你过一遍。即使你之前没怎么接触过深度学习跟着我的步骤走也能把这个系统跑起来。咱们不搞那些虚头巴脑的理论直接上干货说人话讲实操。2. 环境准备与工具初识磨刀不误砍柴工在开始写代码之前咱们得先把“厨房”收拾好把“厨具”备齐。这里主要涉及两个核心工具ddddocr和Siamese网络的训练框架。它们的安装难度一个天上一个地下咱们分开说。2.1 秒级安装的“定位神器”ddddocr首先说说ddddocr这绝对是国内开发者的福音。它是一个由大佬开源、已经预训练好的目标检测模型专门针对各种验证码滑块、点选、图标等中的元素进行定位。它的最大优点就是开箱即用。安装简单到令人发指。你不需要配任何复杂的环境只要你的电脑有Python打开命令行CMD或Terminal输入下面这行命令回车等它自己完成就行了pip install ddddocr就这么一句话。我试过在Windows、Mac和Linux上安装基本都是一路绿灯。安装完成后在Python里用import ddddocr导入几行代码就能调用它的检测功能。它底层用的是深度学习但封装得极好你完全不用关心模型结构把它当成一个黑盒函数来用就行。这工具大大降低了验证码定位的门槛也是我们整个方案的第一步能快速实现的关键。2.2 需要耐心配置的“分类大脑”Siamese网络环境接下来是重头戏Siamese网络孪生神经网络。它的原理官方解释起来很复杂什么“共享权重的双塔结构”、“度量学习”……咱们可以先不用深究。你只需要知道它特别擅长解决“比较”问题比如判断两张图片是否相似、是否属于同一类。在我们的场景里就是判断两个裁剪出来的图标是不是同一种东西。它的环境搭建就比ddddocr麻烦多了因为它依赖于PyTorch这个深度学习框架。我强烈建议你按照以下步骤来可以避开很多坑安装Anaconda可选但强烈推荐这是一个Python环境管理工具能让你为不同项目创建独立的、互不干扰的Python环境。去官网下载安装之后用它的Anaconda Prompt来操作。创建并激活虚拟环境在Anaconda Prompt里执行conda create -n siamese python3.8创建一个名为“siamese”的Python3.8环境。然后激活它conda activate siamese。安装PyTorch这是最可能出错的一步。千万不要直接pip install torch一定要去 PyTorch官网根据你的操作系统、包管理工具我们选Conda、CUDA版本如果你有NVIDIA显卡且安装了CUDA就选对应的版本如果没有就选CPU版本生成专属的安装命令。比如对于Windows系统、用Conda、没有独立显卡的电脑命令可能长这样conda install pytorch torchvision torchaudio cpuonly -c pytorch。把官网生成的命令复制下来执行。克隆Siamese网络代码我这里参考了一个GitHub上结构清晰、适合学习的Siamese网络实现。在命令行里进入你打算存放项目的目录运行git clone https://github.com/bubbliiiing/Siamese-pytorch.git。安装剩余依赖进入克隆下来的项目文件夹 (cd Siamese-pytorch)里面通常会有一个requirements.txt文件列出了所有需要的Python库。用pip安装它们pip install -r requirements.txt。完成以上步骤你的Siamese网络训练环境才算基本就绪。这个过程可能会遇到网络问题、版本冲突别着急多搜搜报错信息大部分都能找到解决方案。环境配好了后面就一马平川了。3. 实战第一步用ddddocr精准定位与分割图标环境准备好咱们就动手开干。第一步的目标很明确拿到一张图标验证码图片把里面所有的小图标的位置找出来并且把它们一个个单独保存成小图片。3.1 理解ddddocr的检测输出首先我们写一个简单的脚本来看看ddddocr到底能给我们什么。假设我们有一张名为captcha.jpg的验证码图片。import ddddocr import cv2 from PIL import Image # 初始化检测器detTrue表示启用目标检测模式 det ddddocr.DdddOcr(detTrue) # 读取图片 with open(captcha.jpg, rb) as f: image_bytes f.read() # 进行检测 bboxes det.detection(image_bytes) print(f检测到的框数量{len(bboxes)}) print(f坐标列表{bboxes})运行这段代码你会得到一个bboxes列表。列表里的每个元素都是一个包含4个整数的列表形如[x1, y1, x2, y2]。这4个数字代表一个矩形框(x1, y1)是框的左上角坐标(x2, y2)是框的右下角坐标。这个框就是ddddocr认为的一个图标所在的位置。3.2 编写图标裁剪与保存函数拿到坐标后裁剪就很简单了。我们用PIL库Python Imaging Library来操作图片。下面我给出一个更健壮、更通用的裁剪函数import os from PIL import Image def crop_and_save_icons(image_path, bboxes, output_dircropped_icons): 根据检测框裁剪图标并保存。 :param image_path: 原始验证码图片路径 :param bboxes: ddddocr返回的检测框列表 :param output_dir: 裁剪后图标保存的目录 # 打开原始图片 original_img Image.open(image_path) # 创建保存目录 os.makedirs(output_dir, exist_okTrue) # 获取图片文件名不含扩展名用于创建子文件夹 base_name os.path.splitext(os.path.basename(image_path))[0] save_folder os.path.join(output_dir, base_name) os.makedirs(save_folder, exist_okTrue) # 遍历所有检测框 for idx, bbox in enumerate(bboxes): # 确保坐标是整数 left, upper, right, lower map(int, bbox) # 裁剪 icon_img original_img.crop((left, upper, right, lower)) # 生成保存文件名可以按顺序或按坐标命名 # 方式1按顺序命名 (0.jpg, 1.jpg...) # icon_name f{idx}.jpg # 方式2按坐标命名更唯一推荐 icon_name ficon_{left}_{upper}_{right}_{lower}.jpg save_path os.path.join(save_folder, icon_name) icon_img.save(save_path) print(f已保存图标到{save_path}) print(f所有图标已裁剪完成保存在目录{save_folder})这个函数做了几件事1. 为每张验证码图片创建一个独立的文件夹2. 根据每个框的坐标裁剪出图标3. 以坐标信息命名文件避免了顺序错乱也便于后期追溯。你可以把前面检测到的bboxes直接传给这个函数。3.3 批量处理与效果验证实际项目中我们肯定不止处理一张图片。你需要收集一批目标网站的验证码图片放在同一个文件夹里然后写一个循环来批量处理。import os def batch_process_captchas(image_folder, output_base_dirall_cropped_icons): 批量处理一个文件夹内的所有验证码图片 det ddddocr.DdddOcr(detTrue) image_extensions (.jpg, .jpeg, .png, .bmp, .gif) for filename in os.listdir(image_folder): if filename.lower().endswith(image_extensions): image_path os.path.join(image_folder, filename) print(f正在处理{filename}) try: with open(image_path, rb) as f: image_bytes f.read() bboxes det.detection(image_bytes) print(f 发现 {len(bboxes)} 个图标) if bboxes: # 如果检测到图标才进行裁剪 crop_and_save_icons(image_path, bboxes, output_base_dir) else: print(f 警告未在 {filename} 中检测到图标) except Exception as e: print(f 处理 {filename} 时出错{e}) # 使用示例 batch_process_captchas(path/to/your/captcha/images, my_icons_dataset)跑完这个流程你就能得到一个结构清晰的图标库。每个验证码图片对应一个子文件夹里面是它包含的所有小图标。这是构建我们分类数据集的原材料。我建议一开始至少收集50-100张不同的验证码图片这样裁剪出来的图标样本会比较丰富。4. 数据准备构建与增强你的图标分类数据集从ddddocr那里我们得到了一堆裁剪好的小图标图片但它们是杂乱无章的。下一步我们需要为Siamese网络的训练准备“教材”也就是一个标注好的数据集。Siamese网络的学习方式比较特别它不需要我们告诉它“这是猫那是狗”它需要的是图片对pair以及一个标签这个图片对里的两张图片是“同一类”还是“不同类”。4.1 手动分类枯燥但至关重要的步骤首先我们必须手动整理图标。打开上一步生成的my_icons_dataset文件夹你会看到很多子文件夹每个子文件夹里是一张验证码里抠出来的图标。现在你需要用“人眼”观察把所有看起来是同一个物体的图标复制到同一个新的文件夹里。例如创建一个新文件夹叫datasets/images_background/airplane把所有飞机图标放进去。创建一个新文件夹叫datasets/images_background/car把所有汽车图标放进去。创建一个新文件夹叫datasets/images_background/tree把所有树木图标放进去。……这里有几个关键点文件夹名就是类别名尽量用英文简单明了。确保类别内一致性同一个文件夹里的图标必须确实是同一种东西。哪怕角度、颜色、大小略有差异但主体必须一致。重命名文件可选但推荐为了防止文件名冲突也为了后续处理方便我建议把文件重命名为类别名_随机哈希值.jpg的格式。你可以写个小脚本批量完成。import os import hashlib def rename_files_by_hash(class_folder): 将文件夹内的图片重命名为 类别名_哈希值.jpg 格式 class_name os.path.basename(class_folder) for filename in os.listdir(class_folder): if filename.lower().endswith((.png, .jpg, .jpeg)): filepath os.path.join(class_folder, filename) # 计算文件MD5哈希作为唯一标识 with open(filepath, rb) as f: file_hash hashlib.md5(f.read()).hexdigest()[:8] # 取前8位 new_name f{class_name}_{file_hash}.jpg new_path os.path.join(class_folder, new_name) os.rename(filepath, new_path) print(f重命名{filename} - {new_name}) # 对每个类别文件夹调用此函数这个过程很枯燥但数据质量直接决定模型上限。我最初图省事有些模棱两可的图标也归到了一类结果训练时模型就“学歪了”。所以耐心点分仔细。4.2 数据增强让小数据集发挥大能量手动分类完你可能会发现每个类别的图片数量不多可能就十几二十张。直接用这么少的数据训练模型很容易过拟合就是只记住了训练集遇到新图片就傻眼。这时就需要数据增强Data Augmentation。数据增强的本质是通过一些简单的图像变换人工制造出新的、合理的训练图片。比如把图标稍微旋转一下、调亮一点、加一点模糊在模型看来可能就是一张“新”的图片但它的类别没有变。下面我分享一个增强函数它包含了旋转、翻转、调整亮度、添加噪声等常用操作import cv2 import numpy as np import os import random def augment_single_image(image_path, output_folder, augment_times5): 对单张图片进行多种增强并保存到指定文件夹。 :param augment_times: 每张原图增强出多少张新图 img cv2.imread(image_path) if img is None: return filename os.path.splitext(os.path.basename(image_path))[0] ext os.path.splitext(image_path)[1] os.makedirs(output_folder, exist_okTrue) for i in range(augment_times): augmented img.copy() # 1. 随机旋转 (-30度 到 30度) angle random.uniform(-30, 30) h, w augmented.shape[:2] center (w // 2, h // 2) M cv2.getRotationMatrix2D(center, angle, 1.0) augmented cv2.warpAffine(augmented, M, (w, h), borderModecv2.BORDER_REFLECT) # 2. 随机水平翻转 if random.random() 0.5: augmented cv2.flip(augmented, 1) # 3. 随机亮度调整 brightness random.uniform(0.7, 1.3) augmented cv2.convertScaleAbs(augmented, alphabrightness, beta0) # 4. 随机高斯噪声 if random.random() 0.5: noise np.random.randn(*augmented.shape) * random.uniform(1, 5) augmented np.clip(augmented noise, 0, 255).astype(np.uint8) # 5. 随机高斯模糊 if random.random() 0.7: ksize random.choice([3, 5]) augmented cv2.GaussianBlur(augmented, (ksize, ksize), 0) # 保存增强后的图片 output_path os.path.join(output_folder, f{filename}_aug{i}{ext}) cv2.imwrite(output_path, augmented) # 对整个数据集进行增强 def augment_dataset(original_dataset_path, augmented_dataset_path): :param original_dataset_path: 原始分类数据集路径结构为 /class1/*.jpg, /class2/*.jpg :param augmented_dataset_path: 增强后数据集输出路径 for class_name in os.listdir(original_dataset_path): class_path os.path.join(original_dataset_path, class_name) if not os.path.isdir(class_path): continue output_class_path os.path.join(augmented_dataset_path, class_name) os.makedirs(output_class_path, exist_okTrue) print(f正在增强类别{class_name}) for img_file in os.listdir(class_path): if img_file.lower().endswith((.png, .jpg, .jpeg)): img_path os.path.join(class_path, img_file) # 首先把原图复制过去 import shutil shutil.copy(img_path, os.path.join(output_class_path, img_file)) # 然后对原图进行增强生成新图 augment_single_image(img_path, output_class_path, augment_times3) # 每张原图增强3次 print(数据集增强完成)运行这个增强脚本后你的每个类别下的图片数量可能会变成原来的4倍1张原图3张增强图。这样一来数据量就大大增加了。我个人的经验是如果原始每个类别能有20-30张清晰的图标增强后达到80-120张训练效果就已经很不错了。当然如果原始数据能有几百张那增强后效果会更稳。5. 模型训练配置与调优Siamese网络数据准备好了终于可以开始训练我们的大脑——Siamese网络了。这里我以之前克隆的Siamese-pytorch项目为例讲解如何配置和启动训练。5.1 理解Siamese网络的数据组织方式在开始训练前你必须把增强后的数据按照项目要求放好。通常Siamese-pytorch这样的项目要求数据按如下结构存放datasets/ └── images_background/ ├── airplane/ │ ├── airplane_abcd1234.jpg │ ├── airplane_efgh5678.jpg │ └── ... ├── car/ │ ├── car_ijkl9012.jpg │ └── ... └── tree/ └── ...也就是把之前整理好的、按类别分好的文件夹整个放到datasets/images_background/目录下。注意很多Siamese网络实现包括这个采用了“Few-Shot Learning”的设定images_background通常作为训练集可能还会有一个images_evaluation作为测试集。我们初期可以只准备images_background训练和评估都先用它。5.2 关键配置修改打开项目文件夹找到训练配置文件通常是train.py或者config.py。我们需要修改几个关键参数启用自有数据训练找到train_own_data这个参数可能在代码开头或一个配置类里把它设置为True。这告诉程序“别用你自带的演示数据集了用我准备好的数据。”指定数据集路径检查dataset_path参数确保它指向你存放数据的根目录例如./datasets。调整训练参数根据你的情况input_shape: 输入图片的大小通常是[105, 105, 3]或[100, 100, 3]。务必确保这个尺寸和你的图标图片尺寸匹配或兼容。如果图标太大或太小你可能需要提前用脚本将所有图标resize成统一尺寸。batch_size: 批大小。如果你的显卡内存小比如6G或以下建议调小比如从12调到4或8否则会内存溢出OOM。Epoch: 训练轮数。Siamese网络通常需要较长时间训练才能收敛。不要指望几十轮就能好。我一般会设置100-200轮。训练过程中可以观察损失loss值如果连续多轮不再下降就可以提前停止了。learning_rate: 学习率。新手建议先用默认值如果训练过程中loss震荡很大或者不下降可以尝试调小例如从1e-3调到1e-4。5.3 启动训练与监控配置好后在激活的siamese虚拟环境下进入项目目录直接运行训练脚本python train.py如果一切顺利你会看到命令行开始输出日志显示当前是第几轮Epoch训练损失Loss是多少。训练过程可能非常缓慢尤其是在CPU上。有GPU的话会快很多。一个非常重要的特点与一些需要完全训练完才能使用的分类网络不同Siamese网络在训练过程中每轮或每若干轮结束后都会保存一次模型权重.pth文件。这意味着你不需要等全部训练完成。训练个二三十轮后你就可以尝试用中间生成的权重文件进行预测了效果可能已经不错随着训练轮数增加效果会逐步提升。训练产生的权重文件通常保存在logs文件夹下文件名可能包含训练日期和轮数信息。一般来说最新的文件序号最大的就是最新训练出的权重。6. 模型使用与优化从预测到部署训练出模型权重后我们就要用它来解决实际问题了给定一张新的验证码图片和一个目标图标判断目标图标是否出现在验证码中并找出它的位置。6.1 编写预测与匹配流程整个预测流程是一个串联操作结合了ddddocr和Siamese网络定位用ddddocr处理新验证码得到N个图标框bboxes和对应的N张裁剪小图。特征提取与比对将需要寻找的目标图标比如“飞机”与N张裁剪小图逐一送入Siamese网络计算相似度。决策设定一个相似度阈值例如0.9高于阈值的就认为是同一类图标。下面是一个核心的匹配函数示例from siamese import Siamese # 从项目文件中导入定义好的Siamese类 from PIL import Image import numpy as np def load_siamese_model(model_weights_path): 加载训练好的Siamese模型 model Siamese(model_pathmodel_weights_path, input_shape(105, 105, 3)) # 参数需与你训练时一致 # 注意有些实现将模型封装成了类预测函数可能是 predict 或 detect_image return model def compare_icon_pair(model, image_path1, image_path2): 比较两张图片的相似度 try: image1 Image.open(image_path1) image2 Image.open(image_path2) # 假设模型的预测函数叫 detect_image返回相似度概率 similarity model.detect_image(image1, image2) # 有些实现返回的是距离越小越相似有些返回的是概率越大越相似需要看清 # 这里假设返回的是相似度概率0~1之间 return similarity except Exception as e: print(f比较图片时出错{e}) return 0.0 def find_target_in_captcha(captcha_path, target_icon_path, det_model, siamese_model, threshold0.85): 主函数在验证码中寻找目标图标 :return: 匹配成功的图标坐标列表或None # 步骤1定位验证码中的所有图标 with open(captcha_path, rb) as f: image_bytes f.read() all_bboxes det_model.detection(image_bytes) if not all_bboxes: print(未检测到任何图标。) return [] # 打开验证码大图用于裁剪 captcha_img Image.open(captcha_path) matches [] # 步骤2遍历每个检测框与目标图标比对 for idx, bbox in enumerate(all_bboxes): left, upper, right, lower map(int, bbox) # 裁剪出当前图标 icon_img captcha_img.crop((left, upper, right, lower)) # 临时保存裁剪的图标以便Siamese网络读取 # 更好的做法是直接在内存中转换格式避免磁盘IO这里为清晰起见先保存 temp_icon_path ftemp_icon_{idx}.jpg icon_img.save(temp_icon_path) # 步骤3相似度计算 similarity compare_icon_pair(siamese_model, target_icon_path, temp_icon_path) print(f图标{idx} [{left},{upper},{right},{lower}] 与目标相似度{similarity:.4f}) # 步骤4根据阈值判断 if similarity threshold: matches.append({ bbox: bbox, similarity: similarity, index: idx }) # 清理临时文件 import os os.remove(temp_icon_path) # 按相似度从高到低排序 matches.sort(keylambda x: x[similarity], reverseTrue) return matches # 使用示例 if __name__ __main__: # 1. 加载模型 det ddddocr.DdddOcr(detTrue) siamese load_siamese_model(logs/your_best_model.pth) # 替换为你的权重路径 # 2. 指定验证码和目标图标 new_captcha new_captcha_001.jpg target_icon datasets/images_background/airplane/airplane_sample.jpg # 一个已知的飞机图标 # 3. 执行查找 result find_target_in_captcha(new_captcha, target_icon, det, siamese, threshold0.9) if result: print(f\n找到 {len(result)} 个匹配项) for match in result: bbox match[bbox] print(f 位置{ match[index]}: 坐标{bbox}, 相似度{match[similarity]:.4f}) else: print(未找到目标图标。)6.2 效果优化与踩坑经验在实际使用中你可能会遇到一些问题。这里分享几个我踩过的坑和优化点阈值Threshold的选择0.9只是一个起点。你需要用一个验证集来调整它。验证集是一些你知道正确答案的图片。通过调整阈值观察“误识”把不是的当成是的和“漏识”把是的当成不是的的比例找到一个平衡点。可以尝试0.85, 0.88, 0.92等值。图标尺寸不一致问题ddddocr裁剪出的图标大小可能不一而Siamese网络通常要求固定尺寸输入如105x105。你必须在裁剪后将图标缩放resize到网络要求的尺寸否则会报错或效果差。在上面的compare_icon_pair函数中可以在打开图片后添加image1 image1.resize((105, 105))。灰度图 vs 彩图有些验证码图标是灰度的有些是彩色的。原始Siamese网络训练时用的可能是彩图3通道。如果验证码是灰度图1通道需要先转换成3通道image.convert(RGB)。我实测发现统一转换成灰度图再训练和预测有时效果更好更稳定因为颜色信息可能是一种干扰。你可以在数据准备阶段就统一将所有图标转为灰度。模型集成如果单一模型效果达不到要求可以训练多个Siamese模型比如用不同的数据增强方式、不同的网络深度然后对它们的预测结果进行投票这样可以提升鲁棒性。部署为API最终要想集成到自动化系统中最好将整个识别流程ddddocr定位 Siamese比对封装成一个HTTP API服务使用Flask或FastAPI这样其他程序就可以通过发送图片来获取识别结果了。6.3 转换为ONNX格式加速推理如果你对识别速度有更高要求可以考虑将训练好的PyTorch模型.pth转换为ONNX格式。ONNX是一种开放的模型格式可以被多种推理引擎如ONNX Runtime, TensorRT高效支持通常能获得比原生PyTorch更快的推理速度。转换代码大致如下具体需参考项目文档import torch from siamese import Siamese # 加载PyTorch模型 model Siamese(model_pathlogs/best_model.pth) model.eval() # 切换到评估模式 # 创建一个示例输入张量 dummy_input torch.randn(1, 3, 105, 105) # (batch, channel, height, width) # 导出模型 torch.onnx.export(model, dummy_input, siamese_model.onnx, input_names[input], output_names[output], dynamic_axes{input: {0: batch_size}, output: {0: batch_size}})转换成功后你可以使用ONNX Runtime来加载和运行siamese_model.onnx替换掉原来PyTorch的推理部分速度会有明显提升。整个方案从无到有搭建确实需要一些时间和耐心尤其是数据准备和模型调优阶段。但一旦跑通你会发现这套结合了现成检测工具和定制化分类模型的方案对于图标验证码这类问题通用性和准确性都非常不错。最重要的是整个技术栈都是可解释、可控制的你可以根据具体验证码的特点去调整数据增强方式、网络结构或后处理逻辑直到获得满意的效果。

相关新闻

逆向解析某音乐平台缓存加密机制:从密钥推导到解密实践(以酷狗音乐为例)

逆向解析某音乐平台缓存加密机制:从密钥推导到解密实践(以酷狗音乐为例)

1. 缘起:为什么我们要研究音乐缓存加密? 大家好,我是老张,一个在音视频技术领域折腾了十多年的老码农。今天想和大家聊聊一个既有趣又实用的话题:音乐平台本地缓存文件的加密与解密。这事儿听起来有点“黑客”的味道&a…

2026/6/26 11:03:44 阅读更多 →
【Python】Pyglet快速上手:从零搭建你的第一个多媒体应用

【Python】Pyglet快速上手:从零搭建你的第一个多媒体应用

1. 为什么选择Pyglet?一个老玩家的真心话 如果你刚接触Python,想做个带点图形、能出声儿的小程序,或者干脆就是想试试自己做个小游戏,那你可能已经听过Pygame的大名。但今天我想跟你聊聊另一个选择:Pyglet。我用过不少…

2026/6/26 11:09:13 阅读更多 →
2026巨头疯抢赛道:多任务强化学习Multi-task RL

2026巨头疯抢赛道:多任务强化学习Multi-task RL

最近观察了AGI的发展,作为其重要技术路径之一的多任务强化学习MTRL热度暴涨,吸引了很多大佬和机构入场,仅2026年初,就有一批相关论文被顶会接收。细数是数不过来了,就说几个瞩目的:字节跳动的OneReward&…

2026/7/3 11:21:15 阅读更多 →

最新新闻

量子科技中的多样性与包容性实践

量子科技中的多样性与包容性实践

1. 量子科技领域为何需要关注多样性与包容性?量子计算、量子通信等量子科技正在重塑未来技术格局。与传统学科不同,量子科技本质上是一门高度交叉的领域,融合了物理学、计算机科学、材料学、工程学等多个学科。这种交叉性决定了其发展特别依赖…

2026/7/4 12:12:52 阅读更多 →
终极指南:3分钟解决Windows上iPhone USB网络共享驱动问题

终极指南:3分钟解决Windows上iPhone USB网络共享驱动问题

终极指南:3分钟解决Windows上iPhone USB网络共享驱动问题 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_…

2026/7/4 12:10:51 阅读更多 →
SaToken实战:密码加密与会话查询的深度整合与应用

SaToken实战:密码加密与会话查询的深度整合与应用

1. 项目概述:为什么我们需要深度整合密码加密与会话查询? 在任何一个需要用户登录的现代Web应用中,安全都是悬在开发者头顶的达摩克利斯之剑。我们常常会陷入一种“头痛医头,脚痛医脚”的困境:用户注册时,我…

2026/7/4 12:10:51 阅读更多 →
Appium视觉测试实战:从像素对比到智能忽略的UI自动化回归方案

Appium视觉测试实战:从像素对比到智能忽略的UI自动化回归方案

1. 项目概述:为什么我们需要视觉测试?在移动应用自动化测试的征途上,我们常常会遇到一个令人头疼的问题:功能逻辑明明跑通了,按钮能点,数据能提交,但界面却“跑偏”了。可能是某个按钮在iOS 17上…

2026/7/4 12:08:51 阅读更多 →
基于Django与TensorFlow的实时口罩检测系统设计与实现

基于Django与TensorFlow的实时口罩检测系统设计与实现

1. 项目概述这个基于DjangoTensorFlow的实时口罩检测系统是我在疫情期间完成的一个毕业设计项目。当时观察到公共场所人工检查口罩佩戴情况效率低下,于是萌生了用深度学习技术解决这个问题的想法。系统通过摄像头实时捕捉人脸图像,使用训练好的CNN模型判…

2026/7/4 12:06:50 阅读更多 →
Sandboxie配置加密备份全攻略:从明文风险到AES-256安全存储

Sandboxie配置加密备份全攻略:从明文风险到AES-256安全存储

1. 项目概述:为什么沙箱配置也需要“上锁”?如果你和我一样,长期把Sandboxie当作一个隔离测试环境、软件试用区,甚至是处理一些不确定文件的安全沙盒,那你一定花了不少心思去调整它的配置。从文件访问规则、资源限制到…

2026/7/4 12:06:50 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻