Faster RCNN训练自己的数据集

参考作者:对比实验系列:Faster R-CNN配置及训练自己数据集_做对比实验时应该与哪个版本的faster rcnn对比-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Yayisheng/article/details/138496610?ops_request_misc=%257B%2522request%255Fid%2522%253A%25226F6B58AF-AA6A-486E-A87F-53116E9C0D31%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=6F6B58AF-AA6A-486E-A87F-53116E9C0D31&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-138496610-null-null.142%5Ev100%5Epc_search_result_base7&utm_term=faster%20rcnn%E8%AE%AD%E7%BB%83%E8%87%AA%E5%B7%B1%E6%95%B0%E6%8D%AE&spm=1018.2226.3001.4187

一、下载源码

https://gitcode.com/gh_mirrors/fa/faster-rcnn-pytorch/overview?utm_source=csdn_github_accelerator&isLogin=1icon-default.png?t=O83Ahttps://gitcode.com/gh_mirrors/fa/faster-rcnn-pytorch/overview?utm_source=csdn_github_accelerator&isLogin=1

二、配置环境

        1.这里我使用的是 python3.8

        2.安装依赖包 pip install -r requirements.txt

三、预训练权重下载

        1.双击下载,保存到 model_data 文件夹下

四、制作数据集

        1.找到model_data/voc_classes.txt,修改为自己的类别

        2.运行voc_annotation.py

        在根目录生成2007_train.txt和2007_val.txt,

        在VOCdevkit\VOC2007\ImageSets\Main文件夹下生成四个txt文件,train.txt,val.txt,       trainval.txt和test.txt

五、训练

1.修改train.py文件参数

        自己的类别路径:classes_path = 'model_data/voc_classes.txt'

        vgg权重路径:model_path = 'model_data/voc_weights_vgg.pth'

        主干网络:backbone = "vgg"

2.运行train.py即可

六、验证

        注意:训练时的backbone为vgg,则主目录下的frcnn.py的backbone也要是vgg

1.修改主目录下的frcnn.py的参数,使用训练好best_epoch_weights.py作为权重,自己的类别文件,训练时的主干网络(我使用的是vgg)

2.修改predict.py文件的验证模式,这里我选择的是验证文件下的图片

3.在predict.py文件下,指定原图片路径,输出图片路径,这里我是新建了一个文件夹

七、可视化精准度

1.修改主目录下的frcnn.py文件

(1)依旧是与训练时的backbone保持一致

(2)红线部分为验证图片的路径,自己可随意修改

2.运行get_map.py文件,终端结果如下

(1)可视化图表

(2)终端结果

Faster R-CNN 是一种基于深度学习目标检测算法,它可以用于训练自己的数据集。下面是 Faster R-CNN 训练自己数据集的代码示例: 1. 准备训练数据集 首先需要准备训练数据集,包括图像和标注文件。标注文件可以是 VOC 格式或 COCO 格式。 2. 安装依赖库和下载代码 需要安装 TensorFlow 和 Keras,以及下载 Faster R-CNN 的代码。 3. 修改配置文件 修改 Faster R-CNN 的配置文件,包括训练和测试的参数、数据集路径以及模型保存路径等。 4. 训练模型 运行训练代码,使用准备好的数据集进行训练,直到模型收敛或达到预设的训练轮数。 5. 测试模型 使用测试数据集训练好的模型进行测试,评估模型的准确率和召回率等指标。 6. 模型优化 根据测试结果对模型进行优化,包括调整参数、增加数据集大小等。 参考代码: 以下是 Faster R-CNN 训练自己数据集的代码示例。这里以 TensorFlow 和 Keras 为例,代码中的数据集为 VOC 格式。 ```python # 导入依赖库 import tensorflow as tf from keras import backend as K from keras.layers import Input from keras.models import Model from keras.optimizers import Adam from keras.utils import plot_model from keras.callbacks import TensorBoard, ModelCheckpoint from keras_frcnn import config from keras_frcnn import data_generators from keras_frcnn import losses as losses_fn from keras_frcnn import roi_helpers from keras_frcnn import resnet as nn from keras_frcnn import visualize # 设置配置文件 config_output_filename = 'config.pickle' network = 'resnet50' num_epochs = 1000 output_weight_path = './model_frcnn.hdf5' input_weight_path = './resnet50_weights_tf_dim_ordering_tf_kernels.h5' tensorboard_dir = './logs' train_path = './train.txt' test_path = './test.txt' num_rois = 32 horizontal_flips = True vertical_flips = True rot_90 = True output_weight_path = './model_frcnn.hdf5' # 加载配置文件 config = config.Config() config_output_filename = 'config.pickle' # 加载数据集 all_imgs, classes_count, class_mapping = data_generators.get_data(train_path) test_imgs, _, _ = data_generators.get_data(test_path) # 计算平均像素值 if 'bg' not in classes_count: classes_count['bg'] = 0 class_mapping['bg'] = len(class_mapping) config.class_mapping = class_mapping # 计算平均像素值 C = config.num_channels mean_pixel = [103.939, 116.779, 123.68] img_size = (config.im_size, config.im_size) # 组装模型 input_shape_img = (None, None, C) img_input = Input(shape=input_shape_img) roi_input = Input(shape=(num_rois, 4)) shared_layers = nn.nn_base(img_input, trainable=True) # RPN 网络 num_anchors = len(config.anchor_box_scales) * len(config.anchor_box_ratios) rpn_layers = nn.rpn(shared_layers, num_anchors) # RoI 网络 classifier = nn.classifier(shared_layers, roi_input, num_rois, nb_classes=len(classes_count), trainable=True) model_rpn = Model(img_input, rpn_layers) model_classifier = Model([img_input, roi_input], classifier) # 加载权重 model_rpn.load_weights(input_weight_path, by_name=True) model_classifier.load_weights(input_weight_path, by_name=True) # 生成训练数据 data_gen_train = data_generators.get_anchor_gt(all_imgs, classes_count, C, K.image_dim_ordering(), mode='train', \ img_size=img_size, \ num_rois=num_rois, \ horizontal_flips=horizontal_flips, \ vertical_flips=vertical_flips, \ rot_90=rot_90) # 编译模型 optimizer = Adam(lr=1e-5) model_rpn.compile(optimizer=optimizer, loss=[losses_fn.rpn_loss_cls(num_anchors), losses_fn.rpn_loss_regr(num_anchors)]) model_classifier.compile(optimizer=optimizer, loss=[losses_fn.class_loss_cls, losses_fn.class_loss_regr(len(classes_count) - 1)], metrics={'dense_class_{}'.format(len(classes_count)): 'accuracy'}) # 训练模型 epoch_length = 1000 num_epochs = int(num_epochs) iter_num = 0 losses = np.zeros((epoch_length, 5)) rpn_accuracy_rpn_monitor = [] rpn_accuracy_for_epoch = [] start_time = time.time() best_loss = np.Inf class_mapping_inv = {v: k for k, v in class_mapping.items()} print('Starting training') for epoch_num in range(num_epochs): progbar = generic_utils.Progbar(epoch_length) print('Epoch {}/{}'.format(epoch_num + 1, num_epochs)) while True: try: if len(rpn_accuracy_rpn_monitor) == epoch_length and C.verbose: mean_overlapping_bboxes = float(sum(rpn_accuracy_rpn_monitor)) / len(rpn_accuracy_rpn_monitor) rpn_accuracy_rpn_monitor = [] print('Average number of overlapping bounding boxes from RPN = {} for {} previous iterations'.format(mean_overlapping_bboxes, epoch_length)) if mean_overlapping_bboxes == 0: print('RPN is not producing bounding boxes that overlap the ground truth boxes. Check RPN settings or keep training.') X, Y, img_data = next(data_gen_train) loss_rpn = model_rpn.train_on_batch(X, Y) P_rpn = model_rpn.predict_on_batch(X) R = roi_helpers.rpn_to_roi(P_rpn[0], P_rpn[1], C.image_dim_ordering(), use_regr=True, overlap_thresh=0.7, max_boxes=300) X2, Y1, Y2, IouS = roi_helpers.calc_iou(R, img_data, C, class_mapping) if X2 is None: rpn_accuracy_rpn_monitor.append(0) rpn_accuracy_for_epoch.append(0) continue # sampling positive/negative samples neg_samples = np.where(Y1[0, :, -1] == 1) pos_samples = np.where(Y1[0, :, -1] == 0) if len(neg_samples) > 0: neg_samples = neg_samples[0] else: neg_samples = [] if len(pos_samples) > 0: pos_samples = pos_samples[0] else: pos_samples = [] rpn_accuracy_rpn_monitor.append(len(pos_samples)) rpn_accuracy_for_epoch.append((len(pos_samples))) if C.num_rois > 1: if len(pos_samples) < C.num_rois // 2: selected_pos_samples = pos_samples.tolist() else: selected_pos_samples = np.random.choice(pos_samples, C.num_rois // 2, replace=False).tolist() try: selected_neg_samples = np.random.choice(neg_samples, C.num_rois - len(selected_pos_samples), replace=False).tolist() except: selected_neg_samples = np.random.choice(neg_samples, C.num_rois - len(selected_pos_samples), replace=True).tolist() sel_samples = selected_pos_samples + selected_neg_samples else: # in the extreme case where num_rois = 1, we pick a random pos or neg sample selected_pos_samples = pos_samples.tolist() selected_neg_samples = neg_samples.tolist() if np.random.randint(0, 2): sel_samples = random.choice(neg_samples) else: sel_samples = random.choice(pos_samples) loss_class = model_classifier.train_on_batch([X, X2[:, sel_samples, :]], [Y1[:, sel_samples, :], Y2[:, sel_samples, :]]) losses[iter_num, 0] = loss_rpn[1] losses[iter_num, 1] = loss_rpn[2] losses[iter_num, 2] = loss_class[1] losses[iter_num, 3] = loss_class[2] losses[iter_num, 4] = loss_class[3] iter_num += 1 progbar.update(iter_num, [('rpn_cls', np.mean(losses[:iter_num, 0])), ('rpn_regr', np.mean(losses[:iter_num, 1])), ('detector_cls', np.mean(losses[:iter_num, 2])), ('detector_regr', np.mean(losses[:iter_num, 3])), ('mean_overlapping_bboxes', float(sum(rpn_accuracy_for_epoch)) / len(rpn_accuracy_for_epoch))]) if iter_num == epoch_length: loss_rpn_cls = np.mean(losses[:, 0]) loss_rpn_regr = np.mean(losses[:, 1]) loss_class_cls = np.mean(losses[:, 2]) loss_class_regr = np.mean(losses[:, 3]) class_acc = np.mean(losses[:, 4]) mean_overlapping_bboxes = float(sum(rpn_accuracy_for_epoch)) / len(rpn_accuracy_for_epoch) rpn_accuracy_for_epoch = [] if C.verbose: print('Mean number of bounding boxes from RPN overlapping ground truth boxes: {}'.format(mean_overlapping_bboxes)) print('Classifier accuracy for bounding boxes from RPN: {}'.format(class_acc)) print('Loss RPN classifier: {}'.format(loss_rpn_cls)) print('Loss RPN regression: {}'.format(loss_rpn_regr)) print('Loss Detector classifier: {}'.format(loss_class_cls)) print('Loss Detector regression: {}'.format(loss_class_regr)) print('Elapsed time: {}'.format(time.time() - start_time)) curr_loss = loss_rpn_cls + loss_rpn_regr + loss_class_cls + loss_class_regr iter_num = 0 start_time = time.time() if curr_loss < best_loss: if C.verbose: print('Total loss decreased from {} to {}, saving weights'.format(best_loss, curr_loss)) best_loss = curr_loss model_rpn.save_weights(output_weight_path) model_classifier.save_weights(output_weight_path) break except Exception as e: print('Exception: {}'.format(e)) continue print('Training complete, exiting.') ``` 这是一个简单的 Faster R-CNN 训练自己数据集的示例代码,可以根据自己的数据集和需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值