基于Pytorch框架的目标检测迁移学习和微调训练自己的数据集

目录

1.前置知识点

2.数据集准备

(1)下载数据集

(2)标注自己的数据集步骤

(3)加载数据集

3.预训练模型进行修改

4.Pytorch中TensorBoard的使用

5.图像分类模型的训练

6.人脸检测模型训练


1.前置知识点

使用pytorch实现预训练模型迁移学习中的目标检测

使用pytorch实现预训练模型迁移学习中的图像分类

使用pytorch加载数据集和对数据集进行处理

LabelImg标注的YOLO格式txt标签中心坐标和物体边界框长宽的转换

python实现图片的大小变换之后图片中的目标坐标一起等比例变换

使用python修改文件名并保存

2.数据集准备

(1)下载数据集

链接:https://pan.baidu.com/s/1QCLjLZBAUbpwppHiHq3e_Q 
提取码:t563

提示:这里的数据集是我已经标注好的,并且已经是处理好的一小部分数据集,读者首先利用这一部分数据集进行训练,确保数据集在代码上可以训练之后,再标注自己的数据集进行训练。

(2)标注自己的数据集步骤

第一步:使用LabelImg标注自己的数据集(采用的是YOLO格式,参考上面的链接);

提示:建议读者在标注数据集之前,首先将图片缩放到指定大小,这样后期就不需要对图片大小和对应坐标大小进行等比例缩放了。

def equalScaleImage(imgPath,savePath):
    """
    :param imgPath: 需要转换图片的位置
    :param savePath: 需要保存转换后图片的位置
    :return: 
    """
    imgs=os.listdir(imgPath)
    i=0
    for i,imgName in enumerate(imgs):
        img_path=os.path.join(imgPath,imgName)
        img=cv2.imread(img_path)
        newImg=cv2.resize(img,(224,224))
        save_path=os.path.join(savePath,str(i)+'.png')
        i+=1
        cv2.imwrite(save_path,newImg)
        print('正在转换...')

提示:读者需要注意给定的图片路径中的反斜杠的问题,不然读取失败。

第二步:标注得到的坐标值进行转换,由于使用YOLO格式标注得到的数据都是经过归一化的(需要重新进一步对数据进行处理,这样才能将图像中的人脸框画出来)。

提示:这里为什么需要将图片的坐标重新进行对应的处理呢?主要是我们使用的预训练模型的要求,如下图所示:

由于我们使用YOLO格式标注出来的数据集是下面这样的:

 因此,需要将使用YOLO格式标注的坐标进行一定的转换(转换的程序已经在上面的链接中给出了)。

第三步:关于数据集的名称,读者可以根据自己的需要进行命名,对于图片进行批量的命名也已经给出链接。

提示:标注数据集和处理数据集的过程比较繁琐和无趣,希望读者可以坚持标完数据集。

(3)加载数据集

第一:由于加载到模型中的数据集都是有格式要求的,所以需要单独写一个加载数据集的程序对数据集进一步处理(MyDataset.py),并且数据集都是需要转换为Tensor格式;

比如:加载到目标检测模型中的数据集格式为:

#怎么使用预训练模型进行自己的数据集的一个小实例
def example():
    model = fasterrcnn_resnet50_fpn(pretrained=True, progress=True)
    #images:四张图像,每一张图像的格式为[C,H,W]
    #boxes:对于每一张图像中包含11个目标,每一个目标包含四个坐标
    images, boxes = torch.rand(4, 3, 600, 1200), torch.rand(4, 11, 4)
    # print('images.shape: {}'.format(images.shape))
    # print('boxes.shape: {}'.format(boxes.shape))
    print('boxes: {}'.format(boxes))
    boxes[:, :, 2:4] = boxes[:, :, 0:2] + boxes[:, :, 2:4]
    print('boxes.shape: {}'.format(boxes.shape))
    # print('boxes: {}'.format(boxes))
    #这里的整数范围[1,91),其二维形状为[4,11]
    labels = torch.randint(1, 91, (4, 11))
    print('labels.shape: {}'.format(labels.shape))
    #将图像存放在一个列表中
    images = list(image for image in images)
    targets = []
    #将坐标和对应的标签存放在一个字典当中
    for i in range(len(images)):
        d = {}
        d['boxes'] = boxes[i]
        # print('boxes.shape: {}'.format(boxes[i].shape))
        d['labels'] = labels[i]
        # print('labels[i].shape: {}'.format(labels[i].shape))
        targets.append(d)
        # print('d: {}'.format(d))
    print('images.shape: {}'.format(len(images)))
    print('targets.shape: {}'.format(len(targets)))
    print('images: {}'.format(images))
    print('targets: {}'.format(targets))
    #注意模型默认的模式为训练模式
    # model.train()
    # output = model(images, targets)
    # print(output)
    # print(output['loss_classifier'].item())
    # For inference
    #设置为eval模式并进行检测
    model.eval()
    x = [torch.rand(3, 300, 400), torch.rand(3, 500, 400)]
    predictions = model(x)
    print('predictions: {}'.format(predictions))
    print('boxes.shape: {}')

3.预训练模型进行修改

提示:由于我们训练的数据集类别数和预训练模型的数据集类别数不一样,所以需要进行一定的修改,关于模型输出类别数的修改,可以看下面的文章:

使用pytorch实现预训练模型迁移学习中的目标检测

4.Pytorch中TensorBoard的使用

推荐以下这位博主:

Pytorch中使用TensorBoard

5.图像分类模型的训练

提示:如果训练的是人脸识别检测模型,不仅仅需要将人人脸的位置标注出来,而且也识别人脸的身份。

使用pytorch实现预训练模型迁移学习中的图像分类

6.人脸检测模型训练

提示:这里的代码将放置在Github上面。

https://github.com/KeepTryingTo/-Pytorch-

猜你喜欢

转载自blog.csdn.net/Keep_Trying_Go/article/details/130259762