当前位置: 首页 > news >正文

车牌识别

车牌识别方案对比与实现总结(GUI 三方法:lock / test / rec2)

本文面向实际工程应用,系统梳理当前 GUI 集成的三种车牌识别方法(lock、test、rec2)的技术亮点、设计思路、模型选择、实现过程与关键代码,帮助快速理解与持续优化。目标是:在统一界面中,对比“传统候选+文字识别过滤”的方案(lock)、“端到端检测-识别-分类”方案(test),以及“形态学/轮廓候选+识别过滤”的方案(rec2),支持图片/文件夹/视频多形态输入,直观呈现识别效果差异。


一、总体架构与设计思路

  • 核心目标:

    • 在统一 GUI 中提供三种方法的可选运行模式;
    • 对比传统 vs 端到端的精度、鲁棒性与效率;
    • 统一中文标注与多输入适配(图像/视频)。
  • 模块职责:

    • 界面层:方法选择、输入/输出配置、预览与“大图”查看;
    • 业务层:三种方法在“单图/视频帧”上的处理逻辑、可视化与结果导出;
    • 公共组件:中文文本绘制(PIL)、视频快照节流、结果持久化(图像/JSON)。
  • 关键设计原则:

    • 单一职责:方法逻辑与界面解耦,便于新增方法与维护;
    • 可视化一致性:所有方法输出“筛选前/筛选后/检测或二值图”;
    • 可扩展性:新增方法仅需实现标准接口并注册到 GUI 下拉中;
    • 统一中文绘制:用 PIL 绘制中文,彻底规避 cv2.putText 中文乱码。

技术实现(细化)

本节基于当前代码实现,按“GUI 触发 → 业务函数 → 文件输出”的链路,细化可复现的工程细节,便于维护与扩展。

  • 入口与界面交互(/gui.py

    • 方法选择:QComboBoxlock / test / rec2)。
    • 输入选择:图片/文件夹/视频三类(_choose_input)。
    • 输出目录:默认为 /runs,可自定义(_choose_output)。
    • 模型与参数(仅 test):det/rec/cls 路径,det_size 输入尺寸。
    • 运行按钮:_on_run 根据输入类型分派到图片/文件夹/视频流程,并将日志与预览三图更新到界面。
  • 单图处理(图片文件)

    • lock:调用 /app.py::method_lock_on_image(img_path, out_dir)
      • 内部使用:锁定筛选.py::recognize_on_candidates 生成候选与识别结果;draw_quads 可视化保留候选。
      • 产出(存于 out_dir):
        • 二值图 *_bin.jpg
        • 筛选前 *_pre.jpg
        • 筛选后 *_post.jpg
        • 结果 JSON *_lock_results.json(字段:text/conf/quad)。
      • GUI 预览:img1←binimg2←preimg3←post
    • rec2:调用 /app.py::method_recognize2_on_image识别2.py 函数化)。
      • 形态学/轮廓获取候选 → 可选识别与字符规则过滤(与 lock 同步)。
      • 产出:*_m2_pre.jpg*_m2_post.jpg 与结构化 results 返回(GUI 用于日志与预览)。
    • test:调用 /app.py::method_test_on_image
      • 模型:standalone_modules
        • 检测 MultiTaskDetectorORTdet,默认输入 (det_size, det_size)
        • 识别 RecognitionORTrec,输入 (48,160)
        • 分类 ClassificationORTcls,输入 (96,96)
      • 裁剪:standalone_modules/crop.py::crop_plate_by_landmarks
      • 中文标签:app.py::put_chinese_text
      • 产出:可视化 *_test_vis.jpg,结果 JSON *_test_results.jsonbbox/text/rec_conf/plate_type_idx)。
      • GUI 预览:img1←vis
  • 批量图片处理(文件夹)

    • gui.py::_on_run 通过 app.py::list_images_in_dir 顺序处理;
    • 按所选方法调用对应单图函数;
    • 日志逐文件写入,输出组织与单图一致。
  • 视频处理(/app.py::process_video

    • 公共控制:
      • frame_stride:抽帧处理(默认 5)
      • max_frames:最多保存快照数量上限(避免产出过多,默认 60/120)
      • snapshot_stride:每 N 帧保存一张(默认 30)
      • snapshot_on_change:识别文本集合变化时保存(True
      • save_video:是否保存带可视化叠加的视频(MP4V 编码)
    • 方法分支:
      • lock
        • 每帧:recognize_on_candidates → 合成四宫格(pre/post/bin/raw)作为帧级可视化。
        • 快照:按步长/内容变化保存 basename_lock_{frame_idx}.jpg
        • 文本集合:{t for (t,_,_) in recs} 用于变化检测。
      • rec2
        • 每帧:method_recognize2_on_frame → 左右拼接(pre/post)。
        • 快照命名:basename_rec2_{frame_idx}.jpg
      • test
        • 首帧前加载模型(避免重复初始化);
        • 每帧:检测→裁剪→识别→分类→叠加中文标签;
        • 快照命名:basename_test_{frame_idx}.jpg
    • 输出:
      • 结果汇总 JSON:{basename}_{method}.json(按帧的结果列表);
      • 可选视频:{basename}_{method}.mp4
      • 快照若干(GUI 取前三张用于预览)。
  • 模型默认路径(自动回退)

    • app.py::default_paths():从用户目录 ~/.hyperlpr3/20230229/onnx/ 读取默认 det/rec/cls
    • rec2 若可用会尝试 RecognitionORT 同目录模型;路径不存在时自动跳过识别,仅输出候选可视化。
  • 中文可视化

    • 统一使用 app.py::put_chinese_text(PIL 渲染,失败回退 cv2.putText)。
    • GUI 不直接绘制文字,所有文本叠加在业务层完成,保证跨方法一致性。
  • 文件 I/O 规范

    • 读:统一 cv2.imdecode(np.fromfile(...)) 兼容中文路径;
    • 写:cv2.imencode(...).tofile(path),避免 Windows 路径与编码问题;
    • 目录:所有方法输出按 runs/{method}/... 归档,保证方法间结果互不冲突。
  • 扩展与参数外露建议

    • 新方法接入:实现 method_xxx_on_image/imgs/video 同名风格函数并在 gui.py 注册;
    • 参数外露:将 frame_stride/max_frames/snapshot_stride/snapshot_on_change/识别阈值/形态学核大小 等映射到 GUI 控件;
    • 评估闭环:在 process_video 统计每帧结果,后处理按时间聚合同文本事件,便于计算 Precision/Recall/F1。

二、方法一(lock):传统候选定位 + 仅文字识别(对比基准)

2.1 技术亮点

  • 不依赖检测模型,部署轻量,速度快;
  • 传统 CV(边缘+色域+形态学)快速召回候选区域;
  • 仅对候选做 OCR 识别,再以“车牌字符规则”过滤,直观对比传统候选误检/漏检与“后端识别”的关系。

2.2 候选定位(示意代码)

def pipeline(img_bgr):gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)blur = cv2.blur(gray, (3, 3))edge = cv2.Canny(blur, 30, 100)hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)# 蓝/黄/白/绿常见车牌颜色掩膜blue   = cv2.inRange(hsv, (100, 40, 40), (130, 255, 255))yellow = cv2.inRange(hsv, (15,  40, 40), (35,  255, 255))white  = cv2.inRange(hsv, (0,   0, 180), (180, 60, 255))green  = cv2.inRange(hsv, (55,  40, 40), (95,  255, 255))color_mask = blue | yellow | white | greenfinal = cv2.bitwise_and(edge, edge, mask=color_mask)final = cv2.morphologyEx(final, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_RECT, (22, 4)), 1)final = cv2.morphologyEx(final, cv2.MORPH_OPEN,  cv2.getStructuringElement(cv2.MORPH_RECT, (1, 5)),  1)return finaldef locate_plates(bin_img, rgb_img):contours, _ = cv2.findContours(bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)h_img, w_img = bin_img.shapecandidates = []for cnt in contours:rot_box = cv2.minAreaRect(cnt)(cx, cy), (w, h), angle = rot_boxif w < h:w, h = h, waspect = w / max(h, 1e-6)area = w * hif (800 <= area <= 0.05 * h_img * w_img and 2.0 <= aspect <= 6.0):pts = cv2.boxPoints(rot_box)candidates.append(np.int32(np.round(pts)))vis = rgb_img.copy()for pts in candidates:cv2.drawContours(vis, [pts], -1, (0, 0, 255), 2)return candidates, vis

2.3 仅 OCR 与规则过滤(示意代码)

def get_rotate_crop_image(img, points):points = points.astype(np.float32)w = int(max(np.linalg.norm(points[0]-points[1]), np.linalg.norm(points[2]-points[3])))h = int(max(np.linalg.norm(points[0]-points[3]), np.linalg.norm(points[1]-points[2])))dst = np.float32([[0,0],[w,0],[w,h],[0,h]])M = cv2.getPerspectiveTransform(points, dst)return cv2.warpPerspective(img, M, (w, h), flags=cv2.INTER_CUBIC)def plate_code_valid(code: str) -> bool:code = (code or '').strip().upper()if len(code) < 6 or len(code) > 8:return Falseif re.search(r"[\u4e00-\u9fa5]", code):return re.search(r"[A-Z0-9]{3,}", code) is not Noneif len(code) == 7 and re.match(r"^[A-Z0-9]{7}$", code):return Trueif len(code) == 8 and re.match(r"^[A-Z0-9]{8}$", code):return Truereturn Falsedef recognize_on_candidates(img_bgr, recognizer):bin_img = pipeline(img_bgr)candidates, pre_vis = locate_plates(bin_img, img_bgr)results, kept = [], []for quad in candidates:crop = get_rotate_crop_image(img_bgr, quad.astype(np.float32))if crop is None or crop.size == 0 or crop.shape[0] < 8 or crop.shape[1] < 16:continuetext, conf = recognizer(crop)if text and plate_code_valid(text):results.append((text, float(conf), quad))kept.append(quad)return results, candidates, kept, bin_img, pre_vis

2.4 可视化输出

  • 二值图(bin):展示边缘与色域结合后的响应;
  • 筛选前(pre):候选外接轮廓图;
  • 筛选后(post):通过字符规则过滤后保留的候选图。

三、方法二(test):端到端检测→裁剪→识别→分类

3.1 技术亮点

  • 完整管线:检测(bbox+关键点+单双层)→ 透视裁剪 → 识别(CTC)→ 分类(颜色/类型);
  • 鲁棒性好,泛化能力强;
  • 与方法一形成鲜明对比:传统候选召回 vs 学习型检测器召回。

3.2 关键逻辑(示意代码)

def run_full(img, det, rec, cls):outputs = det(img)  # [x1,y1,x2,y2, score, 8个关键点, layer]vis = img.copy()results = []for out in outputs:x1, y1, x2, y2 = out[:4].astype(int)pad = crop_plate_by_landmarks(img, out)  # 根据四点透视裁剪text, conf = rec(pad)type_idx = int(np.argmax(cls(pad)))cv2.rectangle(vis, (x1, y1), (x2, y2), (0, 255, 0), 2)label = f"{text} {conf:.2f} 类型:{type_idx}"vis = put_chinese_text(vis, label, (x1, max(0, y1 - 5)))results.append(dict(bbox=[int(x1), int(y1), int(x2), int(y2)],text=text, rec_conf=float(conf), plate_type_idx=type_idx))return vis, results

3.3 中文可视化(PIL 绘制)

def put_chinese_text(img_bgr, text, position, font_path="C:/Windows/Fonts/simhei.ttf", font_size=18, color_bgr=(0,255,0)):from PIL import Image, ImageDraw, ImageFontimg_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)pil_img = Image.fromarray(img_rgb)draw = ImageDraw.Draw(pil_img)color_rgb = (color_bgr[2], color_bgr[1], color_bgr[0])font = ImageFont.truetype(font_path, font_size)draw.text(position, str(text), font=font, fill=color_rgb)return cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)

3.4 视频处理节流

  • 抽帧(frame_stride):降低帧级处理频率;
  • 快照(snapshot_stride):固定间隔保存快照;
  • 内容变化触发(snapshot_on_change):识别文本集合变化即保存快照。

四、方法三(rec2):形态学/轮廓候选 + 文字识别过滤

4.1 技术亮点

  • 传统图像处理形态学管线,可快速生成候选;
  • 标准化为函数接口,补齐 OCR 与字符规则过滤,使其可与 lock 方法直接对比;
  • 便于教学/研究或固定场景快速搭建基线。

4.2 候选生成(示意代码)

def rec2_candidates(img_bgr):raw = img_bgrblur = cv2.GaussianBlur(raw, (3, 3), 0)gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)sobelx = cv2.Sobel(gray, cv2.CV_16S, 1, 0)absx = cv2.convertScaleAbs(sobelx)_, th = cv2.threshold(absx, 0, 255, cv2.THRESH_OTSU)close = cv2.morphologyEx(th, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_RECT, (17, 5)), iterations=3)kx, ky = cv2.getStructuringElement(cv2.MORPH_RECT, (20,1)), cv2.getStructuringElement(cv2.MORPH_RECT, (1,19))mor = cv2.dilate(close, kx); mor = cv2.erode(mor, kx)mor = cv2.erode(mor, ky);  mor = cv2.dilate(mor, ky)med = cv2.medianBlur(mor, 15)contours, _ = cv2.findContours(med, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)pre_vis = raw.copy(); cv2.drawContours(pre_vis, contours, -1, (0,255,0), 2)candidates, crops = [], []for cnt in contours:x, y, w, h = cv2.boundingRect(cnt)if h > 0 and (w > 3*h) and (w < 5*h):candidates.append(np.array([[x,y],[x+w,y],[x+w,y+h],[x,y+h]], dtype=np.int32))crops.append(raw[y:y+h, x:x+w])return pre_vis, candidates, crops

4.3 OCR 与过滤(示意)

与 lock 相同,直接对 crops 调用识别器并用相同字符规则过滤,输出 post 图与 results


五、模型选择与部署建议

  • 识别模型(CTC):字符表覆盖汉字与英数,兼容省份简称;
  • 检测模型:多任务头(bbox + 顶点 + 单/双层),对不规则倾斜牌照提供对齐依据;
  • 分类模型:颜色/类型辅助决策;
  • 部署路径:推荐统一放置到用户目录下的模型缓存,或工程自带的 models 目录,避免路径分散引发加载失败。

六、统一中文绘制方案(无乱码)

6.1 原因

cv2.putText 基于底层绘制函数,多数仅支持单字节 ASCII,无法正确渲染中文,导致显示“???” 或乱码。

6.2 解决方案(PIL 渲染)

核心思路:OpenCV BGR → PIL RGB,PIL 绘制中文(指定系统字体),再转回 BGR。

def put_chinese_text(img_bgr, text, position, font_path="C:/Windows/Fonts/simhei.ttf", font_size=18, color_bgr=(0,255,0)):from PIL import Image, ImageDraw, ImageFontimg_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)pil_img = Image.fromarray(img_rgb)draw = ImageDraw.Draw(pil_img)color_rgb = (color_bgr[2], color_bgr[1], color_bgr[0])font = ImageFont.truetype(font_path, font_size)draw.text(position, str(text), font=font, fill=color_rgb)return cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)

字体建议:

  • Windows:C:/Windows/Fonts/simhei.ttf(黑体)、C:/Windows/Fonts/msyh.ttc(微软雅黑)。
  • 若项目跨平台,建议把字体文件随项目分发,并以相对路径加载。

七、视频处理的“节流与高价值帧”策略

  • 抽帧(frame_stride):降低处理频率(如每 5 帧处理一次);
  • 快照间隔(snapshot_stride):每 N 帧保存一张可视化快照;
  • 内容变化触发(snapshot_on_change):当识别文本集合发生变化时保存快照,捕捉“发生关键变化”的瞬间;
  • 最大处理帧数(max_frames):避免长视频处理时间上限不可控。

该策略既兼顾可视化体验(能看到关键帧),又控制输出量(避免“每帧一图”的冗余)。


八、方法对比与适用建议

  • lock(传统候选 + OCR 过滤)

    • 优点:轻量快速;无需检测模型;
    • 局限:对复杂背景/光照敏感;召回受限;
    • 适用:固定场景的快速基线、与端到端方案对比实验。
  • test(端到端检测-识别-分类)

    • 优点:鲁棒性与泛化最佳;精度稳定;
    • 局限:对模型与算力依赖较高;
    • 适用:通用/生产场景的主方案。
  • rec2(形态学/轮廓候选 + OCR 过滤)

    • 优点:流程直观、可控性强;
    • 局限:依赖阈值/核大小等手工参数,对噪声敏感;
    • 适用:教学研究、固定场景的快速试验与对比。

九、工程优化与下一步

  • 参数外露到 GUI:

    • 抽帧间隔、快照间隔、最大帧数、是否按内容变化保存;
    • 识别阈值、字符规则开关、形态学核大小与迭代次数。
  • 评估工具:

    • 与 GT JSON 对齐,统计 Precision / Recall / F1;
    • 视频事件聚合:按时间合并连续相同文本,避免重复统计。
  • 性能优化:

    • 视频批量预处理 + 线程/进程并行;
    • 断点续处理与结果缓存。

十、结语

本文完成了三种方法在统一 GUI 下的整合与对比,从传统候选到端到端,再到形态学候选,覆盖了业界最常见的三条路径。通过一致的中文可视化、统一的输出(bin/pre/post/vis/JSON)、以及视频节流策略,既提升了可用性也保证了可比性。实际落地时,推荐以 test 方案作为生产主路径,同时结合 lock/rec2 在特定环境下建立轻量基线或进行可解释性分析;未来可继续引入参数可视化调优、自动评估、批量处理与数据闭环,形成从实验到部署的完整链路。

相关文章:

车牌识别

车牌识别方案对比与实现总结(GUI 三方法:lock / test / rec2) 本文面向实际工程应用,系统梳理当前 GUI 集成的三种车牌识别方法(lock、test、rec2)的技术亮点、设计思路、模型选择、实现过程与关键代码,帮助快速理解与持续优化。目标是:在统一界面中,对比“传统候选+文…...

告别人工标注瓶颈!Reward-RAG:用 CriticGPT 打造更懂人类偏好的检索模型

Reward-RAG: Enhancing RAG with Reward Driven Supervision 全文摘要 本文介绍了一种名为Reward-RAG的新方法,旨在通过奖励驱动监督增强Retrieval-Augmented Generation(RAG)模型。与以往的RAG方法不同,该方法使用了CriticGPT训练了一个专门的奖励模型,并利用该模型生成合…...

在AI技术快速实现创想的时代,挖掘前端学习新需求成为关键——某知名编程教育平台需求洞察

本文分析了一个包含50个前端项目的编程学习资源,涵盖交互设计、动画效果和实用工具等多种类型,通过用户反馈发现了界面优化、功能扩展和教学改进等方面的潜在需求。a.内容描述 该项目是一个包含50个独立前端项目的编程学习资源,核心功能定位在于通过实际项目练习帮助开发者掌…...

Latex 中百分号怎么打

Latex 中百分号怎么打 由于 % 被用作注释符,所以前面 + \ 进行转义 \(\frac{285.5}{1-2.7\%}\)...

文件上传-条件竞争绕过

条件竞争原理: 条件竞争的逻辑是代码逻辑问题:当我们文件上传到服务器时,先对文件进行保存,然后对文件的后缀名进行判断,符合白名单的保存,不符合就删除,但在删除之前,有另一个对服务器发起的请求,要访问这个文件,那么就可能造成文件被读取和访问。这就是条件竞争。 …...

9.17 CSP-S模拟23/多校A层冲刺NOIP2024模拟赛19 改题记录

HZOJ 写在前面 连着三天吃三坨。本来想着今天大凶忌参加模拟赛然后没模拟赛挺好的,然后7:57临时通知加场,难道这就是大凶?好吧打就打吧,没想到真差点爆零。粗看没一道题可做怀疑自己的水平了然后赛后猛然醒悟是自己蠢如猪。其实这篇前面应该还有两篇,但是奈何这套改完得比…...

C++ 并发

C++ 并发编程是现代软件开发中的核心技术,主要用于利用多核处理器提升程序性能。C++11 及后续标准引入了完善的并发库(<thread>、<mutex>、<condition_variable> 等),使开发者能更安全地编写多线程程序。 1、std::thread std::thread 是 C++11 引入的线程…...

UML 5章

UML是建模语言,能够用面向对象的方法描述任何类型的系统 UML时序图:他通过对象之间发送消息的时间顺序显示多个对象之间的动态协作,重在对象之间的交互,强调时间顺序例UML状态图例...

《微服务事务管理》 - 教程

《微服务事务管理》 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-siz…...

python之socket udp服务器实现

import socket# 1. 创建 UDP Socket (SOCK_DGRAM 表示 UDP) receiver_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 2. 绑定地址和端口 receiver_address = (, 1883) # 端口号 9999 receiver_socket.bind(receiver_address)print("UDP 接收方已启动,等待…...

kylin SP3安装mysql 8.4.5

环境:OS:kylin SP3mysql:8.4.5 glibc2.17,建议安装glibc.2.28版本 查看系统glibc版本[root@localhost ~]# ldd --versionldd (GNU libc) 2.28Copyright (C) 2018 自由软件基金会。这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性或者适合某…...

Unity中是否可以禁用GC

1)Unity中可以禁用GC吗2)项目是URP管线,渲染模块CPU耗时高,经排查主要是Batches数过高,应怎样进一步排查和优化渲染批次这是第445篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。 UWA社区主页:co…...

经典SQL语句大全

经典SQL语句大全一、基础1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- 开始 备份BACKUP D…...

IvorySQL 与 deepin 完成兼容性认证,共创开源生态新篇章

近日,IvorySQL 与 deepin 操作系统成功完成了兼容性适配认证。这一里程碑式的成就标志着 IvorySQL 在国产操作系统生态中的进一步深化,为用户提供更稳定、高效的数据库解决方案。deepin 简介 深度操作系统 deepin 是一款以“简洁、美观、易用”著称的国产 Linux 发行版,拥有…...

在 Nginx 上搭建静态站点

1、新建站点的配置文件 vi /etc/nginx/conf.d/www.xxx.com.conf2、写入如下内容: server {listen 80;#listen [::]:80;server_name www.xxx.com; # 这里可以写你的域名,或者 _ 表示匹配所有 root /var/www/www.xxx.com; # 你的静态文件目录 index index.html index.htm;locat…...

使用GitHub Dork快速发现漏洞:我的第一个Bugcrowd漏洞挖掘实战

本文详细介绍了如何通过GitHub Dork技术快速发现企业敏感信息泄露漏洞,包含实用的搜索语法和实际案例,帮助安全研究人员高效挖掘漏洞。使用GitHub Dork快速发现漏洞:我的第一个Bugcrowd漏洞挖掘实战 嗨,黑客们,漏洞猎人们! 祝愿你们发现大量漏洞并获得丰厚奖励! 虽然距离…...

kylin SP3安装mysql8.0.41

环境:OS:kylin SP3mysql:8.0.41 glibc2.17,建议安装glibc.2.28版本 查看系统glibc版本[root@localhost ~]# ldd --versionldd (GNU libc) 2.28Copyright (C) 2018 自由软件基金会。这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性或者适合某…...

DIFY 项目中通过 Makefile 调用 Dockerfile 并采用 sudo make build-web 命令构建 web 镜像的方法和注意事项

DIFY 项目中通过 Makefile 调用 Dockerfile 并采用 sudo make build-web 命令构建 web 镜像的方法和注意事项pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…...

代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素、209.长度最小的子数组

704. 二分查找 思路:刷过很多次了,就是双指针思想,初始化一个在数组最左边的指针index_l,一个在最右边的指针index_r,当index_l < index_r 的时候通过判断index_l 和 index_r所确定的区间,缩小区间,最后夹逼出我们的目标值。 注意的点:最终状态会有两个 :1.l与r相等…...

从 MLPerf Storage v2.0 看 AI 训练中的存储性能与扩展能力

8 月 5 日,全球权威 AI 工程联盟 MLCommons 发布了最新的 MLPerf Storage v2.0 基准测试结果。本次评测吸引了众多厂商参与,包括 Cloud、Shared File、Fabric-Attached Block、Direct-Attached Block 这几大类存储厂商。 由于各厂商在硬件配置、节点规模和应用场景上的差异,…...

Revit二次开发 钢筋生成API(二)

2、自由钢筋生成API 创建一条无约束的自由形状钢筋。之后无法对该钢筋添加约束。public static Rebar CreateFreeForm(Document doc,RebarBarType barType,Element host,IList<IList<Curve>> curves,out RebarFreeFormValidationResult error )这个合自由钢筋生成A…...

创建会计凭证报错:FI/CO接口:待更新的不一致的FI/CO凭证标题数据(转)

问题:使用过账BAPI_ACC_DOCUMENT_POST,自动过账时,报错原因是“FI/CO接口:待更新的不一致的FI/CO凭证标题数据”。 原因: 1、如果头数据里面的公司和行项目公司是一致的,检查行项目,不要对行项目赋公司bukrs。 "it_item-comp_code = wa_account-bukrs. 2、检查金额是…...

Uri uri = new Uri(Path); 这行代码的作用

1. 语法校验 字符串里只要多一个空格、少一个 /、中文没转义,后面 HttpClient 会直接炸。 Uri 构造函数会第一时间给你抛 UriFormatException,早发现早处理。 2. 把“一串字符”升级成“有结构的零件箱” 转成 Uri 后,你就能直接拿这些字段,而不用再 Substring、IndexOf 去…...

Qt函数方法传入参数未使用-警告warning错误error提示解决

前言全局说明某些情况下,函数(方法)会传入参数,但并不一定会使用, 但是,不使用编辑器又会警告一、说明 1.1 环境: Windows 7 旗舰版 Visual Studio 2013二、未使用参数解决 原型 Q_UNUSED(未使用参数)三、示例 3.1 文件名: public:MyThread(QWidget *parent = nullptr){Q_…...

mysql 性能监控,关键指标解析与优化案例剖析

你是否经历过数据库突然变慢却无从下手的困境?某金融平台曾因慢查询堆积导致交易响应暴增300%,某电商大促期间因缓冲池命中率骤降引发订单延迟。性能问题往往具备隐蔽性和突发性特征,本文将揭示MySQL监控的核心参数与实战诊断方法。 连接池监控是性能防护的第一道防线。Thre…...

设计模式

1.分类 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享 元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责…...

Rhinoceros 8.23.25251.13001 犀牛3D建模

描述 Rhinoceros 是由美国Robert McNeel公司最新出品的专业强大的3D建模软件。软件以集百家之长为一体的发展教育理念,拥有NURBS的优秀传统建模教学方法,也有一个网格进行建模插件T-Spline,使建模方式方法有了更多的挑选,然后能创建出更传神、生动的造型。能输入和输出几十…...

Git 常用操作指南

本文为你整理了 Git 的常用操作,无论你是刚接触 Git 还是需要快速查阅,这篇指南都能帮你高效管理代码版本。 🔧 初始配置 开始使用 Git 前,先配置你的用户信息: git config --global user.name "你的用户名" git config --global user.email "你的邮箱&qu…...

《深入理解计算机系统》计算机系统漫游(一) - Invinc

本文记录《深入理解计算机系统》中第1章 计算机系统漫游 的一些知识点。本文记录《深入理解计算机系统》中第1章 计算机系统漫游 的一些知识点。第1章 计算机系统漫游 信息就是位+上下文 系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的…...

从几何分离到语义理解:深度解析3D点云分割与语义分割的本质区别

在三维计算机视觉领域,3D点云作为真实世界场景的核心数据载体,其处理技术直接决定了机器感知环境的精度与效率。 其中,3D点云分割与语义分割是两类关键技术,尽管二者同属点云处理范畴,但在目标定位、信息输出与应用价值上存在本质差异。 前者专注于“几何层面的分离”,通…...

欧拉筛(线性筛)算法分析

前言对于寻找素数,第一时间想到的便是二重循环暴力查找,其复杂度O(n^2),通过循环中只判断到根号n可以优化一些,不过复杂度也达不到预期。在数论的学习中,我学到了埃氏筛法,O(nloglogn)的算法,而在一些数据范围达到1e7这样的题目中,也很难让人满意,于是我便学习了欧拉筛…...

2021年安徽省大数据与人工智能应用竞赛 大数据(网络赛)-高职组赛题

本套数据数据: 通过网盘分享的文件: 链接: https://pan.baidu.com/s/1ZQXoWQhCOAiGVcFOZozV1g?pwd=json 提取码: json 第二部分:大数据程序编写部分(30分) 任务一、数据抽取转化部分(5分) 1、使用sqoop将MySQL的sakila数据库中的city表中city列以C开头的数据导入到hdfs…...

Alexandresku设计的loki小对象内存分配器

Loki是由 Alexandresku 编写的一个与《Modern C++ Design》(C++设计新思维)一书配套发行的C++代码库。其中有两个文件 SmallObj.h 、SmallObj.cpp 进行内存管理,可以单独进行使用 三个class,第一层是chunk,第二层是vector<chunk> FixedAllocator,第三层是vector&l…...

C++ 内存管理

C++ 内存管理是程序设计的核心环节,直接影响程序的性能、稳定性和安全性。C++ 不像 Java、Python 等语言有自动垃圾回收机制,而是需要开发者手动管理动态内存(或通过智能指针等机制自动管理)。 1、C++ 内存分区内存区域 存储内容 生命周期 管理方式栈 (Stack) 函数参数、局…...

一些写了和没写的数学!

P8114 [Cnoi2021] 六边形战士 传送 非常好玩的题! 首先你大概率看过一些“无字证明”,其中很经典的是这个: 证明:用若干个边长为 \(1\),顶角为 \(60\) 度的菱形拼成一个边长为 \(n\) 的正六边形,三个方向的菱形个数一定相等。这是一个经典的无字证明,虽然前置的说明要费…...

【光照】[自发光Emission]以UnityURP为例

【从UnityURP开始探索游戏渲染】专栏-直达自发光的基本原理 $Cemissive=Memissive$ 自发光是物体表面主动发射光线的现象,在光照模型中通常作为独立于外部光源的附加项。其核心特点是不受其他光照影响,但可以影响周围环境。 实现流程‌定义发射颜色和强度‌:确定基础发光颜色…...

mybatis-plus初体验,解决报错Invalid value type for attribute factoryBeanObjectType: java.lang.String

解决报错Invalid value type for attribute factoryBeanObjectType: java.lang.String 推荐这位大佬的博客: https://www.cnblogs.com/muphy/p/18653627 项目结构MyBatis-Plus配置类MyBatisPlusConfig package com.example.config;import com.baomidou.mybatisplus.annotation…...

浅谈制氢电源及英飞凌解决方案

大家对氢元素肯定都不陌生,认识它基本都是从背元素周期表开始的。近年来我们身边多了很多氢的身影,从北京冬奥会的氢燃料电池大巴,再到广州南沙小虎岛电氢智慧能源站,氢也越来越被大家熟知。工业上,氢的使用可是一点都不少,自 1975 年以来,需求量增长了三倍,而且还在继…...

微算法科技(NASDAQ:MLGO)研究分布式量子计算,释放量子计算潜能

在信息时代,数据量呈指数级增长,经典计算机面临算力瓶颈。量子计算以其超强的并行处理能力,被视为下一世代计算范式的颠覆者。然而,单个量子处理器的脆弱性和制造难度限制了其广泛应用。微算法科技(NASDAQ:MLGO)研发团队研究通过分布式量子计算模型,将多个量子计算节点连…...

AI 重塑招聘三角:Moka 招聘智能体如何实现 HR、候选人与企业的三方共赢

AI 重塑招聘三角:Moka 招聘智能体如何实现 HR、候选人与企业的三方共赢在人才竞争进入白热化的今天,招聘早已不是 HR 单方面的 “筛选任务”,而是涉及 HR 效率、候选人体验、企业战略人才储备的三角关系。传统招聘模式下,这三角常常陷入 “HR 疲于奔命却难出成果、候选人等…...

Flash Attention原理

提出问题 Transformer 结构已成为自然语言处理和图像分类等应用中最常用的架构。尽管 Transformer 在规模上不断增大和加深,但处理更长上下文仍然是一个挑战,因为核心的自注意力模块在序列长度上具有二次方的时间和内存复杂度。这导致在处理长序列时速度变慢且内存需求巨大。…...

MSMQ 跨服务器读写队列的“消息队列系统的访问被拒绝”的解决方案

转:http://m.blog.csdn.net/blog/2000killer/8904852 在服务器上创建的Queue开发者的 机器只能写数据而不能读数据。.net给出的错误是“对消息队列系统的访问被拒绝”,也就是说拒绝访问队列没有相关权限,我给Everyone和 ANONYMOUS LOGON赋予全部权限都无法解决(正常情况下可…...

opencv学习记录1

img = cv2.imread(pic.jpg)#读图像 #封装函数 def cv_show(name,img):cv2.imshow(image,img)#显示图像cv2.waitKey(0)#显示时间cv2.destroyWindow()#读灰度图 img = cv2.imread(pic.jpg,cv2.IMREAD_GRAYSCALE) #保存 cv2.imwrite(name,img)#读视频 vc = cv2.VideoCapture(name)…...

kylin V10SP3安装mysql5.7.42

环境:OS:kylin V10SP3mysql:5.7.42查看系统glibc版本[root@localhost ~]# ldd --versionldd (GNU libc) 2.28Copyright (C) 2018 自由软件基金会。这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性或者适合某些特殊目的。由 Roland McGrath …...

MATLAB 仿真无线传感器网络(WSN)三大经典场景

一、统一参数区(建议先调这里) %% 0. 公共参数 clear; clc; close all; rng(2025) % 可重复 field = [0 100; 0 100]; % 100 m 100 m nNode = 200; % 节点数 R = 15; % 通信半径 /m E0 = 0.5; …...

9.05 DP 专题

Permutation Blackhole 按照过题人数顺序做题是这样的,如果要看难一点的建议向下 首先,不要读错题 QAQ 然后你现在发现每个位置只会在它被涂黑之前向最近放位置产生一次贡献,从 P 的角度思考是困难的,考虑从被涂黑的图的角度思考 你注意到我们每次涂完两个点之后,它们中间…...

MySQL主从复制 - 指南

MySQL主从复制 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14…...

阿里 Qoder 体验超预期,Repo Wiki 功能迎来全新升级

作者:沉默王二 大家好,我是二哥呀。 最近,阿里发布了一款名为 Qoder(/ˈkoʊdər/)的 Agentic 开发工具。我第一时间就去尝鲜了,其 Quest Mode 和 Repo Wiki 给我印象深刻。Quest Mode 主打一个 AI 自主研发,我们只需要把工程任务扔给他,Quest Mode 就会把模糊的需求翻…...

实用指南:ZooKeeper 的选举算法

实用指南:ZooKeeper 的选举算法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fon…...

JAVA获取keytab的Principal

依赖<dependency><groupId>org.apache.kerby</groupId><artifactId>kerb-client</artifactId><version>2.0.1</version></dependency> 代码执行Keytab keytab = Keytab.loadKeytab(new File("D:\\dl.keytab"));key…...