02 YOLO系列总结

参考:

https://www.jianshu.com/p/cad68ca85e27

https://arxiv.org/abs/1506.02640

https://www.jianshu.com/p/13ec2aa50c12

https://www.imooc.com/article/36391

https://www.jianshu.com/p/f87be68977cb

https://www.cnblogs.com/xiongzihua/p/9315183.html

1. YOLO v1

网络框架:

1.1 其中,输入图像大小是448*448*3,输出大小是7*7*30,如上图,最后输出的一个像素值对应原图中的一个网格,即相当于将原图分割成7*7的网格:

  • 最后输出的每个像素值都是一个30维的向量,每个像素对应原图中的一个网格,30等于2×5+20,即2个bbox值(bbox值包括坐标和宽高),同时为每个bbox值预测一个置信度(confidence scores)。20表示某个类的中心落在当前单元格内的概率。
  • 即前面10个值用来确定目标的位置(定位),后面20个值用来确定目标的类别(分类)。
  • 输出结果中的一个像素,只能有一个类别,即要么是狗,要么是自行车,所以对应到原图中的网格,每个网格负责预测一种物体;为何用两个bbox,为了更准确的定位出物体。

 

1.2 分类功能简单,即20个0到1的值,哪个位置上的值大即属于哪个类,难点是定位功能:

 

因为定位和分类一样也视为回归任务,所以需要将坐标数据值归一化为0到1之间,假设输出结果的其中一个像素值为(x,y,w,h,confidence),对应到原图即为上图的蓝色网格的检测结果,该目标的bbox是红色框。

1.2.1 (x, y)

(x, y)是红色bbox的中心(原图绿色点)相对于网格(当前网格是蓝色)的左边界和上边界偏移距离,由两个坐标决定,分别是单元格左上角坐标、bbox中心在原图像的坐标位置。对于上图蓝色网格坐标为(x_{col} = 1, y_{row} = 4),假设它输出的是红色框bbox,设bbox的中心坐标(x_c, y_c),那么最终预测的结果(x,y)是经过归一化处理的,表示的是绿色中心相对于蓝色网格的偏移,计算公式如下:

因为bbox中心相对于单元格的偏移量,即绿色点如果正好在蓝色单元格最左上角,则偏移量为0,如果正好在最右下角,则相对于左边界和上边界偏移量都为1,公式如下

\large x = \frac{x_c - w_i}{w_c}

\large y = \frac{y_c - h_i}{h_c}

其中,(w_i,h_i) 是单元格左上角坐标,w_c, h_c是每个单元格的宽、高,(x_c, y_c) 是原图像的坐标位置,x就是相对于单元格的左边界偏移的距离。所以x, y区间都是[0, 1]。

同理,y值一样,这样就实现了原图中所有的坐标值都是0到1。

每个网络只有有一个类别,类别的中心只能在网格内移动。

1.2.2 (w,h)

(w,h)是红色bbox相对于整个图片的比例。预测的bbox的真实宽高为w_b, h_b,如上图所示。(w_i,h_i)表示的是原图宽、高,计算公式如下:

w = \frac{w_b}{w_i}

h = \frac{h_b}{h_i}

其中w_i值为448,假设w_b值为160,则w = 160 / 448 = 0.3571. 

1.2.3 confidence

这个置信度是由两部分组成,一是格子内是否有目标(有为1,无为0),二是bbox的准确度(IoU,设置IoU是为了定位更准)。即如果有目标,置信度为IoU,否则置信度为0。用来评估目标位置是否准确,而不管具体类别。

一个网格,有两个bbox,所以就有两个confidence

1.2.4 C类的条件概率

20个条件概率定义为\large p_r = (Class_i|Object),表示该网格存在目标且属于第i类的概率。

测试的时候,将最终的输出是置信度乘以这20个条件概率值,得出一组20个概率值,因为有两组bbox,这样bbox1和bbox2的confidence分别乘以这20个条件概率值,就有两组概率值。送入NMS,得到最终的输出框结果。

1.3 损失函数

首先要明确两个概念,一是网格中有无目标,二是网格中的一个目标只有一个box负责(responsible)另一个box也算没有目标,根据在线计算IOU的大小确定哪一个负责。

其中,\sum_{i=1}^{S^2}是在遍历网格,\sum_{j=1}^{B}是在遍历每个网格的bbox,\large 1_{ij}^{obj}表示选取S^2*B个bbox中框出ground truth的那几个bbox。剩下的未被选择的,就给了\large 1_{ij}^{noobj}. λ是用来调节类别不平衡的超参数。

confidence损失:负责检测的box的label是在线计算的IOU,不负责和无目标的都为0,为了平衡,加入λnoobj

位置损失:容易理解,负责检测的才有位置损失,其他的都不需回传损失,也就不需要计算,此外小目标对于预测wh的误差更敏感,用开根的方法缓解。举例来说,大小为10和大小为100的目标,预测大小分别为20和110,损失一样但是显然小目标检测的更差一些,开根后,\large (\sqrt{20}-\sqrt{10})^2=1.7,而\large (\sqrt{110}-\sqrt{010})^2=0.24,相当于强化了小目标的损失。

类别损失:容易理解,含有目标的网格才有类别损失,其他都不需要回传损失,也就不需要计算。默认网格只出现一种类别,这当然是有缺陷的。yolov1对于一些聚集的目标,检测效果会不好。其实聚集目标本身也算很难检测的情况吧。

  • 可以看到损失函数包括5个部分。第一部分是x,y坐标;第二部分是w,h,采用根号使得小方框size变化的损失比大方框size变化的损失大,因为小目标对于预测wh的误差更敏感;第三部分是方框置信度损失,回归目标是预测方框与实际方框的IOU值;前三部分都只在预测方框和实际方框有对应关系时才计算loss
  • 第四部分是没有对应物体的方框置信度损失,实际的置信度都是0;
  • 第五部分是分类损失,当方格与物体有对应关系时,才计算分类损失。

因为在图片中很多方格都不包含物体,使得方格预测方框的置信分数趋于0。所以对包含物体的方格加大权重,对不包含物体的方格减小权重。论文中有\large \lambda _coord = 5\large \lambda_{noobj} = 5

 

待续。。。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用OpenCV中提供的resize函数,将输入图像的分辨率进行降低。代码示例如下: ```python import cv2 # 读取图片 img = cv2.imread("input.jpg") # 将分辨率降低为原来的一半 resized_img = cv2.resize(img, (img.shape[1]//2, img.shape[0]//2)) # 保存图片 cv2.imwrite("output.jpg", resized_img) ``` 其中,cv2.imread用于读取图片,cv2.resize用于调整图片大小,cv2.imwrite用于将处理后的图片保存到本地。调整图片大小可以根据具体需求进行修改。 ### 回答2: 要降低YOLO输入图像的分辨率,可以通过调整图像的大小来实现。下面是一个示例代码,可以使用OpenCV库来完成这个任务: ```python import cv2 def resize_image(image, new_width, new_height): """ 调整图像大小 :param image: 原始图像 :param new_width: 新的宽度 :param new_height: 新的高度 :return: 调整大小后的图像 """ resized_image = cv2.resize(image, (new_width, new_height)) return resized_image def main(): # 加载原始图像 image = cv2.imread('input_image.jpg') # 调整图像大小为新的分辨率 new_width = 416 # 设置新的宽度 new_height = 416 # 设置新的高度 resized_image = resize_image(image, new_width, new_height) # 保存调整大小后的图像 cv2.imwrite('resized_image.jpg', resized_image) if __name__ == '__main__': main() ``` 上述代码中,我们定义了一个名为`resize_image`的函数,该函数使用OpenCV的`resize`方法来调整图像的大小。在`main`函数中,我们加载了原始图像,然后调用`resize_image`函数将图像调整为新的宽度和高度。最后,我们使用`imwrite`方法保存调整大小后的图像。 此代码旨在将YOLO输入图像的分辨率调整为416x416像素,你可以根据需要更改`new_width`和`new_height`的值来调整分辨率。希望这个回答能对你有所帮助! ### 回答3: 要降低YOLO输入图像的分辨率,可以通过以下步骤完成: 1. 导入必要的库和模块:首先,需要导入YOLO使用的库和模块,例如OpenCV和YOLO的Python接口。 2. 加载预训练的YOLO模型:使用YOLO的Python接口,加载已经训练好的YOLO模型。这个模型将会被用来进行目标检测任务。 3. 加载输入图像:使用OpenCV库,加载需要进行目标检测的输入图像。 4. 调整输入图像的分辨率:使用OpenCV库提供的函数,对输入图像的尺寸进行修改。可以通过设置新的宽度和高度来降低图像的分辨率。 5. 执行目标检测:将调整后的输入图像传递给YOLO模型,执行目标检测任务。这会返回图像中检测到的目标的边界框信息和置信度。 6. 绘制边界框:使用OpenCV库提供的函数,将检测到的目标边界框信息绘制到原图上。 7. 显示输出图像:使用OpenCV库提供的函数,将绘制完边界框的输出图像显示出来。 下面是一个示例代码来降低YOLO输入图像的分辨率: ``` import cv2 import numpy as np import yolo_module # 加载YOLO模型 yolo = yolo_module.YOLO() # 加载输入图像 image = cv2.imread("input_image.jpg") # 调整输入图像的分辨率 new_width = 640 new_height = 480 resized_image = cv2.resize(image, (new_width, new_height)) # 执行目标检测 boxes, confidences = yolo.detect_objects(resized_image) # 绘制边界框 yolo.draw_boxes(resized_image, boxes, confidences) # 显示输出图像 cv2.imshow("Output Image", resized_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 注意,在实际使用中,可能需要根据具体情况修改参数和函数调用。以上代码仅供参考。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值