不能再详细!!!手把手教你用Faster-RCNN训练自己的数据集

本文详细介绍如何基于Faster RCNN框架,针对特定物体“transform”进行模型定制的过程,包括环境搭建、数据集准备、代码修改及训练测试全流程。

接前篇:http://blog.csdn.net/zcy0xy/article/details/79614690

一、环境安装准备

python2.7以及相关的包cython, python-opencv, easydict

Faster-RCNN用的是https://github.com/smallcorgi/Faster-RCNN_TF tensorflow版本

本文假设你已经按照上面的教程完成了安装,并可以运行demo.py


并且可以训练


二、准备自己的数据集

在实际的应用中,这个数据集肯定是自己项目里面拍摄的。

首先,拍摄的图片可能分辨率太大,不利于训练,通过一顿操作把他们差不多缩小到跟voc数据集里的图片差不多大小。

#coding=utf-8
import os  #打开文件时需要
from PIL import Image
import re

Start_path='C:\\Users\\zcy\\Desktop\\transform\\' #你的图片目录
iphone5_width=333 #图片最大宽度
iphone5_depth=500 #图片最大高度

list=os.listdir(Start_path)
#print list
count=0
for pic in list:
    path=Start_path+pic
    print path
    im=Image.open(path)
    w,h=im.size
    #print w,h
    #iphone 5的分辨率为1136*640,如果图片分辨率超过这个值,进行图片的等比例压缩

    if w>iphone5_width:
        print pic
        print "图片名称为"+pic+"图片被修改"
        h_new=iphone5_width*h/w
        w_new=iphone5_width
        count=count+1
        out = im.resize((w_new,h_new),Image.ANTIALIAS)
        new_pic=re.sub(pic[:-4],pic[:-4]+'_new',pic)
        #print new_pic
        new_path=Start_path+new_pic
        out.save(new_path)

    if h>iphone5_depth:
        print pic
        print "图片名称为"+pic+"图片被修改"
        w=iphone5_depth*w/h
        h=iphone5_depth
        count=count+1
        out = im.resize((w_new,h_new),Image.ANTIALIAS)
        new_pic=re.sub(pic[:-4],pic[:-4]+'_new',pic)
        #print new_pic
        new_path=Start_path+new_pic
        out.save(new_path)

print 'END'
count=str(count)
print "共有"+count+"张图片尺寸被修改"

然后命名图片,按照一定的规律——

#coding=utf-8
import os  #打开文件时需要
from PIL import Image
import re

class BatchRename():
    def __init__(self):
        #我的图片文件夹路径
        self.path = 'C:\\Users\\zcy\\Desktop\\transform'

    def rename(self):
        filelist = os.listdir(self.path)
        total_num = len(filelist)
        i = 10000 #图片编号从多少开始,不要跟VOC原本的编号重复了
        n = 6
        for item in filelist:
            if item.endswith('.jpg'):
                n = 6 - len(str(i))
                src = os.path.join(os.path.abspath(self.path), item)
                dst = os.path.join(os.path.abspath(self.path), str(0)*n + str(i) + '.jpg')
                try:
                    os.rename(src, dst)
                    print 'converting %s to %s ...' % (src, dst)
                    i = i + 1
                except:
                    continue
        print 'total %d to rename & converted %d jpgs' % (total_num, i)
if __name__ == '__main__':
    demo = BatchRename()
    demo.rename()
然后需要进行手动的标注,生成符合pascal VOC格式的xml文件,替换进去才能训练

这里我尝试了各种办法——修改数据接口,自己编辑json分割文件然后转换等等,最后找到了一条最简单的路,用labelImg工具制作。

下载地址  https://github.com/tzutalin/labelImg

使用方法特别简单,设定xml文件保存的位置,打开你的图片的目录,然后一幅一幅图的标注,就可以了。


比如这个物体命名为“transform”类。


把所有的图片全部标注完毕,生成了一堆的xml文件。

接下来,来到voc2007的目录这里,把原来的图片和xml删掉,位置分别是:

/home/Faster-RCNN_TF-master/data/VOCdevkit/VOC2007/JPEGImages
/home/Faster-RCNN_TF-master/data/VOCdevkit/VOC2007/Annotations
删掉是因为我们不需要训练别的数据集,只想训练自己的数据集,这样能快一点。

然后把我们的图片放到“/home/Faster-RCNN_TF-master/data/VOCdevkit/VOC2007/JPEGImages”里面来


接下来生成训练和测试需要的txt文件索引,程序是根据这个索引来获取图像的。

# !/usr/bin/python
# -*- coding: utf-8 -*-
import os
import random  
  
trainval_percent = 0.8  #trainval占比例多少
train_percent = 0.7  #test数据集占比例多少
xmlfilepath = 'Annotations'  
txtsavepath = 'ImageSets\Main'  
total_xml = os.listdir(xmlfilepath)  
  
num=len(total_xml)  
list=range(num)  
tv=int(num*trainval_percent)  
tr=int(tv*train_percent)  
trainval= random.sample(list,tv)  
train=random.sample(trainval,tr)  
  
ftrainval = open('ImageSets/Main/trainval.txt', 'w')  
ftest = open('ImageSets/Main/test.txt', 'w')  
ftrain = open('ImageSets/Main/train.txt', 'w')  
fval = open('ImageSets/Main/val.txt', 'w')  
  
for i  in list:  
    name=total_xml[i][:-4]+'\n'  
    if i in trainval:  
        ftrainval.write(name)  
        if i in train:  
            ftrain.write(name)  
        else:  
            fval.write(name)  
    else:  
        ftest.write(name)  
  
ftrainval.close()  
ftrain.close()  
fval.close()  
ftest .close()  
生成的索引文件在这里


四个文件,看名字想必就知道意思了。

三、修改源代码

好了,我们终于来最后一步了!

1. lib\datasets\pascal_voc.py中更改self._classes中的类别,添加自己的类名字“transform”



2. lib\networks中VGGnet_train.py和VGG_test.py中更改n_classes为自己的类的个数+1,这里我的是21+1=22



3. tools/demo.py中CLASSES的类别改为自己的类




四、开始训练

跟原来的训练方法一样,这里我们就输入

./experiments/scripts/faster_rcnn_end2end.sh gpu 0 VGG16 pascal_voc

我这里是使用GPU的,gpuid为0。

它会训练70000遍,每5000次保存一次在这里“/home/Faster-RCNN_TF-master/output/faster_rcnn_end2end/voc_2007_trainval”



我们可以在1万次时就停止训练,然后把10000那个model后缀名改成“.ckpt”,就可以使用了

五、测试

把几张测试图片放到这里来


修改demo里的测试图片名字


最后,运行demo就可以啦!

python ./tools/demo.py --model /home/Faster-RCNN_TF-master/output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_10000.ckpt

记得模型改成你刚才训练出来的文件名字

结果看起来还不错


恭喜,大功告成!!!




### 使用 Faster R-CNN 训练自定义数据集 为了使用 Faster R-CNN 进行目标检测并训练自定义数据集,可以按照以下方法操作: #### 1. 准备环境和依赖项 确保安装了必要的 Python 库以及深度学习框架 PyTorch。可以通过 pip 安装所需的包: ```bash pip install torch torchvision torchaudio ``` 此外,还需要准备 COCO API 或类似的工具来处理标注文件。 --- #### 2. 数据集格式化 Faster R-CNN 的输入通常需要遵循特定的格式。常见的做法是将数据转换为 COCO 格式或 Pascal VOC 格式。COCO 格式的 JSON 文件结构如下所示[^3]: ```json { "images": [ {"id": 0, "file_name": "image_0.jpg", ...}, ... ], "annotations": [ {"id": 1, "image_id": 0, "category_id": 0, "bbox": [x_min, y_min, width, height], ...}, ... ], "categories": [ {"id": 0, "name": "object_class"}, ... ] } ``` 如果数据不是这种格式,则需编写脚本将其转化为上述标准形式。 --- #### 3. 创建 Dataset 类 在 PyTorch 中,通过继承 `torch.utils.data.Dataset` 来创建一个新的类用于加载图像及其对应的标签信息。以下是示例代码片段[^4]: ```python import os from PIL import Image import torch from torch.utils.data import Dataset class CustomDataset(Dataset): def __init__(self, root_dir, annotation_file, transforms=None): self.root_dir = root_dir self.annotations = json.load(open(annotation_file)) self.transforms = transforms def __len__(self): return len(self.annotations['images']) def __getitem__(self, idx): img_info = self.annotations['images'][idx] anns = [ann for ann in self.annotations['annotations'] if ann['image_id'] == img_info['id']] image_path = os.path.join(self.root_dir, img_info['file_name']) img = Image.open(image_path).convert('RGB') boxes = [] labels = [] for ann in anns: xmin, ymin, w, h = ann['bbox'] xmax = xmin + w ymax = ymin + h boxes.append([xmin, ymin, xmax, ymax]) labels.append(ann['category_id']) target = {} target["boxes"] = torch.as_tensor(boxes, dtype=torch.float32) target["labels"] = torch.as_tensor(labels, dtype=torch.int64) if self.transforms is not None: img, target = self.transforms(img, target) return img, target ``` 此部分实现了从本地路径读取图片与边界框坐标的功能,并返回张量形式的数据供后续模型调用。 --- #### 4. 加载预训练模型 可以直接基于官方提供的 Faster R-CNN 预训练权重初始化模型。例如,在 PyTorch 中有现成的方法获取这些资源[^2]: ```python import torchvision.models as models def get_model(num_classes): model = models.detection.fasterrcnn_resnet50_fpn(pretrained=True) in_features = model.roi_heads.box_predictor.cls_score.in_features model.roi_heads.box_predictor = models.detection.faster_rcnn.FastRCNNPredictor(in_features, num_classes) return model ``` 这里调整分类器层以适应新的类别数量(包括背景),从而完成迁移学习的过程。 --- #### 5. 设置优化器与损失函数 对于目标检测任务来说,默认情况下会采用 SGD 作为优化策略之一;同时由于 Faster R-CNN 自身已经包含了多任务联合训练机制,因此无需额外指定单独的 Loss Function 表达式。 ```python params = [p for p in model.parameters() if p.requires_grad] optimizer = torch.optim.SGD(params, lr=0.005, momentum=0.9, weight_decay=0.0005) lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=3, gamma=0.1) ``` --- #### 6. 开始训练循环 最后一步就是执行完整的 epoch 循环逻辑,期间不断更新参数直至收敛为止。下面给出简化版伪代码表示整个流程: ```python num_epochs = 10 for epoch in range(num_epochs): train_one_epoch(model, optimizer, data_loader_train, device, epoch, print_freq=10) lr_scheduler.step() evaluate(model, data_loader_val, device=device) ``` 其中涉及到了辅助函数如 `train_one_epoch()` 和评估指标计算等内容均来自 Torchvision 工具箱内部实现细节。 --- ### 总结 综上所述,借助于开源社区的力量加上适当修改即可轻松部署属于自己的定制版本 Faster R-CNN 解决方案[^1]。
评论 65
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值