yolov3的多显卡训练单显卡测试(keras)版本

这篇博客记录了如何使用Keras进行Yolov3模型的多GPU训练,并在单GPU上进行测试。作者参考了多个资源,包括原始的keras-yolo3仓库、多GPU训练的实现以及关于`multi_gpu_model()`函数的详细解释。经过修改,实现了训练过程的多GPU支持,并通过CPU保存权重以便在单GPU环境下进行模型测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天是记录yolov3的多显卡的训练,之前也尝试过,没有跑起来,或者是跑起来了,但是不能单显卡检测,之后就不了了之了。

知道最近要训练大批量的数据,有多显卡不用实属浪费,于是就在网络找了找,跑成功了,可以多显卡训练,单显卡检测了。

主要是参考3个地方:

1.https://github.com/qqwweee/keras-yolo3 这个就是原始的yolo keras版本,但是好像没有多gpu选择

2.https://github.com/FlyEgle/keras-yolo3 这个就是多gpu训练的版本,然后在他的基础上修改了一下,他的代码只有训练前面的冻结层,我自己补全了一些东西,还是很感谢他分享代码的。

3.https://blog.youkuaiyun.com/u010122972/article/details/84784245 这个是讲multi_gpu_model()这个函数的,巨详细,很好!

然后下面贴上我修改的FlyEgle大神的代码,也是一个记录。主要思想就是用多gpu训练,然后用单cpu保存权重,这样就可以在单gpu上test了(我也不知道为啥是用cpu保存权重。。。。。)

主要修改的是FlyEgle里train_height_point.py的代码

"""
Retrain the YOLO model for your own dataset.
"""
import os

import numpy as np
import json
import codecs
import matplotlib.pyplot as plt
import keras.backend as K
import tensorflow as tf

from keras.layers import Input, Lambda, add
from keras.models import Model
from keras.optimizers import Adam, SGD
from keras.callbacks import TensorBoard, ModelCheckpoint, ReduceLROnPlateau, EarlyStopping, LearningRateScheduler
from keras.backend.tensorflow_backend import set_session 

from yolo3.model import preprocess_true_boxes, yolo_body, yolo_loss
from yolo3.utils import get_random_data
# 当前程序可以调用的gpu
os.environ["CUDA_VISIBLE_DEVICES"]="0,1,2,3"

def _main():
    # 这里是要的由VOC生成的txt,里面包括image地址和框和种类 需修改
    annotation_path = '/data/drone_detect/keras-yolo3-multigpu/6.6/final_label.txt'
    # 是存放生成好的新的weights的
    log_dir = '/data/drone_detect/keras-yolo3-multigpu/6.6/weights/'
    # 这个我只标记了4类,所以要修改,原来voc是有20类的
    classes_path = '/data/drone_detect/keras-yolo3-multigpu/6.6/voc_classes.txt'
    # 这里的anchor暂时先不修改(最好从新kmean算anchors)
    anchors_path = '/data/drone_detect/keras-yolo3-multigpu/6.6/all_anchors.txt'
    class_names = get_classes(classes_path)
    num_classes = len(class_names)
    anchors = get_anchors(anchors_path)

    input_shape = (480, 960) # multiple of 32, hw
    is_tiny_version = len(anchors)==6 # default setting
    # use tiny model if need else darkent53 model for train
    if is_tiny_version:
        '''cpu filed for create model and save weights from model'''
        pass
        # with tf.device('/cpu:0'):
        #     template_model = create_tiny_model(input_shape, anchors, num_classes,
        #         freeze_body=1, weights_path='model_data/tiny_yolo_weights.h5')
        #     print('model.input shape', model.input_layers)
    else:
        '''build the darknet53 model on the cpu'''
        with tf.device('/cpu:0'):
            # 这里放预训练权重
            # 这里是创建训练模型,在这里还没有加入duogpu模式
            template_model = create_model(input_shape, anchors, num_classes,
                freeze_body=1, weights_path="/data/drone_detect/keras-yolo3-multigpu/6.5/trained_weights_final_480x960_30.62.h5") # make sure you know what you freeze
            print('model.input shape', template_model.input_layers, 'model.inputs', template_model.inputs)
    logging = TensorBoard(log_dir=log_dir)
    checkpoint = ModelCheckpoint(log_dir + 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',
                                 monitor='val_loss', save_weights_only=True, save_best_only=True, period=3)
    reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1)

    # template_model input
    # print('model inputs', model.input)
    '''add shedule for reduce lr ratio by epoch monitor'''
    def shedule(epoch):
        if epoch <= 150:
            return 1e-3
        elif epoch <= 170:
            return 1e-4
        else:
            return 1e-5
    
    lr_shedule = LearningRateScheduler(shedule)
    
    early_stopping = EarlySto
### 训练YOLOv10模型仅使用CPU 尽管现代深度学习框架通常依赖于GPU来加速计算,但在某些情况下可能需要在纯CPU环境下训练模型。以下是关于如何实现这一目标的关键点: #### 使用PyTorch进行纯CPU训练 如果选择PyTorch作为深度学习框架,则可以通过设置设备为`cpu`来进行训练[^1]。这意味着所有的张量操作都将发生在CPU上而不是GPU上。 ```python import torch from torchvision.models import yolov10 # 假设存在yolov10预定义模型 device = torch.device(&#39;cpu&#39;) # 设置设备为CPU model = yolov10(pretrained=False).to(device) # 定义损失函数和优化器 criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9) # 数据加载部分省略... for data, target in dataloader: data, target = data.to(device), target.to(device) # 将数据移动到CPU optimizer.zero_grad() # 清零梯度 output = model(data) # 前向传播 loss = criterion(output, target) # 计算损失 loss.backward() # 反向传播 optimizer.step() # 更新参数 ``` 上述代码片段展示了如何通过指定`torch.device(&#39;cpu&#39;)`让整个流程运行在CPU上。 #### TensorFlow中的纯CPU配置 对于TensorFlow用户来说,可以禁用所有可用的GPU资源从而强制程序运行在CPU之上[^2]: ```python import tensorflow as tf tf.config.set_visible_devices([], &#39;GPU&#39;) with tf.device(&#39;/CPU:0&#39;): model = tf.keras.applications.YOLOV10(weights=None) # 创建模型实例 # 编译模型 model.compile(optimizer=&#39;adam&#39;, loss=&#39;sparse_categorical_crossentropy&#39;) # 开始训练过程 history = model.fit(train_dataset, epochs=epochs, validation_data=val_dataset) ``` 这里利用了`tf.config.set_visible_devices([])`方法隐藏掉系统内的任何GPU硬件支持,进而确保全部运算都在中央处理器完成。 #### 性能考量与优化建议 需要注意的是,在仅有核或核CPU的情况下执行大规模神经网络可能会非常耗时。为了缓解这个问题,可考虑以下几种策略: - **减少批量大小(batch size)**:较小批次能够降低内存占用率以及每轮迭代所需时间。 - **简化架构设计**:移除不必要的复杂组件比如注意力机制或者过卷积层堆叠。 - **线程/分布式处理**:即使是在无图形环境中也可以尝试启用异步I/O读取或是跨节点分布工作负载以提高吞吐效率。 最后值得注意的一点是虽然理论上可行但实际应用中由于缺乏专用硬件辅助往往难以达到理想效果因此推荐尽可能获取适当规格显卡用于此类任务除非确实受限条件不允许之外。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值