视觉识别:ffmpeg-python、ultralytics.YOLO、OpenCV-Python、标准RTSP地址格式
@TOC
ffmpeg-python
ffmpeg-python 是一个用于操作 FFmpeg 的 Python 库,它通过 Python 对象和链式调用封装了 FFmpeg 的命令行参数。
核心概念
input():创建输入流1
input_stream = ffmpeg.input('input.mp4', ss=10, t=5) # 从第10秒开始,读取5秒- 关键参数:
filename:输入文件路径ss:起始时间(秒或HH:MM:SS)t:持续时间f:强制输入格式(如f='rawvideo')
- 关键参数:
output():生成输出流1
output_stream = ffmpeg.output(input_stream, 'output.mp4', vcodec='libx264', crf=23)- 关键参数:
filename:输出路径vcodec/acodec:视频/音频编码器('libx264','aac','copy')crf:视频质量(0-51,值越低质量越高)b:v/b:a:视频/音频比特率(如b:v='1M')r:帧率(如r=30)s:分辨率(如s='1280x720')preset:编码速度('ultrafast','slow')
- 关键参数:
run():执行命令1
ffmpeg.run(output_stream, overwrite_output=True) # 覆盖已存在文件
常用过滤器(Filters)
通过 .filter() 方法调用:
1 | |
视频缩放
1
scaled = input_stream.filter('scale', width=640, height=-1) # 宽度640,高度按比例裁剪
1
cropped = input_stream.filter('crop', w=100, h=100, x=20, y=20)旋转
1
rotated = input_stream.filter('rotate', angle=45*math.pi/180) # 45度叠加水印
1
2
3
4
5watermarked = ffmpeg.overlay(
input_stream,
ffmpeg.input('watermark.png').filter('scale', 50, 50),
x=10, y=10
)音频降噪
1
denoised = input_stream.filter('afftdn', nf=-20) # 降噪强度
高级操作
合并多个输入
1
2
3video = ffmpeg.input('video.mp4')
audio = ffmpeg.input('audio.mp3')
output = ffmpeg.output(video, audio, 'merged.mp4', vcodec='copy', acodec='aac')提取音轨
1
ffmpeg.input('video.mp4').output('audio_only.mp3', acodec='libmp3lame').run()生成 GIF
1
2
3
4
5
6(
ffmpeg.input('video.mp4', t=3)
.filter('fps', fps=10)
.output('output.gif', loop=0)
.run()
)硬件加速(NVIDIA)
1
2
3
4
5
6
7
8
9(
ffmpeg.input('input.mp4')
.output('output.mp4',
vcodec='h264_nvenc', # NVIDIA 编码器
preset='p1',
rc='constqp',
qp=21)
.run()
)
视频截帧转换图片示例
1 | |
参考
- 官方文档:ffmpeg-python GitHub
ultralytics.YOLO(You Only Look Once)

1 | |
核心思想:端到端的统一检测
- 摒弃传统流程: 不同于早期的R-CNN系列(R-CNN, Fast R-CNN, Faster R-CNN)等两阶段方法(先提取候选区域,再对每个区域分类和回归),YOLO是单阶段(One-Stage) 方法的代表。
- “只看一眼”: 将整个输入图像一次性输入到一个单一的卷积神经网络(CNN)。
- 统一预测: 网络在单次前向传播中,直接预测图像中所有目标的位置(边界框)和类别。它将预测问题建模为一个端到端的回归任务。
1. 模型加载
https://docs.ultralytics.com/zh/models/
1 | |
2. 训练模型 (train())
https://docs.ultralytics.com/zh/modes/train/#idle-gpu-training
1 | |
标准YAML格式示例
在YOLO(尤其是YOLOv5/YOLOv8)中,用于训练的数据集配置文件(如 basket_random_split.yaml)需要遵循特定格式。
1 | |
names(必须)- 类别名称列表(字符串数组或字典)
- 索引必须从0开始连续编号
- 两种写法:
1
2
3
4
5
6
7
8# 数组写法
names: ['basketball', 'hoop', 'player']
# 字典写法
names:
0: basketball
1: hoop
2: player
重要提示:YOLOv5/YOLOv8会自动根据
images路径查找对应的labels目录,确保目录结构匹配。如果测试集未标注,可省略test字段。
3. 预测 (predict())
https://docs.ultralytics.com/zh/modes/predict/#inference-arguments
1 | |
4. 验证模型 (val())
https://docs.ultralytics.com/zh/modes/val/#arguments-for-yolo-model-validation
1 | |
metrics
model.val() 方法返回的 metrics 对象包含了丰富的模型性能指标
核心指标 (metrics.box)
| 属性 | 类型 | 说明 |
|---|---|---|
map |
float | mAP@0.5:0.95 (IoU 0.5-0.95 的平均精度) |
map50 |
float | mAP@0.5 (IoU=0.5 的平均精度) |
map75 |
float | mAP@0.75 (IoU=0.75 的平均精度) |
maps |
list[float] | 每个类别的 mAP@0.5:0.95 |
ap50 |
list[float] | 每个类别的 AP@0.5 |
ap |
list[float] | 每个类别的 AP@0.5:0.95 |
precision |
list[float] | 每个类别的精确率 (Precision) |
recall |
list[float] | 每个类别的召回率 (Recall) |
f1 |
list[float] | 每个类别的 F1 分数 |
ap_class_index |
list[int] | 对应类别的索引 |
confusion_matrix |
np.ndarray | 混淆矩阵 |
其他重要属性
| 属性 | 类型 | 说明 |
|---|---|---|
speed |
dict | 处理速度指标 |
- preprocess |
float | 预处理时间 (ms/图像) |
- inference |
float | 推理时间 (ms/图像) |
- loss |
float | 损失计算时间 (ms/图像) |
- postprocess |
float | 后处理时间 (ms/图像) |
results_dict |
dict | 所有结果的字典形式 |
class_names |
list[str] | 类别名称列表 |
nt_per_class |
list[int] | 每个类别的真实目标数量 |
mp |
float | 平均精确率 (所有类别的均值) |
mr |
float | 平均召回率 (所有类别的均值) |
fi |
float | 平均 F1 分数 (所有类别的均值) |
完整指标获取示例
1 | |
results_dict 中的完整键值
当访问 metrics.results_dict 时,会得到包含所有指标的字典:
1 | |
注意事项
- 指标前缀说明:
(B)表示边界框相关指标(M)表示掩码相关指标(实例分割任务)(P)表示姿态相关指标(姿态估计任务)
- 指标计算依据:
- 所有指标基于设定的置信度阈值(
conf)和IoU阈值(iou) - 默认使用0.001置信度阈值来最大化召回率
- 所有指标基于设定的置信度阈值(
- 可视化输出:
当设置plots=True时,会额外生成:- PR曲线图
- 混淆矩阵图
- 各类别误差分析图
- 预测结果示例图
5. 模型导出 (export())
1 | |
常用参数说明表
| 参数 | 适用方法 | 说明 |
|---|---|---|
data |
train, val |
数据集YAML配置文件路径 |
epochs |
train |
训练总轮次 |
imgsz |
所有方法 | 输入图像尺寸(整数或元组) |
conf |
predict, val |
置信度阈值(0-1) |
iou |
predict, val |
NMS的IoU阈值(0-1) |
device |
所有方法 | 运行设备(cpu, cuda, mps) |
batch |
train, val |
批次大小(-1表示自动批大小) |
project |
train |
结果保存的根目录(如 runs/train) |
name |
train |
实验名称(在project下生成子目录) |
classes |
predict |
指定检测的类别ID列表 |
save_txt |
predict |
保存结果为YOLO格式的txt标签 |
save_json |
val |
保存COCO格式的JSON结果 |
format |
export |
导出格式(onnx, engine, tflite, coreml等) |
训练验证输出中各参数的详细解释
1 | |
训练迭代参数(每轮训练)
| 参数 | 说明 | 示例值 | 解读 |
|---|---|---|---|
| Epoch | 当前训练轮次/总轮次 | 1/30 | 第1轮训练(共30轮) |
| GPU_mem | GPU显存占用 | 0G | 显存使用较低(单位:GB) |
| box_loss | 边界框回归损失 | 1.575 | 预测框位置误差,值越小定位越准 |
| cls_loss | 分类损失 | 3.235 | 类别预测误差,值越小分类越准 |
| dfl_loss | 分布聚焦损失 | 1.696 | 边界框分布离散化误差(YOLOv8特有) |
| Instances | 当前批次目标数 | 20 | 本批含20个待检测目标 |
| Size | 输入图像尺寸 | 640 | 图像缩放至640×640像素 |
| 进度 | 批次进度 | 20/20 | 完成20个训练批次 |
| 时间 | 训练耗时 | 07:29<00:00 | 本轮耗时7分29秒 |
| 速度 | 批次处理速度 | 22.47s/it | 每批次平均耗时22.47秒 |
验证阶段参数(每轮训练后评估)
| 参数 | 说明 | 示例值 | 解读 |
|---|---|---|---|
| Class | 评估类别 | all | 所有类别的综合指标 |
| Images | 验证图片数 | 78 | 使用78张图片评估模型 |
| Instances | 目标实例数 | 78 | 验证集含78个待检测目标 |
| P | 边界框精确率 | 0.817 | 81.7%的预测框正确(查准率) |
| R | 边界框召回率 | 0.938 | 93.8%的目标被成功检出(查全率) |
| mAP50 | IoU=0.5的mAP | 0.977 | 97.7%的高精度检测(核心指标) |
| mAP50-95 | IoU[0.5:0.95]的mAP | 0.715 | 严格IoU阈值下的平均精度(鲁棒性指标) |
| 进度 | 验证批次进度 | 3/3 | 完成3个验证批次 |
| 时间 | 验证耗时 | 00:30<00:00 | 总耗时30秒 |
| 速度 | 批次处理速度 | 10.14s/it | 每批次平均耗时10.14秒 |
train/val/predict关键区别总结
| 特性 | train() |
val() |
predict() |
|---|---|---|---|
| 主要目的 | 模型训练 | 性能评估 | 新数据推理 |
| 数据源 | 数据集配置文件 | 数据集配置文件 | 任意图像/视频 |
| 增强处理 | ✓ 数据增强 | ✗ 无增强 | ✗ 无增强 |
| 输出类型 | 训练日志/模型 | 评估指标 | 检测结果图像 |
| 关键指标 | 训练损失 | mAP/Precision | 检测框/置信度 |
| 设备优化 | 训练优化 | 评估优化 | 推理优化 |
| 参数特点 | 学习率/优化器 | 评估阈值 | 可视化选项 |
| 典型使用 | 训练前 | 训练后评估 | 部署推理 |
mAP 详解
1. 核心概念
| 术语 | 说明 |
|---|---|
| IoU | 交并比(Intersection over Union) 预测框与真实框的重叠程度 |
| TP | 真正例(True Positive) IoU ≥ 阈值(如0.5)的正确检测 |
| FP | 假正例(False Positive) IoU < 阈值或重复检测 |
| FN | 假负例(False Negative) 未检测到的真实目标 |
| Precision | TP / (TP + FP) 检测结果的准确性 |
| Recall | TP / (TP + FN) 目标检测的完整性 |
$$IoU=\frac{预测框与真实框的交集面积}{并集面积}$$
2. 计算流程
生成PR曲线:
- 对每个类别,在不同置信度阈值下计算Precision和Recall
- 绘制Precision-Recall曲线
计算AP(Average Precision):
- 计算PR曲线下的面积
- 公式:$AP = \int_0^1 p(r) dr$
- 实际计算:对Recall进行插值后取平均精度
计算mAP:
- 对所有类别的AP取平均值
- 公式:$mAP = \frac{1}{N}\sum_{i=1}^{N} AP_i$
3. 常见变体
| 类型 | 说明 | 应用场景 |
|---|---|---|
| mAP@0.5 | IoU阈值固定为0.5 | 基础评估标准 |
| mAP@0.5:0.95 | IoU从0.5到0.95(步长0.05)取平均 | 严格评估定位精度 |
| mAP@0.75 | IoU阈值固定为0.75 | 高精度定位要求场景 |
mAP 在目标检测中的意义
- 综合性:同时考虑精确率和召回率
- 鲁棒性:不受置信度阈值选择的影响
- 类别平衡:平等对待所有类别
- 定位敏感:反映边界框的准确度(通过IoU)
mAP 解读指南
| mAP值范围 | 模型性能 |
|---|---|
| 0.9+ | 极好(接近完美) |
| 0.7-0.9 | 优秀(工业应用级) |
| 0.5-0.7 | 可用(需优化) |
| 0.3-0.5 | 较差(需大幅改进) |
| <0.3 | 基本无效 |
提升mAP的策略
数据层面:
- 增加困难样本
- 平衡类别分布
- 优化标注质量
模型层面:
- 使用更大模型(如YOLOv8x)
- 增加输入分辨率(
imgsz) - 调整锚框尺寸
训练技巧:
- 延长训练时间(增加
epochs) - 调整学习率策略
- 增强数据多样性(
augment=True)
- 延长训练时间(增加
后处理优化:
- 调整NMS参数(
iou) - 优化置信度阈值(
conf)
- 调整NMS参数(
mAP 是目标检测领域的”黄金标准”,全面反映了模型在定位准确性和分类正确性上的综合能力。在工业应用中,mAP@0.5 > 0.7 通常是可部署的最低标准。
runs/detect日志讲解
- weights 是训练好的模型权重,保留了best.pt,last.pt
- args.yaml 是训练过程中的参数记录。
- results.csv 是训练过程中的记录。
- results.png 是训练过程中的记录的可视化。
- confusion_matrix.png ,confusion_matrix_normalized.png 是训练过程中的混淆矩阵的可视化和可视化归一化。
- labels.jpg,labels_correlogram.jpg 是训练过程中的标签和标签的correlogram。
- F1_curve.png,PR_curve.png,P_curve.png,R_curve.png 是训练过程中的F1曲线、PR曲线、P曲线、R曲线。
- train_batch0.jpg,train_batch1.jpg,train_batch2.jpg 是训练过程中的训练图片,采用了mosaic的数据增强方式。
- train_batch23250.jpg,train_batch23251.jpg,train_batch23252.jpg 是训练过程中的训练图片,不再采用mosaic的数据增强方式。
- val_batch0_labels.jpg,val_batch1_labels.jpg ,val_batch2_labels.jpg 是训练过程中的验证图片的标签。
- val_batch0_labels.jpg,val_batch1_labels.jpg ,val_batch2_labels.jpg 是训练过程中的验证图片的标签。
- val_batch0_pred.jpg,val_batch1_pred.jpg ,val_batch2_pred.jpg 是训练过程中的验证图片的预测值。
参考
- 官方文档参考:Ultralytics YOLO Docs
- YOLO系列模型之如何阅读ultralytics源码?
- 项目基础配置说明:https://docs.ultralytics.com/quickstart/#ultralytics-settings
- 下游任务解决方案:https://docs.ultralytics.com/solutions/
- 研发过程相关指导:https://docs.ultralytics.com/guides/
- LabelImg、X-AnyLabeling
OpenCV-Python(cv2)
1. 图像读取与保存
cv2.imread(filename, flags)
- 功能: 读取图像文件。
- 参数:
filename: 图像路径(支持 JPG、PNG、TIFF 等格式)。flags: 读取模式(可选):cv2.IMREAD_COLOR(默认): 加载 3 通道 BGR 彩色图像。cv2.IMREAD_GRAYSCALE: 加载灰度图像。cv2.IMREAD_UNCHANGED: 保留原始通道(如 PNG 的透明度)。
- 返回值:
numpy.ndarray格式的图像数据。
cv2.imwrite(filename, img, params)
- 功能: 保存图像。
- 参数:
filename: 保存路径(扩展名决定格式)。img: 要保存的图像数据。params(可选): 编码参数(如 JPEG 质量):[cv2.IMWRITE_JPEG_QUALITY, 95]: JPEG 质量(0-100)。[cv2.IMWRITE_PNG_COMPRESSION, 9]: PNG 压缩级别(0-9)。
cv2.imshow()
- 功能: 在窗口中显示图像。
- 用法: cv2.imshow(“窗口名”, image)
2. 图像处理
cv2.cvtColor(src, code)
- 功能: 颜色空间转换。
- 参数:
src: 输入图像。code: 转换类型:cv2.COLOR_BGR2GRAY: BGR → 灰度。cv2.COLOR_BGR2HSV: BGR → HSV。cv2.COLOR_BGR2RGB: BGR → RGB。
cv2.resize(src, dsize, fx, fy, interpolation)
- 功能: 调整图像尺寸。
- 参数:
dsize: 目标尺寸(width, height)。fx,fy: 沿 x/y 轴的缩放因子。interpolation: 插值方法(默认cv2.INTER_LINEAR):cv2.INTER_NEAREST: 最近邻插值(快)。cv2.INTER_CUBIC: 双三次插值(慢但质量高)。
为什么需要插值?
图像缩放时,输入与输出像素的位置并非一一对应:
- 放大图像:输出像素可能位于输入像素之间
- 缩小图像:多个输入像素映射到同一输出位置
插值通过数学估算解决这些位置的像素值问题,避免锯齿、模糊等失真。
cv2.GaussianBlur(src, ksize, sigmaX)
- 功能: 高斯模糊(降噪)。
- 参数:
ksize: 高斯核大小(width, height)(必须为奇数)。sigmaX: X 方向标准差(若为 0,则根据 ksize 自动计算)。
3. 阈值与二值化
cv2.threshold(src, thresh, maxval, type)
- 功能: 图像阈值处理。
- 参数:
thresh: 阈值(0-255)。maxval: 超过阈值时赋予的值。type: 阈值类型:cv2.THRESH_BINARY:dst = (src > thresh) ? maxval : 0。cv2.THRESH_OTSU: 自动计算阈值(需与cv2.THRESH_BINARY组合使用)。
- 返回值:
retval(实际使用的阈值),dst(二值化图像)。
4. 特征检测
cv2.Canny(image, threshold1, threshold2, apertureSize, L2gradient)
- 功能: Canny 边缘检测。
- 参数:
threshold1: 低阈值(弱边缘过滤)。threshold2: 高阈值(强边缘保留)。apertureSize: Sobel 算子大小(默认 3)。L2gradient: 是否使用更精确的 L2 范数(默认 False,用 L1)。
cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)
- 功能: 概率霍夫变换检测直线。
- 参数:
rho: 距离分辨率(像素)。theta: 角度分辨率(弧度)。threshold: 投票阈值(低于此值忽略)。minLineLength: 线段最小长度。maxLineGap: 线段最大间断距离。
5. 视频处理
cv2.VideoCapture(index)
- 功能: 打开摄像头或视频文件。
- 参数:
index: 摄像头 ID(0 为默认摄像头)或视频文件路径。
- 常用方法:
cap.read(): 读取帧(返回ret, frame)。cap.set(propId, value): 设置属性(如cv2.CAP_PROP_FPS,cv2.CAP_PROP_FRAME_WIDTH)。cap.release(): 释放资源。
cv2.VideoWriter(filename, fourcc, fps, frameSize)
- 功能: 保存视频。
- 参数:
fourcc: 编码器(如cv2.VideoWriter_fourcc(*'XVID'))。fps: 帧率(如 30)。frameSize: 帧尺寸(width, height)。
6. 绘图函数
cv2.rectangle(img, pt1, pt2, color, thickness)
- 参数:
pt1,pt2: 矩形对角点(x1,y1),(x2,y2)。color: BGR 元组(如(0, 255, 0)表示绿色)。thickness: 线宽(-1 表示填充)。
cv2.putText(img, text, org, fontFace, fontScale, color, thickness)
- 参数:
org: 文本左下角坐标(x, y)。fontFace: 字体(如cv2.FONT_HERSHEY_SIMPLEX)。fontScale: 字体缩放因子。
7. 形态学操作
cv2.erode(src, kernel, iterations)
- 功能: 腐蚀(缩小白色区域)。
- 参数:
kernel: 结构元素(如np.ones((3,3), np.uint8))。iterations: 执行次数。
cv2.dilate(src, kernel, iterations)
- 功能: 膨胀(扩大白色区域)。
cv2.morphologyEx(src, op, kernel)
- 功能: 高级形态学操作。
- 参数:
op: 操作类型:cv2.MORPH_OPEN: 开运算(去噪)。cv2.MORPH_CLOSE: 闭运算(填充空洞)。
8. 窗口管理
| 参数/函数 | 说明 | 常用值/用法 |
|---|---|---|
namedWindow() |
创建命名窗口 | cv2.namedWindow("窗口名", flags)• flags=cv2.WINDOW_NORMAL (可调整大小)• flags=cv2.WINDOW_AUTOSIZE (自动适应图像) |
WND_PROP_FULLSCREEN |
窗口全屏属性标识符 | 用于setWindowProperty()/getWindowProperty() |
WINDOW_FULLSCREEN |
设置全屏模式的标志 | cv2.setWindowProperty("win", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) |
setWindowProperty() |
设置窗口属性 | cv2.setWindowProperty("win", 属性, 值)• 属性: cv2.WND_PROP_FULLSCREEN• 值: cv2.WINDOW_FULLSCREEN |
getWindowImageRect() |
获取窗口坐标和尺寸 | x, y, w, h = cv2.getWindowImageRect("窗口名") |
resizeWindow() |
调整窗口尺寸 | cv2.resizeWindow("窗口名", 宽, 高) |
destroyWindow() |
关闭单个窗口 | cv2.destroyWindow("窗口名") |
destroyAllWindows() |
关闭所有窗口 | cv2.destroyAllWindows() |
标准RTSP地址格式
1 | |
参数说明
[用户名]- 相机登录用户名(如
admin)。
- 相机登录用户名(如
[密码]- 该用户名的密码。
[相机IP地址]- 相机的网络IP(如
192.168.1.108)。
- 相机的网络IP(如
[端口](可选)- RTSP服务端口,默认为
554(若未修改可省略)。
- RTSP服务端口,默认为
[通道号]channel=1:单路相机固定为1;- NVR下的相机:按实际通道顺序填写(如
channel=2表示第2通道)。
[码流类型]subtype=0:主码流(高清,默认值);subtype=1:子码流(低码率,适用于移动端或带宽受限场景)。
调试工具建议
- 使用 VLC播放器 测试:
媒体→打开网络串流→ 粘贴RTSP地址 → 播放。 - 工具:ONVIF Device Manager 扫描相机,自动生成RTSP地址。