尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
CNN人脸识别考勤从demo到可靠部署:特征提取、阈值调控与避坑指南
简介这是一份基于卷积神经网络的人脸识别考勤演示项目面向Python初学者与大学生课程设计场景完整展示从模型调用到界面操作的流程。资源打包了训练好的Caffe模型与网络配置提供摄像头实时采集、人脸检测、特征比对以及签到签退的完整脚本并配有多个Qt界面文件和示例图片结构清晰便于直接运行与二次开发。压缩包共30个文件以Python源码为主体另有界面设计文件、模型文件、图片素材与说明文档总大小约32.54MB目录按模型、界面、脚本和素材划分方便按需查阅。目前已有173人学习下载适合需要快速理解深度学习落地流程的读者也可作为考勤、门禁等系统的课程设计基础尤其适合大二、大三学生借鉴整体思路与模块拆分方式是一款体量适中、代码组织规范的人工智能入门应用项目。1. 第一次把CNN人脸识别考勤demo部署到现场我翻车了整整一个上午某个周一早晨我负责把下载回来的人脸识别考勤demo部署到办公室摄像头是现成的电脑是普通i5结果第一位同事站在镜头前程序显示“未知人员”第二位同事直接被识别成第一位考勤表里打了一串错误工号。问题不在摄像头也不在员工颜值而在于这个基于CNN神经网络人脸识别实现的考勤demo项目本质上只是把“人脸检测特征提取特征比对”的骨架跑通了离“可靠考勤”还差数据规范、阈值调控和一整套路业务状态逻辑。这篇文章想帮你把这个demo真正变成能点名的工具先讲清楚链路怎么拆再给一份能直接抄的跑通流程最后把我踩过的坑一条条列出来。2. 拆开CNN人脸识别考勤的链路:检测、对齐、特征提取谁都不能少2.1 考勤识别为什么不是“多分类问题”很多人第一次接触CNN第一反应是“把每个员工当一个类别”用分类网络去训。分类网络当然能做张三图片送进去输出一个“张三概率0.93”。但考勤场景这么玩会翻车——新员工入职要重新训练整个模型老员工换发型、戴眼镜数据集又得重做一套而且分类网络输出的是“见过的几个人里最像谁”一旦来个陌生人它也会强行归到某个员工头上这就是误打卡的根源。实际的人脸识别考勤走的是度量学习路线。CNN主网在这里不是输出类别而是输出一个固定维度的特征向量常见是128维或512维。训练阶段用ArcFace这类带margin的损失函数让同一个人的特征向量在余弦空间里聚在一起不同人的向量散开。推理阶段只做两件事第一算摄像头拍到的人脸特征第二和底库里每位员工的特征向量比对余弦相似度超过阈值就认为是本人。入职新员工只需要往底库加一条记录完全不用动网络。这也解释了为什么demo里通常会带一个“注册”功能而不是“训练”功能。你点注册程序采集几张照片、提取特征、存进底库整套逻辑和通讯录加联系人差不多。把“识别”当成“比对”把“考勤”当成“比对后的业务动作”这个顺序理顺了后面看代码不会一头雾水。2.2 三级流水线检测、对齐、特征提取的具体分工一个完整的人脸识别考勤流程代码上至少拆成三段。第一段是人脸检测输入是整帧画面输出是若干个脸部包围框和关键点坐标。第二段是人脸对齐把检测到的脸通过仿射变换旋转、缩放到标准尺寸。第三段才是CNN特征提取把对齐后的112×112标准人脸变成512维向量。检测网络常用MTCNN、RetinaFace这类它们除了输出人脸框还能输出左眼、右眼、鼻尖、嘴角关键点。这些关键点是给对齐用的。一个歪着脖子站在门禁机前面的员工如果直接把原图裁下来送进特征网络特征质量会肉眼可见地下降用关键点做一次仿射变换把两只眼睛拉回同一条水平线识别率立刻上一个台阶。特征提取网络是性能和精度的权衡。常见的有MobileFaceNet、FaceNet、ArcFace配套的IResNet系列。考勤场景一般就几十个人用MobileFaceNet在CPU上就能跑到单张20到50毫秒如果要求更高精度且有大显卡再考虑IResNet。模型选型我放在一张表里方便对着选。环节常见模型输出考勤场景选型建议检测MTCNN、RetinaFace、SCRFD人脸框关键点优先MTCNN数据量小、上手快对齐关键点驱动的仿射变换112×112标准化人脸必须做不做识别率差一截特征提取MobileFaceNet、IResNet512维特征向量CPU部署选MobileFaceNet比对faiss线性扫描或余弦相似度身份ID相似度分数几十人直接算余弦相似度即可对齐这段代码是后面所有环节的基础我一般会写成独立函数不要放进识别主流程里临时拼否则以后换模型你会到处改import cv2 import numpy as np # 参考点112x112 人脸识别最常用的对齐目标坐标 # 顺序依次是左眼中心、右眼中心、鼻尖、左嘴角、右嘴角 REF_POINTS np.array([ [38.2946, 51.6963], # 左眼中心 [73.5318, 51.5014], # 右眼中心 [56.0252, 71.7366], # 鼻尖 [41.5493, 92.3655], # 左嘴角 [70.7299, 92.2041] # 右嘴角 ], dtypenp.float32) def align_face(img, keypoints): # keypoints: 检测网络输出的5个关键点顺序与REF_POINTS一致 dst REF_POINTS.reshape(5, 2) src np.array(keypoints, dtypenp.float32).reshape(5, 2) trans, _ cv2.estimateAffinePartial2D(src, dst, methodcv2.LMEDS) aligned cv2.warpAffine(img, trans, (112, 112), flagscv2.INTER_LINEAR) return aligned逻辑说明参考点坐标对应的是公开人脸识别模型最常用的112×112对齐标准部分256×256版本参考点不一样换模型时要去模型发布页把参考点一起换掉。cv2.estimateAffinePartial2D求的是部分仿射变换矩阵只允许平移、旋转和缩放不会出现剪式扭曲对歪头、侧脸比较宽容。LMEDS是鲁棒估计方法防止某个关键点抖动把整张脸拉歪。对齐后统一用INTER_LINEAR插值速度和效果均衡不需要为了“更清晰”换成INTER_CUBIC那样只会变慢。参数说明里有三个坑要留意关键点顺序必须跟检测模型输出一致MTCNN输出的是[左眼右眼鼻子左嘴角右嘴角]RetinaFace某些版本会多一个轮廓点注意对齐前截取前5个如果检测网络返回的置信度很低对齐结果会飘最好在调用对齐前先按置信度丢弃图像通道顺序默认BGRwarpAffine不会改变通道后面特征网络如果要求RGB输入转换动作要放在对齐之后、预处理之前。2.3 相似度比对的数学意义与“阈值”为什么不能拍脑袋特征向量出来后比对环节通常用余弦相似度。两个向量夹角的余弦值越高说明方向越一致理论上就是同一张脸。余弦相似度取值范围是[-1, 1]人脸识别里正常分布在0.3到0.9同一个人的不同照片通常在0.55以上不同人通常在0.45以下。但这个区间因模型而异不要拿别人的经验值直接套用。这一步的陷阱在于很多人把阈值写死在代码里再不动。合理做法是从系统里收集一批真实考勤数据打上标签算出同一个人的相似度分布和不同人的相似度分布取两者的间隔中点做初始阈值更工程一点就跑一遍阈值在0.40、0.45、0.50、0.55下的误检率和漏检率。考勤场景宁可漏检不可误检因为漏检最多是让员工再刷一次脸误检就要人工改考勤表。默认从0.45到0.50起步底库超过100人再考虑用faiss做向量检索几十个人的底库真没必要引入向量数据库。3. 环境搭建、底库采集与运行前检查把demo跑起来之前先做三件事3.1 用onnxruntime在CPU上跑通的最小依赖很多人一拿到demo就想着GPU但考勤摄像头实时识别普通办公环境根本没有GPU。靠谱做法是优先保证CPU能跑onnxruntime推理引擎非常适合这件事它能把PyTorch训练好的模型在Windows和Linux上运行还对CPU指令集做了优化。我习惯的依赖组合是这样conda create -n face_att python3.9 -y conda activate face_att pip install opencv-python4.8.1.78 onnxruntime1.16.3 numpy1.24.3 scipy pandas openpyxl这里的版本我全部锁死。opencv和onnxruntime的API变动快新版opencv在人脸检测部分的细节行为时有变化onnxruntime的算子支持也逐版更新demo里自带的onnx模型可能是老版本导出的新版本未必兼容。如果你机器有NVIDIA显卡可以额外装onnxruntime-gpu但不要在demo阶段接先确认CPU路径跑通再考虑加速。提示Python不要用3.12部分预编译的依赖包找不到对应wheel3.9或3.10最省事。装完以后建议顺手降级numpy到1.24.3新版numpy的API有调整老模型转换代码容易报错。3.2 员工底库怎么建一人多张、角度覆盖与质量筛选考勤底库是整个系统的地基。我见过很多人直接从手机相册挑照片建底库这是大概率翻车的行为。手机照片通常在顺光下拍摄而现场摄像头往往装在头顶、逆光或者侧光位置光照分布差异太大识别率会直接崩掉。正规做法是用要部署的那台摄像头采集底库每个员工正脸、左右转头、微微低头各拍一张至少5张。再配合一个质量筛选脚本把模糊、过曝、人脸太小的帧自动过滤掉。脚本逻辑不复杂检测网络返回置信度、人脸框面积、像素亮度三路指标。三个参数比较关键min_face_area控制人脸最小像素面积blur_threshold用拉普拉斯方差判断模糊程度brightness_min控制最低亮度防止逆光生成一团黑import cv2 def quality_check(frame, face_box, face_score, min_face_area22500, blur_threshold60, brightness_min80): # face_box: [x, y, w, h]face_score: 检测框置信度 if face_score 0.95: return False, confidence too low x, y, w, h face_box if w * h min_face_area: return False, face too small roi frame[y:y h, x:x w] gray cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) blur cv2.Laplacian(gray, cv2.CV_64F).var() if blur blur_threshold: return False, image too blurry if gray.mean() brightness_min: return False, too dark return True, ok参数说明min_face_area等于22500像素对应150×150的人脸这是考勤场景比较合理的下限再小的人脸比如远处有同事走过即使是真人也没有打卡价值。blur_threshold取60是经验值室内摄像头拍的图拉普拉斯方差一般在100到150这里偏低一点是因为很多摄像头自动对焦会轻微柔焦阈值太严会误删可用照片。质量筛查的定位不是选“最美照片”而是别让一张模糊脸注册进底库否则当天就有人怎么都打不上卡。3.3 目录结构与模型文件运行前把文件摆清楚一个够用的demo目录大致长这样。这不是固定规范但建议保持这种风格后面换模型、加功能时能少折腾face_attendance/ ├── models/ # 检测模型onnx、特征模型onnx ├── face_db/ # 注册照片原图 ├── feature_db/ # 序列化特征文件 .npy 或 .pkl ├── utils/ │ ├── align.py # 人脸对齐 │ ├── detector.py # 人脸检测封装 │ └── embedder.py # 特征提取封装 ├── record.db # sqlite考勤记录 └── main.py # 主入口跑之前第一件事是自检模型加载onnx模型能不能正常加载输入输出的张量形状是不是预期值。很多demo翻车不是代码写得不行而是模型文件路径错误、模型加载后静默失败程序继续跑识别结果全是空。第二件事是确认摄像头编号。Windows下笔记本自带摄像头一般是0外接USB摄像头可能是1main.py里如果打开0号摄像头黑屏先换成1试试。4. 把识别demo改造成真正的考勤逻辑线程分离、打卡状态机与落库统计4.1 摄像头采集与识别线程分离卡顿和漏识别的根源demo最容易出的两个问题界面卡成PPT、识别结果延迟好几秒。原因一般是把读取摄像头帧、人脸检测、特征比对全放在一个循环里识别网络一推理整个UI就阻塞了。常见做法是生产者消费者模式采集线程只负责从摄像头不停捞帧识别线程从队列里取帧处理。import queue import threading frame_queue queue.Queue(maxsize2) def capture_worker(camera_id0): import cv2 cap cv2.VideoCapture(camera_id) while True: ok, frame cap.read() if ok and frame_queue.qsize() 2: # 队列满就丢帧保证消费端拿到的永远是最新帧 frame_queue.put(frame) def infer_worker(model): while True: frame frame_queue.get() faces model.detect(frame) if faces: emb model.embed(frame, faces[0]) result model.search(emb) update_ui(result) # 只写全局状态UI线程只读逻辑说明队列maxsize2很关键。队列设太大消费端还在处理旧帧画面会越来越卡maxsize2时生产端发现队列满了就丢帧识别线程拿到的永远是最新画面延迟反而低。识别线程里可以加每隔3帧处理一次的计数逻辑考勤不需要每帧都识别30帧摄像头3帧一处理员工从走到镜头前到完成打卡有1到2秒足够了。参数说明skip_count3适合一般办公场景。人走得快或者通道窄改成skip_count1CPU占用会翻倍。如果单帧识别已经超过200ms加大skip_count没有意义得先优化模型或者换更轻量的检测网络靠丢帧救不了性能问题。4.2 打卡状态机上班、下班、重复打卡与补卡逻辑识别出一个人不等于完成打卡这中间隔着一个状态机。考勤至少要处理三个基本状态上班打卡未完成、下班打卡未完成、重复打卡比如上午打完卡中午吃完饭又走回镜头前。日常demo我用一张简单的字典表就能处理不需要引入重量级框架class AttendanceState: def __init__(self): self.last_seen {} # emp_id - (last_time, status) def on_recognize(self, emp_id, timestamp, is_clockinTrue): # 10分钟内同一人重复识别只算一次避免来回走动重复打卡 last self.last_seen.get(emp_id) if last and (timestamp - last[0]).total_seconds() 600: return False, duplicated status in if is_clockin else out self.last_seen[emp_id] (timestamp, status) return True, status逻辑说明600秒窗口是防抖参数不是业务规则。员工在镜头前停留几秒识别线程可能连续识别到多帧没有这个窗口一次打卡会被记录好几条。is_clockin由当前时间决定上午时段识别到算上班下午时段识别到算下班中间时段识别到只更新last_seen不写入记录。参数说明重复窗口10分钟在普通办公室够用。三班倒车间场景半小时内可能有两批人交接窗口缩到60秒更合理。按上午下午区分上下班其实是简化逻辑更严谨的做法是拿当前时间和排班表比对排班表存sqlite后状态机里直接查库。4.3 考勤落库与统计别把记录写进Excel就跑路很多demo最后都是把打卡记录存成Excel文件演示阶段可以一排查问题就痛苦。我一般用sqlite零配置、Python自带支持、统计起来也方便CREATE TABLE IF NOT EXISTS attendance ( emp_id TEXT NOT NULL, emp_name TEXT NOT NULL, check_time DATETIME NOT NULL, check_type TEXT NOT NULL CHECK (check_type IN (in, out)), similar_score REAL, PRIMARY KEY (emp_id, check_time) ); CREATE INDEX idx_att_time ON attendance(check_time);逻辑说明主键用(emp_id, check_time)天然防止同一秒写入重复记录CHECK约束限制了check_type只能写入in或outsimilar_score字段建议保留排查“为什么张三被识别成李四”时非常有用——回放那条记录对应的相似度分数很快能判断是阈值问题还是底库问题。当日考勤统计用一条SQL就能算出来julianday换算工作时长在sqlite里很顺手SELECT emp_id, emp_name, MAX(CASE WHEN check_typein THEN check_time END) AS first_in, MAX(CASE WHEN check_typeout THEN check_time END) AS last_out, CAST(ROUND((julianday(MAX(CASE WHEN check_typeout THEN check_time END)) - julianday(MAX(CASE WHEN check_typein THEN check_time END))) * 24 * 60) AS INTEGER) AS work_minutes FROM attendance WHERE date(check_time) 2025-04-14 GROUP BY emp_id, emp_name;逻辑说明MAX(CASE WHEN ...)的写法在只有一条in一条out的时候等价于取值但员工一天打了多次卡能自动取最早和最晚的记录。work_minutes直接换算成分钟方便和排班比对迟到早退。字段结构初看简单统计“谁没打下班卡”“谁迟到超过10分钟”都很顺手。5. 人脸考勤demo避坑清单5个翻车现场与解决路径5.1 翻车一底库用手机照片现场怎么都认不出来现象用手机相册自拍注册底库现场摄像头识别率惨不忍睹同一个人站在镜头前经常返回“未知人员”。原因手机照片的光照条件、拍摄角度、镜头畸变与现场摄像头差异太大。识别模型对光照分布极其敏感手机顺光自拍和现场头顶逆光在模型眼里几乎不是同一张脸。解决切换成现场摄像头重新采集底库识别率会明显回升。注册时让员工在镜头前缓慢转头保留左右各30度以内的侧脸照片能显著提升现场场景下的鲁棒性。这个步骤看起来慢实际一个人半分钟就结束比以后每天有人打不上卡强得多。5.2 翻车二整帧画面直接送识别网络卡到怀疑人生现象1920×1080全高清画面人脸检测处理整帧CPU占用率拉满识别延迟好几秒画面肉眼可见地卡顿。原因检测网络在1080p上的计算量和640×480完全不是一个量级大多数人脸检测模型按VGA分辨率训练高清输入并不会提高检测精度。解决把输入帧先缩放到宽度640再检测。人脸检测不需要全高清640宽照样能准确定位推理速度能提升4到6倍。注意保留缩放比例检测出的框和关键点坐标要映射回原图否则后续裁剪人脸会偏def preprocess(frame, target_width640): h, w frame.shape[:2] scale target_width / w resized cv2.resize(frame, (target_width, int(h * scale))) return resized, scale参数说明返回两个值resized是送给检测网络的图scale用于坐标还原。检测结果里的x、y、w、h全部除以scale才能映射回原图坐标。很多人在这里忘记映射导致裁出的人脸区域是空白或者偏的。另外裁剪人脸后先外扩20到30像素再对齐比直接严格贴着检测框切效果要好因为检测框偶尔会切掉额头或下巴。5.3 翻车三戴眼镜、口罩后识别率断崖下跌现象员工戴上口罩后识别失败摘下口罩立刻成功部分戴眼镜的员工识别不了但摘下眼镜又能过。原因口罩盖住嘴部区域特征提取网络拿到的有效信息变少整体特征向量漂移眼镜反光会干扰关键点定位尤其是侧光环境下镜片反光。解决口罩场景建议单独建一个“口罩版本”底库让员工戴口罩时重新拍摄注册照片而不是拿不戴口罩的底库硬扛。眼镜场景则保留戴眼镜的照片入库。我见过最省事的做法是底库里每个员工存两组特征正常组和口罩组识别时先看口罩检测结果是哪种状态再选对应组比对。这样两组数据互不干扰。5.4 翻车四训练时挺好一部署识别率垮掉——预处理不一致现象模型在开源数据集上验证准确率90%部署到demo里识别率掉到50%。原因绝大多数是预处理不一致——训练时的归一化方式、像素通道顺序、resize插值、是否减均值部署pipeline完全对不上。人脸识别模型对这种事极为敏感差一个归一化参数特征空间全乱。解决把预处理函数单独抽成一个文件训练端和部署端共用同一份代码。最常见的一组参数是RGB顺序、归一化除以255、resize用双线性、输入尺寸112×112部分模型还要求按通道减均值def preprocess_for_embedder(face_img): # face_img: 对齐后的BGR图 rgb cv2.cvtColor(face_img, cv2.COLOR_BGR2RGB) rgb cv2.resize(rgb, (112, 112), interpolationcv2.INTER_LINEAR) rgb rgb.astype(np.float32) / 255.0 # 如果训练时用了mean/std在这里按模型要求补上 return np.transpose(rgb, (2, 0, 1))[None, ...]逻辑说明transpose把HWC转成CHW[None, ...]是在最前面增加batch维度这步漏掉onnxruntime直接报维度错误。如果识别的相似度分数整体偏低先回去核对预处理而不是急着调阈值绝大多数“部署后变傻”的问题出在归一化而不是模型本身。5.5 踩坑五拿识别结果当底库不停更新越更新越乱现象为了提高识别率有人把每日识别成功的照片持续更新到底库结果过几天发现张三谁都像误识率暴涨。原因人的日常装扮变化会被累积进特征向量每天迭代一次特征点逐渐漂移最后远离原始注册照和其他人挤在一起。解决底库更新要加严格校验。只有相似度高于0.70且当天首次识别成功时才允许增量更新更新用加权方式新特征占0.3原特征保留0.7而不是直接替换。这样既能适应换发型、胖瘦变化又不会让短期装扮变化把特征带偏。特征更新做好记录万一出错还能回滚到原始注册版本。6. 验证一个demo到底行不行正负样本对与混淆矩阵6.1 动手前先测用正负样本对给阈值把好关demo跑通后第一件事不是加功能而是验证识别靠不靠谱。我会把每个员工不同时段拍的照片分成两组一组建底库一组做测试。然后人工构造两类pair正样本对是同一个人两张照片负样本对是两个人各一张照片。跑完全部pair记录相似度分数画出两个分布曲线。这一步不超过半小时能避免后面反复调参数的返工。import numpy as np def compute_pairs(pairs, embedder, align_fn, detector): scores [] labels [] for img1, img2, is_same in pairs: e1 embedder.embed(align_fn(detector.detect_face(img1))) e2 embedder.embed(align_fn(detector.detect_face(img2))) e1 e1 / np.linalg.norm(e1) e2 e2 / np.linalg.norm(e2) scores.append(float(np.dot(e1, e2))) labels.append(is_same) return np.array(scores), np.array(labels)逻辑说明特征向量先做L2归一化再点乘结果就是余弦相似度这是比直接用cosine_dist更稳定的做法。跑完后把正负样本的分数画直方图两个峰的重叠越小模型在你这批数据上越可靠重叠越大说明底库本身或者注册阶段就有问题先修数据再谈阈值。考勤场景选阈值的原则很明确优先压低负样本的误检率。误检意味着把A识别成B考勤里这是要人工改数据的严重事故漏检最多是让员工再刷一次脸。负样本分布高分端的99分位点当作初始阈值一般不会错太远。6.2 再往前走一步检索、模型、业务三个方向验证通过后如果还想继续往产品方向走优先做三件事。第一底库超过500人时别再线性扫描引入faiss建索引检索耗时从毫秒级降到微秒级第二MobileFaceNet速度好但精度一般有GPU可以把特征网络换成IResNet带ArcFace head的组合识别准确率还能上一个台阶第三也是最重要的考勤不等于识别补卡审批、排班联动、迟到异常推送这些业务功能才是考勤系统真正值钱的部分。我做过最蠢的一件事是把识别准确率调到99%以后才发现忘了写迟到计算最后考勤表还是手改的。现在我的习惯是每天下班把当日识别失败的帧和similar_score低于0.4的记录翻一遍不看热闹专看错认。这套检查习惯比任何调参都管用——阈值调得再好底库里有脏数据一样白搭。希望今天的这些思路能帮到你至少让你在部署第一个demo时少走点弯路。本文还有配套的精品资源点击获取
RELATED

相关推荐

openrig开源六轴机械臂DIY全攻略:硬件选型、运动学与视觉引导

openrig开源六轴机械臂DIY全攻略:硬件选型、运动学与视觉引导

那段时间我几乎天天泡在工作台前调机,刷到 openrig 这个项目的时候,第一反应是“又来了一个开源机械臂”,毕竟这类项目在社区里一抓一大把。真正把文件下载下来、打完第一批结构件、写完第一版控制代码后,我才意识到它跟那些半成品…

📅 2026/10/31 10:18:01
数字签名与数字认证:哈希、证书链及openssl验签实践

数字签名与数字认证:哈希、证书链及openssl验签实践

数字签名和数字认证这两个概念,大部分人在课本上见过,真正在接口联调、配置 HTTPS、签发证书的时候才会发现它们差别有多大。之前帮一个团队排查接口验签失败的问题,两边打印出来的哈希值一模一样,最后定位到是拼接待签名串时把空…

📅 2026/10/31 10:18:01
Agent从单兵到摇人:多Agent系统安全边界重构与权限衰减实践

Agent从单兵到摇人:多Agent系统安全边界重构与权限衰减实践

1. 从“单兵作战”到“摇人干活”:Agent 能力跃迁背后的安全逻辑断层 过去两年,我接触过不少 Agent 项目,从最简单的“读文件、调接口、返回结果”的脚本型 Agent,到能自主规划任务、调用多个工具、甚至动态生成子任务的多层 Agen…

📅 2026/10/31 10:13:01
MORE NEWS

更多资讯

📰

AWS学习与实践系列(四):Amazon S3 入门与实践

系列文章目录 第一章:AWS账号注册 第二章:IAM权限操作介绍 第三章:Amazon EC2介绍与实践 第四章:Amazon S3介绍与实践(本文) 第五章:AWS Lambda介绍与实践 第六章:AWS Glue介绍与实…

📰

PotPlayer底部状态栏字体大小修改(PotPlayer皮肤修改)

问题:PotPlayer底部导航栏文字太小并且是灰色的不够清晰1.随便打开一个视频,右键播放窗口打开皮肤设置2.打开皮肤文件夹3.复制一份Default.dsf,然后将复制的文件名修改为MyDefault.zip,注意将后缀修改为zip4.将MyDefault.zip解压到…

📰

卓里奇《数学分析》有哪些特色

卓里奇《数学分析》的核心特色,是打破传统数分教材的边界,把严谨分析、现代数学视角和自然科学应用深度融合,是俄罗斯数学学派的标杆级作品。 🔗 打通多学科的现代数学视角 它跳出了传统数分只讲纯分析的局限,主动加强…

📰

学习笔记6:51单片机GPIO介绍

一、GPIO概念GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。51单片机芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。不过GPIO最简单的应用还属…

📰

麒麟V11如何使用SSH国密互信

背景 SSH互信太有用了,大多数的服务器双活机制都需要依赖操作系统的SSH互信。那么基于国密SSH该如何搭建互信呢?今天就以麒麟操作系统V11为例,用桌面版V11搭建一个到服务器版的国密SM2的无密码信任机制。 麒麟服务器V11配置过程 麒麟服务器…

📰

notepad-- 文本编辑器 macOS 安装教程:3 条路线,最快 5 分钟跑通

notepad-- 文本编辑器 macOS 安装教程:3 条路线,最快 5 分钟跑通 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/n…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬