FasterRCNN训练自己的数据集

FasterRCNN训练自己的数据 前言 因为科研需要,折腾了一阵Faster RCNN. 最开始将大佬chenyuntc的simple-faster-rcnn-pytorch鼓捣了一下使之能够在Windows下面跑(有需要的朋友可以联系我),但是该代码的batch size只能设为1,跑一次实验的耗时过长。本渣尝试花了四天时间通读了一遍大佬的代码,奈何功力尚浅,还做不到大范围的修改,因此从github上找到了jwyang的fast... 阅读详情
AI摘要

本文介绍了如何使用FasterRCNN模型进行目标检测,包括从CNN提取特征、RPN网络、ROIPooling等步骤。文章展示了在自定义数据集上利用torchvision和torchkeras库进行模型微调和训练的过程,以及如何评估模型性能。

2016年提出的Faster RCNN目标检测模型是深度学习现代目标检测算法的开山之作,也是第一个真正全流程都是神经网络的目标检测模型。

其主要步骤如下:

1,使用CNN对输入图片提取feature map.

2,对feature map上的每个点设计一套不同大小和长宽比的anchor作为先验框。

3,设计RPN网络从大量的anchor中筛选出一些作为目标框的proposals并用回归分支纠正它们的位置。

4,使用ROI Pooling技术对不同大小的proposals获取相同大小的对应特征图,以便后续分类模型一并处理。

5,在proposals的feature map上使用分类分支和回归分支进一步预测目标类别和更精确的定位。

anchor技巧和ROI Pooling技术 是非常值得学习的技巧,在许多目标检测模型中都能看到他们的身影。

b1c2e63ddc895a32120c5b0ddb03a614.jpeg

尽管FasterRCNN历史悠久,但依然是一个非常重要的目标检测任务的baseline.

一般会把它叫做two-stage的目标检测模型,主要是如果train from scratch,   RPN网络提取proposals和后续对propasals的定位分类 这两个步骤是要分开训练的,但在微调的时候,通常可以一起训练。

本文我们主要演示调用torchvision中的faster-rcnn模型在自己的数据集上微调来检测螺丝螺母。

#!pip install torchvision,torchkeras
import numpy as np
import pandas as pd 
from matplotlib import pyplot as plt
from PIL import Image,ImageColor,ImageDraw,ImageFont 

import torch
from torch import nn
import torchvision
from torchvision import datasets, models, transforms

import datetime
import os
import copy
import json 

print(torch.__version__)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
2.0.0+cu117

〇,预训练模型

from torchkeras.data import get_example_image
img = get_example_image('park.jpg')
img.save('park.jpg')
from torchkeras.plots import vis_detection 

# 准备数据
inputs = []
img = Image.open('park.jpg').convert("RGB")
img_tensor = torch.from_numpy(np.array(img)/255.).permute(2,0,1).float()
if torch.cuda.is_available():
    img_tensor = img_tensor.cuda()
inputs.append(img_tensor)    

# 加载模型
num_classes = 91
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(
    weights=torchvision.models.detection.FasterRCNN_ResNet50_FPN_Weights.COCO_V1,
    num_classes = num_classes)

if torch.cuda.is_available():
    model.to("cuda:0")
model.eval()

# 预测结果
with torch.no_grad():
    predictions = model(inputs)


# 结果可视化
class_names = torchvision.models.detection.FasterRCNN_ResNet50_FPN_Weights.COCO_V1.meta['categories']

vis_detection(img,predictions[0],class_names,min_score = 0.8)

ed52a62468ca74dbcbd773733d61e7c5.png

下面代码我们演示使用我开发的优雅的torchkeras工具在自己的数据集上对Faster-RCNN模型进行finetune。

我们使用一个非常简单的螺丝(bolt)螺母(nut)数据集作为示范。

公众号 算法美食屋 后台回复关键词:torchkeras,获取本文notebook代码和 bolt nut 数据集 下载地址。

一,准备数据

data_path = "./data/bolt_nut"

train_images_path = "./data/bolt_nut/train"
train_targets_path = './data/bolt_nut/train.txt'

val_images_path = "./data/bolt_nut/val"
val_targets_path = './data/bolt_nut/val.txt'

class_names = ['__background__','bolt','nut']
class BoltNut(torch.utils.data.Dataset):
    def __init__(self, images_path, targets_path, 
                 class_names = class_names,
                 transforms = None
                ):
        self.images_path = images_path
        self.targets_path = targets_path
        self.transforms = transforms
        self.infos_list = open(targets_path,"r").readlines()
        self.class_names = class_names

    def __getitem__(self, idx):
        
        info_str = self.infos_list[idx]
        info_arr = info_str.replace("\n","").replace("\t ","").split("\t")
        
        img_path = info_arr.pop(0)
        
        info_arr = [x for x in info_arr if x.strip()] 
        infos = [json.loads(x) for x in info_arr]

        img= Image.open(os.path.join(self.images_path,img_path)).convert("RGB")

        target = {}
        target["image_id"] = torch.tensor([int(img_path.split(".")[0])],dtype = torch.int64)  
        target["labels"] = torch.tensor([self.class_names.index(x["value"]) for x in infos],
                                        dtype = torch.int64)

        coords = [x["coordinate"]  for x in infos]
        boxes = torch.tensor([[xmin,ymin,xmax,ymax] for (xmin,ymin), (xmax,ymax)  in coords])
        target["boxes"] = boxes

        target["area"] = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0])
        target["iscrowd"] = torch.zeros((len(infos) ,), dtype=torch.int64)
        
        if self.transforms is not None:
            img, target = self.transforms(img, target)
  
        return img, target

    def __len__(self):
        return len(self.infos_list)
# 可视化数据集
ds_train = BoltNut(train_images_path,train_targets_path)
img,target = ds_train[12]

target["scores"] = torch.ones_like(target["labels"])
img_result = vis_detection(img,target,class_names,min_score = 0.8)
img_result

0f773c51efefd49c9ef239c74d8c1302.png

下面我们设计数据增强模块

import random 
from torchvision import transforms as T

class Compose(object):
    def __init__(self, transforms):
        self.transforms = transforms

    def __call__(self, image, target):
        for t in self.transforms:
            image, target = t(image, target)
        return image, target


class RandomHorizontalFlip(object):
    def __init__(self, prob):
        self.prob = prob

    def __call__(self, image, target):
        if random.random() < self.prob:
            height, width = image.shape[-2:]
            image = image.flip(-1)
            bbox = target["boxes"]
            bbox[:, [0, 2]] = width - bbox[:, [2, 0]]
            target["boxes"] = bbox
            if "masks" in target:
                target["masks"] = target["masks"].flip(-1)
        return image, target


class ToTensor(object):
    def __call__(self, image, target):
        image = T.ToTensor()(image)
        return image, target
transforms_train = Compose([ToTensor(),RandomHorizontalFlip(0.5)])
transforms_val = ToTensor()

ds_train = BoltNut(train_images_path,train_targets_path,transforms=transforms_train)
ds_val = BoltNut(val_images_path,val_targets_path,transforms=transforms_val)
def collate_fn(batch):
      return tuple(zip(*batch))

dl_train = torch.utils.data.DataLoader(ds_train, batch_size=2, 
          shuffle=True, num_workers=4,collate_fn= collate_fn)

dl_val = torch.utils.data.DataLoader(ds_val, batch_size=2, 
          shuffle=True, num_workers=4,collate_fn= collate_fn)
for batch in dl_train:
    features,labels = batch  
    break

二,定义模型

import torchvision
from torchvision.models.detection.faster_rcnn import FastRCNNPredictor

num_classes = 3  # 3 classes (bult,nut) + background
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(
    weights=torchvision.models.detection.FasterRCNN_ResNet50_FPN_Weights.COCO_V1)
in_features = model.roi_heads.box_predictor.cls_score.in_features
model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)

三,训练模型

from torchkeras import KerasModel
class StepRunner:
    def __init__(self, net, loss_fn, accelerator, stage = "train", metrics_dict = None, 
                 optimizer = None, lr_scheduler = None
                 ):
        self.net,self.loss_fn,self.metrics_dict,self.stage = net,loss_fn,metrics_dict,stage
        self.optimizer,self.lr_scheduler = optimizer,lr_scheduler
        self.accelerator = accelerator
        if self.stage=='train':
            self.net.train() 
        else:
            self.net.train() #attention here
    
    def __call__(self, batch):
        features,labels = batch 
        
        #loss
        loss_dict = self.net(features,labels)
        loss = sum(loss_dict.values())
        
        #backward()
        if self.optimizer is not None and self.stage=="train":
            self.accelerator.backward(loss)
            self.optimizer.step()
            if self.lr_scheduler is not None:
                self.lr_scheduler.step()
            self.optimizer.zero_grad()
            
        #all_preds = self.accelerator.gather(preds)
        #all_labels = self.accelerator.gather(labels)
        all_loss = self.accelerator.gather(loss).sum()
        
        #losses
        step_losses = {self.stage+"_loss":all_loss.item()}
        
        #metrics
        step_metrics = {}
        
        if self.stage=="train":
            if self.optimizer is not None:
                step_metrics['lr'] = self.optimizer.state_dict()['param_groups'][0]['lr']
            else:
                step_metrics['lr'] = 0.0
        return step_losses,step_metrics
    
KerasModel.StepRunner = StepRunner
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.CosineAnnealingLR(optimizer,T_max=4)

keras_model = KerasModel(model,
                         loss_fn = None,
                         metrics_dict=None,
                         optimizer= optimizer,
                         lr_scheduler=lr_scheduler
                        )

keras_model.fit(train_data=dl_train,val_data=dl_val,
    epochs=20,patience=5,
    monitor='val_loss',
    mode='min',
    ckpt_path ='faster-rcnn.pt',
    plot=True
)

d299f12f273b84c75b01062c0740f2b0.png

024eaa1bd0ac0807dfeea0bdc3963d7c.png

四,评估模型

import torch 

from PIL import Image 
from tqdm import tqdm
from ultralytics.yolo.utils import set_logging
set_logging(verbose=False)
from ultralytics.yolo.utils.metrics import  DetMetrics, box_iou
def process_batch(predictions, targets, 
                  iouv = torch.linspace(0.5, 0.95, 10) # iou vector for mAP@0.5:0.95
                 ):
    ...
    return metrics
model.eval()
list_predictions = [model(x[0].to('cuda')[None,...])[0] for x in ds_val]
list_targets = [x[1] for x in ds_val]

names = {0:'bolt',1:'nut'}
metrics = eval_metrics(list_predictions,
                       list_targets,
                       names =  names)
display(metrics.results_dict)
{'metrics/precision(B)': 0.9976781395819151,
 'metrics/recall(B)': 1.0,
 'metrics/mAP50(B)': 0.995,
 'metrics/mAP50-95(B)': 0.8542317510036526,
 'fitness': 0.8683085759032874}
import pandas as pd 
df = pd.DataFrame()
df['metric'] = metrics.keys
for i,c in names.items():
    df[c] = metrics.class_result(i)
df

9dfe2e3a0af99c86ab178b6e85870002.png

五,使用模型

# 准备数据
inputs = []
img_path = os.path.join(val_images_path,os.listdir(val_images_path)[5])
img = Image.open(img_path).convert("RGB")
img_tensor = torch.from_numpy(np.array(img)/255.).permute(2,0,1).float()
if torch.cuda.is_available():
    img_tensor = img_tensor.cuda()
inputs.append(img_tensor)    

model.eval()

# 预测结果
with torch.no_grad():
    predictions = model(inputs)

# 结果可视化
vis_detection(img,predictions[0],list(idx2names.values()),min_score = 0.8)

38fed89e054034ac169df0251abc66d5.png

公众号 算法美食屋 后台回复关键词:torchkeras,获取本文notebook代码和 bolt nut 数据集 下载地址。

万水千山总是情,点个赞赞行不行?😋😋

【目标检测】用自己的数据集训练Faster RCNN的详细全过程(步骤很详细很直观,小白可入) 一、写在前面 最近和小伙伴一起参加了服务外包比赛,选择的题目是对于图像中的安全帽的检测。对YOLOv3,Faster RCNN这些常见的目标检测算法都进行了实验。本文就介绍Faster RNN的整个实验过程。 二、电脑相关配置 win10,python3.6 三、训练过程 实验选用的源码是较为常用的Faster RCNN源码。对于该源码的使用网上也有很多的博客文章,但是正是因为文章很多,所以也容易... 阅读详情

相关推荐

使用Faster RCNN训练自己的数据集

使用Faster RCNN训练自己的数据集,过程不太顺利,踩坑数次,所以把流程记录一下。 所使用的代码版本:faster-rcnn.pytorch 1.源码及环境配置 原Github版本使用的Pytorch==0.4.0,但是看了网上的博客记录这个版本有较多错误无法解决,建议使用Pytorch==1.0.0及以上版本; 源码 Pytorch0.4.0版源码:https://github.com/jwyang/faster-rcnn.pytorch.git Pytorch1.0.0版源码:https

SpadgerZ的博客 1万+

Faster RCNN训练自己的数据集【傻瓜式教程】

Faster RCNN训练自己的数据集【傻瓜式教程】

magicnnonn的博客 2万+

【实战指南】从零构建FasterRCNN:自定义数据集训练与部署全解析

本文详细解析了从零构建FasterRCNN模型的完整流程,包括数据集格式转换、环境配置、模型训练调参技巧以及预测与结果可视化。特别针对YOLO到VOC格式的数据集转换提供了实用脚本和避坑指南,帮助开发者高效完成自定义数据集训练与部署。

weixin_29093169的博客 372

Faster RCNN训练

训练 其余均为通用的训练流程,Faster RCNN源码上的train、predict均可使用。 import os import datetime import torch import transforms from FastRCNN_model import FasterRCNN, FastRCNNPredictor from ResNet50_FPN import ResNet50_FPN_backbone from Dataset_FasterRcnn import VOCDataset fr

weixin_44422920的博客 2889

mmdetection 商汤开源库 FasterRCNN 训练自己的数据集 VOC2007, 結果可視化 2019

目前為止玩过了兩個目标检测库 一個是陈云大神的simple-faster-rcnn 一个就是商汤科技的mmdetection 这篇主要讲一下商汤的 mmdetection 如何训练自己的数据集 个人认为必须要养成看官方文档的习惯, 尤其开始学习一个新的库的时候 步骤将分为 安装库 配置数据集 调整训练文件 结果可视化 数据集格式: VOC2007为主 第一步 安装mmdetection ...

史蒂夫方 6825

VS2019配置Qt5.14.2开发环境全流程(含MSVC2017 64-bit选择指南)

本文详细介绍了在VS2019中配置Qt5.14.2开发环境的完整流程,特别针对MSVC2017 64-bit编译器的选择提供了专业建议。从环境准备、Qt安装配置到VS2019集成设置,逐步指导开发者完成开发环境的搭建,并提供了常见问题的解决方案和高级优化技巧,帮助开发者高效进行Qt开发。

weixin_29243279的博客 516

【深度学习】使用FasterRCNN模型训练自己的数据集(记录全流程

浅浅记录训练两阶段模型FasterRCNN模型的过程

努力敲代码的小盆友 2万+

如何制作Mike21溢油模型围油栏文件

这段时间群友在做海洋环评的做了一个MIKE21的溢油模型,溢油模型其实也是ECOLAB模块的应用,而在海上发生溢油事件的时候,为防止溢油对海洋生态的破坏,经常使用的一种手段就是使用围油栏技术将溢油控制在一定范围并进行处理。今天小编就给大家说说在MIKE21里怎么实现围油栏文件的制作

zhuzhujiayoua的博客 1332

FasterRCNN训练自己的数据集方法记录

记录一下FasterRCNN如何训练自己的数据集

LJ1147517021的博客 457

linux 驱动 - pinctrl子系统

分析总结 pinctrl 子系统框架结构,平台 mtk6771 内核版本 kernel-4.4 , 本文所有的分析均基于此版本。

sty01z的博客 1557

MoveIt避障规划实战:从点云到OctoMap的环境感知全流程

本文详细解析了MoveIt避障规划中从点云到OctoMap的环境感知全流程,重点介绍了深度相机选型、点云数据处理、OctoMap生成及避障规划参数调优等关键技术。通过实战案例展示了如何利用MoveIt和OctoMap实现机械臂在复杂环境中的高效避障,为工业自动化和服务机器人开发提供实用解决方案。

weixin_30417487的博客 569

pytorch使用torchvision自带fasterrcnn模型训练与测试(Pascal Voc与Coco数据集)

参考项目地址:https://github.com/lpuglia/torchvision_voc 参考链接: [1]https://github.com/pytorch/vision/issues/1116 [2]https://pytorch.org/docs/stable/_modules/torchvision/models/detection/faster_rcnn.html [3]ht...

ouening的博客 1万+

Kylin-Desktop-V10-SP1海光版虚拟机安装全流程(含桥接网络配置)

本文详细介绍了在VMware虚拟机中安装Kylin-Desktop-V10-SP1海光版操作系统的完整流程,重点解决了基于海光(Hygon C86)平台的网络配置难题。内容涵盖从镜像准备、虚拟机创建、系统安装到桥接网络配置的三种实战方法,并提供了安装后的优化与必备软件配置指南,帮助用户高效搭建国产化测试与开发环境。

weixin_29323493的博客 357

FasterRCNN训练自己的数据集log2

FasterRCNN训练自己的数据集log2 前一篇:https://blog.youkuaiyun.com/weixin_42730997/article/details/88967266 发现还是数据集太小的问题,而且在之前的训练中并未使用 pre-trained model,这个初始化权值的模型。 现在用上这个model后,固定输出的问题已经解决了,不过因为数据集太小,test出来的精度还是不高,准备再...

迦小叶的博客 283

MSVS C# Matlab的混合编程系列2 - 构建一个复杂(含多个M文件)的动态库:

本节我们尝试将一个有很多函数和文件的Matlab算法文件集成到C#的项目里面。

山云的专栏 2071

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

记录fasterrcnn训练自己数据集

选择什么模式按照你的需求来,如果你是自己已经划分好了数据集就选择模式选择1和2,需要划分Main文件夹中的train.txt、val.txt等文件,然后代码会依据该文件生成模型训练所需的文件。VOC数据集内有三个文件,文件内容已在图中进行了介绍,与yolo不同,Annotation和JPEGImages的文件不需要按照train、val、test格式进行划分存放。模型可以寻找fasterrcnn官方的文件,在这里我用的是B站大佬提供的文件,大佬也有配套讲解,如果看文字不会的可以看视频手把手做。

2401_82728160的博客 473

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

FasterRCNN训练自己的数据集log1

FasterRCNN 训练自己的数据集 这学期接手了一个project,关于宫颈癌前期筛查,我的任务是训练网络识别细胞切片里的细菌和微生物。 学长给我的是fasterRCNN的代码。 那么我的任务本质就是用fasterRCNN在我自己的数据集上训练,已达到识别的目的。 数据预处理 代码里有学长写好的自己的数据类型训练方法,输入图片是1024*1024,原先是用来进行多label的识别。 我拿到的数...

迦小叶的博客 851

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

FasterRcnn训练数据集参数配置

说明:本博文假设你已经做好了自己的数据集,该数据集格式和VOC2007相同。做好数据集后,我们开始训练,下面是训练前的一些修改。本文来自:http://www.lai18.com/content/2526443.html 1 、VOCdevkit2007\VOCcode\VOCinit.m的修改 (1)路径的修改 [plain]view plaincopy ...

a616735104的博客 1563

FasterRCNN训练自己的数据集2

尝试用FasterRCNN做版面分析,由于缺少大量的标注数据,手动标注数据量少也不起什么作用,鉴于之前做过版面分析,且效果还行,之前版面分析效果图见: OCR版面分析效果图(一) OCR版面分析效果图(二) 考虑使用之前的处理结果(去除效果差的)做标注数据(由于我之前的版面处理中文本不是按文本段落切分的,而是以文本行切分,而每页文本行数目又太多,大小情况比较复杂,所以暂时不把...

1303

目标检测之FasterRcnn算法——训练自己的数据集(pytorch)

数据集 数据集目录如上,VOC数据集的格式 JPEGImages目录下,放上自己的训练集和测试集 Annotations 下,放上自己的xml文档配置,如上。 在VOCdevkit\VOC2012\ImageSets\Main下,放上自己的train.txt和val.txt, 上面,我按照VOC的格式来的,前面是所有的XML,因为VOC有32类,这里有我懒的删除,刚好前面代表XML文件,后面代表这张图片中有多少该目标,-1表示没有。 这样的话,数据就准备好了。 准备一个json,文件,选择

swpucwf的博客 2万+

fasterrcnn训练自己的数据集

fasterrcnn 参考教程 https://www.jianshu.com/p/08c1faa38358 配置 CUDA8.0 + CUDNN5.1 + Ubuntu16.04 tensorflow-gpu1.2 python3.6.4 cython0.28.3 easydict 1.6 训练:采用tf-faster-rcnn github源码 数据集:voc2007 迭代次数:70000 训...

qq_36848681的博客 406
上一篇: 炼丹师,这是你的梦中情炉吗?
下一篇: 离离原上谱,上海大学插班生招生绩点折算方法
算法美食屋
博客等级 码龄9年 2万+粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值