车牌识别与管理系统实战:OpenCV+深度学习+Flask全链路解析
简介面向Python毕业设计的车牌识别与管理系统高分项目资源包基于OpenCV与深度学习实现覆盖车牌检测、字符分割、字符识别及后台管理功能适合毕业设计、期末大作业和课程设计参考。包体共2000个文件以1987张jpg车牌图像数据集为主配套4个xml标注文件、2个py核心脚本、2个sh部署脚本另有pptx答辩演示、docx工作总结报告、md说明和js辅助文件压缩包约33.47MB目录结构清晰便于按模块部署与学习。代码包含详细注释从图像预处理、边缘检测到字符分割和CNN识别均有完整实现并附有调试阶段的样本输出与7z压缩资源可帮助理解整个车牌识别流程。目前已有373人学习下载适合需要快速搭建同等功能系统并获取完整项目文档的开发者。1. 车牌识别与管理系统这个毕业设计核心难点其实是“连接”很多人拿到“Python基于OpenCV和深度学习的车牌识别与管理系统”这个题目第一反应是去调车牌识别模型。等到答辩前才发现光识别准确率够高根本不够——你还要把OpenCV处理的结果、深度学习分类器的输出、后台数据库的车辆记录串成一条流水线漏掉任何一环系统都跑不起来。我见过测试集上95%准确率的模型接进Flask后端后实际成功率掉到80%以下原因不在模型而在图片解码、路径处理和事务提交这些环节。这篇笔记就是帮你把链路打通车牌定位、字符分割和CNN识别怎么配合管理系统怎么接数据以及哪些坑最容易翻车。适合正在做毕业设计或课程设计、手里有代码但不知从哪改起的同学。这里没有玄学全是能照着复现的步骤。2. 从车牌定位到字符识别为什么先OpenCV后深度学习以及最小可跑模型车牌识别听起来是“深度学习”但实际落地顺序通常是先定位、再分割、最后分类。定位和分割我用OpenCV解决深度学习只负责最后一步字符识别。原因是毕业设计的数据量撑不起目标检测模型而车牌区域颜色和形状都很固定OpenCV能以极低成本把候选区域抠出来如果每张图都直接丢给CNN端到端识别训练时间翻几倍答辩时还说不清楚中间过程。下面按三步拆开。2.1 车牌定位用HSV颜色过滤还是YOLO先想清楚再选常见做法是先跑通HSV颜色过滤因为它代码短、效果好也容易讲清楚。蓝色车牌在HSV色彩空间里集中在H通道100到124附近S和V都有一定容忍度。我一般会先转HSV再用inRange生成掩膜然后用形态学闭运算把字符间隙和铆钉造成的断点连起来最后按轮廓宽高比筛掉非车牌区域。代码如下import cv2 import numpy as np def locate_plate_by_color(image): hsv cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # H通道100~124是蓝色区域S和V只要不太低都算 mask cv2.inRange(hsv, (100, 80, 80), (124, 255, 255)) # 闭运算是把车牌字符之间的空隙填平避免轮廓被切碎 kernel cv2.getStructuringElement(cv2.MORPH_RECT, (15, 5)) closed cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) contours, _ cv2.findContours( closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) candidates [] for cnt in contours: x, y, w, h cv2.boundingRect(cnt) # 标准车牌宽高比约3:1小幅放宽到2~5 if w 80 and h 20 and 2.0 w / h 5.0: candidates.append((x, y, w, h)) return candidates这段代码里kernel的宽度15是为了让左右相邻字符之间的空隙被横条填平高度5避免把上下边框和字符混在一起。面积阈值w80和h20是给720p输入准备的如果你的图是1080p要按比例放大。定位框后面还要送去做透视矫正和字符分割所以这里宁可多返回几个候选也不要漏掉真实车牌漏了后面什么都做不了。为什么不直接上YOLO不是YOLO不行而是这个章节里我们只需要一个“能解释、好调参”的定位器。YOLO在复杂背景下确实更稳但需要标注框、训练时间、显卡资源对毕业设计来说成本偏高。如果后面有时间可以把HSV定位得到的候选框存下来做数据增强再微调一个轻量检测模型而不是一上来就啃目标检测。2.2 字符分割和识别垂直投影做分割CNN只做单字符分类定位到车牌后要先把车牌区域转正。简单做法是拿2.1得到的轮廓做minAreaRect用透视变换把旋转的字符拉水平。这一步最容易被跳过但跳过后字符倾斜会让CNN识别率掉10到15个百分点。分割方面最稳的是垂直投影。所谓垂直投影就是把二值化后的字符区域按列统计白点数量字符之间有缝隙所以投影会呈现“峰-谷-峰”的形状。按谷分割就能切出单个字符。下面是我常用的一段分割代码def segment_char_boxes(plate_img): gray cv2.cvtColor(plate_img, cv2.COLOR_BGR2GRAY) # Otsu自动找阈值避免硬编码127 _, binary cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) # 计算每列有白点的数量 col_sum binary.sum(axis0) # 返回一维数组每列总和 chars [] in_char False start 0 for i, s in enumerate(col_sum): if s 0 and not in_char: start, in_char i, True elif s 0 and in_char: end i in_char False if end - start 6: # 太窄的列段当噪声 chars.append((start, end)) # 理想情况下应该是7段新式车牌或8段带后方汉字 if len(chars) 6 or len(chars) 9: return None return chars分割结果还会包含边框和铆钉误触发的短段所以后面要按宽度和间距做合并。常见做法是统计所有候选段的宽度把明显小于中位数的段丢弃再把相邻且间隔小于5像素的段合并成一个字符框。你可以把返回的(start,end)转成(x,y,w,h)再统一缩放成32x32输入CNN。CNN模型我一般用三层卷积参数少且训练快。类别数是省份汉字24个英文字母10个数字如果只做常见省份约65类。模型代码如下from tensorflow.keras import layers, models def build_char_classifier(num_classes65): model models.Sequential([ layers.Input(shape(32, 32, 1)), layers.Conv2D(32, (3, 3), activationrelu), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activationrelu), layers.MaxPooling2D((2, 2)), layers.Conv2D(128, (3, 3), activationrelu), layers.Flatten(), layers.Dropout(0.3), layers.Dense(128, activationrelu), layers.Dense(num_classes, activationsoftmax) ]) model.compile(optimizeradam, losssparse_categorical_crossentropy, metrics[accuracy]) return model这里sparse_categorical_crossentropy配合整数标签不用做one-hot。dropout设在全连接层前防止几十个类别里某个省份汉字样本少导致过拟合。如果你想节省显存可以把卷积核从64、128减半效果损失不大。2.3 训练数据准备先合成再增强最后手动清洗毕设最怕数据不够。常见做法是先用开源车型车牌数据集或者自己渲染的合成车牌把分类器跑通再拿真实图片微调。合成数据可以用背景图片加模板文字生成不需要严格的对抗网络。我一般会给每个字符准备至少200张样本合成数据5万到10万张真实数据2000到5000张就足够在这个尺度下训练。增强时注意不要做上下翻转因为车牌字符颠倒意义完全变了。旋转角度控制在正负5度水平平移5%亮度范围0.8到1.2灰度图输入下不需要做颜色扰动。增强代码可以直接用Keras的ImageDataGeneratorfrom tensorflow.keras.preprocessing.image import ImageDataGenerator datagen ImageDataGenerator( rotation_range5, width_shift_range0.05, brightness_range(0.8, 1.2), zoom_range0.05, rescale1.0 / 255, )如果你发现分类器把“0”和“O”混得很厉害先别急着加数据优先检查这两类字符在训练集里的数量是否均衡。车牌上字母I和数字1也经常混这类易混对是正常的最终识别后用一次“易混规则表”做校正即可。3. 管理系统代码怎么组织Flask SQLite 的车辆表、进出记录表和识别接口识别模型跑通只是第一步毕业设计题目里“管理系统”四个字才是拿分的重点。常见做法是不用重型框架Flask加SQLite足够撑起一个停车场进出管理的演示系统。这套组合的好处是没有外部数据库依赖答辩现场不会因为MySQL没装而翻车代码结构简单评委问起来每张表都能说清用途。3.1 目录结构和最小Flask后端上传一张图返回车牌文本我建议把代码拆成三个文件app.py管路由recognizer.py管OpenCV和模型db.py管数据库。这样识别逻辑和后端逻辑互不干扰在答辩讲功能时可以一条线讲完。app.py的最小骨架如下from flask import Flask, request, jsonify import sqlite3 from recognizer import recognize_plate app Flask(__name__) DB_FILE parking.db def get_db(): # check_same_threadFalse 允许请求线程共用连接 conn sqlite3.connect(DB_FILE, check_same_threadFalse) conn.row_factory sqlite3.Row return conn app.route(/api/recognize, methods[POST]) def recognize(): if image not in request.files: return jsonify({success: False, message: no image}), 400 img_bytes request.files[image].read() plate_text recognize_plate(img_bytes) if not plate_text: return jsonify({success: False, message: plate not found}), 422 db get_db() db.execute( INSERT OR IGNORE INTO vehicle(plate, vehicle_type) VALUES (?, ?), (plate_text, normal) ) db.commit() return jsonify({success: True, plate: plate_text})这段代码把“识别”和“建档”合在一起了逻辑很直白。注意sqlite3.connect里的check_same_threadFalse是因为Flask默认是多线程处理请求如果不开这个参数第二个请求进来时访问同一个连接会抛异常。更保险的做法是每个请求单独开连接但演示项目里一个线程安全连接够用。为什么用INSERT OR IGNORE因为vehicle表里plate设为UNIQUE如果车牌已经存在就跳过插入。你还可以在返回值里带上is_new字段让前端知道这是首次进场还是老客户方便后续收费策略。3.2 数据库表设计车辆档案、进出记录、收费规则尽量拆开很多人的管理系统把车牌号和进出时间都塞进一张表开始写起来简单到后面统计日收费时发现SQL语句又臭又长。我一般把数据拆成三张表vehicle存固定档案entry_log存每一次的进出事件fee_rule存收费参数。建表SQL如下CREATE TABLE IF NOT EXISTS vehicle ( id INTEGER PRIMARY KEY AUTOINCREMENT, plate TEXT UNIQUE NOT NULL, owner_name TEXT DEFAULT , vehicle_type TEXT DEFAULT normal, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS entry_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, plate TEXT NOT NULL, entry_time DATETIME DEFAULT CURRENT_TIMESTAMP, exit_time DATETIME, fee REAL DEFAULT 0 ); CREATE TABLE IF NOT EXISTS fee_rule ( id INTEGER PRIMARY KEY CHECK (id 1), -- 保证只有一行配置 free_minutes INTEGER DEFAULT 30, hourly_rate REAL DEFAULT 5.0, daily_cap REAL DEFAULT 30.0 );plate在vehicle里设UNIQUE确保同一辆车只有一条档案。entry_log不设UNIQUE因为它记录的是多次进出事件每次入场插入一条出场时按plate和exit_time IS NULL更新当前记录。fee_rule用CHECK(id1)限制只能有一行方便在配置文件里调收费标准。这个设计的价值在统计报表时能体现出来按天汇总营收只需要对entry_log里exit_time不空的记录按fee求和要查某个车主所有停车场记录用一条JOIN就能从vehicle关联到entry_log。如果在答辩时能讲清楚为什么拆三张表评委一般不会在这个环节再刁难你。3.3 出入场逻辑和收费计算别让识别结果空转识别接口拿到车牌后下一步要根据“当前有没有未出场记录”判断是入场还是出场。常见的做法是入场时插入一条exit_time为空的entry_log出场时先查同一块车牌的最早一条未出场记录计算时长和费用再更新exit_time并写入fee。收费计算的代码片段def calc_fee(minutes, rule): if minutes rule[free_minutes]: return 0.0 hours math.ceil((minutes - rule[free_minutes]) / 60) fee min(hours * rule[hourly_rate], rule[daily_cap]) return round(fee, 2)这一小段逻辑里有两个坑。第一分钟数要向上取整超过免费时长1分钟也算一小时否则运营方会觉得亏。第二要设置每日封顶不然停车48小时的费用会高到不合理。把这样的计算逻辑单独放到函数里代码还能直接用pytest写三个用例测边界答辩时再加分。进出场状态变化都会修改entry_log同一行为避免两个线程同时更新同一条记录我一般会在更新语句里加条件“exit_time IS NULL”db.execute( UPDATE entry_log SET exit_time ?, fee ? WHERE plate ? AND exit_time IS NULL ORDER BY entry_time DESC LIMIT 1, (now_str, fee, plate_text) )ORDER BY DESC取最新一次未出场记录能处理同一辆车短时间内重复进出的情况。这里你不用一开始就设计得太复杂先把“入场插入、出场更新”跑通后面再补异常情况。4. 用本地摄像头和图片跑通端到端三种输入切换与四个必调参数前面的代码拆着看都成立但组装时常发现单张图片能识别摄像头一开就卡或者视频里隔几帧就丢车牌。这一章把输入切换和调参的实操讲清楚。4.1 图片、视频、摄像头三种输入的统一封装最简单的方式是定义一个统一函数输入路径或者摄像头编号输出一帧BGR图片。遇到视频和摄像头时逐帧读取识别完一帧丢一帧。代码如下def frame_generator(source): if isinstance(source, str): if source.lower().endswith((.jpg, .png, .jpeg)): img cv2.imread(source) if img is not None: yield img return cap cv2.VideoCapture(source) else: cap cv2.VideoCapture(source) # source为摄像头索引 while True: ok, frame cap.read() if not ok: break yield frame cap.release()注意图片路径用endswith判断视频文件则交给VideoCapture自动解码。摄像头传0就会打开第一个USB摄像头。使用这个生成器后主循环只需要调用一次识别函数即可不会因为分支太多把手写乱。视频流里每一帧都做完整定位、分割、识别速度会很慢。常见做法是只处理关键帧比如每3帧处理一次剩下的帧直接调用上次识别结果。对毕业设计来说这个策略能让实时画面保持流畅同时不影响演示效果。4.2 四个必调参数HSV范围、轮廓面积、宽高比和置信度阈值先列一张表这些是我每次调系统都要看的第一梯队参数。参数默认值720p输入影响调整方向H通道下限/上限100 / 124蓝色车牌的像素范围明显偏青就提高下限偏紫就降低上限轮廓最小宽/高80 / 20过滤太小的候选区域摄像头距离远就调小距离近就调大车牌宽高比2.0 ~ 5.0过滤门框、墙壁等矩形干扰标准牌约3:1夜间或畸变大时可放宽置信度阈值0.5控制字符级误识别宁缺毋滥就调到0.7追求召回就调到0.3置信度阈值大部分人在写代码时根本没用。字符识别器对一个字符输出的是65个类别的概率分布如果你只取argmax而不看概率值一个模糊的“冀”也会被硬认成“京”。我一般会把每个字符的最大概率乘起来得到一个“整牌可信度”小于阈值就放弃本次识别结果。这样能明显减少显示器上的乱码。在代码里体现为def plate_confidence(char_probs): confidence 1.0 for prob in char_probs: confidence * max(prob) return confidence ** (1.0 / len(char_probs))这里用几何平均而不是直接连乘是为了避免字符数越多分值越小导致不同长度车牌分数不可比。几何平均小于0.5时大概率已经出现错字可以直接判定为未识别。4.3 让成功率从70%提到90%的常规手段透视矫正和自适应二值化很多人在HSV定位后直接拿原始彩色车牌去分割效果很不稳定。原因有两个一是原始图像有复杂背景字符和背景的边界不清晰二是车牌略微倾斜时垂直投影被斜线污染。我自己会先做透视矫正再做灰度化加CLAHE对比度增强最后二值化。矫正代码def rectify_plate(plate_img): gray cv2.cvtColor(plate_img, cv2.COLOR_BGR2GRAY) edges cv2.Canny(gray, 100, 200) # 用车牌轮廓最小外接矩形来估计倾斜角 contours, _ cv2.findContours( edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if not contours: return plate_img rect cv2.minAreaRect(max(contours, keycv2.contourArea)) angle rect[2] # 只矫正小角度旋转超过15度通常是误检 if angle -15 or angle 15: return plate_img matrix cv2.getRotationMatrix2D( rect[0], angle 90 if angle -45 else angle, 1.0) return cv2.warpAffine(plate_img, matrix, (plate_img.shape[1], plate_img.shape[0]))这段代码的核心是minAreaRect返回的旋转角度。width小于height时角度值是直角加当前角度所以有“angle 90”这步。我建议把矫正后的车牌先打印成图片看看角度方向做反了是常见现象。二值化时不要固定阈值127。车门线、路面阴影会导致全局阈值失效。改用CLAHE加Otsu结合能处理大部分光照不均的停车场门口先对灰度图做直方图均衡化再用Otsu自适应阈值。夜间场景下还可以对V通道做一次Gamma校正把暗部提亮后再走识别流程。5. 车牌识别与管理系统避坑清单五个最容易翻车的地方5.1 现象OpenCV读不出中文路径下的图片程序直接报错车牌识别测试集经常是老师发来的“示例图.jpg”文件名带中文cv2.imread返回None整个管线静默失败。原因是OpenCV的imread底层调用的是C标准文件流它不认Windows下默认的gbk编码文件名。解决方式不是改文件名而是用numpy转码读入def imread_unicode(path): data np.fromfile(path, dtypenp.uint8) return cv2.imdecode(data, cv2.IMREAD_COLOR)我在写识别前会先封装imread_unicode把这个作为唯一入口。后续处理不再直接调用cv2.imread避免文件名问题反复出现。5.2 现象HSV定位只抓蓝色车牌新能源绿牌全部漏检如果只写了蓝色车牌遇到沪AD12345这种绿牌时整个系统当看不见。原因是inRange阈值被写死成蓝色。解决方法是把颜色过滤做成双通道分别对蓝、绿两种颜色生成掩膜取并集。绿色车牌H通道大致在35到77之间不同环境光源会有偏移。mask_blue cv2.inRange(hsv, (100, 80, 80), (124, 255, 255)) mask_green cv2.inRange(hsv, (35, 80, 80), (77, 255, 255)) mask cv2.bitwise_or(mask_blue, mask_green)这样最简单的改进能把绿牌漏检率降到接近0。顺带提醒识别出的车牌首字符可能因为颜色不同而略微影响分割所以分割前统一用CLAHE而不是依赖车牌底色。5.3 现象字符分割把“京A·12345”中间的间隔号切出来当字符有的省份车牌在字母和数字之间有一个圆点间隔符垂直投影时它会形成一条窄峰。如果不处理分割结果会变成8段干扰后续识别。原因是对“至少6像素宽”的过滤条件放得太松。解决方式是在分割后增加一步字符宽高比校验丢掉宽度明显小于中位数的候选段widths [end - start for start, end in chars] median_w np.median(widths) chars [(s, e) for s, e in chars if (e - s) median_w * 0.5]这是分割后的“后悔药”式过滤虽然不能挽回已经分割错的内容但能挡住大量明显噪声。我习惯把这步放在len检查之前这样过滤完再判断字数是否符合车牌结构。5.4 现象Flask开启debug模式后访问SQLite频繁报database is locked这个问题在学生项目里出现率极高。原因是启用Flask debug模式后werkzeug会启动一个reloader并额外开一个进程多个进程同时写同一个SQLite文件很快会触发锁冲突。解决方式上线演示时关闭debug给连接加上超时和线程安全参数。conn sqlite3.connect(DB_FILE, timeout10, check_same_threadFalse)另外写库操作尽量合并到事务里不要每次都单独commit如果一次请求里要更新entry_log和vehicle两张表用with conn包裹一个事务能减少锁竞争。5.5 现象识别结果出现“0”和“O”混写字母I与数字1分不清O和0在32x32灰度图下本来就高度相似CNN也容易混淆。原因不是模型不好而是训练数据里两者外观差异太小。解决方法是不要在识别后直接返回加一个易混字符映射表根据上下文修正车牌第二位通常是发牌机关字母当模型输出为数字且置信度不高时转成对应字母。CONFUSE_MAP {0: O, 1: I, 8: B} def correct_mixed_char(text): parts list(text) # 第二位通常为字母易混数字转字母 if len(parts) 2 and parts[1] in CONFUSE_MAP: parts[1] CONFUSE_MAP[parts[1]] return .join(parts)这是后处理修正不改变模型本身。如果“0”和“O”还是反复混再回到训练数据里看这两类样本的字体差异是否足够大。6. 验证模型好坏的三种方法混淆矩阵、灰度直方图和一键验收脚本6.1 用混淆矩阵找易混字符识别模型调得好的标志不是总准确率而是混淆集中。把测试集跑一遍计算每个字符的精确率和召回率输出混淆矩阵。最容易混错的几对如果集中在你预期的地方0/O、1/I、8/B说明模型处于合理状态如果“京”和“沪”这种完全不同形状的字符乱混说明数据或预处理有问题。6.2 用灰度直方图确认预处理是否生效在调参前先画出处理后二值化图片的直方图。如果直方图集中在一个很窄的灰度区间说明对比度不足后面的Otsu阈值会被噪声带偏。直方图有两个峰值时Otsu才会选出正确阈值。这条在夜间尤其重要。6.3 一键验收脚本遍历测试集输出平均耗时和准确率最后写一个脚本读取test_images目录按蓝牌、绿牌、夜间、倾斜四个子目录统计。还要输出平均耗时因为毕业设计演示中摄像头不能每帧卡几秒。脚本大概如此。import time, os from recognizer import recognize_plate cases {} for sub in [blue, green, night, tilt]: ok 0 total 0 costs [] for f in os.listdir(os.path.join(test_images, sub)): total 1 t0 time.time() text recognize_plate(os.path.join(test_images, sub, f)) costs.append(time.time() - t0) # 只比对去掉横线后的内容 if text.replace(-, ) f.split(_)[0]: ok 1 cases[sub] {accuracy: ok / total, avg_ms: (sum(costs) / total) * 1000}代码中有一个细节测试文件名要按“车牌号.jpg”命名直接拿文件名前的部分和识别结果比对这样脚本不用维护对照表。当然这只适用于标注规范的数据集真实情况还要做人工抽样确认。这套验收流程是我每改一版代码都会跑一遍的固定动作。一次评测里总准确率提升了但夜间准确率反而下降这种时候我不会急着合代码而是先回滚预处理。我的习惯是所有修改都只调一个变量跑完四个分类的准确率再动手下一个。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

BP模糊神经网络Python实现:结构解析、复现步骤与避坑指南

BP模糊神经网络Python实现:结构解析、复现步骤与避坑指南

简介:BP模糊神经网络Python实现代码包,面向机器学习与深度学习初学者与研究者,解决将模糊推理与BP神经网络结合进行建模预测的算法落地问题。压缩包内共7个文件,包括4个CSV数据文件(分别存放训练集与测试集的输入和输出…

2026/10/11 22:00:45 阅读更多 →
如何快速上手 AI File Sorter:Windows/macOS/Linux 三平台安装完整教程

如何快速上手 AI File Sorter:Windows/macOS/Linux 三平台安装完整教程

AI 应用大模型本地部署桌面应用 【免费下载链接】ai-file-sorter Cross-platform desktop application for content-aware file organization and renaming. Supports local and remote LLMs, preview-based workflows, and fully user-controlled changes. 项目地址&#xff1…

2026/10/11 21:59:45 阅读更多 →
CASS_3D基础版V2.0.3:轻量化地形建模与断面出图工作流

CASS_3D基础版V2.0.3:轻量化地形建模与断面出图工作流

简介:CASS_3D基础版V2.0.3是广东南方数码自主研发的AutoCAD挂接式三维测图插件,专为测绘地理信息行业从业者及CASS平台用户设计,解决传统二维采编向三维DSM数据加载、智能识别与矢量化成图升级的核心需求。资源为完整安装包(ZIP格…

2026/10/11 21:59:45 阅读更多 →

最新新闻

MySQL子查询完全指南:分类、执行流程、性能优化与常见坑

MySQL子查询完全指南:分类、执行流程、性能优化与常见坑

子查询在MySQL里被很多人当成"会用但说不清"的技术点。SQL子查询用得好,能把复杂统计拆成清晰的嵌套逻辑;用不好,一条慢查询直接拖垮业务接口。这篇文章我把子查询从分类、执行流程到性能优化、报错排查完整过一遍,所有…

2026/10/11 22:51:36 阅读更多 →
手把手搭建中文RAG系统:从文档切片到本地大模型问答

手把手搭建中文RAG系统:从文档切片到本地大模型问答

1. 项目概述:这不是调用API,而是亲手搭一条“知识输送管道”你有没有试过这样一种场景:手头有一堆PDF、Word、Excel和内部Wiki文档,想让大模型准确回答“上季度华东区客户投诉TOP3原因是什么”,结果它要么胡编乱造&…

2026/10/11 22:51:36 阅读更多 →
LangGraph+MCP智能体工程方法论:可审计、可扩展、可运维的落地实践

LangGraph+MCP智能体工程方法论:可审计、可扩展、可运维的落地实践

1. 这不是又一个“AI Agent教程”,而是一套可落地的智能体工程方法论LangChain、LangGraph、MCP——这三个词最近在技术社区里出现的频率,已经快赶上“微服务”当年刚火起来时的状态了。但和当年不同的是,这次没有统一的架构图、没有成熟的部…

2026/10/11 22:51:36 阅读更多 →
LangChain+LangGraph+MCP智能体工程化实战方法论

LangChain+LangGraph+MCP智能体工程化实战方法论

1. 项目概述:这不是又一个“LangChain 教程”,而是一套可落地的智能体工程方法论你点开这个标题,大概率不是想学“怎么调用一个 LLM API”,而是被卡在了某个真实场景里:比如写了个自动处理客户工单的脚本,跑…

2026/10/11 22:51:36 阅读更多 →
YOLOv8手势识别实战:从训练到RK3588部署全链路

YOLOv8手势识别实战:从训练到RK3588部署全链路

简介:本资源是一个基于YOLOv8实现的手势识别完整应用项目,面向深度学习初学者与计算机视觉实践者,解决非接触式人机交互场景下的实时手势检测与识别问题,适用于智能交互、虚拟现实、辅助驾驶等方向的快速原型开发。压缩包共18个文…

2026/10/11 22:51:36 阅读更多 →
新浪Level2接口SDK接入实战:授权、协议解析与避坑指南

新浪Level2接口SDK接入实战:授权、协议解析与避坑指南

简介:新浪Level2接口SDK是一份面向量化开发与行情分析人员的Java工程,用于对接新浪Level2全推行情,获取股票、基金等品种的深度交易数据。相比普通免费接口,Level2数据在速度与深度上更适合机构级策略,适合有一定Java基…

2026/10/11 22:50:35 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →