使用YOLOv8在Veri-776车辆重识别数据集上进行训练 通过训练的权重推理识别检测 车辆的品牌、型号、车牌、颜色、年份、时空关系
文章目录
- 1. 安装 CUDA 驱动
- 2. 安装 Anaconda
- 3. 创建 Python 虚拟环境
- 4. 安装必要的依赖项
- 5. 准备数据
- 6. 使用官方预训练模型
- 7. 训练模型
- 8. 推理代码
- 9. 评估代码
- ✅ 一、系统功能概述
- 🧰 二、环境依赖
- 📁 三、项目结构
- 🚀 四、Flask 主程序 (`app.py`)
- 🖼️ 五、前端页面 (`templates/index.html`)
- 🎨 六、样式文件 (`static/css/style.css`)
数据集描述:
Veri-776车辆重识别数据集
训练集37778测试集11579
由776辆汽车的50000张图像组成,其中每个ID由2~18个样本组成,对车辆的品牌、型号、车牌、颜色、年份、时空关系等都进行了标注。每张图像分辨率为1920*1080。
1
1
1
YOLOv8 对 Veri-776 车辆重识别数据集进行训练、推理和评估,我们需要完成一系列步骤,包括安装必要的软件、配置环境、准备数据以及编写训练、推理和评估代码。以下是详细的指南:
1. 安装 CUDA 驱动
确保你的系统已经安装了适合你 GPU 的最新版本的 NVIDIA CUDA 驱动程序。你可以从 NVIDIA官网 下载并安装。
2. 安装 Anaconda
下载并安装最新版本的 Anaconda,这是一个开源的Python和R语言的发行版,用于大规模数据处理、预测分析和科学计算。
3. 创建 Python 虚拟环境
打开终端或命令提示符,创建一个新的虚拟环境,并激活它:
conda create-nyolov8_veripython=3.8-yconda activate yolov8_veri4. 安装必要的依赖项
在激活的虚拟环境中安装 PyTorch 和其他必要的库:
pipinstalltorch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117 pipinstallultralytics opencv-python matplotlib tqdm注意:根据你的CUDA版本调整PyTorch的安装链接。
5. 准备数据
已经有Veri-776数据集,你需要将其组织为YOLOv8可接受的格式。通常需要将图像文件放置在一个文件夹中,并创建一个与之对应的标签文件夹,其中包含每个图像的标注信息(如车辆边界框和类别ID)。
6. 使用官方预训练模型
首先,确保你已经克隆了 YOLOv8 的仓库到本地:
gitclone https://github.com/ultralytics/ultralytics.gitcdultralytics加载官方提供的预训练模型:
fromultralyticsimportYOLO# 加载预训练模型model=YOLO('yolov8n.pt')# 或者选择其他尺寸的预训练模型7. 训练模型
创建一个train.py文件来定义训练过程:
fromultralyticsimportYOLOdeftrain_yolo():model=YOLO('yolov8n.yaml')# 如果要从头开始训练,可以指定yaml配置文件results=model.train(data='path/to/veri776/data.yaml',epochs=100,imgsz=640)if__name__=='__main__':train_yolo()确保你已经准备好了一个名为data.yaml的文件,该文件指定了训练和验证数据集的位置,以及类的数量和名称。
8. 推理代码
创建一个detect.py文件来进行推理:
fromultralyticsimportYOLOimportcv2defdetect_yolo(image_path):model=YOLO('runs/train/exp/weights/best.pt')# 替换为你的最佳权重路径results=model.predict(source=image_path,save=True)if__name__=='__main__':detect_yolo('path/to/test/image.jpg')9. 评估代码
YOLOv8 提供了内置的评估函数,可以直接调用:
fromultralyticsimportYOLOdefevaluate_yolo():model=YOLO('runs/train/exp/weights/best.pt')# 替换为你的最佳权重路径metrics=model.val()# 自动对验证集进行评估if__name__=='__main__':evaluate_yolo()根据你已有的训练好的 YOLOv8 权重文件,我们可以建立一个完整的车辆识别系统,用于识别图像、视频或实时摄像头画面中的车辆,并展示检测结果。以下是一个基于 Flask 框架的 Web 识别系统的完整实现方案,包括:
- 前端页面上传图片/视频
- 后端调用 YOLOv8 模型进行检测
- 显示检测结果图像
- 支持摄像头实时识别(可选)
✅ 一、系统功能概述
| 功能 | 描述 |
|---|---|
| 图像检测 | 上传图片进行车辆识别 |
| 视频检测 | 上传视频进行帧级识别 |
| 实时摄像头检测 | 打开摄像头实时识别 |
| 检测结果显示 | 显示识别结果图像 |
| 模型权重加载 | 使用训练好的best.pt文件 |
🧰 二、环境依赖
确保你已经安装了以下依赖:
pipinstallflask opencv-python ultralytics numpy📁 三、项目结构
vehicle_recognition_system/ ├── app.py # Flask 主程序 ├── static/ │ ├── uploads/ # 用户上传的图片/视频 │ ├── detections/ # 检测结果保存路径 │ └── css/ │ └── style.css # 网页样式 ├── templates/ │ └── index.html # 前端页面 └── models/ └── best.pt # 你的训练好的YOLOv8权重文件🚀 四、Flask 主程序 (app.py)
fromflaskimportFlask,render_template,request,jsonifyimportcv2fromultralyticsimportYOLOimportnumpyasnpimportos app=Flask(__name__)app.config['UPLOAD_FOLDER']='static/uploads'app.config['DETECTION_FOLDER']='static/detections'# 加载模型model=YOLO('models/best.pt')@app.route('/')defindex():returnrender_template('index.html')@app.route('/load_model',methods=['POST'])defload_model():globalmodelreturnjsonify({'status':'Model loaded'})@app.route('/detect_image',methods=['POST'])defdetect_image():if'file'notinrequest.files:returnjsonify({'error':'No file uploaded'})file=request.files['file']iffile.filename=='':returnjsonify({'error':'Empty filename'})# 保存原始图像original_path=os.path.join(app.config['UPLOAD_FOLDER'],file.filename)file.save(original_path)# 检测图像results=model(original_path)forrinresults:im=r.plot()im=cv2.cvtColor(im,cv2.COLOR_BGR2RGB)detected_path=os.path.join(app.config['DETECTION_FOLDER'],file.filename)cv2.imwrite(detected_path,im)returnjsonify({'original':file.filename,'detected':file.filename})@app.route('/detect_video',methods=['POST'])defdetect_video():if'file'notinrequest.files:returnjsonify({'error':'No file uploaded'})file=request.files['file']iffile.filename=='':returnjsonify({'error':'Empty filename'})# 保存原始视频original_path=os.path.join(app.config['UPLOAD_FOLDER'],file.filename)file.save(original_path)cap=cv2.VideoCapture(original_path)fourcc=cv2.VideoWriter_fourcc(*'mp4v')output_path=os.path.join(app.config['DETECTION_FOLDER'],file.filename)out=cv2.VideoWriter(output_path,fourcc,20.0,(int(cap.get(3)),int(cap.get(4))))whilecap.isOpened():ret,frame=cap.read()ifnotret:breakresults=model(frame)forrinresults:im=r.plot()im=cv2.cvtColor(im,cv2.COLOR_BGR2RGB)out.write(im)cap.release()out.release()returnjsonify({'original':file.filename,'detected':file.filename})@app.route('/open_camera',methods=['POST'])defopen_camera():cap=cv2.VideoCapture(0)whileTrue:ret,frame=cap.read()ifnotret:breakresults=model(frame)forrinresults:im=r.plot()im=cv2.cvtColor(im,cv2.COLOR_BGR2RGB)cv2.imshow('Vehicle Detection',im)ifcv2.waitKey(1)==ord('q'):breakcap.release()cv2.destroyAllWindows()returnjsonify({'status':'Camera closed'})if__name__=='__main__':os.makedirs(app.config['UPLOAD_FOLDER'],exist_ok=True)os.makedirs(app.config['DETECTION_FOLDER'],exist_ok=True)app.run(debug=True)🖼️ 五、前端页面 (templates/index.html)
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>车辆识别系统</title><linkrel="stylesheet"href="{{ url_for('static', filename='css/style.css') }}"></head><body><divclass="container"><h1>车辆识别系统</h1><divclass="control-panel"><h2>控制面板</h2><buttononclick="loadModel()">加载模型</button><buttononclick="uploadImage()">图像检测</button><buttononclick="uploadVideo()">视频检测</button><buttononclick="openCamera()">打开摄像头</button><inputtype="file"id="imageInput"accept="image/*"onchange="detectImage()"hidden><inputtype="file"id="videoInput"accept="video/*"onchange="detectVideo()"hidden></div><divclass="display-area"><divclass="image-container"><h3>原始图像</h3><imgid="originalImage"src=""alt="Original Image"></div><divclass="image-container"><h3>检测图像</h3><imgid="detectedImage"src=""alt="Detected Image"></div></div></div><script>functionloadModel(){fetch('/load_model',{method:'POST'}).then(res=>res.json()).then(console.log);}functionuploadImage(){document.getElementById('imageInput').click();}functiondetectImage(){constfile=document.getElementById('imageInput').files[0];constformData=newFormData();formData.append('file',file);fetch('/detect_image',{method:'POST',body:formData}).then(res=>res.json()).then(data=>{document.getElementById('originalImage').src='/static/uploads/'+data.original;document.getElementById('detectedImage').src='/static/detections/'+data.detected;});}functionuploadVideo(){document.getElementById('videoInput').click();}functiondetectVideo(){constfile=document.getElementById('videoInput').files[0];constformData=newFormData();formData.append('file',file);fetch('/detect_video',{method:'POST',body:formData}).then(res=>res.json()).then(data=>{document.getElementById('originalImage').src='/static/uploads/'+data.original;document.getElementById('detectedImage').src='/static/detections/'+data.detected;});}functionopenCamera(){fetch('/open_camera',{method:'POST'});}</script></body></html>🎨 六、样式文件 (static/css/style.css)
body{font-family:Arial,sans-serif;background-color:#f4f4f4;margin:0;padding:0;}.container{width:90%;margin:auto;overflow:hidden;padding:20px;}.control-panel{margin-bottom:20px;}.display-area{display:flex;justify-content:space-around;align-items:center;flex-wrap:wrap;}.image-container{margin:10px;text-align:center;border:1px solid #ccc;padding:10px;background:white;width:40%;}img{max-width:100%;height:auto;}、