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)>10005. 识别路由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":"您的问题我暂时无法回答,您可以咨询车牌识别相关问题。"})六、部署与使用说明
- 后端启动:
python app.py - 前端启动:
npmrun serve - 使用流程:
- 注册账号并登录系统;
- 上传图片/视频进行车牌识别;
- 在历史记录中查看、导出识别结果;
- 使用AI助手咨询识别相关问题。
七、系统扩展建议
- 可接入OpenAI/DeepSeek API,升级AI助手为智能对话模式;
- 可增加实时摄像头流识别功能,对接监控设备;
- 可增加车牌黑白名单管理,实现自动告警功能。