YOLOv5 + StrongSORT with OSNet

项目简介

  • YOLOv5 + StrongSORT with OSNet:YOLOv5检测器 + StrongSORT跟踪算法 + OSNet行人重识别模型
  • 项目地址:https://github.com/mikel-brostrom/Yolov5_StrongSORT_OSNet

环境安装

1.Conda建立虚拟环境

conda create -n yolov5 python=3.8

2.安装PyTroch和TorchVision

可以选择官网安装:或者下载whl文件

本文Pytorch安装的版本为1.8.0,torchvision对应的版本为0.9.0

在这里插入图片描述
在这里插入图片描述

注意:cp对应Python包版本,linux对应lLinux版本,win对应Windows版本

当whl文件下载到本地后,进入包下载命令,使用pip install 包名来安装:

pip install torch-1.8.0+cu111-cp38-cp38-win_amd64.whl
pip install torchvision-0.9.0+cu111-cp38-cp38-win_amd64.whl

3.安装Torchreid

# cd to your preferred directory and clone this repo
git clone https://github.com/KaiyangZhou/deep-person-reid.git

# create environment
cd deep-person-reid/
# 环境上面已建立,使用yolov5虚拟环境
# conda create --name torchreid python=3.7
# conda activate torchreid

# install dependencies
# make sure `which python` and `which pip` point to the correct path
pip install -r requirements.txt

# install torch and torchvision (select the proper cuda version to suit your machine)
# conda install pytorch torchvision cudatoolkit=9.0 -c pytorch

# install torchreid (don't need to re-build it if you modify the source code)
python setup.py develop

pip install -r requirements.txt本地安装记录:

在这里插入图片描述
在这里插入图片描述

最后执行python setup.py develop,一顿操作后得到下面的提示:

在这里插入图片描述

输入conda list确定本机基本环境:
在这里插入图片描述

python:3.8
pytorch:1.8.0
torchvision:0.9.0
torchreid:1.4.0
注:本环境下的一些包安装这个是没有的,这些是之前安装另一个项目留下的(主要是一些导出包)

4.安装项目其他依赖包

在这里插入图片描述

Bug解决

问题描述:在下载源码是选择Download Zip这种方式,默认yolov5文件夹下内容是空的,此时需要点击编号(yolov5@91a81d4)下载yolov5源码放在yolov5目录下

在这里插入图片描述

在这里插入图片描述

但在我运行python track.py 时程序依然报错:

在这里插入图片描述

这是因为在strong_sort/deep/reid目录是空的,下载源码默认是没下载那部分内容的,因此需要和上面一下,将torchreid下载并放入到strong_sort/deep/reid下面

在这里插入图片描述

代码运行

python track.py

在这里插入图片描述

在这里插入图片描述

  • 默认结果保存在runs/track/exp目录下,之前跑过一次没成功,所以这次结果保存在runs/track/exp2目录下
  • 如果使用python track.py运行的话默认是不保存视频的,只能在控制台查看输出结果,如果保存视频,需指定–save-vid参数,使用命令python track.py --save-vid即可

参数解析

track.py

    parser.add_argument('--yolo-weights', nargs='+', type=Path, default=WEIGHTS / 'yolov5m.pt', help='model.pt path(s)')
    parser.add_argument('--strong-sort-weights', type=Path, default=WEIGHTS / 'osnet_x0_25_msmt17.pt')
    parser.add_argument('--config-strongsort', type=str, default='strong_sort/configs/strong_sort.yaml')
    parser.add_argument('--source', type=str, default='D:/video/1.6_10_videos/301337_3/151035.mp4', help='file/dir/URL/glob, 0 for webcam')  
    parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')
    parser.add_argument('--conf-thres', type=float, default=0.5, help='confidence threshold')
    parser.add_argument('--iou-thres', type=float, default=0.5, help='NMS IoU threshold')
    parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image')
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--show-vid', action='store_true', help='display tracking video results')
    parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
    parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
    parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes')
    parser.add_argument('--save-vid', action='store_true', help='save video tracking results')
    parser.add_argument('--nosave', action='store_true', help='do not save images/videos')
    # class 0 is person, 1 is bycicle, 2 is car... 79 is oven
    parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3')
    parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
    parser.add_argument('--augment', action='store_true', help='augmented inference')
    parser.add_argument('--visualize', action='store_true', help='visualize features')
    parser.add_argument('--update', action='store_true', help='update all models')
    parser.add_argument('--project', default=ROOT / 'runs/track', help='save results to project/name')
    parser.add_argument('--name', default='exp', help='save results to project/name')
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
    parser.add_argument('--line-thickness', default=3, type=int, help='bounding box thickness (pixels)')
    parser.add_argument('--hide-labels', default=False, action='store_true', help='hide labels')
    parser.add_argument('--hide-conf', default=False, action='store_true', help='hide confidences')
    parser.add_argument('--hide-class', default=False, action='store_true', help='hide IDs')
    parser.add_argument('--half', action='store_true', help='use FP16 half-precision inference')
    parser.add_argument('--dnn', action='store_true', help='use OpenCV DNN for ONNX inference')
    parser.add_argument('--eval', action='store_true', help='run evaluation')
  • –yolo-weights:YOLO得到的权重模型
  • –strong-sort-weights:Reid模型
  • –show-vid:python track.py --show-vid:可视化跟踪结果
  • –save-vid:python track.py --save-vid:保存跟踪结果
  • –classes:指定类别检测跟踪

彩蛋

本文对构建YOLOAir库环境进行详细阐述,笔者以后会定期分享关于项目的其他模块和相关技术,笔者也建立了一个关于目标检测的交流群:781334731,欢迎大家踊跃加入,一起学习鸭!

笔者也持续更新一个微信公众号:Nuist计算机视觉与模式识别,大家帮忙点个关注谢谢

### 使用YOLOv12结合StrongSort实现目标跟踪 #### 介绍 YOLO (You Only Look Once) 是一种广泛应用于实时物体检测的神经网络框架,而 StrongSORT 则是一种基于 DeepSORT 的改进版本,在多目标跟踪方面表现出色。两者结合能够显著提升视频监控场景下的目标识别与跟踪效果。 #### 安装依赖库 为了使 YOLOv12 和 StrongSort 正常工作,需安装必要的 Python 库: ```bash pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113 pip install opencv-python numpy matplotlib scikit-image filterpy cython lap motmetrics tqdm ``` #### 下载预训练模型权重文件 获取官方发布的 YOLOv12 权重文件并将其放置于指定路径下;对于 StrongSort 所需的支持向量机(SVM),可以从开源社区下载对应的 .pth 文件[^1]。 #### 配置环境变量 设置好相应的环境变量以便程序能顺利加载所需的配置参数和外部资源: ```python import os os.environ['CUDA_VISIBLE_DEVICES'] = '0' # 设置GPU ID, 如果只有一张显卡则设为'0' ``` #### 编写主函数逻辑 创建 `main.py` 脚本用于启动整个流程,其中包含了初始化 yolov12 模型实例、读取摄像头流或本地视频片段作为输入源等内容. ```python from models.experimental import attempt_load from utils.general import non_max_suppression, scale_coords from deep_sort.utils.parser import get_config from deep_sort.deep_sort import DeepSort def main(): # 加载YOLOv12模型 weights_path = './weights/yolov12.pt' device = select_device('') model = attempt_load(weights=weights_path, map_location=device) # 初始化Deep Sort对象 cfg_deep = get_config() cfg_deep.merge_from_file("deep_sort/configs/deep_sort.yaml") deepsort = DeepSort(cfg_deep.DEEPSORT.REID_CKPT, max_dist=cfg_deep.DEEPSORT.MAX_DIST, min_confidence=cfg_deep.DEEPSORT.MIN_CONFIDENCE, nms_max_overlap=cfg_deep.DEEPSORT.NMS_MAX_OVERLAP, max_iou_distance=cfg_deep.DEEPSORT.MAX_IOU_DISTANCE, max_age=cfg_deep.DEEPSORT.MAX_AGE, n_init=cfg_deep.DEEPSORT.N_INIT, nn_budget=cfg_deep.DEEPSORT.NN_BUDGET, use_cuda=True) source_video = "./data/input.mp4" cap = cv2.VideoCapture(source_video) while True: ret, frame = cap.read() if not ret: break detections = detect_objects(model=model, img=frame.copy(), device=device)[^1] outputs = strongsort.update(detections=detections.cpu().numpy(), ori_img=frame)[^2] draw_boxes(frame=frame, output_data=outputs) if __name__ == '__main__': main() ``` 上述代码展示了如何利用 PyTorch 版本的 YOLOv12 进行图像特征提取,并通过调用 StrongSort 类完成对检测框内实体的身份确认过程[^3]. #### 可视化展示结果 最后一步是在每一帧上绘制边界矩形来表示被锁定的目标个体及其唯一编号,从而直观呈现最终的效果图样。 ```python def draw_boxes(frame, output_data): for det in output_data: bbox = list(map(int, det[:4])) id_num = int(det[-1]) label = f'{id_num}' plot_one_box(bbox=bbox, image=frame, color=(0, 255, 0), label=label) ``` 此部分功能由辅助工具函数 `plot_one_box()` 提供支持,负责按照给定坐标系画出彩色方框标记特定区域内的移动物体位置信息[^4].
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值