
把系统装好、常用软件装完再顺手把“龙虾”装上——圈里朋友喜欢把Lock锁定开玩笑叫成龙虾意思就是开机密码、锁屏、磁盘加密这些基础锁都得先到位。基础锁不装后面加再多AI都是给自己看个心安。真正值得花半小时折腾的是给电脑加一道AI防盗门。这里先解释清楚我所说的AI防盗门不是某款杀毒软件也不是防火墙而是一套由本地AI驱动的小型门禁方案。它做三件事用摄像头人脸识别判断坐在电脑前的人是不是你用轻量Agent盯着进程和网络连接有没有异常行为发现不对劲时自动锁屏、拍照留证、把告警推到手机上。适合谁如果你手头有一台普通电脑、一个USB摄像头又对AI应用开发或者本地部署大模型感兴趣这个项目够你玩上一天而且做完是真能天天用的那种。1. 先搞清楚“AI防盗门”到底防什么1.1 传统锁只负责“挡人”AI负责“认人”密码、PIN码、指纹、Windows Hello……这些都属于“你手里有没有钥匙”的问题。钥匙能挡住一部分人但挡不住三种场景偷走电脑直接拆硬盘趁你人不在但电脑没锁屏时偷摸操作中了木马后攻击者在你已解锁的会话里执行命令。传统安全方案最大的盲区就在这里——它只在开机的瞬间验证一次身份验证通过后就不再管了。这就像小区的门禁卡你刷进去了后面跟着谁、去哪儿、干什么没人管。AI防盗门的核心价值是把判断从“能否解锁”升级为“解锁后是否继续盯着你”把“一次认证”变成“持续认证”。我实际做出来的效果是人一离开陌生脸凑上来系统会在1秒左右自动锁屏同时拍一张现场照片存下来。电脑被人偷偷抱起带走的时候它能留下证据链有人趁你冲咖啡时想动你桌面文件它也能直接把屏幕锁住。这道门真正防的不是“打不开”而是“打开之后是不是你在操作”。1.2 这道门拆开看其实有三道小门第一道人证核验摄像头持续采集人脸与本地注册特征比对连续多帧不认识就锁屏。这是最直观的一道门相当于把“门禁卡”换成了“刷脸”而且是无感式的你坐在电脑前不用做任何额外动作。第二道行为监控后台一个小Agent持续扫描进程列表、监听文件目录写操作、检查网络外联。它不弹窗、不打断你只在后台默默记录。这里的思路是就算真有人能绕过人脸识别比如直接用你的照片他的操作行为也会暴露——突然批量跑脚本、疯狂改文档、连接陌生地址这些都不是正常人会用电脑的方式。第三道联动处置发现可疑事件时系统先把事件上下文拼成一段文本交给本地小模型做语义判断只有当模型给出可疑或恶意结论时才触发锁屏、拍照、推送告警的完整动作链。整个数据流是单向的摄像头和系统事件 → 轻量规则 → 本地小模型/大模型 → 动作。这样设计的好处是轻量规则负责24小时站岗大模型只在真出事时被叫醒资源占用能被压到极低。2. 方案选型千万别上来就堆大模型2.1 人脸识别我为什么选了face_recognition人脸识别这块我试过四种方案先说结论再讲原因。方案精度速度离线可用上手难度适用场景OpenCV Haar级联低快是低只能定位人脸做不了身份识别face_recognition中高中是低个人门禁首选API太友好了MediaPipe Face Mesh中快是中适合做活体检测、表情识别多模态大模型高慢部分高成本高不适合实时门禁OpenCV自带的Haar级联分类器只能告诉你“画面里有没有人脸”至多再画个框识别不了“你是谁”对门禁来说等于半成品。MediaPipe能输出468个关键点速度很快但做身份比对的时候还得再叠一层特征计算工作量上去了收益却不明显。face_recognition库封装了dlib的ResNet模型输入人脸框直接输出128维特征向量API简单到离谱离线可用精度对于个人门禁完全够。多模态大模型方案我试过一版把画面帧喂给视觉模型让它判断“画面里的人是否是主人”准确率确实不错但延迟23秒风扇直接起飞实时门禁场景根本顶不住。最终选了face_recognition。测试环境是一台普通的i5-1240P笔记本加30元的USB摄像头在640x480分辨率下用hog检测模型能稳定跑到1520FPSCPU占用不到10%。如果用cnn模型精度会更高但速度掉到23FPS个人场景完全没必要。人脸识别默认的0.6阈值对门禁来说偏松我后面会单独讲怎么调。2.2 行为判断让轻量规则站岗让大模型当裁判很多人一听AI行为监控第一反应就是“本地拉一个70B大模型跑异常检测”这真的没必要。一开机就跑大模型风扇先起飞而且日常日志大概率喂出一堆误报——你更新个软件、跑个定时任务都会被当成异常。我的做法是三层结构。第一层规则引擎用psutil每分钟扫一遍进程列表和白名单比对用watchdog监听文档目录的写入事件用psutil.net_connections检查有没有异常外联。这一层的目标很明确不是判断“是不是恶意”而是筛选出“值得让AI看一眼”的事件。第二层可疑事件聚合。把命中的规则拼成一句话比如“python.exe在凌晨2点修改了30个docx文件并主动连接了8.8.8.8:443”然后送到本地模型判断。单看“python.exe在运行”没问题单看“修改docx”也没问题但组合在一起就很可疑——这正是规则引擎和大模型各干各的活、各吃各的饭。第三层本地小模型做语义判断。我本机用Ollama部署了qwen2.5:7b写了个prompt让它做normal/suspicious/malicious三分类。因为只是偶尔被调用所以风扇根本不会转。这里为什么7B够用因为多步攻击行为下载、执行、批量改文件、外联在日志里是有明显语义的7B模型完全可以理解“进程一curl下载进程二执行进程三批量重命名”这种序列是否可疑不需要70B。如果要追求极致轻量qwen2.5:3b也能干只是对长上下文的把握差一些。2.3 本地部署是硬前提隐私和延迟都是理由人脸特征属于生物特征这种数据一旦上传第三方等于把家门钥匙交给别人。所以我在这套方案里坚持所有环节全部本地部署人脸特征文件、日志分析、模型推理全部留在自己电脑里。本地部署还有一个容易被忽略的好处断网也能用。家里Wi-Fi断了、路由器被拔了防盗门依然有效因为整个判断链路根本不依赖外网。再一个就是成本。调用第三方大模型API按token收费实时摄像头识别每小时产生的费用会让你肉疼本地部署拉一个qwen2.5:7b跑一次推理几秒钟电费可以忽略不计。Ollama安装也很简单Windows直接下载安装包Linux执行一条官方安装脚本然后ollama pull qwen2.5:7b就完事。显存不够就选3b纯CPU推理也能接受因为只在可疑事件触发时才调用不是常驻。3. 实操给电脑装上一道AI人脸锁3.1 装依赖避开编译地狱先说系统环境我用的是Ubuntu 22.04Windows 10/11也能跑就是依赖安装方式略有差别。Ubuntu先更新基础包sudo apt update sudo apt install -y python3-pip cmake build-essential pip installface_recognition opencv-python numpy psutil watchdog requests这里最大的坑在face_recognition的底层依赖dlib。dlib需要编译C代码Windows上尤其痛苦我当年为了在Windows装dlib折腾了一整个晚上最后发现最稳的方案是用condaconda install -c conda-forge dlib pip install face_recognition opencv-python一定要记住Windows用户别用pip硬编译dlib直接conda装省下好几个小时的痛苦。Ubuntu用户如果编译报错也先检查cmake和build-essential装没装。Ollama那边更简单# Windows直接下载安装包Linux用官方脚本 curl -fsSL https://ollama.com/install.sh | sh ollama pull qwen2.5:7b摄像头建议用普通USB摄像头720P以上就行30块钱的也能跑别为了这个单独买昂贵的设备。3.2 跑一个最小可用的门禁脚本下面给出一份可直接运行的代码。功能拆开讲首次运行按r注册人脸特征会存到本地json文件之后每次启动自动加载特征识别到已注册人脸不做动作连续5帧检测到陌生脸自动锁屏并拍照留证按q退出。import cv2 import face_recognition import numpy as np import json import os import time from datetime import datetime KNOWN_FILE known_faces.json CAMERA_INDEX 0 FRAME_W, FRAME_H 640, 480 SAMPLE_EVERY_N_FRAMES 2 TOLERANCE 0.5 LOCK_AFTER_CONSECUTIVE_UNKNOWN 5 ALBUM_DIR captured os.makedirs(ALBUM_DIR, exist_okTrue) def load_known(): if os.path.exists(KNOWN_FILE): with open(KNOWN_FILE, r) as f: return json.load(f) return [] def save_known(data): with open(KNOWN_FILE, w) as f: json.dump(data, f, ensure_asciiFalse, indent2) def register_face(name, frame): rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) boxes face_recognition.face_locations(rgb, modelhog) encodings face_recognition.face_encodings(rgb, boxes) if not encodings: return False, 没有检测到人脸 data load_known() data.append({name: name, encoding: encodings[0].tolist()}) save_known(data) return True, f已注册 {name} def take_picture(frame, tagunknown): filename os.path.join( ALBUM_DIR, f{tag}_{datetime.now().strftime(%Y%m%d_%H%M%S)}.jpg ) cv2.imwrite(filename, frame) return filename def lock_screen(): # Windows 用下面这行 os.system(rundll32.exe user32.dll,LockWorkStation) # Linux 用下面这行自行注释切换 # os.system(loginctl lock-session) def main(): cap cv2.VideoCapture(CAMERA_INDEX) cap.set(cv2.CAP_PROP_FRAME_WIDTH, FRAME_W) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, FRAME_H) known load_known() consecutive_unknown 0 frame_count 0 print(已知人脸:, [k[name] for k in known]) print(按 r 注册新脸按 q 退出) while True: ret, frame cap.read() if not ret: time.sleep(0.1) continue frame_count 1 if frame_count % SAMPLE_EVERY_N_FRAMES ! 0: continue rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) boxes face_recognition.face_locations(rgb, modelhog) encodings face_recognition.face_encodings(rgb, boxes) if not encodings: continue for box, enc in zip(boxes, encodings): name unknown if known: names [k[name] for k in known] encs [np.array(k[encoding]) for k in known] distances face_recognition.face_distance(encs, enc) if distances[np.argmin(distances)] TOLERANCE: name names[int(np.argmin(distances))] if name unknown: consecutive_unknown 1 if consecutive_unknown LOCK_AFTER_CONSECUTIVE_UNKNOWN: take_picture(frame, intruder) lock_screen() consecutive_unknown 0 else: consecutive_unknown 0 top, right, bottom, left box cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2) cv2.putText(frame, name, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) cv2.imshow(AI Door, frame) key cv2.waitKey(1) 0xFF if key ord(r): name input(输入姓名: ) ok, msg register_face(name, frame) print(msg) known load_known() if key ord(q): break cap.release() cv2.destroyAllWindows() if __name__ __main__: main()几个参数值得单独说明。SAMPLE_EVERY_N_FRAMES2意思是每两帧做一次人脸识别如果机器卡就改成3或4代价只是检测反应慢一点。LOCK_AFTER_CONSECUTIVE_UNKNOWN5连续5帧判定为陌生人才锁屏防止画面里突然闪过一个路人就立刻锁死。但这也意味着陌生人需要在你屏幕前停留1秒左右才会触发这是有意为之宁可慢一点也不要误锁。TOLERANCE0.5是判定阈值下面单独讲。3.3 把误判率压下来的关键参数误判率是这种门禁系统能不能长期用的核心。我自己的经验分三点。第一注册策略。不要只注册一次分三个时间段各注册一组特征白天自然光、傍晚室内光、晚上台灯光每轮采样23次。戴眼镜的话戴和不