YOLOX-入门2-训练-【Reproduce our results on COCO】

YOLOX-入门2-训练-【Reproduce our results on COCO】

上一篇:
YOLOX-部署与测试

部署的平台:【极链AI云平台】
YOLOX地址:
https://github.com/Megvii-BaseDetection/YOLOX

复现YOLOX在COCO数据集的结果

在这里插入图片描述

数据集

在部署平台极链AI云上,有提供数据集,其中就包括coco2017,可以直接用ln语句在自己的YOLOX路径下建立软链接,使用方便。
极链AI云提供的coco数据集中,有提示该coco数据集的路径,可以直接复制过去,替代官方给的示例中的【/path/to/your/COCO】。
在这里插入图片描述
注意
这里测试的是coco2017数据集,如果你想改其他的coco数据集,可以在/root/YOLOX/yolox/data/datasets/coco.py路径下,改这个coco.py。
他这里设置的是instances_train2017.json文件。
还有root/YOLOX/yolox/exp/yolox_base.py文件,如下图2。
我目前只注意到这两个,我没有实际运行过用coco2014的。
在这里插入图片描述
在这里插入图片描述

epoch修改

在/root/YOLOX/yolox/exp/yolox_base.py文件中,可以修改epoch数。
原本设定的max_epoch是300。
我自己尝试的时候,为了更快训练完,改成了5。
在这里插入图片描述

运行

cd /root/YOLOX
ln -s /datasets/coco2017 ./datasets/COCO
python tools/train.py -n yolox-s -d 8 -b 64 --fp16 -o

其中,d后是GPU数量,b后是batch size,通常就是GPU数量乘8:
-d: number of gpu devices
-b: total batch size, the recommended number for -b is num-gpu * 8

一开始博主在平台上创建实例的时候,由于贫穷,GPU数量选择的是1个。
但是-d 1 -b 8,这样子的参数,去跑coco2017,大概要跑一辈子。
所以,忍痛充钱,用8GPU的跑。
8GPU的跑5epoch,用时大约43分钟。
2GPU的跑5epoch,预计用时是 2:16:55。(我就不等了,没有跑完)

关于增加GPU的数量,现在平台还不能直接升。
可以先创建自定义镜像,然后再从【数据管理】——【我的镜像】——找到刚刚自定义创建的镜像——【创建实例】——改选8个GPU数量
他的官方教程:使用过程中想要增加或减少显卡数量,更换显卡型号怎么办?
或者重新从安装开始来一次,这样可能报错更少,更顺利。

训练过程

下面这个只是某一时刻的,运行一段时间后GPU-Util比较平均。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

训练结束

训练结束,在YOLOX_outputs/yolox_s/目录下产生了新的权重文件。
将events.out.tfevents这两个文件copy到data-output路径下,再打开tensorboard,就可以查看训练结果的可视化展示。
云平台上操作的教程:TensorBoard 使用
在这里插入图片描述
在这里插入图片描述

结果对比

为了保持继续深入学习的高涨的热情,建立了一个帅哥测试数据集。
今天随手测了最近看的一个韩剧的片段。
分别用yolox_m模型,和本篇博客中只训练5个epoch的/root/YOLOX/YOLOX_outputs/yolox_s/best_ckpt.pth.tar模型,运行同一段视频。

只训练了40多分钟,5个epoch的模型,全程只能识别出person这个类别,而且当人背向镜头的时候,识别他为人的概率只有50%左右。
所以这个就不放截图了。

官方给的yolox_m模型就效果好很多。能识别出很多小物体。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是NSGA-II算法的Python代码(附有注释): ```python import random import numpy as np # 定义一个类来表示每个个体 class Individual: def __init__(self, x, y): self.x = x self.y = y self.rank = None self.crowding_distance = None # 计算个体的适应度函数值 def evaluate(self): self.fitness = [self.x**2, self.y**2] # 初始化种群 def initialize_population(pop_size): population = [] for i in range(pop_size): x = random.uniform(-5, 5) y = random.uniform(-5, 5) individual = Individual(x, y) individual.evaluate() population.append(individual) return population # 计算支配关系 def dominates(x, y): return all(x_i >= y_i for x_i, y_i in zip(x.fitness, y.fitness)) and any(x_i > y_i for x_i, y_i in zip(x.fitness, y.fitness)) # 计算非支配排序 def non_dominated_sort(population): # 存储支配个体的数量 domination_count = [0] * len(population) # 存储每个个体被哪些个体支配 dominated_individuals = [[] for _ in range(len(population))] # 存储每个个体支配的个体 dominating_individuals = [[] for _ in range(len(population))] # 存储每个个体的等级 ranks = [None] * len(population) # 第一层中的个体没有被任何个体支配 front_1 = [] for i, individual in enumerate(population): for j, other_individual in enumerate(population): if i == j: continue if dominates(individual, other_individual): # i 支配 j dominating_individuals[i].append(j) dominated_individuals[j].append(i) elif dominates(other_individual, individual): # i 被 j 支配 domination_count[i] += 1 if domination_count[i] == 0: ranks[i] = 1 front_1.append(i) fronts = [front_1] current_front = 0 while True: next_front = [] for i in fronts[current_front]: for j in dominating_individuals[i]: domination_count[j] -= 1 if domination_count[j] == 0: ranks[j] = current_front + 2 next_front.append(j) if not next_front: break fronts.append(next_front) current_front += 1 for i, individual in enumerate(population): individual.rank = ranks[i] return fronts # 计算拥挤度 def crowding_distance(front): distances = [0] * len(front) # 对每个目标函数都进行排序 for i in range(2): front.sort(key=lambda individual: individual.fitness[i]) distances[0] = distances[-1] = float('inf') fitness_range = front[-1].fitness[i] - front[0].fitness[i] # 计算每个个体的拥挤度 for j in range(1, len(front) - 1): distances[j] += (front[j+1].fitness[i] - front[j-1].fitness[i]) / fitness_range for i, individual in enumerate(front): individual.crowding_distance = distances[i] # 计算新的种群 def reproduce(fronts, pop_size): new_population = [] current_size = 0 front_index = 0 # 按照等级从前往后遍历每一层 while current_size < pop_size and front_index < len(fronts): # 如果加入这一层的所有个体总数小于等于种群大小,则全部加入新种群 if current_size + len(fronts[front_index]) <= pop_size: for individual_index in fronts[front_index]: new_population.append(population[individual_index]) current_size += 1 front_index += 1 else: # 否则,按照拥挤度选择部分个体加入新种群 crowding_distances = [individual.crowding_distance for individual in fronts[front_index]] sort_order = np.argsort(crowding_distances)[::-1] for i in sort_order: new_population.append(population[fronts[front_index][i]]) current_size += 1 if current_size == pop_size: break front_index += 1 return new_population # 初始化种群 population = initialize_population(100) # 迭代次数 num_generations = 50 # 进化 for generation in range(num_generations): fronts = non_dominated_sort(population) for front in fronts: crowding_distance(front) population = reproduce(fronts, len(population)) # 输出 Pareto 最优解 pareto_front = non_dominated_sort(population)[0] for index in pareto_front: print(population[index].fitness)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值