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

YOLOv5+Web车牌识别系统 人工智能+YOLO AI对话功 能 用户登录注册 视频 图片识别 AI对话功能 识别结果保存与导出 YOLOV5车牌识别检测系统

深度学习-YOLOv5+Web车牌识别系统

功能点:
用户登录注册

视频 图片识别

AI对话功能

识别结果保存与导出
1

YOLOv5+Web车牌识别系统 完整实现方案

一、系统功能架构

模块核心功能
用户模块登录、注册、权限控制
识别模块图片车牌检测+OCR识别、视频流实时识别
结果管理识别记录存储、CSV导出、历史查询
扩展功能AI对话助手(解答识别问题、提供使用指导)

二、环境依赖安装

# 后端依赖pipinstallflask flask_sqlalchemy flask_login ultralytics paddleocr opencv-python pandas# 前端依赖(Node.js环境)npminstallvue@3 element-plus axios

三、后端核心代码实现(Flask)

1. 项目结构

license_recognition_system/ ├── app.py # 主程序入口 ├── models/ │ ├── user.py # 用户模型 │ └── record.py # 识别记录模型 ├── routes/ │ ├── auth.py # 登录注册路由 │ ├── recognition.py # 车牌识别路由 │ └── ai_chat.py # AI对话路由 ├── utils/ │ ├── license_detector.py # YOLOv5+OCR识别工具 │ └── file_handler.py # 文件上传/导出工具 └── static/ └── uploads/ # 上传文件存储目录

2. 主程序入口app.py

fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyfromflask_loginimportLoginManagerfromroutes.authimportauth_bpfromroutes.recognitionimportrec_bpfromroutes.ai_chatimportai_bp app=Flask(__name__)app.config['SECRET_KEY']='your_secret_key'app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///license.db'app.config['UPLOAD_FOLDER']='static/uploads'db=SQLAlchemy(app)login_manager=LoginManager(app)login_manager.login_view='auth.login'# 注册蓝图app.register_blueprint(auth_bp,url_prefix='/api/auth')app.register_blueprint(rec_bp,url_prefix='/api/recognition')app.register_blueprint(ai_bp,url_prefix='/api/ai')if__name__=='__main__':app.run(debug=True)

3. 用户与记录模型models/__init__.py

fromappimportdbfromflask_loginimportUserMixinfromdatetimeimportdatetimeclassUser(UserMixin,db.Model):id=db.Column(db.Integer,primary_key=True)username=db.Column(db.String(50),unique=True,nullable=False)password=db.Column(db.String(100),nullable=False)records=db.relationship('RecognitionRecord',backref='user',lazy=True)classRecognitionRecord(db.Model):id=db.Column(db.Integer,primary_key=True)user_id=db.Column(db.Integer,db.ForeignKey('user.id'),nullable=False)file_name=db.Column(db.String(100),nullable=False)license_plate=db.Column(db.String(20),nullable=False)plate_color=db.Column(db.String(10),nullable=False)confidence=db.Column(db.Float,nullable=False)create_time=db.Column(db.DateTime,default=datetime.now)

4. 车牌识别工具utils/license_detector.py

fromultralyticsimportYOLOfrompaddleocrimportPaddleOCRimportcv2importnumpyasnpclassLicensePlateDetector:def__init__(self,model_path="best.pt"):self.model=YOLO(model_path)self.ocr=PaddleOCR(use_angle_cls=True,lang='ch',show_log=False)defdetect_license(self,image_path):# YOLOv5检测车牌位置results=self.model(image_path,conf=0.5)img=cv2.imread(image_path)forresultinresults:forboxinresult.boxes:x1,y1,x2,y2=map(int,box.xyxy[0])plate_roi=img[y1:y2,x1:x2]# OCR识别车牌文字ocr_result=self.ocr.ocr(plate_roi,cls=True)ifocr_resultandocr_result[0]:license_num=ocr_result[0][0][1][0]confidence=ocr_result[0][0][1][1]# 识别车牌颜色(简化实现)hsv=cv2.cvtColor(plate_roi,cv2.COLOR_BGR2HSV)color="蓝色"ifself.is_blue_plate(hsv)else"绿色"returnlicense_num,color,confidencereturnNone,None,0.0defis_blue_plate(self,hsv_img):# 简化的车牌颜色判断blue_lower=np.array([100,43,46])blue_upper=np.array([124,255,255])mask=cv2.inRange(hsv_img,blue_lower,blue_upper)returncv2.countNonZero(mask)>1000

5. 识别路由routes/recognition.py

fromflaskimportBlueprint,request,jsonify,current_appfromflask_loginimportlogin_required,current_userfromwerkzeug.utilsimportsecure_filenamefrommodelsimportdb,RecognitionRecordfromutils.license_detectorimportLicensePlateDetectorimportosimportpandasaspd rec_bp=Blueprint('recognition',__name__)detector=LicensePlateDetector()@rec_bp.route('/upload/image',methods=['POST'])@login_requireddefupload_image():if'file'notinrequest.files:returnjsonify({"code":400,"msg":"未上传文件"})file=request.files['file']filename=secure_filename(file.filename)save_path=os.path.join(current_app.config['UPLOAD_FOLDER'],filename)file.save(save_path)# 车牌识别license_num,color,confidence=detector.detect_license(save_path)ifnotlicense_num:returnjsonify({"code":400,"msg":"未检测到车牌"})# 保存记录record=RecognitionRecord(user_id=current_user.id,file_name=filename,license_plate=license_num,plate_color=color,confidence=confidence)db.session.add(record)db.session.commit()returnjsonify({"code":200,"data":{"license_num":license_num,"color":color,"confidence":confidence}})@rec_bp.route('/records',methods=['GET'])@login_requireddefget_records():records=RecognitionRecord.query.filter_by(user_id=current_user.id).all()data=[{"id":r.id,"file_name":r.file_name,"license_plate":r.license_plate,"plate_color":r.plate_color,"confidence":r.confidence,"create_time":r.create_time.strftime("%Y-%m-%d %H:%M:%S")}forrinrecords]returnjsonify({"code":200,"data":data})@rec_bp.route('/export',methods=['GET'])@login_requireddefexport_records():records=RecognitionRecord.query.filter_by(user_id=current_user.id).all()df=pd.DataFrame([{"文件名":r.file_name,"车牌号码":r.license_plate,"车牌颜色":r.plate_color,"置信度":r.confidence,"识别时间":r.create_time.strftime("%Y-%m-%d %H:%M:%S")}forrinrecords])csv_path=os.path.join(current_app.config['UPLOAD_FOLDER'],"records.csv")df.to_csv(csv_path,index=False,encoding="utf-8-sig")returnjsonify({"code":200,"url":"/static/uploads/records.csv"})

四、前端核心代码实现(Vue3+Element Plus)

1. 登录注册页面src/views/Login.vue

<template> <div class="login-container"> <div class="login-box"> <h2>用户登录</h2> <el-form :model="form" label-width="80px"> <el-form-item label="用户名"> <el-input v-model="form.username" placeholder="请输入用户名"></el-input> </el-form-item> <el-form-item label="密码"> <el-input v-model="form.password" type="password" placeholder="请输入密码"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="handleLogin">登录</el-button> <el-button @click="goRegister">注册新账号</el-button> </el-form-item> </el-form> </div> </div> </template> <script setup> import { ref } from 'vue' import { useRouter } from 'vue-router' import axios from 'axios' const router = useRouter() const form = ref({ username: '', password: '' }) const handleLogin = async () => { const res = await axios.post('/api/auth/login', form.value) if (res.data.code === 200) { localStorage.setItem('token', res.data.token) router.push('/home') } } const goRegister = () => { router.push('/register') } </script>

2. 图片/视频识别页面src/views/Recognition.vue

<template> <div class="recognition-container"> <el-card title="图片检测"> <el-upload action="/api/recognition/upload/image" :headers="headers" :on-success="handleSuccess" list-type="picture" > <el-button type="primary">上传图片</el-button> </el-upload> <div v-if="result"> <p>车牌号码: {{ result.license_num }}</p> <p>车牌颜色: {{ result.color }}</p> <p>置信度: {{ (result.confidence*100).toFixed(2) }}%</p> </div> </el-card> <el-card title="视频检测" style="margin-top:20px"> <el-upload action="/api/recognition/upload/video" :headers="headers" list-type="video" > <el-button type="success">上传视频</el-button> </el-upload> </el-card> </div> </template> <script setup> import { ref } from 'vue' const headers = { Authorization: `Bearer ${localStorage.getItem('token')}` } const result = ref(null) const handleSuccess = (res) => { if (res.code === 200) { result.value = res.data } } </script>

3. 历史记录与导出页面src/views/Records.vue

<template> <div class="records-container"> <el-button type="success" @click="exportCSV">下载CSV</el-button> <el-table :data="records" border style="margin-top:20px"> <el-table-column prop="file_name" label="图片名"></el-table-column> <el-table-column prop="license_plate" label="车牌号码"></el-table-column> <el-table-column prop="plate_color" label="车牌颜色"></el-table-column> <el-table-column prop="confidence" label="置信度"> <template #default="scope"> {{ (scope.row.confidence*100).toFixed(2) }}% </template> </el-table-column> <el-table-column prop="create_time" label="识别时间"></el-table-column> </el-table> </div> </template> <script setup> import { ref, onMounted } from 'vue' import axios from 'axios' const records = ref([]) const headers = { Authorization: `Bearer ${localStorage.getItem('token')}` } onMounted(async () => { const res = await axios.get('/api/recognition/records', { headers }) records.value = res.data.data }) const exportCSV = async () => { const res = await axios.get('/api/recognition/export', { headers }) window.open(res.data.url) } </script>

五、AI对话助手功能实现(简化版)

1. 对话路由routes/ai_chat.py

fromflaskimportBlueprint,request,jsonifyimportrandom ai_bp=Blueprint('ai_chat',__name__)# 预设回复库replies={"车牌识别":"系统使用YOLOv5检测车牌位置,结合PaddleOCR识别文字,支持蓝/绿牌识别。","置信度":"置信度表示识别结果的可信度,越高代表结果越可靠。","使用方法":"您可以上传图片或视频,系统会自动识别车牌并保存记录。"}@ai_bp.route('/chat',methods=['POST'])defchat():question=request.json.get('question','')forkey,replyinreplies.items():ifkeyinquestion:returnjsonify({"code":200,"reply":reply})returnjsonify({"code":200,"reply":"您的问题我暂时无法回答,您可以咨询车牌识别相关问题。"})

六、部署与使用说明

  1. 后端启动
    python app.py
  2. 前端启动
    npmrun serve
  3. 使用流程
    • 注册账号并登录系统;
    • 上传图片/视频进行车牌识别;
    • 在历史记录中查看、导出识别结果;
    • 使用AI助手咨询识别相关问题。

七、系统扩展建议

  • 可接入OpenAI/DeepSeek API,升级AI助手为智能对话模式;
  • 可增加实时摄像头流识别功能,对接监控设备;
  • 可增加车牌黑白名单管理,实现自动告警功能。
http://www.jsqmd.com/news/1148213/

相关文章:

  • 5分钟掌握专业网络测速:Windows版iperf3完全解析
  • League Akari工具包深度解析:基于LCU API的模块化架构设计与技术实现
  • 时间序列进阶:特征工程/多步预测/异常检测
  • boost 双oo发音规律拆解
  • .NET CAP入门到入土
  • Bun.js 集成了 SQL/Redis/S3,为什么 Java/Go/Python 不集成?
  • 嘉祥整牙哪家最靠谱
  • 振弦采集仪与倾角计技术差异分析:从底层原理到工程选型对照
  • LinkSwift:九大网盘直链下载助手,让文件下载回归简单高效
  • OpenClaw 2.7.9 网关离线、安装报错全套故障解决办法
  • AI助手引发重大变革,谁能掌控“设备联盟”赢得平台之战?
  • 数屿医械数据库 2023 版:3 步精准查询最新二类医疗器械目录(附导出指南)
  • Windows网络性能诊断:iperf3预编译版深度探索与实战应用
  • 每个开发者都该有一个本地工具箱,我造了一个
  • 射频功率放大器温补简略
  • 爆肝万字!C++ Stack/Queue/Priority_queue 从入门到源码手撕,仿函数 + 容器适配器 + 二叉堆,面试吊打 99% 人!
  • IQR与MAD异常值检测实战:3种数据分布场景下的Python代码与效果对比
  • 音频剪辑革命:5分钟掌握Audio Slicer智能分割技巧
  • Tor网桥方法
  • Claude Code技能库:扩展AI代理能力的即插即用解决方案
  • Windows系统文件CIWmi.dll丢失找不到问题解决
  • m4s-converter:跨平台B站缓存视频转换解决方案
  • 5 分钟跑通你的第一个 AI Agent
  • 补时绝杀:西蒙谷的最后一舞,与马丁内斯没能兑现的空霸蓝图
  • HarmonyOS7 数据看板卡片布局:flexBasis 比固定宽度更顺手
  • 终极指南:彻底解决macOS系统下SMAPI启动失败的5种方法
  • HarmonyOS7 ArkUI 实战:Flex Row 商品信息卡片不被长文案挤变形
  • 基于C语言实现(控制台)中小型饭店的点餐系统
  • 开源项目 Riddle 让 Remarkable 电子墨水屏平板秒变“邪恶日记”,能与你对话!
  • openEuler AI-tools实战:如何训练97%准确率的验证码识别模型