代码讲解系列-CV(四)——目标检测初探
文章目录
- 一、目标检测标注
- 1.1 Lableme——标准工具
- 1.2 json格式
- 二、检测数据解析
- 2.1 coco
- 2.2 Pascal VOC
- 2.3 YOLO
- 2.3.1 VOC2YOLO
- 三、网络搭建
- 3.1 DETR
- 3.1 dataset
- 3.2 ViT添加检测头
- 3.3 IOU
- 3.4 损失函数
- 3.5 推理处理
- 四、Yolo-v8
- 4.1 Ultralytics
- 4.2 训练
- 4.3 指标
- 五、作业
- 六、其他
- 6.1 并行训练
- DP
- DDP
- 6.2 DDP训练
- 6.3 注意事项
一、目标检测标注
1.1 Lableme——标准工具
左上到右下的选择
1.2 json格式
二、检测数据解析
2.1 coco
检测数据集自带检测定义
2.2 Pascal VOC
是xml的后缀名
2.3 YOLO
今天是希望把标注出来的数据转换成yolo的数据格式
2.3.1 VOC2YOLO
对于labelme有转换到VOC和coco的数据格式转换
三、网络搭建
3.1 DETR
3.1 dataset
图像,标签;分类+box位置
3.2 ViT添加检测头
3.3 IOU
True Positive: 有预测的边界框与给定类的目标边界框的IOU大于阈值
False Positive: 有预测的边界框与给定类的目标边界框的IOU小于阈值
True Negative: 无目标
False Negative: 没有预测出任何边界框
3.4 损失函数
匈牙利算法
阈值过滤+NMS
3.5 推理处理
四、Yolo-v8
4.1 Ultralytics
https://yolov8.com/
安装库: pip install ultralytics
编写yolo配置文件data.yaml
定义训练和验证集路径、类别等信息
4.2 训练
编写yolo训练文件
4.3 指标
box_loss (定位损失):
•衡量边界框的位置和形状是否准确。
•直接影响检测框的位置和大小。
cls_loss (分类损失):
•衡量目标的类别预测是否准确。
•决定模型的分类性能。
dfl_loss (细粒度边界框损失):
•提高边界框预测的精度,使边界框更加贴合目标。
-
mAP@50
表示IoU(Intersection over Union)阈值固定为 0.5 时计算的平均精度
AP (Average Precision): 对某个类别,按照模型输出的置信度排序,计算精度
mAP: 将每个类别的 AP 平均,得到所有类别的平均值。 -
mAP@50-95
在IoU 阈值从 0.5 到 0.95 之间(每隔 0.05 递增), 对每个阈值分别计算 mAP,然后取所有
阈值的平均值。
五、作业
一、基于本课内容,生成以下数据集的
yolo标签,并调用yolov8进行训练。
https://aistudio.baidu.com/datasetdetail/312444
二、参考上节课的
VIT模型和DETR,自己添加多目标检测分类头进行训练。
六、其他
6.1 并行训练
DP
torch.nn.DataParallel(module, device_ids=None, output_device=None)
网络在前向传播时会将model从主卡复制一份到所有的device上, input_data会在batch这个维度被分组后upload到不同的device上计算;反向传播时,每个卡上的梯度会汇总到主卡上,求得梯度的均值后,再用反向传播更新单个GPU上的模型参数,最后将更新后的模型参数复制到剩余指定的GPU中进行下一轮的前向传播。
缺点:负载不均衡,通信成本高
DDP
https://pytorch.org/docs/stable/generated/torch.nn.parallel.DistributedDataParallel.html#torch.nn.parallel.DistributedDataParallel
torch.nn.parallel.DistributedDataParallel(module, device_ids=None, output_device=None, dim=0, broadcast_buffers=True, process_group=None, bucket_cap_mb=25, find_unused_parameters=False, check_reduction=False)
6.2 DDP训练
- 初始化分布式环境
def setup(rank, world_size):
os.environ[“MASTER_ADDR”] = ‘localhost’
os.environ[“MASTER_PORT”] = “12355”
dist.init_process_group(“nccl”, rank=rank, world_size=world_size)
torch.cuda.set_device(rank)
def cleanup():
dist.destroy_process_group() - 模型 torch.nn.parallel.DistributedDataParallel
ddp_model = DDP(model, device_ids=[rank]) - 数据 torch.utils.data.distributed.DistributedSampler
sampler = DistributedSampler(dataset, num_replicas=world_size, rank=rank)
dataloader = DataLoader(dataset, batch_size=64, sampler=sampler)
sampler.set_epoch(epoch) - 运行
torchrun --nproc_per_nodes=2 --nnodes=1 example_script.py
torch.multiprocessing.spawn
6.3 注意事项
-
使用rank=0的主进程进行日志记录和模型保存
-
DP训练后的模型参数,进行单卡推理
checkpoint = torch.load(“model.pth”)移除 “module.” 前缀
state_dict = {key.replace(“module.”, “”): value for key, value in checkpoint[“state_dict”].items()}model.load_state_dict(state_dict)