circle loss代码实现_从零开始实现Yolov3-Yolov1 Pytorch实现

1 目标

文章的目标是让pytorch初学者也可以使用pytorch实现yolov3,由于yolov3 网络结构和head对于初学者来说实现上可能存在一定的困难,所以采用循序渐进的方式,从yolov1 开始到v2 逐步实现yolov3。从零开始实现Yolov3整体分为2个部分:(1) 主要描述yolo v1和v2的复现过程 ,这部分不做详细的检测效果的的对比(2)yolov3论文阅读以及实现。

2 Yolov1原理

2.1 Yolov1原理

Yolo v1是一阶段物体检测方法,和rcnn系列两阶段检测方法不同的是,直接在输出层回归bounding box的位置以及宽高和bounding box所属的类别(整张图作为网络的输入,把 Object Detection 的问题转化成一个 Regression 问题)。

主要实现方法是:将一幅图像分成SxS个网格(grid cell),如果某个object的中心,落在这个网格中,则这个网格就负责预测这个object,主要包括物体中心相对这个格子左上角坐标的偏移量,宽,高和物体类别。

b5a901a0d6316f0183c4205d74a3886d.png
如图所示,将图片分为S*S的格子,每个格子预测B个物体以及当前grid所属的类别,所以输出大小为S*S*(B*5+C),5是delta_x,delta_y,w,h,confidence,yolov1还不是全卷积网络,是有FC层的

2.2 Yolov1 Loss组成

4dd47d36b045d4d5bb82104c7dad07bf.png

yolov1的loss总共由3部分组成:

(1)物体位置部分:物体位置部分loss由三部分组成,一是x,y的loss,是相对于当前第i个格子的偏移量,二是w,h的loss采用均方误差,开根号的目的:主要是为了减少对大物体的惩罚,同时关注到小物体,三是物体的confidence,第i个格子的第j个box的预测的confidence的误差

(2)背景部分:第i个格子的第j个box不预测物体,只计算confidence的误差

(3)物体类别部分:第i个格子预测的物体的类别

由于背景较多对loss的贡献过大,最终会给背景部分loss乘以一个比较小的系数,论文中是0.5,同时对有物体的部分loss也乘以一个较大的系数,论文中是5,来保证loss的均衡

2.3 Yolov1 loss部分Pytorch实现

实现了简化版本的yolo v1的loss,只包含物体预测部分,不包括类别,可以比较方便的使用coco数据其中的一个类别做训练和测试,代码主要包含两部分,一个是debug中的可视化部分(可以看到一些网络的学习过程),其中包括,GT的物体的confidence的map的可视化,代码如下:

if 

可视化效果如下:

054d36c4993c65b965d1c9fb59aa21f7.png
左边预测图,右侧为GT

GT以及预测值的可视化(基于图片),这部分会在训练的时候将每个batch的第0张图片的输出和label取出来,保存到本地

# Original  image
img_show_1 = (imgs[0].reshape(3,416,416)*255.0).cpu().detach().numpy().astype(np.uint8).transpose((1, 2, 0))
img_show = img_show_1.copy().reshape(416,416,3).astype(np.uint8) #np.zeros((416,416,3),dtype=np.uint8)
for i in range(0,13):
    for j in range(0,13):
        # find predict object grid
        if score_gt_show[i,j] > 0 :
            # compute x,y and w,h, the range of values is 0-1
            cx_pred = int((cx_offset_pred[i,j] + j)*416.0/13.0)
            cy_pred = int((cy_offset_pred[i,j] + i)*416.0/13.0)
            cx_gt = int((cx_offset_gt[i,j] + j)*416.0/13.0)
            cy_gt = int((cy_offset_gt[i,j] + i)*416.0/13.0)
            img_show = cv2.circle(img_show,(cx_pred,cy_pred),4,(0,0,255),-1)
            img_show = cv2.circle(img_show,(cx_gt,cy_gt),2,(0,255,0),-1)
            # change value to Original image
            w_i_pred = int(w_pred[i,j]*416)
            h_i_pred = int(h_pred[i,j]*416)
            
            w_i_gt = int(w_gt[i,j]*416)
            h_i_gt = int(h_gt[i,j]*416)
                        
            cv2.rectangle(img_show,(cx_pred - w_i_pred//2 , cy_pred - h_i_pred//2), (cx_pred + w_i_pred//2 , cy_pred + h_i_pred//2), (0,0,255),2)
            cv2.rectangle(img_show,(cx_gt - w_i_gt//2 , cy_gt - h_i_gt//2), (cx_gt + w_i_gt//2 , cy_gt + h_i_gt//2),  (0,255,0),2)
                        
cv2.imwrite("img_show.png",img_show)

可视化效果如下:

85fcde6d81cb681518c84f548596f652.png
绿色为GT的框,红色为对应grid的预测框

整体代码如下:

targets是由输入Class生成的符合网络输出的结构的,大小是:B*S*S*5,最后一维由confidence,x,y,w,h组成,s是和网络输出的feature map大小一样的值,当前是13,B是batch的大小

fea是backbone输出,B*S*S*5

class 

2.4 Yolo v1主体部分

为了快速实现,简化问题,这部分没有采用原始论文backbone的网络结构(yolo v3复现的时候,这是很重要的一部分),直接用了torchvision中已有的resnet50作为主体

class 

2.5 整体训练以及测试代码

github地址:gaoshuhui-bupt/yolo_study

⚠️注意:coco数据处理的时候需要注意crowd这个属性,密集的人的场景下,为了节省标注成本会画一个大框,但是大框是不利于网络学习的,这里使用的是分割的接口,避免了这个问题,但是这并不算一个很有方案。可参考:哆来咪:MSCOCO物体检测评测系统的分析

3 参考资料

【YOLO学习笔记】之YOLO v1 论文笔记1(超详细:翻译+理解)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值