如何使用YOLOv8模型对无人机视角下车辆红外识别数据集进行目标检测任务的基本框架 无人机红外车辆检测数据集的训练及应用
文章目录
数据集描述:
无人机视角下的车辆红外YOLO识别数据集 4类,
truck --卡车
car – 汽车
van – 货车
bus --公交车 图片17956张。数据集按7:2:1分配。其中 训练集12569张图片,测试集3591张,验证集1796张图片。 数据集可直接训练。 下面是yolov11n训练好的结果,mAP86.1。
1
为了使用YOLOv8对无人机视角下的车辆红外识别数据集进行训练、推理和评估,我们将按照以下步骤操作。该数据集包括4种类别的车辆:卡车(truck)、汽车(car)、货车(van)和公交车(bus),共有17956张图片,并按7:2:1的比例分配为训练集、测试集和验证集。
一、环境准备
安装CUDA驱动
确保系统已经安装了适合你GPU的NVIDIA CUDA驱动程序。你可以通过运行nvidia-smi
命令来检查是否已正确安装。
安装Anaconda并创建虚拟环境
首先,下载并安装Anaconda。然后创建一个新的Python虚拟环境:
conda create -n vehicle_ir python=3.8
conda activate vehicle_ir
安装依赖项
在激活的虚拟环境中安装必要的库:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
pip install ultralytics opencv-python matplotlib tqdm
CUDA版本调整PyTorch的安装链接。
二、数据集组织
确保数据集按如下结构组织(YOLOv8支持YAML格式的数据配置):
vehicle_ir_dataset/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
├── labels/
│ ├── train/
│ ├── val/
│ └── test/
└── data.yaml
其中 data.yaml
文件应包含如下信息:
train: ./vehicle_ir_dataset/images/train
val: ./vehicle_ir_dataset/images/val
test: ./vehicle_ir_dataset/images/test
nc: 4 # 类别数量
names: ['truck', 'car', 'van', 'bus']
三、使用YOLOv8训练模型
加载预训练模型
from ultralytics import YOLO
model = YOLO('yolov8n.pt') # 可以选择其他尺寸的预训练模型
训练模型
编写简单的Python脚本来启动训练过程:
from ultralytics import YOLO
def train_yolo():
model = YOLO('yolov8n.yaml') # 使用YOLOv8n配置文件
results = model.train(data='./vehicle_ir_dataset/data.yaml', epochs=100, imgsz=640, batch=16)
if __name__ == '__main__':
train_yolo()
确保将 './vehicle_ir_dataset/data.yaml'
替换为实际路径。你可以根据需要调整epochs
和batch
大小。
四、推理代码
用于对新的图像或视频进行检测:
from ultralytics import YOLO
import cv2
def detect_yolo(image_path):
model = YOLO('runs/detect/exp/weights/best.pt') # 替换为你的最佳权重路径
results = model.predict(source=image_path, save=True)
if __name__ == '__main__':
detect_yolo('path/to/test/image.jpg')
五、评估代码
使用YOLOv8内置的评估函数直接对验证集进行评估:
from ultralytics import YOLO
def evaluate_yolo():
model = YOLO('runs/detect/exp/weights/best.pt') # 替换为你的最佳权重路径
metrics = model.val() # 自动对验证集进行评估
print(f"mAP50: {metrics.box.map50:.3f} | mAP50-95: {metrics.box.map:.3f}")
if __name__ == '__main__':
evaluate_yolo()
六、结果可视化与进一步分析
利用OpenCV或其他可视化库来展示检测结果,并进一步分析如计算mAP等性能指标。对于单个图像的检测结果,可以通过以下方式显示:
import cv2
for r in results:
im_array = r.plot() # plot a BGR numpy array of predictions
im = cv2.cvtColor(im_array, cv2.COLOR_BGR2RGB)
cv2.imshow("YOLOv8 Inference", im)
cv2.waitKey(0)
cv2.destroyAllWindows()
根据你提供的信息(无人机视角下的红外车辆识别数据集 + YOLOv8n 模型权重 + mAP 达到 86.1),我们可以构建一个 完整的红外车辆识别系统,支持:
- 图像识别
- 视频识别
- 实时摄像头检测
- Flask Web 系统(可选)
- 检测结果可视化
- 支持 4 类红外车辆(truck、car、van、bus)
✅ 系统目标
功能 | 描述 |
---|---|
图像识别 | 上传图像,识别红外车辆 |
视频识别 | 上传视频,逐帧识别 |
实时检测 | 调用摄像头实时识别 |
可视化结果 | 显示边界框和类别 |
支持训练权重 | 使用你训练好的 best.pt 模型 |
🧰 环境依赖
确保你已安装以下依赖:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install ultralytics opencv-python numpy flask
✅ 说明:根据你的 CUDA 版本选择对应的 PyTorch 安装命令,例如 cu118(CUDA 11.8)。
📁 数据结构与模型权重
确保以下文件结构:
infrared_vehicle_system/
├── models/
│ └── best.pt # 你训练好的YOLOv8模型权重
├── static/
│ ├── uploads/ # 用户上传的图像/视频
│ └── results/ # 识别结果保存路径
├── app.py # Flask 主程序
└── templates/
└── index.html # 前端页面
🚀 核心代码实现
1. 加载模型(YOLOv8)
from ultralytics import YOLO
# 加载训练好的模型
model = YOLO('models/best.pt')
2. 图像识别函数
import cv2
import os
def detect_image(image_path, output_path):
results = model(image_path)
for r in results:
im = r.plot()
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
cv2.imwrite(output_path, im)
return output_path
3. 视频识别函数
def detect_video(video_path, output_path):
cap = cv2.VideoCapture(video_path)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
results = model(frame)
for r in results:
im = r.plot()
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
out.write(im)
cap.release()
out.release()
return output_path
4. 实时摄像头检测函数
def detect_camera():
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
results = model(frame)
for r in results:
im = r.plot()
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
cv2.imshow('Infrared Vehicle Detection', im)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
🖥️ Flask Web 系统(可选)
构建一个简单的 Flask Web 系统,实现图像/视频上传和结果展示。
app.py
主程序
from flask import Flask, request, render_template, send_from_directory
import os
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'static/uploads'
app.config['RESULT_FOLDER'] = 'static/results'
# 加载模型
from ultralytics import YOLO
model = YOLO('models/best.pt')
@app.route('/')
def index():
return render_template('index.html')
@app.route('/detect_image', methods=['POST'])
def detect_image_route():
file = request.files['file']
if not file:
return 'No file uploaded', 400
original_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
file.save(original_path)
result_path = os.path.join(app.config['RESULT_FOLDER'], 'result_' + file.filename)
detect_image(original_path, result_path)
return {
'original': file.filename,
'detected': 'result_' + file.filename
}
@app.route('/detect_video', methods=['POST'])
def detect_video_route():
file = request.files['file']
if not file:
return 'No file uploaded', 400
original_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
file.save(original_path)
result_path = os.path.join(app.config['RESULT_FOLDER'], 'result_' + file.filename)
detect_video(original_path, result_path)
return {
'original': file.filename,
'detected': 'result_' + file.filename
}
@app.route('/camera')
def camera():
detect_camera()
return "Camera closed."
@app.route('/static/<folder>/<filename>')
def get_file(folder, filename):
return send_from_directory(os.path.join('static', folder), filename)
if __name__ == '__main__':
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
os.makedirs(app.config['RESULT_FOLDER'], exist_ok=True)
app.run(debug=True)
templates/index.html
前端页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>红外车辆识别系统</title>
</head>
<body>
<h1>红外车辆识别系统</h1>
<button onclick="loadModel()">加载模型</button>
<input type="file" id="imageInput" accept="image/*" onchange="uploadImage()">
<input type="file" id="videoInput" accept="video/*" onchange="uploadVideo()">
<button onclick="document.getElementById('imageInput').click()">图像检测</button>
<button onclick="document.getElementById('videoInput').click()">视频检测</button>
<button onclick="window.location.href='/camera'">打开摄像头</button>
<div style="margin-top: 20px;">
<h3>原始图像</h3>
<img id="original" src="" width="400">
</div>
<div>
<h3>识别结果</h3>
<img id="result" src="" width="400">
</div>
<script>
function uploadImage() {
const formData = new FormData();
const file = document.getElementById('imageInput').files[0];
formData.append('file', file);
fetch('/detect_image', {
method: 'POST',
body: formData
}).then(res => res.json()).then(data => {
document.getElementById('original').src = '/static/uploads/' + data.original;
document.getElementById('result').src = '/static/results/' + data.detected;
});
}
function uploadVideo() {
const formData = new FormData();
const file = document.getElementById('videoInput').files[0];
formData.append('file', file);
fetch('/detect_video', {
method: 'POST',
body: formData
}).then(res => res.json()).then(data => {
alert('视频已处理完成,可在 results 文件夹查看');
});
}
</script>
</body>
</html>
用户只需运行:
pip install -r requirements.txt
python app.py
然后访问:
http://127.0.0.1:5000/
即可使用红外车辆识别系统。
🧠 :requirements.txt
torch
torchvision
ultralytics
opencv-python
numpy
flask