BAT方法在LasHeR上进行训练,生成了相关训练模型,在RGBT234的可视化操作过程(Linux)

一,创建可视化脚本

复制代码
cd /home/dxf/BAT-main

# 使用文本编辑器创建脚本
nano visualize_tracking.py

将下面的可视化Python代码复制粘贴进去,然后按 Ctrl+X,按 Y,按 Enter 保存。(我的代码由ai生成,可以根据需要再重新生成一份)

复制代码
import os
import cv2
import numpy as np
from pathlib import Path
import argparse

def load_tracking_results(result_path):
    """
    加载跟踪结果文件
    每一行格式: x, y, width, height
    """
    with open(result_path, 'r') as f:
        lines = f.readlines()
    
    boxes = []
    for line in lines:
        # 解析每一行的坐标
        values = line.strip().split()
        if len(values) >= 4:
            x, y, w, h = map(float, values[:4])
            boxes.append([x, y, w, h])
    
    return boxes

def visualize_sequence(dataset_root, sequence_name, result_path, output_dir, modality='visible'):
    """
    可视化单个视频序列的跟踪结果
    
    Args:
        dataset_root: RGBT234数据集根目录
        sequence_name: 视频序列名称 (如 'afterrain')
        result_path: 跟踪结果文件路径
        output_dir: 输出视频保存目录
        modality: 'visible' 或 'infrared'
    """
    # 构建图像序列路径
    if modality == 'visible':
        img_dir = os.path.join(dataset_root, sequence_name, 'visible')
    else:
        img_dir = os.path.join(dataset_root, sequence_name, 'infrared')
    
    # 获取所有图像文件
    img_files = sorted([f for f in os.listdir(img_dir) if f.endswith(('.jpg', '.png', '.bmp'))])
    
    if len(img_files) == 0:
        print(f"❌ 没有找到图像文件: {img_dir}")
        return
    
    # 加载跟踪结果
    tracking_boxes = load_tracking_results(result_path)
    
    print(f"📊 序列: {sequence_name}")
    print(f"   - 图像数量: {len(img_files)}")
    print(f"   - 跟踪框数量: {len(tracking_boxes)}")
    
    # 读取第一帧以获取视频尺寸
    first_img = cv2.imread(os.path.join(img_dir, img_files[0]))
    height, width = first_img.shape[:2]
    
    # 创建输出视频
    os.makedirs(output_dir, exist_ok=True)
    output_path = os.path.join(output_dir, f"{sequence_name}_{modality}.avi")
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    video_writer = cv2.VideoWriter(output_path, fourcc, 20.0, (width, height))
    
    # 逐帧绘制跟踪框
    for idx, img_file in enumerate(img_files):
        # 读取图像
        img_path = os.path.join(img_dir, img_file)
        frame = cv2.imread(img_path)
        
        if frame is None:
            print(f"⚠️  无法读取图像: {img_path}")
            continue
        
        # 绘制跟踪框(如果有对应的框)
        if idx < len(tracking_boxes):
            x, y, w, h = tracking_boxes[idx]
            
            # 转换为整数坐标
            x, y, w, h = int(x), int(y), int(w), int(h)
            
            # 绘制矩形框(绿色,线宽2)
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
            
            # 添加帧号文本
            cv2.putText(frame, f"Frame: {idx+1}", (10, 30), 
                       cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
        
        # 写入视频
        video_writer.write(frame)
        
        # 显示进度
        if (idx + 1) % 50 == 0:
            print(f"   处理进度: {idx+1}/{len(img_files)}")
    
    video_writer.release()
    print(f"✅ 视频已保存: {output_path}\n")

def visualize_all_sequences(dataset_root, results_root, output_dir, modality='visible'):
    """
    批量可视化所有序列
    """
    results_dir = os.path.join(results_root, 'RGBT234', 'rgbt')
    
    if not os.path.exists(results_dir):
        print(f"❌ 结果目录不存在: {results_dir}")
        return
    
    # 获取所有结果文件
    result_files = [f for f in os.listdir(results_dir) if f.endswith('.txt')]
    
    print(f"🎯 找到 {len(result_files)} 个跟踪结果文件\n")
    
    for result_file in result_files:
        sequence_name = result_file.replace('.txt', '')
        result_path = os.path.join(results_dir, result_file)
        
        try:
            visualize_sequence(dataset_root, sequence_name, result_path, 
                             output_dir, modality)
        except Exception as e:
            print(f"❌ 处理 {sequence_name} 时出错: {str(e)}\n")

def main():
    parser = argparse.ArgumentParser(description='可视化RGBT234跟踪结果')
    parser.add_argument('--dataset', type=str, required=True,
                       help='RGBT234数据集根目录')
    parser.add_argument('--results', type=str, required=True,
                       help='跟踪结果根目录')
    parser.add_argument('--output', type=str, default='./visualizations',
                       help='输出视频保存目录')
    parser.add_argument('--modality', type=str, default='visible',
                       choices=['visible', 'infrared'],
                       help='可视化模态: visible(可见光) 或 infrared(热红外)')
    parser.add_argument('--sequence', type=str, default=None,
                       help='指定单个序列名称(可选,不指定则处理所有序列)')
    
    args = parser.parse_args()
    
    print("="*60)
    print("🎬 RGBT234 跟踪结果可视化工具")
    print("="*60)
    print(f"数据集路径: {args.dataset}")
    print(f"结果路径: {args.results}")
    print(f"输出路径: {args.output}")
    print(f"可视化模态: {args.modality}")
    print("="*60 + "\n")
    
    if args.sequence:
        # 可视化单个序列
        result_path = os.path.join(args.results, 'RGBT234', 'rgbt', f'{args.sequence}.txt')
        visualize_sequence(args.dataset, args.sequence, result_path, 
                         args.output, args.modality)
    else:
        # 批量可视化所有序列
        visualize_all_sequences(args.dataset, args.results, 
                               args.output, args.modality)
    
    print("="*60)
    print("✨ 可视化完成!")
    print("="*60)

if __name__ == '__main__':
    main()

或者直接在pycharm中手动创建文件,但是我将该代码复制粘贴不到该python文件中,是通过手动打开本地文件进行粘贴上去的。

另外,在创建这个python文件时,我是现在终端上进行创建,没有在pycham上发现该文件,而且我发现我不太会用复制粘贴的指令,于是在pycharm上进行创建,两边都创建了文件,我怕冲突,就删除了pycharm上创建的文件,准备再删除终端上创建的文件,用这个指令:

复制代码
# 进入文件所在目录
cd /home/dxf/BAT-main

# 删除文件
rm visualize_tracking.py

没找到该文件,可能就没创建成功。

二,确认路径结构

首先确定你的数据集和结果路径

复制代码
# 查看RGBT234数据集结构(应该在Pudata下)
ls /home/Pudata/RGBT234/

# 查看跟踪结果
ls /home/dxf/BAT-main/RGBT_workspace/results/RGBT234/rgbt/

RGBT234的典型结构应该是:

复制代码
RGBT234/
├── afterrain/
│   ├── visible/
│   │   ├── 00001.jpg
│   │   ├── 00002.jpg
│   │   └── ...
│   └── infrared/
│       ├── 00001.jpg
│       └── ...
├── aftertree/
└── ...

本文结构:

复制代码
afterrain/
├── visible/          # 可见光图像文件夹 ✅
├── infrared/         # 热红外图像文件夹 ✅
├── visible.txt       # Ground Truth标注文件
├── infrared.txt      # Ground Truth标注文件
└── 其他.tag文件      # 属性标签文件

三,运行可视化脚本

方法1:可视化单个序列(快速测试)

复制代码
# 激活conda环境
conda activate py37

# 可视化单个视频(如afterrain)
python visualize_tracking.py \
    --dataset /home/Pudata/RGBT234 \
    --results /home/dxf/BAT-main/RGBT_workspace/results \
    --output ./visualizations \
    --modality visible \
    --sequence afterrain

我只进行了单个序列的可视化。另外,我在逐行分别输入命令 ,但是每行的 \ 后面按了回车键,导致bash认为这些是独立的参数而不是一个完整的命令。(我是直接复制粘贴指令上去的)

可以通过把参数全写在一行上面:

复制代码
python visualize_tracking.py --dataset /home/Pudata/RGBT234 --results /home/dxf/BAT-main/RGBT_workspace/results --output ./visualizations --modality visible --sequence afterrain

运行结果:

方法2:批量可视化所有序列

复制代码
# 处理所有测试序列(可见光模态)
python visualize_tracking.py \
    --dataset /home/Pudata/RGBT234 \
    --results /home/dxf/BAT-main/RGBT_workspace/results \
    --output ./visualizations \
    --modality visible

方法3:可视化热红外模态

复制代码
python visualize_tracking.py \
    --dataset /home/Pudata/RGBT234 \
    --results /home/dxf/BAT-main/RGBT_workspace/results \
    --output ./visualizations \
    --modality infrared \
    --sequence afterrain

四,查看生成的视频

复制代码
# 查看生成的视频文件
ls -lh /home/dxf/BAT-main/visualizations/

# 使用Linux自带的视频播放器观看
vlc /home/dxf/BAT-main/visualizations/afterrain_visible.avi
# 或
totem /home/dxf/BAT-main/visualizations/afterrain_visible.avi

运行结果:

可视化脚本运行非常成功,已经得到了 afterrain_visible.avi 视频文件。

出现 bash: vlc: 未找到命令 是因为我的 Linux 系统中没有安装 VLC 播放器

直接打开图形化界面,在桌面环境下操作:打开"文件管理器"(类似 Windows 的文件夹)。

  1. 导航到目录:/home/dxf/BAT-main/visualizations/
  2. 你应该能看到 afterrain_visible.avi 这个文件。
  3. 直接双击它,系统会调用自带的默认播放器打开它。(我是直接在系统提示下安装了一个小插件,然后得到了最终的视频)

第一个序列是包含123帧的视频。

五,(可选)生成对比视频

如果你想同时看到可见光和热红外的跟踪效果,可以创建一个并排对比的脚本:

复制代码
nano visualize_comparison.py

添加以下代码:

复制代码
import cv2
import numpy as np
import os

def create_comparison_video(seq_name, vis_video_path, ir_video_path, output_path):
    """创建左右并排对比视频"""
    
    # 打开两个视频
    vis_cap = cv2.VideoCapture(vis_video_path)
    ir_cap = cv2.VideoCapture(ir_video_path)
    
    # 获取视频属性
    fps = int(vis_cap.get(cv2.CAP_PROP_FPS))
    width = int(vis_cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(vis_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    
    # 创建输出视频(宽度是原来的2倍)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter(output_path, fourcc, fps, (width * 2, height))
    
    print(f"🎥 生成对比视频: {seq_name}")
    
    frame_idx = 0
    while True:
        ret1, vis_frame = vis_cap.read()
        ret2, ir_frame = ir_cap.read()
        
        if not ret1 or not ret2:
            break
        
        # 在可见光帧上添加标签
        cv2.putText(vis_frame, "Visible", (10, height - 20),
                   cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
        
        # 在热红外帧上添加标签
        cv2.putText(ir_frame, "Infrared", (10, height - 20),
                   cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
        
        # 水平拼接两个帧
        combined = np.hstack((vis_frame, ir_frame))
        
        # 写入输出视频
        out.write(combined)
        
        frame_idx += 1
        if frame_idx % 50 == 0:
            print(f"   处理帧: {frame_idx}")
    
    vis_cap.release()
    ir_cap.release()
    out.release()
    
    print(f"✅ 对比视频已保存: {output_path}\n")

if __name__ == '__main__':
    # 配置路径
    vis_dir = './visualizations'
    output_dir = './visualizations/comparisons'
    os.makedirs(output_dir, exist_ok=True)
    
    # 获取所有可见光视频
    vis_videos = [f for f in os.listdir(vis_dir) if f.endswith('_visible.avi')]
    
    for vis_video in vis_videos:
        seq_name = vis_video.replace('_visible.avi', '')
        ir_video = f'{seq_name}_infrared.avi'
        
        vis_path = os.path.join(vis_dir, vis_video)
        ir_path = os.path.join(vis_dir, ir_video)
        
        if os.path.exists(ir_path):
            output_path = os.path.join(output_dir, f'{seq_name}_comparison.avi')
            create_comparison_video(seq_name, vis_path, ir_path, output_path)

    print("✨ 所有对比视频生成完成!")

运行对比脚本:

复制代码
python visualize_comparison.py

如果有很多序列需要处理,可以只处理几个代表性的:

复制代码
# 只处理3个序列
for seq in afterrain aftertree baby; do
    python visualize_tracking.py \
        --dataset /home/Pudata/RGBT234 \
        --results /home/dxf/BAT-main/RGBT_workspace/results \
        --output ./visualizations \
        --sequence $seq
done
相关推荐
极安代理2 小时前
代理地址IP怎么获取和使用?一文讲清
服务器·网络·tcp/ip
物理与数学2 小时前
Linux 页表映射
linux·linux内核
2501_945837432 小时前
相变浸没液冷,中科曙光突破超算级算力散热瓶颈
服务器
在线OJ的阿川2 小时前
vscode远程连接服务器:解决Got bad result from install script
服务器·ide·vscode·个人开发
Jorunk2 小时前
VS Code的Remote-SSH免密登录
运维·ssh
沐雨风栉2 小时前
用 Kavita+cpolar 把数字书房装进口袋
服务器·开发语言·数据库·后端·golang
UP_Continue2 小时前
Linux--进程状态
linux·运维·服务器
C++ 老炮儿的技术栈2 小时前
KUKA机器人程序抓料
linux·运维·c语言·人工智能·机器人·库卡
紫神2 小时前
不重启节点情况下删除rook-ceph
linux·运维·服务器·rook-ceph