faster rcnn 训练自己的数据集---踩坑记录!!!

1.下载代码:

git clone https://github.com/jwyang/faster-rcnn.pytorch.git

也可以暴力下载<--直接download压缩包-->

2. 解压完-->cd到faser-rcnn.pytorch文件夹中,-->再创建新的文件夹用来存放自己制作的数据集

3.cd ..返回到faster-rcnn.pytorch文件夹中-->然后在终端输入

pip install -r requirements.txt 

4.踩坑点!!!重要的事情感叹号!!!

这一步有很多要修改的点

(1)首先针对错误 --can't import 'imread'-->需要将scipy的版本降低

pip install scipy==1.0

(2)cd到lib文件夹进行编译

python setup.py build develop

(3)***--安装CoCo API--***

针对错误 

ImportError: cannot import name '_mask'和

ModuleNotFoundError: No module named 'pycocotools._mask'-->需要下载cocoapi

git clone https://github.com/cocodataset/cocoapi.git

随便你放在什么位置,但还是建议放在lib里面,方便看,-->解压后cd到PYTHONAPI文件夹中-->如果是在ubuntu平台需要给一个权限,即加了前面sudo指令

sudo python setup.py install

还有一个坑...

_mask.so : undefined symbol: _Py_ZeroStruct

这时候需要-->

如果前面给了权限且不是另外开一个终端输入命令的情况下,其实也不需要sudo的

sudo python setup.py build_ext --inplace
sudo python setup.py build_ext install
sudo make

最最最后一个坑

TypeError: load() missing 1 required positional argument: 'Loader'

打开/lib/model/utils/config.py文件--> ctrl+f 搜索 

yaml_cfg = edict(yaml.load(f))

并将此改为

yaml_cfg = edict(yaml.load(f, Loader=yaml.FullLoader))

后面就是训练啦^&^

####这太多大佬都出了博文,就不重复啦,也只是对踩坑的地方做个记录####

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值