ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于Python和Openmv车牌识别系统:TaoToken统一Key接入配置与验证

基于Python和Openmv车牌识别系统:TaoToken统一Key接入配置与验证 1. 从 OpenMV 到云端识别车牌系统为什么需要统一 Key做 OpenMV 车牌识别的人大多会经历一个很拧巴的阶段OpenMV 端能跑 Haar Cascade 把车牌框出来但框出来之后要识别内容就卡住了。嵌入式平台算力有限跑轻量 CNN 勉强跑成熟的 OCR 模型基本不现实。于是自然想到把裁剪出来的车牌图传到云端让云端 AI 做识别OpenMV 只负责采集和预处理。这个思路本身没问题问题出在接入环节。云端 AI 能力往往分散在不同平台车牌识别可能用一家通用 OCR 用另一家图像理解又换一家。每接一个服务就要注册一次、拿一次 Key、写一套鉴权逻辑代码里到处散落着不同的 base_url 和 token。对嵌入式项目来说这种碎片化接入特别难受因为 OpenMV 端资源紧张Python 端也不该把精力耗在管理多套凭证上。TaoToken 在这里的价值就是把这些云端 AI 调用收敛到一个统一入口。你只需要一个 Key通过一个兼容 OpenAI 风格的接口就能调用包括视觉理解在内的多种模型能力。对车牌识别场景来说OpenMV 采集图像、Python 端裁剪车牌区域、再通过 TaoToken 统一 Key 把图片发给云端模型做识别整条链路只需要维护一份配置。这篇就聚焦这个配置环节给你可复制的 config.toml 骨架、settings.json 片段以及连通性验证和报错排查的完整动作。适合谁看正在做 OpenMV 车牌识别、想把识别环节放到云端、又不想被多平台 Key 管理拖住的嵌入式视觉开发者。下面所有步骤都可以跟着做代码直接改改就能用。2. TaoToken 前置准备拿 Key 与理解接入形态在写配置之前先把 TaoToken 这边的准备工作做完。这一步不复杂但顺序别搞反否则后面配置文件里的字段会填错。2.1 注册与获取 API Key打开 TaoToken 官网完成账号注册后进入控制台。在控制台里找到 API Keys 管理页面创建一个新的 Key。这个 Key 就是你后面所有云端调用的唯一凭证Python 端和 OpenMV 端如果 OpenMV 也走网络请求都用它。创建时建议给 Key 起一个能区分用途的名字比如openmv-lpr这样以后如果有多个项目排查问题时能一眼看出是哪个项目在用。Key 创建后只显示一次复制下来存到安全的地方不要直接硬编码进要提交到 Git 的代码里。2.2 接入地址与接口形态TaoToken 的 API 入口是https://taotoken.net/api接口形态兼容 OpenAI 风格。这意味着你原来用 openai 这个 Python 库写的调用代码只需要改base_url和api_key两个地方其余请求结构基本不用动。对车牌识别来说你要用的是支持图像输入的模型把车牌裁剪图以 base64 或者图片 URL 的形式传进去让模型返回车牌号码文本。这里有个认知要先建立TaoToken 是统一接入层不是替代你本地的 OpenMV 或 OpenCV。图像采集、车牌定位、裁剪这些还是在你本地做TaoToken 负责的是“把裁剪好的车牌图变成车牌号文本”这一步。分工清楚了配置才不会写乱。2.3 模型选择的基本判断车牌识别对模型的要求是能读图、能输出结构化文本、对数字和字母的识别要准。你在 TaoToken 的模型列表里选一个支持视觉输入的模型即可。具体模型名称以控制台和文档里列出的为准不要凭记忆写。选好之后把模型名记下来后面要填进配置文件。如果你还想在识别之后做点后处理比如把车牌号存进数据库、和已存车牌做比对这些逻辑放在 Python 端做不需要再额外调模型。发挥部分要求存 100 个以上车牌做比对用本地 SQLite 或直接写文件都行和 TaoToken 的调用是解耦的。3. 可复制配置config.toml 骨架与 settings.json 片段这一节是重点给你两份可直接复制的配置。一份是 Python 端用的config.toml一份是 OpenMV 端或项目级用的settings.json。两份配置的字段含义我会逐个说明你按自己的实际情况改。3.1 config.toml 骨架# config.toml # OpenMV 车牌识别系统 - TaoToken 统一接入配置 [taotoken] # TaoToken API 入口不要加末尾斜杠 base_url https://taotoken.net/api # 从控制台创建的 API Key建议用环境变量注入 api_key sk-你的Key # 视觉理解模型名称以控制台文档为准 model 你的视觉模型名 # 单次请求超时车牌识别图片不大30 秒足够 timeout 30 # 失败重试次数嵌入式网络不稳给 2 次 max_retries 2 [image] # OpenMV 采集分辨率和你的摄像头设置保持一致 capture_width 320 capture_height 240 # 车牌裁剪后保存的临时目录 crop_dir ./crops # 传给云端前是否压缩压缩能省流量但可能影响识别 compress true # 压缩后 JPEG 质量1-100 jpeg_quality 85 [recognition] # 识别结果里期望的字符集中国车牌常见字符 charset 京沪粤苏浙鲁豫川渝鄂湘皖闽赣冀晋辽吉黑桂云贵陕甘青宁新藏琼津蒙 # 是否在识别后做本地比对 enable_local_match true # 本地车牌库文件路径 plate_db ./plates.db [logging] level INFO log_file ./lpr.log这份配置里[taotoken]段是核心。base_url固定填https://taotoken.net/apiapi_key填你创建的那个 Key。model字段一定要去控制台或文档确认不要自己猜一个名字填进去否则请求会返回模型不存在的错误。[image]段控制图像处理。OpenMV 常用分辨率是 320x240 或 640x480你按实际设置填。compress和jpeg_quality这两个参数在嵌入式场景下很关键因为 OpenMV 的网络传输带宽有限传原图可能很慢压缩到 85 质量通常对车牌识别影响不大但流量能省不少。[recognition]段里的charset是给后处理用的模型返回的文本可能包含一些噪声字符你可以用这个字符集做过滤。enable_local_match和plate_db对应发挥部分的比对需求。3.2 settings.json 片段如果你的项目里 OpenMV 端或上层应用需要读 JSON 配置可以用下面这份。它和 config.toml 是互补关系字段有重叠但用途不同。{ taotoken: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, model: 你的视觉模型名, endpoint_chat: /v1/chat/completions }, openmv: { uart_baud: 115200, frame_width: 320, frame_height: 240, cascade_file: cascade_plate.cascade }, pipeline: { detect_on_device: true, recognize_on_cloud: true, save_crop: true, crop_format: jpg } }注意api_key_env这个字段它指向的是环境变量名而不是 Key 本身。这是更安全的做法把 Key 放在环境变量里配置文件里只写变量名。Python 端用os.environ.get(TAOTOKEN_API_KEY)读取这样配置文件即使被看到也不会泄露 Key。endpoint_chat填/v1/chat/completions这是 OpenAI 风格的对话补全接口路径拼接在base_url后面就是完整的请求地址。pipeline段描述了整条链路的分工设备端做检测云端做识别裁剪图保存下来方便调试。3.3 环境变量注入 Key不要把 Key 写死在代码或配置文件里。Linux 或 macOS 下可以这样设置export TAOTOKEN_API_KEYsk-你的KeyWindows PowerShell$env:TAOTOKEN_API_KEYsk-你的Key然后在 Python 里读取import os api_key os.environ.get(TAOTOKEN_API_KEY) if not api_key: raise RuntimeError(TAOTOKEN_API_KEY 未设置请先注入环境变量)这样你的代码可以安全地提交到仓库Key 留在本地环境里。4. 验证请求从一张车牌图到识别结果配置写好了接下来要验证整条链路能不能通。我建议分两步走先用一张本地图片做最小验证确认 TaoToken 调用没问题再把 OpenMV 采集的图接进来确认端到端流程。4.1 最小验证脚本先写一个不依赖 OpenMV 的脚本用一张本地车牌图测试 TaoToken 调用。这样能把“配置问题”和“OpenMV 问题”分开排查。import os import base64 import json import requests BASE_URL https://taotoken.net/api API_KEY os.environ.get(TAOTOKEN_API_KEY) MODEL 你的视觉模型名 def encode_image(path): with open(path, rb) as f: return base64.b64encode(f.read()).decode(utf-8) def recognize_plate(image_path): img_b64 encode_image(image_path) url f{BASE_URL}/v1/chat/completions headers { Authorization: fBearer {API_KEY}, Content-Type: application/json } payload { model: MODEL, messages: [ { role: user, content: [ {type: text, text: 请识别这张图片中的车牌号码只返回车牌号文本。}, {type: image_url, image_url: {url: fdata:image/jpeg;base64,{img_b64}}} ] } ], max_tokens: 64 } resp requests.post(url, headersheaders, jsonpayload, timeout30) resp.raise_for_status() data resp.json() return data[choices][0][message][content] if __name__ __main__: result recognize_plate(./test_plate.jpg) print(识别结果:, result)运行前确认test_plate.jpg存在且环境变量已设置。如果返回类似京A12345的文本说明 TaoToken 这条链路是通的。4.2 接入 OpenMV 采集流程最小验证通过后把 OpenMV 采集的图接进来。OpenMV 端负责检测车牌并裁剪裁剪后的图通过串口或文件传给 Python 端Python 端再调 TaoToken。OpenMV 端裁剪车牌的伪代码逻辑import sensor, image, time sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.set_windowing((320, 240)) sensor.skip_frames(time2000) plate_cascade image.HaarCascade(cascade_plate.cascade, stages25) while True: img sensor.snapshot() plates img.find_features(plate_cascade, threshold0.5, scale_factor1.2) for p in plates: crop img.copy(roip) crop.save(/sd/crop_%d.jpg % time.ticks_ms()) time.sleep_ms(500)裁剪图存到 SD 卡后Python 端轮询目录把新出现的裁剪图送去识别。这样 OpenMV 端只做它擅长的检测识别交给云端分工清晰。4.3 识别结果与本地比对识别返回后把车牌号写进本地库并和已有车牌比对。发挥部分要求存 100 个以上车牌用 SQLite 很合适import sqlite3 def init_db(path./plates.db): conn sqlite3.connect(path) conn.execute( CREATE TABLE IF NOT EXISTS plates ( id INTEGER PRIMARY KEY AUTOINCREMENT, plate_no TEXT NOT NULL, capture_time TEXT NOT NULL, image_path TEXT ) ) conn.commit() return conn def save_plate(conn, plate_no, capture_time, image_path): conn.execute( INSERT INTO plates (plate_no, capture_time, image_path) VALUES (?, ?, ?), (plate_no, capture_time, image_path) ) conn.commit() def is_duplicate(conn, plate_no): cur conn.execute(SELECT COUNT(*) FROM plates WHERE plate_no ?, (plate_no,)) return cur.fetchone()[0] 0这样每次识别到车牌先查重再决定是否入库。100 条数据对 SQLite 来说毫无压力。5. 本篇常见错排查配置和验证过程中最容易踩的坑集中在几个地方。下面按报错现象来排查。5.1 401 Unauthorized这是最常见的错误基本是 Key 的问题。检查三件事环境变量TAOTOKEN_API_KEY是否真的设置成功用echo $TAOTOKEN_API_KEY确认Key 是否复制完整有没有多空格或少字符请求头里Authorization的格式是否是Bearer sk-xxxBearer和 Key 之间有一个空格。如果环境变量在终端里设置了但 Python 脚本读不到可能是脚本运行在不同的 shell 会话里。可以在脚本开头打印os.environ.get(TAOTOKEN_API_KEY)的前几位确认。5.2 404 Not Found 或模型不存在先确认base_url是https://taotoken.net/api没有多余斜杠也没有拼错。再确认model字段填的模型名在控制台里确实存在。模型名是大小写敏感的不要自己改写。如果接口路径拼出来是https://taotoken.net/api/v1/chat/completions这是正确的如果变成https://taotoken.net/api//v1/...双斜杠说明 base_url 末尾多了斜杠。5.3 请求超时嵌入式场景网络不稳超时很常见。先把timeout从 30 调到 60 试试。如果还是超时检查图片是不是太大。OpenMV 裁剪出来的图如果没压缩可能几百 KB传输慢。把compress设为 truejpeg_quality降到 80 左右通常能明显改善。另外确认设备所在网络能正常访问外网DNS 解析是否正常。5.4 返回内容不是车牌号模型返回了文本但不是你想要的车牌号可能是提示词不够明确。把提示词改成“只返回车牌号码文本不要任何解释”并在后处理里用charset过滤非车牌字符。如果返回的是空内容检查max_tokens是不是设得太小64 一般够用但有些模型可能需要更大。5.5 OpenMV 端找不到 cascade 文件OpenMV 的 Haar Cascade 文件需要是它自己能读的格式不能直接用 OpenCV 的 XML。官方提供了转换脚本把 OpenCV 的 cascade 转成 OpenMV 可读的格式后再放到 SD 卡根目录。文件名要和代码里image.HaarCascade(cascade_plate.cascade)一致路径也要对。5.6 裁剪图质量太差导致识别不准车牌裁剪区域如果太小、太模糊、或者光照不均云端模型也识别不出来。在 OpenMV 端裁剪时把 ROI 稍微放大一点给车牌留点边距。另外确认摄像头对焦正常必要时加补光灯。识别不准时先把裁剪图存下来人工看一眼图本身清楚但识别错才是模型或提示词的问题。6. 接入文档与后续调用入口配置跑通之后你可能会想调整模型、换提示词、或者把识别能力接到更多场景里。这时候直接查接入文档最省事里面有完整的接口说明和参数列表。接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite模型对话体验https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite如果你后面想把车牌识别扩展成更完整的编码辅助或 Agent 流程比如识别结果自动触发某些操作可以看看 Coding PlanCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite控制台入口在这里Key 管理和用量查看都在里面控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite整条链路的核心就一句话OpenMV 负责看Python 负责传TaoToken 统一 Key 负责把图变成车牌号。配置写对一次后面加功能就是改改提示词和模型名的事。
返回列表