项目介绍
该项目一个基于深度学习和目标跟踪算法的项目,主要用于实现视频中的目标检测和跟踪。该项目使用了 YOLOv4 目标检测算法和 DeepSORT 目标跟踪算法,以及一些辅助工具和库,可以帮助用户快速地在本地或者云端上实现视频目标检测和跟踪。
https://ucc.alicdn.com/images/user-upload-01/295e8a4980c74bf9bb4c67a8e5ec966a.gif
YOLOv4 是一种高效的目标检测算法,它基于深度卷积神经网络,可以在实时性要求比较高的场景下进行目标检测。DeepSORT 是一种基于卡尔曼滤波器和匈牙利算法的目标跟踪算法,可以将视频帧中的目标在时间序列中进行跟踪,并且可以自适应地调整卡尔曼滤波器的参数,以提高跟踪的精度和鲁棒性。
主要功能
视频目标检测和跟踪:该项目可以读取本地或者云端的视频文件,对视频帧中的目标进行检测和跟踪,并且可以将跟踪结果保存为视频文件或者输出为实时视频流。
目标检测和跟踪参数的调整:该项目提供了一些参数可以调整,包括目标检测的置信度阈值、目标跟踪的匹配阈值、卡尔曼滤波器的参数等等,用户可以根据实际场景进行调整,同时也进行了自适应卡尔曼滤波。
相机标定:该项目还提供了相机标定的工具,可以对相机进行标定,以提高目标检测和跟踪的精度。
多目标跟踪:该项目支持同时跟踪多个目标,可以通过目标 ID 进行区分和跟踪。
面向对象
该项目的实现比较简单和易于理解,适合初学者和学习者使用。同时,该项目的代码也是开源的,用户可以根据自己的需要进行修改和扩展。需要注意的是,该项目的使用需要一定的计算资源和算法实现能力,同时也需要一些深度学习和目标跟踪的基本知识。
在这里插入图片描述
YOLOv4-DeepSort项目实战
依赖项
- Python 3.x
- TensorFlow 2.x
- OpenCV 4.x
- NumPy
- SciPy
- Matplotlib
安装
克隆本项目:
git clone my_project.git 或者联系我获取压缩包------qq1309399183-------
安装依赖项:
pip install -r requirements.txt
- 下载 YOLOv4 / yolov4.weights权重文件:
- 下载
yolov4.weights
文件。链接权重 - 将
yolov4.weights
文件保存在data
目录下。
运行
运行 object_tracker.py
文件:
python object_tracker.py --video ./data/video/test.mp4 --output ./outputs/output.avi
--video
参数指定要处理的视频文件路径。--output
参数指定要保存的输出视频文件路径。如果不指定该参数,则会将跟踪结果输出为实时视频流。
运行相机标定工具:
python tools/camera_calibration.py
该工具会自动读取 data/camera_calib/sample.mp4
视频文件,并进行相机标定。标定结果会保存在 data/camera_calib/calib.txt
文件中。
参数调整
可以通过修改 object_tracker.py 文件中的一些参数来调整目标检测和跟踪的效果。
- 目标检测置信度阈值:confidence_threshold 参数,默认值为 0.5。
- 目标跟踪匹配阈值:max_iou_distance 参数,默认值为 0.7。
- 卡尔曼滤波器参数:kalman_filter 类中的 Q 和 R 矩阵。可以根据实际场景进行调整。
代码获取及结果
def save_tf():#------联系:qq1309399183---- STRIDES, ANCHORS, NUM_CLASS, XYSCALE = utils.load_config(FLAGS) input_layer = tf.keras.layers.Input([FLAGS.input_size, FLAGS.input_size, 3]) feature_maps = YOLO(input_layer, NUM_CLASS, FLAGS.model, FLAGS.tiny) bbox_tensors = [] prob_tensors = [] if FLAGS.tiny: for i, fm in enumerate(feature_maps): if i == 0: output_tensors = decode(fm, FLAGS.input_size // 16, NUM_CLASS, STRIDES, ANCHORS, i, XYSCALE, FLAGS.framework) else: output_tensors = decode(fm, FLAGS.input_size // 32, NUM_CLASS, STRIDES, ANCHORS, i, XYSCALE, FLAGS.framework) bbox_tensors.append(output_tensors[0]) prob_tensors.append(output_tensors[1]) else: for i, fm in enumerate(feature_maps): if i == 0: output_tensors = decode(fm, FLAGS.input_size // 8, NUM_CLASS, STRIDES, ANCHORS, i, XYSCALE, FLAGS.framework) elif i == 1: output_tensors = decode(fm, FLAGS.input_size // 16, NUM_CLASS, STRIDES, ANCHORS, i, XYSCALE, FLAGS.framework) else: output_tensors = decode(fm, FLAGS.input_size // 32, NUM_CLASS, STRIDES, ANCHORS, i, XYSCALE, FLAGS.framework) bbox_tensors.append(output_tensors[0]) prob_tensors.append(output_tensors[1]) pred_bbox = tf.concat(bbox_tensors, axis=1) pred_prob = tf.concat(prob_tensors, axis=1) if FLAGS.framework == 'tflite': pred = (pred_bbox, pred_prob) else: boxes, pred_conf = filter_boxes(pred_bbox, pred_prob, score_threshold=FLAGS.score_thres, input_shape=tf.constant([FLAGS.input_size, FLAGS.input_size])) pred = tf.concat([boxes, pred_conf], axis=-1) model = tf.keras.Model(input_layer, pred) utils.load_weights(model, FLAGS.weights, FLAGS.model, FLAGS.tiny) model.summary() model.save(FLAGS.output) def main(_argv): save_tf()
在这里插入图片描述