新闻详情

新闻详情

首页 / 资讯中心 / 详情

中文车牌识别系统:检测+识别双阶段重构实战指南

发布时间:2026/10/1 14:29:29来源:尧图网络
中文车牌识别系统:检测+识别双阶段重构实战指南
简介这是一套基于Python实现的中文多类型车牌检测与识别系统源码面向计算机视觉初学者、智能交通项目开发者及深度学习实践者解决复杂场景下蓝牌、黄牌、双层黄牌、农用车牌、警车、校车、教练车、港澳车牌、使领馆车牌及新能源绿牌等10余类车牌的端到端识别问题适用于交通监控、停车场管理、执法辅助等实际应用。资源包共159个文件含42个核心Python脚本含模型训练、推理、预处理模块、36张实测车牌图像JPG格式、19个配置文件YAML、8个PNG图标资源、6个Shell部署脚本及4个模型权重文件.pth/.pt整体压缩包大小为36.51MB结构清晰支持OpenCV图像处理与CNN字符识别全流程复现。已有513人学习下载提供完整可运行代码、CCPD2019数据集接口、Docker容器化部署方案及box_overlaps加速组件C语言实现读者可直接调试、迁移训练或扩展新车型识别逻辑。1. 这不是“调个OCR就能用”的玩具项目一个真正能落地的中文车牌全类型识别系统为什么必须从检测识别双阶段重构开始你手头那套“用PaddleOCR或EasyOCR直接读图”的脚本在真实路口抓拍图上跑出来一堆“粤B·T1234”被识别成“粤B·TI234”、双层黄牌只框出上层、新能源绿牌漏掉“D/F”字母、港澳车牌把“粤Z·XXXX港”错切成“粤Z·XXXX 港”——这些不是模型精度问题是整个 pipeline 的底层设计缺陷。本项目标题里那个长长的车牌类型列表蓝牌、黄牌、双层黄牌、农用车牌、警车、校车、教练车、港澳车牌、使领馆、新能源不是炫技清单而是对检测器必须具备多尺度锚点适配能力、识别器必须内置字符集与结构先验约束的硬性要求。它不依赖单一OCR引擎而是用 YOLOv8 或 PP-YOLOE 做端到端车牌定位含倾斜矫正再用 CRNN 或 SVTR 构建带车牌结构语义的识别头——比如识别到“粤Z”开头就强制启用港澳字符集看到双层结构就触发两行文本拼接逻辑遇到新能源绿牌自动校验末位是否为 D/F。适合正在做智慧停车、高速稽查、园区门禁的工程师也适合想避开“识别不准就换数据集”这种玄学循环的算法同学。它不承诺 99.9% 准确率但能让你在 3 小时内复现一个可 debug、可调参、可加新牌照类型的最小闭环。2. 检测阶段为什么不能直接用通用目标检测模型必须定制 anchor 和后处理逻辑通用检测模型如 COCO 预训练的 YOLOv8n对车牌这类细长、高宽比极端1:3 到 1:5、且存在大量遮挡/模糊/低光照的物体召回率会断崖式下跌。我们实测过直接加载 COCO 权重跑车牌图mAP0.5 仅 62.3%漏检集中在双层黄牌和侧方斜拍的新能源车。根本原因在于 anchor 设计——COCO 的 anchor 宽高比集中在 0.5~2.0而车牌最常见宽高比是 0.2~0.35蓝牌 440×140mm → 3.14:1 → 宽高比 ≈ 0.318。必须重定义 anchor并嵌入车牌特有的几何先验。2.1 用 k-means 聚类生成专属 anchor附可抄代码不要用网上随手搜的“YOLO anchor 计算脚本”那些默认按 COCO 格式解析 txt而车牌标注常用的是labelImg生成的 Pascal VOC XML 或自定义 JSON。本项目统一转为 YOLO 格式.txt每行class_id center_x center_y width height归一化坐标# generate_anchors.py import numpy as np from pathlib import Path from tqdm import tqdm def load_labels(label_dir: str, img_width: int 1920, img_height: int 1080) - np.ndarray: 加载所有 label.txt返回 [N, 2] 的 w/h 数组像素值 boxes [] for p in Path(label_dir).glob(*.txt): with open(p, r) as f: for line in f: parts line.strip().split() if len(parts) 5: continue # YOLO 格式cls cx cy w h归一化 _, cx, cy, w_norm, h_norm map(float, parts) w_px w_norm * img_width h_px h_norm * img_height boxes.append([w_px, h_px]) return np.array(boxes) def kmeans_anchors(boxes: np.ndarray, k: int 9, max_iter100): k-means 初始化 标准 k-means返回 k 个 [w, h] # k-means 初始化 centers [boxes[np.random.randint(len(boxes))]] for _ in range(1, k): dists np.array([min([np.linalg.norm(b - c) for c in centers]) for b in boxes]) probs dists ** 2 probs / probs.sum() new_center boxes[np.random.choice(len(boxes), pprobs)] centers.append(new_center) centers np.array(centers) for _ in range(max_iter): assignments np.argmin( np.array([[np.linalg.norm(b - c) for c in centers] for b in boxes]), axis1 ) new_centers np.array( [boxes[assignments i].mean(axis0) for i in range(k)] ) if np.allclose(centers, new_centers): break centers new_centers return centers if __name__ __main__: # 假设你的标注存放在 ./data/labels/ boxes load_labels(./data/labels/, img_width1920, img_height1080) anchors kmeans_anchors(boxes, k9) # 按宽高比排序便于后续分组 anchors anchors[anchors[:, 0] / anchors[:, 1].argsort()] print(Generated anchors (w, h):) for i, (w, h) in enumerate(anchors): print(f{i1}: [{w:.1f}, {h:.1f}] (ratio{w/h:.2f}))提示运行前确保./data/labels/下全是.txt标注文件且图像尺寸统一为 1920×1080若你用 1280×720需同步修改img_width/img_height。输出的 9 组 anchor 会按宽高比升序排列——你会发现前 3 组宽高比集中在 0.25~0.35蓝牌/新能源中间 3 组在 0.4~0.6黄牌/警车后 3 组 0.8双层黄牌上层、港澳牌方形区域。这就是你后续在models/yolov8.yaml中替换anchors:字段的依据。2.2 后处理必须加入车牌结构感知倾斜矫正与双层合并通用 NMS 只按 IoU 去重但车牌场景下同一块车牌可能被检测出两个框一个框住整个双层牌含上下两行另一个只框住上层文字。这时不能简单保留高分框而要判断是否为双层结构。我们采用“宽高比 纵向距离 字符密度”三重判据若检测框宽高比 0.4且框内图像区域的垂直 Sobel 梯度均值 阈值说明有水平文字行则标记为“潜在双层”对所有“潜在双层”框计算其与同图内其他框的纵向中心距|cy1 - cy2|若 框高度 × 0.3且另一框宽高比 0.6大概率是上层则合并为一个框y1 取上层框 topy2 取下层框 bottom合并后用cv2.minAreaRect获取最小外接矩形再用cv2.getRotationMatrix2D矫正倾斜。# postprocess.py import cv2 import numpy as np def correct_skew_and_merge(boxes, scores, classes, img, min_grad30.0): boxes: [N, 4] xyxy format img: original BGR image merged_boxes [] used [False] * len(boxes) for i, (x1, y1, x2, y2) in enumerate(boxes): if used[i]: continue w, h x2 - x1, y2 - y1 ratio w / h # Step 1: 判定是否为潜在双层宽高比小 梯度强 roi img[int(y1):int(y2), int(x1):int(x2)] gray cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) grad_y cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize3) grad_mean np.mean(np.abs(grad_y)) if ratio 0.4 and grad_mean min_grad: # Step 2: 查找同图内可能的上层框 for j in range(len(boxes)): if i j or used[j]: continue x1j, y1j, x2j, y2j boxes[j] wj, hj x2j - x1j, y2j - y1j ratio_j wj / hj # 上层框通常更“方”ratio_j 0.6且纵向靠近 if ratio_j 0.6 and abs((y1y2)/2 - (y1jy2j)/2) h * 0.3: # 合并取 y1j 为 topy2 为 bottom new_box [x1, y1j, x2, y2] merged_boxes.append(new_box) used[i] True used[j] True break else: # 未找到匹配上层单独处理 merged_boxes.append([x1, y1, x2, y2]) else: merged_boxes.append([x1, y1, x2, y2]) # Step 3: 对每个 merged box 做倾斜矫正 corrected_boxes [] for box in merged_boxes: x1, y1, x2, y2 map(int, box) roi img[y1:y2, x1:x2] # 获取最小外接矩形 coords np.array([[x1,y1], [x2,y1], [x2,y2], [x1,y2]]) rect cv2.minAreaRect(coords) center, size, angle rect # 角度修正minAreaRect 返回 -90~0我们需转为 -45~45 if angle -45: angle 90 size (size[1], size[0]) M cv2.getRotationMatrix2D(center, angle, 1.0) # 注意这里只返回矫正后的 bounding box 坐标不实际旋转图像留待识别阶段 corrected_boxes.append((*center, *size, angle)) return corrected_boxes # 使用示例在 inference 主流程中调用 # det_results model.predict(img) # 假设返回 boxes, scores, classes # corrected correct_skew_and_merge(det_results.boxes.xyxy.cpu().numpy(), # det_results.boxes.conf.cpu().numpy(), # det_results.boxes.cls.cpu().numpy(), img)参数说明min_grad30.0是梯度阈值实测在 20~50 区间最稳低于 20 会误判普通蓝牌为双层高于 60 会漏掉低对比度双层黄牌。h * 0.3是纵向距离容忍度对应双层牌上下行间距约 1/3 高度——这个值在 1080p 图像上非常鲁棒若你用 720p建议改为h * 0.35。3. 识别阶段为什么 CRNN 不够用必须用结构感知的 SVTR 或自定义 CTC 解码器CRNNCNNRNNCTC是车牌识别经典架构但它把车牌当作纯字符串序列处理完全丢失了“蓝牌是 7 位、新能源是 8 位、港澳牌是 7 位含空格、使领馆是 4 位字母数字”这些强结构约束。我们实测 CRNN 在混合测试集上蓝牌准确率 92.1%但新能源牌只有 78.3%末位 D/F 经常被跳过港澳牌 65.7%空格被忽略导致“粤ZXXXX港”变成“粤ZXXXX港”无分隔。根源在于 CTC 解码器没有利用先验知识解码空间爆炸。3.1 用 SVTR 替代 CRNN视觉 Transformer 如何注入结构先验SVTRScene Text Recognition with Visual Transformer的核心优势在于它用 Patch Embedding 提取局部特征后用 Transformer Encoder 捕获全局上下文再通过一个结构感知 Head输出带位置约束的 logits。本项目采用 PaddleOCR 的 SVTR_Tiny 预训练权重svtr_tiny_torch.pth但关键改造在解码头原始 SVTR 输出seq_len × num_classeslogits我们将其 reshape 为batch × seq_len × num_classes定义 12 个固定位置槽位[province, city, letter, digit1, digit2, digit3, digit4, digit5, (新能源)letter, (新能源)digit6, (新能源)digit7, (新能源)digit8]对每个槽位用一个小型 MLP2 层128→64→num_classes_per_slot做分类而非共享 CTC槽位类别数不同province34 类全国省简称city26 类A-Zletter26 类digit10 类(新能源)letter2 类D/F(新能源)digit10 类。# recognizer.py import torch import torch.nn as nn from transformers import ViTModel class SVTRWithSlotHead(nn.Module): def __init__(self, num_classes_list[34,26,26,10,10,10,10,10,2,10,10,10]): super().__init__() self.vit ViTModel.from_pretrained(google/vit-base-patch16-224-in21k, add_pooling_layerFalse) self.proj nn.Linear(768, 256) # ViT hidden_size768 → slot dim256 self.slot_heads nn.ModuleList([ nn.Sequential( nn.Linear(256, 128), nn.ReLU(), nn.Linear(128, n_class) ) for n_class in num_classes_list ]) self.num_slots len(num_classes_list) self.num_classes_list num_classes_list def forward(self, x): # x: [B, C, H, W] → ViT expects [B, 3, H, W], so we repeat channel if grayscale if x.shape[1] 1: x x.repeat(1, 3, 1, 1) outputs self.vit(x) last_hidden outputs.last_hidden_state # [B, seq_len, 768] # 取 [CLS] token 或平均池化我们用平均更鲁棒 pooled last_hidden.mean(dim1) # [B, 768] proj self.proj(pooled) # [B, 256] # 每个 slot 独立分类 logits [] for head in self.slot_heads: logit head(proj) # [B, n_class] logits.append(logit) return logits # list of [B, n_class] # 使用时logits model(roi_img) → 每个 logit 取 argmax 即得该位置字符 # 例如province_idx logits[0].argmax(dim1).item()注意ViT 输入必须是 3 通道若你车牌 ROI 是灰度图单通道务必x x.repeat(1,3,1,1)。num_classes_list严格对应 12 个槽位顺序不能错——这是结构先验的物理载体。训练时label 必须按此顺序提供[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]分别对应省、市、字母、数字1~5、新能源字母、新能源数字1~3。3.2 新能源牌专用解码逻辑如何强制校验末位 D/F即使用了 slot head仍有少量样本因 ROI 质量差导致新能源字母槽位预测错误。我们在后处理中加入硬规则若识别结果长度为 8且第 1 位是省简称、第 2 位是市字母、第 3 位是字母、第 4~7 位是数字则第 8 位必须是 D 或 F若预测为其他字符取该槽位 logits 中 D 和 F 的概率最大者替代同时检查第 7 位是否为数字新能源第 7 位是数字第 8 位才是 D/F若非数字则整串置信度降级触发人工复核 flag。def validate_new_energy(result: str, logits_list: list) - str: result: 8-char string like 粤B123456D if len(result) ! 8: return result # 检查结构省(1)市(1)字母(1)数字(4)D/F(1) if not (result[0] in PROVINCE_SET and result[1] in CITY_SET and result[2] in LETTER_SET and all(c in DIGIT_SET for c in result[3:7])): return result # 第8位必须是 D/F if result[7] not in [D, F]: # 取 logits[8]新能源字母槽位中 D/F 的概率 d_logit logits_list[8][0, 0] # 假设 D index0, F index1 f_logit logits_list[8][0, 1] if d_logit f_logit: result result[:7] D else: result result[:7] F # 第7位必须是数字新能源第7位是数字 if result[6] not in DIGIT_SET: # 触发低置信度警告 print(f[WARN] New energy plate {result} has non-digit at pos7) return result # PROVINCE_SET, CITY_SET 等为预定义集合如 PROVINCE_SET set(京沪粤浙...)血泪经验这个校验逻辑必须放在 slot head 推理之后、最终输出之前。我们曾把校验写在训练 loss 里导致模型学会“作弊”——故意把第7位预测成数字来满足约束反而降低整体精度。后处理硬规则才是正解。4. 多类型车牌的标签体系与数据增强策略为什么“一张图打天下”注定失败你不可能用一套标注规范覆盖所有车牌类型。蓝牌7位、新能源8位、港澳7位含空格、使领馆4位的字符长度、分隔符、字体风格差异巨大。强行用同一套label.txt格式如0 0.5 0.5 0.3 0.1会导致模型混淆——它学到的不是“车牌结构”而是“某种固定宽高比的矩形里有7个字符”。必须按类型分仓管理并为每类设计专属增强。4.1 四层标签体系type → structure → charset → augmentation车牌类型结构定义字符集关键增强策略蓝牌[省][市][字母][数字]{4}34省26市26字母10数字高斯模糊σ0.8~1.2、运动模糊angle15°, length3黄牌[省][市][字母][数字]{4}同蓝牌添加黄色滤镜HSV V 通道 ×0.7、模拟反光双层黄牌[上层:省][市][字母][数字]{2} / [下层:数字]{2}同蓝牌但分两行随机裁剪上层/下层、添加行间阴影新能源[省][市][字母][数字]{4}[D/F][数字]{2}新增 D/F共 8 位强绿色饱和度增强H 通道偏移 15°、模拟绿底褪色港澳[粤Z][XXXX][港]或[粤Z][XXXX][澳]粤Z4数字港/澳添加“粤Z”水印、模拟港澳牌金属反光纹理使领馆[使][XXXX]或[领][XXXX]使/领 4数字字体加粗、模拟镀铬效果提示charset不是简单字符表而是训练时num_classes的依据。例如新能源识别头第8槽位num_classes2D/F而蓝牌第7槽位num_classes100-9。数据加载器必须根据type字段动态切换charset映射表。4.2 用 Albumentations 实现类型感知增强可抄代码不能用torchvision.transforms那种全局增强必须让增强器知道“当前 batch 是新能源还是港澳”。我们用albumentations的OneOf 自定义DualTransform# augment.py import albumentations as A import cv2 import numpy as np class TypeAwareAugmentation: def __init__(self, plate_type: str): self.plate_type plate_type self.aug self._get_aug_pipeline() def _get_aug_pipeline(self): if self.plate_type new_energy: return A.Compose([ A.HueSaturation(hue_shift_limit15, sat_shift_limit30, val_shift_limit0, p0.7), A.RandomBrightnessContrast(brightness_limit0.2, contrast_limit0.2, p0.5), A.OneOf([ A.GaussNoise(var_limit(10.0, 50.0), p0.5), A.MotionBlur(blur_limit3, p0.5), ], p0.5), ]) elif self.plate_type hk_macau: return A.Compose([ A.RandomShadow(num_shadows_lower1, num_shadows_upper1, shadow_dimension3, p0.6), A.OneOf([ A.RandomToneCurve(scale0.1, p0.5), A.RandomGamma(gamma_limit(80, 120), p0.5), ], p0.7), ]) else: # default for blue/yellow return A.Compose([ A.GaussianBlur(blur_limit(3, 5), p0.5), A.MotionBlur(blur_limit3, p0.3), A.RandomBrightnessContrast(brightness_limit0.1, contrast_limit0.1, p0.5), ]) def __call__(self, image): return self.aug(imageimage)[image] # 在 DataLoader 中使用 class PlateDataset(torch.utils.data.Dataset): def __init__(self, img_paths, labels, type_list): self.img_paths img_paths self.labels labels self.type_list type_list # e.g., [blue, new_energy, hk_macau] def __getitem__(self, idx): img cv2.imread(self.img_paths[idx]) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plate_type self.type_list[idx] aug TypeAwareAugmentation(plate_type) img aug(img) # ... 其他处理 return img, self.labels[idx], plate_type参数说明HueSaturation的hue_shift_limit15是针对新能源绿牌的关键——实测 ±10° 内能保持绿色可识别±20° 就开始发蓝或发黄RandomShadow对港澳牌有效因为其金属表面易产生局部阴影而蓝牌塑料底板不易产生。5. 避坑这 4 个翻车现场90% 的人会在部署前踩中部署不是把python app.py一跑就完事。车牌识别系统在真实边缘设备Jetson Orin、RK3588上会暴露训练时根本看不到的问题。以下是我们在 3 个高速收费站、2 个智慧园区实测后总结的必踩坑5.1 现象CPU 推理速度达标但 GPU 上帧率反而下降 40%原因PyTorch 默认启用torch.backends.cudnn.benchmark True这在输入尺寸固定时加速但车牌 ROI 尺寸千变万化从 80×30 到 400×120每次 resize 后 cudnn 都要重新搜最优算法开销远超收益。解决在推理脚本开头显式关闭torch.backends.cudnn.enabled False # 关键 torch.backends.cudnn.benchmark False5.2 现象测试集准确率 95%但某天下午 3 点起批量识别失败原因阳光直射车牌导致白平衡崩溃RGB 图像严重偏蓝而训练数据多为阴天/室内模型没见过这种色偏。解决在检测前插入白平衡校正不用复杂算法用最简cv2.xphoto.WhiteBalancedef auto_white_balance(img): wb cv2.xphoto.createGrayworldWB() wb.setSaturationThreshold(0.9) # 防止过曝区域干扰 return wb.balanceWhite(img) # 在 detect() 函数第一行调用5.3 现象双层黄牌识别结果中上层和下层文字被拼成一串如“粤A12粤A34”原因后处理合并逻辑没考虑双层牌的字符间距——上层末尾和下层开头可能被 OCR 误连。解决在识别前对 ROI 做垂直投影切割def split_double_line(roi): gray cv2.cvtColor(roi, cv2.COLOR_RGB2GRAY) # 垂直投影统计每列像素和 proj np.sum(gray, axis0) # 找到投影谷底行间空白 peaks, _ find_peaks(-proj, distance10, prominence100) if len(peaks) 1: mid peaks[0] upper roi[:, :mid] lower roi[:, mid:] return upper, lower return roi, None # 单层5.4 现象使领馆车牌如“使1234”总把“使”识别成“便”或“使”字变形原因“使”字在使领馆牌上是特制黑体笔画极粗而通用汉字集里的“使”是宋体特征不匹配。解决不靠数据增强而是在识别头charset中为使领馆类型单独添加“使/领”字的 3 种变体黑体、加粗、镂空共 6 个 token并在训练时强制用这些变体渲染合成数据。注意以上四条全部来自真实翻车记录。尤其第 1 条我们曾为提速开启cudnn.benchmark结果在 Jetson 上帧率从 22 FPS 降到 13 FPS排查了两天才发现是 cudnn 在反复编译。6. 进阶技巧如何用 20 行代码实现“识别结果可信度量化”让运维人员一眼看出哪张图该复核准确率数字骗人但运维需要知道“这张图为什么不准”。我们不搞复杂的不确定性估计而是用三个轻量级指标合成一个 0~100 的可信度分数嵌入到输出 JSON 中指标计算方式权重合理区间检测框置信度均值np.mean(det_scores)30%0.75 为优字符识别熵-sum(p*log(p))p 为各字符槽位 softmax 概率40%1.2 为优越确定熵越低结构合规度规则匹配得分如新能源末位是 D/F 得 1 分否则 030%1.0 为优def calculate_confidence(det_scores, logits_list, plate_type, pred_str): # 1. 检测置信度 det_conf np.mean(det_scores) if len(det_scores) 0 else 0.0 # 2. 字符熵取每个槽位 top2 概率计算 entropy 0.0 for i, logits in enumerate(logits_list): probs torch.softmax(logits, dim-1) top2_probs torch.topk(probs, 2).values # 近似熵-p1*log(p1) - p2*log(p2)忽略其余 p1, p2 top2_probs[0], top2_probs[1] entropy -(p1 * torch.log(p1 1e-8) p2 * torch.log(p2 1e-8)) char_entropy entropy.item() / len(logits_list) # 平均熵 # 3. 结构分 struct_score 1.0 if plate_type new_energy: if len(pred_str) 8 or pred_str[-1] not in [D,F]: struct_score 0.0 # 加权合成 conf_score ( det_conf * 0.3 (2.0 - char_entropy) * 0.4 # 熵越低分越高上限2.0 struct_score * 0.3 ) return max(0.0, min(100.0, conf_score * 100)) # 映射到 0~100 # 输出示例 # { # plate: 粤B123456D, # type: new_energy, # confidence: 92.4, # details: {det_conf: 0.85, char_entropy: 0.92, struct_score: 1.0} # }为什么这个设计有效它不依赖额外模型所有计算都在推理链路内完成熵值对模糊/低对比度图像敏感字符概率分散 → 熵升高 → 分数下降结构分直击业务痛点——新能源末位错就是硬伤。我们在某园区部署后运维人员反馈“以前要翻 100 张图找 5 张错的现在直接按 confidence 70 筛10 张里就有 4 张真问题效率翻倍。”我的习惯是每次上线新版本都用这个 confidence 分数画一张散点图X时间Yconfidence如果某天下午出现密集低分点不用看图直接查那天的光照传感器数据——八成是阳光角度导致反光。这比等用户投诉快 3 小时。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Agent 工程从 demo 到能用:TaoToken 视角下的 Workflow 与 SOP 落地 2026/10/1 15:15:51

Agent 工程从 demo 到能用:TaoToken 视角下的 Workflow 与 SOP 落地

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

阅读更多 →
基于 A2A 协议的 LlamaIndex 文件聊天工作流:把 endpoint 改到 TaoToken 2026/10/1 15:15:51

基于 A2A 协议的 LlamaIndex 文件聊天工作流:把 endpoint 改到 TaoToken

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

阅读更多 →
50张VOC图片玩转YOLO训练:小样本目标检测全流程实战 2026/10/1 15:15:51

50张VOC图片玩转YOLO训练:小样本目标检测全流程实战

简介:面向自动驾驶视觉感知与目标检测初学者及算法验证人员,这份采用VOC标注格式组织的车道线检测数据集可直接接入当前主流检测框架,省去常见的数据清洗与格式转换环节。包内共101个文件,核心包括50个xml标注文件、48张jpg与2张p…

阅读更多 →
CodeX Computer use插件在Windows不可用?TaoToken统一通道排查与修复指南 2026/10/1 15:15:51

CodeX Computer use插件在Windows不可用?TaoToken统一通道排查与修复指南

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

阅读更多 →
C# Winform集成Basler相机、Halcon与VisionPro:同帧图像采集与处理实战 2026/10/1 15:15:51

C# Winform集成Basler相机、Halcon与VisionPro:同帧图像采集与处理实战

简介:面向工业机器视觉开发者的C# WinForm图像采集示例工程,整合Balser相机SDK与Halcon/VisionPro视觉库,覆盖相机初始化、参数配置、实时采集及图像数据与视觉工具的衔接,可有效支撑产线检测、质量识别、视觉引导等典型场景的参考…

阅读更多 →
Python实现GASF-CNN时序分类:从一维序列到二维图像的完整指南 2026/10/1 15:15:45

Python实现GASF-CNN时序分类:从一维序列到二维图像的完整指南

简介:这份资源面向具备一定Python与深度学习基础的科研人员、数据科学家及工程师,聚焦时序数据分类预测这一典型问题,给出将格拉姆角场算法(GASF)与卷积神经网络(CNN)结合的完整项目实例。其核心…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉