吴恩达deeplearning Lesson4 Week3 YOLO识别车辆图片

吴恩达deeplearning Lesson4 Week3-Autonomous+driving+application+-+Car+detection

  • YOLO的思路
    • model
    • 卷积实现
    • 找到框之后的操作
  • 实现过程遇到的TensorFlow问题
    • K函数
    • tf.boolean_mask
    • tf.image.non_max_suppression()
    • K.gather()
    • .eval()
  • 其他

YOLO的思路

model

输入:(None, 608, 608, 3)
一步步经过model:
(None, 608, 608, 32) (None, 304, 304, 32)(None, 304, 304, 64) (None, 152, 152, 64)(None, 152, 152, 128)(None, 152, 152, 64) (None, 152, 152, 128 )(None, 76, 76, 128) (None, 76, 76, 256)(None, 76, 76, 128) (None, 76, 76, 256) (None, 38, 38, 256) (None, 38, 38, 512)(None, 38, 38, 256) (None, 38, 38, 512)(None, 19, 19, 512) (None, 19, 19, 1024)(None, 19, 19, 425)

425=5*85 ->(None, 19, 19, 5,85)

将原画幅改变成19*19块,在每一块内进行物体检测
(5,85)里面是5个可能的anchor box(可能的别的形状的boundingbox,作用是识别出可能在同一区域出现不同的物体)

85是:
在这里插入图片描述

卷积实现

利用卷积实现滑动窗(共享部分全连接),省去了一块一块抠图的时间和能耗。
吴恩达deeplearning Lesson4 Week3 YOLO识别车辆图片_第1张图片

找到框之后的操作

1、只留下置信概率(p)值大于一定阈值的框
2、非极大值抑制
去掉与同区域内与最大框重合度高的框 (高iou值的框)
另外 在fasterrcnn中rpn层的作用是推荐可能的候选区,最早的实现是使用图片图像分割来进行的。

实现过程遇到的TensorFlow问题

K函数

to call a Keras function, you should use K.function(…)
使用Keras函数,应该使用K.function(…)
前提要声明:

from keras import backend as K
box_classes = K.argmax(box_scores, axis=-1) #最大是哪类
box_class_scores = K.max(box_scores, axis=-1, keepdims=False) #最大值

比如使用tensorflow中的argmax(找最大值下标)和max(找最大值)函数**(类比numpy)**

tf.boolean_mask

作业部分源码:

    ### START CODE HERE ### (≈ 1 line)
    filtering_mask = box_class_scores > threshold
    ### END CODE HERE ###
    # Step 4: Apply the mask to scores, boxes and classes
    ### START CODE HERE ### (≈ 3 lines)                          #mask方法
    scores = tf.boolean_mask(box_class_scores, filtering_mask)
    boxes = tf.boolean_mask(boxes, filtering_mask)
    classes = tf.boolean_mask(box_classes, filtering_mask)
    ### END CODE HERE ###

下面为tf.boolean_mask官方例子,作用是将mask罩在目标tensor上,判定为true的留下来,false的就删除不要了

# 1-D example
tensor = [0, 1, 2, 3]
mask = np.array([True, False, True, False])
boolean_mask(tensor, mask)  # [0, 2]

tf.image.non_max_suppression()

官方定义

tf.image.non_max_suppression(
    boxes,
    scores,
    max_output_size,
    iou_threshold=0.5,
    score_threshold=float('-inf'),
    name=None
)

Returns:
selected_indices: A 1-D integer Tensor of shape [M] representing the selected indices from the boxes tensor, where M <= max_output_size.
作用就是对候选框进行非极大值抑制,boxes是候选框、scores是概率值、max_output_size是经过抑制留下的框数,iou_threshold是iou的阈值,score_threshold是概率的阈值。

代码中源码

def yolo_non_max_suppression(scores, boxes, classes, max_boxes = 10, iou_threshold = 0.5):
    """
    Applies Non-max suppression (NMS) to set of boxes
    
    Arguments:
    scores -- tensor of shape (None,), output of yolo_filter_boxes()
    boxes -- tensor of shape (None, 4), output of yolo_filter_boxes() that have been scaled to the image size (see later)
    classes -- tensor of shape (None,), output of yolo_filter_boxes()
    max_boxes -- integer, maximum number of predicted boxes you'd like
    iou_threshold -- real value, "intersection over union" threshold used for NMS filtering
    
    Returns:
    scores -- tensor of shape (, None), predicted score for each box
    boxes -- tensor of shape (4, None), predicted box coordinates
    classes -- tensor of shape (, None), predicted class for each box
    
    Note: The "None" dimension of the output tensors has obviously to be less than max_boxes. Note also that this
    function will transpose the shapes of scores, boxes, classes. This is made for convenience.
    """
    max_boxes_tensor = K.variable(max_boxes, dtype='int32')     # tensor to be used in tf.image.non_max_suppression()
    K.get_session().run(tf.variables_initializer([max_boxes_tensor])) # initialize variable max_boxes_tensor
    
    # Use tf.image.non_max_suppression() to get the list of indices corresponding to boxes you keep
    ### START CODE HERE ### (≈ 1 line)
    nms_indices = tf.image.non_max_suppression(boxes,scores,max_boxes_tensor,iou_threshold)
    ### END CODE HERE ###
    
    # Use K.gather() to select only nms_indices from scores, boxes and classes
    ### START CODE HERE ### (≈ 3 lines) #K.gather作用 在给定的张量中搜索给定下标的向量
    scores = K.gather(scores,nms_indices) 
    boxes = K.gather(boxes,nms_indices) 
    classes = K.gather(classes,nms_indices) 
    ### END CODE HERE ###

    return scores, boxes, classes

吴恩达deeplearning Lesson4 Week3 YOLO识别车辆图片_第2张图片
可以看到scores中有10个值,这是剩下的框的概率值。boxes中的每个量有4个值,分别代表中心位置和长宽,class表示类别(这里是小数我认为是前面初始化就是使用的随机小数)

K.gather()

https://blog.csdn.net/m0_37393514/article/details/81776071
函数原型:

gather(reference,indices)

在给定的张量中搜索给定下标的向量。

参数:reference表示被搜寻的向量;

indices表示整数张量,要查询的元素的下标。

返回值:一个与参数reference数据类型一致的张量。

案例:

a = tf.constant([[1,2,3,4],
[5,6,7,8]],tf.float32)
b=tf.constant([0,0,1],tf.int32)
print('K.gather ='+str(sess.run(K.gather(a,b))))
K.gather =[[1. 2. 3. 4.]
[1. 2. 3. 4.]
 [5. 6. 7. 8.]]

indices值是代表下标,作用是从reference张量中挑出indices下标的张量并gather集合起来,形成一个新的张量。

.eval()

通过.eval()来计算tensor值 也可sess.run()

print("scores[2] = " + str(scores[2].eval())) 
print("scores[2] = " + str(K.get_session().run(scores[2])))  

在目标是tensor张量的时候 tensor.eval() 和sess.run()效果相同,
区别是sess.run可以进一步同时生成多个tensor,而eval只能出一个结果
吴恩达deeplearning Lesson4 Week3 YOLO识别车辆图片_第3张图片
这里我有个问题之前一直不懂,但是经过实验暂且明白了,我在使用完极大值抑制函数后连着写了4个print,sess.run 和 eval各用2次,结果发现4次结果都不一样,说明是在不停的按照上文指示生成新的随机数。

其他

出现了字体错误,发现是因为文件夹名称导致的 font文件夹被搞成了front

你可能感兴趣的:(DeepLearning,yolo,cv,图像识别,吴恩达,tensorflow)