Faster RCNN模型如何自定义损失函数

这篇具有很好参考价值的文章主要介绍了Faster RCNN模型如何自定义损失函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 代码分析:

1.1 _fasterRCNN类:最基础的模型类

/lib/model/faster_rcnn/faster_rcnn.py

class _fasterRCNN(nn.Module):

1.2 resnet类:继承_fasterRCNN类

/lib/model/faster_rcnn/resnet.py

class resnet(_fasterRCNN):

1.3 vgg类:继承_fasterRCNN类

与1.2同理

1.4 如果要修改loss,一共需要修改哪些内容:

1.4.1 模型代码:/lib/model/faster_rcnn/faster_rcnn.py,/lib/model/faster_rcnn/resnet.py,/lib/model/faster_rcnn/vgg16.py

1.4.2 训练代码:trainval_net.py

1.4.3 测试代码:test_net.py

1.4.4 运行参数代码:\lib\model\utils\parser_func.py

2. 修改模型代码:(以添加confidence loss为例)

2.1 修改_fasterRCNN类:

修改/lib/model/faster_rcnn/faster_rcnn.py

class _fasterRCNN(nn.Module):
	# 旧的__init__:
	# def __init__(self, classes, class_agnostic):
	# 新的__init__:
	def __init__(self, classes, class_agnostic, conf):
		......
		# 旧的初始化loss:
	    # self.RCNN_loss_cls = 0
	    # self.RCNN_loss_bbox = 0
	    # 新的初始化loss,这里添加自己定义的损失,如:
	    self.RCNN_loss_cls = 0
	    self.RCNN_loss_bbox = 0
	    self.conf = conf
		......
	# 旧的forward:
	# def forward(self, im_data, im_info, gt_boxes, num_boxes):
	# 新的forward:
	def forward(
        self, 
        im_data,
        im_info,
        gt_boxes,
        num_boxes,
        target=False,
        test=False,
        eta=1.0,
        hints=False,
    ):
    	...
		# 旧的compute object classification probability:
        # cls_score = self.RCNN_cls_score(pooled_feat)
        # cls_prob = F.softmax(cls_score, 1)
        # 新的compute object classification probability:
        cls_score = self.RCNN_cls_score(pooled_feat)
        cls_prob = F.softmax(cls_score, 1)
        if self.conf:
            pooled_feat_conf = pooled_feat.detach()
            # confidence
            confidence = F.sigmoid(self.netD_confidence(pooled_feat_conf))
            # Make sure we don't have any numerical instability
            eps = 1e-12
            pred_original = torch.clamp(cls_prob, 0.0 + eps, 1.0 - eps)
            confidence = torch.clamp(confidence, 0.0 + eps, 1.0 - eps)
            confidence_loss = -torch.log(confidence)
		...
		# 旧的返回值:
		# return rois, cls_prob, bbox_pred, rpn_loss_cls, rpn_loss_bbox, RCNN_loss_cls, RCNN_loss_bbox, rois_label
		# 新的返回值:
		if self.conf:
            return (
                rois,
                cls_prob,
                bbox_pred,
                rpn_loss_cls,
                rpn_loss_bbox,
                RCNN_loss_cls,
                RCNN_loss_bbox,
                rois_label,
                None,
                None,
                confidence_loss,
                confidence,
            )
        else:
            return (
                rois,
                cls_prob,
                bbox_pred,
                rpn_loss_cls,
                rpn_loss_bbox,
                RCNN_loss_cls,
                RCNN_loss_bbox,
                rois_label,
                None,
                None,
                None,
                None,
            )

2.2 修改resnet类:

/lib/model/faster_rcnn/resnet.py

# 整个netD_confidence都是新加的,是用来计算confidence loss的层结构:
class netD_confidence(nn.Module):
    def __init__(self, feat_d):
        super(netD_confidence, self).__init__()
        self.fc1 = nn.Linear(feat_d, 128)
        self.bn = nn.BatchNorm1d(128)
        self.fc2 = nn.Linear(128, 1)

    def forward(self, x):
        x = self.fc2(F.dropout(self.bn(self.fc1(x))))
        return x

class resnet(_fasterRCNN):
	# 旧的 __init__:
	#def __init__(self, classes, num_layers=101, pretrained=False, class_agnostic=False):
	
	# 新的 __init__:多个conf=None
	def __init__( self, classes, num_layers=101, pretrained=False, class_agnostic=False, conf=None):
		self.model_path = 'data/pretrained_model/resnet101_caffe.pth'
    	self.dout_base_model = 1024
    	self.pretrained = pretrained
    	self.class_agnostic = class_agnostic
    	# 多加一行conf的初始化:
    	self.conf = conf
    	...
		# 旧的_fasterRCNN.__init__:
		# _fasterRCNN.__init__(self, classes, class_agnostic)
		# 新的_fasterRCNN.__init__:多一个conf
		_fasterRCNN.__init__(self, classes, class_agnostic, conf)
		...
	def _init_modules(self):
		...
		# 旧的build resnet:
		# self.RCNN_base = nn.Sequential(resnet.conv1, resnet.bn1,resnet.relu,
      	# resnet.maxpool,resnet.layer1,resnet.layer2,resnet.layer3)
    	# self.RCNN_top = nn.Sequential(resnet.layer4)
    	# self.RCNN_cls_score = nn.Linear(2048, self.n_classes)
    	# if self.class_agnostic:
      	# 	self.RCNN_bbox_pred = nn.Linear(2048, 4)
    	# else:
      	#	self.RCNN_bbox_pred = nn.Linear(2048, 4 * self.n_classes)

		# 新的build resnet:
		self.RCNN_base = nn.Sequential(resnet.conv1, resnet.bn1,resnet.relu,
      	resnet.maxpool,resnet.layer1,resnet.layer2,resnet.layer3)
    	self.RCNN_top = nn.Sequential(resnet.layer4)
        feat_d = 2048
        self.RCNN_cls_score = nn.Linear(feat_d, self.n_classes)
        self.netD_confidence = netD_confidence(feat_d)
        if self.class_agnostic:
            self.RCNN_bbox_pred = nn.Linear(feat_d, 4)
        else:
            self.RCNN_bbox_pred = nn.Linear(feat_d, 4 * self.n_classes)
		...
		

2.3 修改vgg16类:

同2.2

3. 修改训练代码:

trainval_net.py

...
if __name__ == '__main__':
	...
	# 旧的initilize the network:
	# if args.net == 'vgg16':
    # 	fasterRCNN = vgg16(imdb.classes, pretrained=True, class_agnostic=args.class_agnostic)
 	#elif args.net == 'res101':
    #	fasterRCNN = resnet(imdb.classes, 101, pretrained=True, class_agnostic=args.class_agnostic)
  	#elif args.net == 'res50':
    #	fasterRCNN = resnet(imdb.classes, 50, pretrained=True, class_agnostic=args.class_agnostic)
  	#elif args.net == 'res152':
    #	fasterRCNN = resnet(imdb.classes, 152, pretrained=True, class_agnostic=args.class_agnostic)
  	#else:
    #	print("network is not defined")
    #	pdb.set_trace()
    
    # 新的initilize the network:
	if args.net == 'vgg16':
		fasterRCNN = vgg16(imdb.classes, pretrained=True, class_agnostic=args.class_agnostic, conf=args.conf)
	elif args.net == 'res101':
		fasterRCNN = resnet(imdb.classes, 101, pretrained=True, class_agnostic=args.class_agnostic, conf=args.conf)
	elif args.net == 'res50':
		fasterRCNN = resnet(imdb.classes, 50, pretrained=True, class_agnostic=args.class_agnostic, conf=args.conf)
	elif args.net == 'res152':
		fasterRCNN = resnet(imdb.classes, 152, pretrained=True, class_agnostic=args.class_agnostic, conf=args.conf)
	else:
		print("network is not defined")
		pdb.set_trace()
	...
	# 添加一行conf_gamma,即conf损失在总损失函数中的权重:
	conf_gamma = args.conf_gamma
	...
	fasterRCNN.zero_grad()
    (
		rois,
		cls_prob,
		bbox_pred,
		rpn_loss_cls,
		rpn_loss_box,
		RCNN_loss_cls,
		RCNN_loss_bbox,
		rois_label,
        out_d_pixel, # 新加的
		out_d, # 新加的
		confidence_loss, # 新加的
		_, # 新加的
	) = fasterRCNN(im_data, im_info, gt_boxes, num_boxes, hints=True)
    loss = rpn_loss_cls.mean() + rpn_loss_box.mean() + RCNN_loss_cls.mean() + RCNN_loss_bbox.mean()
	# 加上conf_loss:
	if args.conf:
		conf_loss = confidence_loss.mean()
	...
	if args.conf:
        loss += conf_gamma * conf_loss
	...
	if args.mGPUs:
		...
	else:
		loss_rpn_cls = rpn_loss_cls.item()
		loss_rpn_box = rpn_loss_box.item()
		loss_rcnn_cls = RCNN_loss_cls.item()
		loss_rcnn_box = RCNN_loss_bbox.item()
		fg_cnt = torch.sum(rois_label.data.ne(0))
		bg_cnt = rois_label.data.numel() - fg_cnt
		# 加上conf:
		if args.conf:
			loss_conf = conf_loss.item()
			

4. 修改测试代码:

test_net.py

在这里插入代码片

5. 修改运行参数代码:

\lib\model\utils\parser_func.py文章来源地址https://www.toymoban.com/news/detail-416633.html

def parse_args():
	...
	# 添加conf和conf_gamma:
	parser.add_argument(
        "--ga",
        dest="conf_gamma",
        help="the weight for confidence loss.",
        default=0.1,
        type=float,
    )
    parser.add_argument(
        "--conf",
        dest="conf",
        help="whether use the confidence branch to help teaching process",
        action="store_false",
    )
	...

到了这里,关于Faster RCNN模型如何自定义损失函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 论文代码学习—HiFi-GAN(3)——模型损失函数loss解析

    这里翻译了HiFi-GAN这篇论文的具体内容,具体链接。 这篇文章还是学到了很多东西,从整体上说,学到了生成对抗网络的构建思路,包括生成器和鉴定器。细化到具体实现的细节,如何 实现对于特定周期的数据处理?在细化,膨胀卷积是如何实现的?这些通过文章,仅仅是了

    2024年02月14日
    浏览(63)
  • 目标检测——Faster RCNN

    Faster RCNN是由 R-CNN、Fast R-CNN 改进而来,是非常经典的目标检测的两阶段网络。 此篇博客是我通过学习以下优秀博客归纳整理而得: 一文读懂Faster RCNN - 知乎 Faster R-CNN详解和网络模型搭建 - 知乎 Faster R-CNN:详解目标检测的实现过程 - 郭耀华 - 博客园 yolov5与Faster-RCNN 训练过程

    2024年02月06日
    浏览(47)
  • Faster RCNN在pycharm中运行

    参考B站up主:霹雳吧啦Wz git clone https://github.com/WZMIAOMIAO/deep-learning-for-image-processing 首先找到faster_rcnn ├── backbone: 特征提取网络,可以根据自己的要求选择 ├── network_files: Faster R-CNN网络(包括Fast R-CNN以及RPN等模块) ├── train_utils: 训练验证相关模块(包括cocotools) ├

    2024年02月03日
    浏览(31)
  • Faster-RCNN环境搭配及运行教程

    最近正在学习Faster-RCNN,环境历经一天时间终于成功安装,借此记录下整体安装过程 本教程是Windows 10 + Python35 + CUDA 10.0 + cudnn 7.4.1.5 + tensorflow-gpu 1.13.2环境的配置过程 所使用的软件包括 名称 版本 CUDA 10.0 CUDNN 7.4.1.5 Anaconda3 4.2.0 Pycharm 2019.3.5 整体过程中所需要的软件包我都放在

    2024年02月04日
    浏览(45)
  • 基于Faster rcnn pytorch的遥感图像检测

    代码:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 使用RSOD遥感数据集,VOC的数据格式如下: RSOD是一个开放的目标检测数据集,用于遥感图像中的目标检测。数据集包含飞机,油箱,运动场和立交桥,以PASCAL VOC数据集的格式进行标注。 数据集包括4个文件夹,每个文件夹

    2024年02月06日
    浏览(31)
  • 目标检测算法:Faster-RCNN论文解读

    前言 ​ 其实网上已经有很多很好的解读各种论文的文章了,但是我决定自己也写一写,当然,我的主要目的就是帮助自己梳理、深入理解论文,因为写文章,你必须把你所写的东西表达清楚而正确,我认为这是一种很好的锻炼,当然如果可以帮助到网友,也是很开心的事情

    2024年02月08日
    浏览(35)
  • 【深度学习】计算机视觉(11)——Faster RCNN(下)

    接上一篇。其实没什么东西了,只是因为参考的文章太多太多太多太多太多太多了没办法附在文末,所以我直接新开了一篇。 参考来源: 一文读懂Faster RCNN Cython 的简要入门、编译及使用 【python基础】easydict的安装与使用 TensorFlow2深度学习实战(十六):目标检测算法Faster

    2024年02月01日
    浏览(31)
  • GIS之深度学习10:运行Faster RCNN算法

    (未完成,待补充) 获取Faster RCNN源码 (开源的很多,论文里也有,在这里不多赘述) 替换自己的数据集(图片+标签文件) (需要使用labeling生成标签文件) 打开终端,进入gpupytorch环境 运行voc_annotation.py文件生成与训练文件  结果所示: 运行:train.py文件  终端/编码器运

    2024年03月13日
    浏览(56)
  • Faster RCNN训练自己的数据集【傻瓜式教程】

    本文采用的源码是:https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3 由于本文是小白教程,光写几个环境怕有人配置不好或者配置版本搞乱。Faster RCNN配置环境比较复杂。我在这直接贴图我的环境版本图: 先安装tensorflow-gpu,然后依次安装cython、opencv-python、easydict、Pillow、matplot

    2024年02月02日
    浏览(29)
  • 【深度学习】计算机视觉(12)——Faster RCNN(最终篇)

    接上一篇。其实没什么东西了,只是因为参考的文章太多太多太多太多太多太多了没办法附在文末,所以我直接新开了一篇。 参考来源: 一文读懂Faster RCNN Cython 的简要入门、编译及使用 【python基础】easydict的安装与使用 TensorFlow2深度学习实战(十六):目标检测算法Faster

    2024年02月02日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包