Caffe(10)--实现YOLOv1目标检测

0、YOLOv1论文

YOLOv1核心思想:从R-CNN到Fast R-CNN一直采用的思路是proposal+分类(proposal提供位置信息。分类提供类别信息),精度高,但速度不行。

YOLOv1更为直接一点,直接在输出层回归bounding box的位置和其所属类别,整张图作为网络的输入,把object detection的问题转换成一个regression问题。

算法原理

1、一副图分为77=49的网格
2、每个格子预测:2个框(每个有1个置信度和x、y、w、h4个位置信息)和1个类别信息,每个格子有classes+num(1+4)=13个参数(以3类别的目标检测来说)。
3、那么一张图预测:7
713=637个参数,77*2=98个框

置信度定义
1、当回归出来的box中有物体中心时,Pr(object)=1,confidence=IOU
2、当回归出来的box中无物体中心时,Pr(object)=0,confidence=0
这里写图片描述
注:这也意味着网络已经为我们预测出到底哪些位置上存在目标。

YOLOv1存在的缺陷
1、YOLOv1对相互靠的很近的物体(挨在一起,且物体中心都落在同一网格),还有很小的群体,检测效果不好,因为一个网格中只预测2个框,并且只有1个类别。
2、测试图像中,当同一类物体出现不常见的宽高比和其它情况时,泛化能力偏弱。
3、由于损失函数本身的问题,定位误差是影响检测效果的主要原因,对于小目标的处理上还有待加强。


1、YOLOv1-Caffe手势识别训练数据准备

图片 lmdb + 标签 hdf5
hdf5不支持图片的预处理,lmdb支持

name: "YOLOv1_Gesture_Recognition"
layer {
  name: "data"
  type: "Data"
  top: "data"
  include {
    phase: TRAIN
  }
  data_param {
    source: "examples/yolov1_gesture/train_lmdb" # lmdb文件路径
    batch_size: 64
    backend: LMDB
  }
  transform_param {
    mean_value:127.5
    mean_value:127.5
    mean_value:127.5
    scale: 0.00784
  }
}
layer {
  name: "truth"
  type: "HDF5Data"
  top: "label"
  include {
    phase: TRAIN
  }
  hdf5_data_param {
    source: "examples/yolov1_gesture/yolov1_hdf5_train/yolov1_train_label.txt" # 标签文件路径,txt文件内容为hdf5文件的绝对路径
    batch_size: 64
  }
}

1.图片转为lmdb
使用脚本create_caffeyolo_lmdb_and_hdf5.py,先跟据图片生成清单txt文件,内容如下:

IMG_9852.JPG 0
IMG_9422.JPG 0
IMG_9540.JPG 0

在将图片转换为lmdb时,必须给定标签,但这个标签我们不使用,后面要用hdf5格式的标签,所以全部指定为0。
转换时,需要resize为448*448。脚本会根据清单txt文件调用caffe接口转换生成lmdb格式文件。
这里写图片描述

2.数据box标注信息的格式转换
yolo需要的标注信息为:x y w h
x,y代表所预测出来的box的中心点,且是相对于单个网格,而不是整个图片
w,h是相对于整个图片
我们的标注信息为:x1 y1 x2 y2 # 通过标注工具标注的到的voc格式数据就是这样的排布
使用脚本create_caffeyolo_lmdb_and_hdf5.py,完成voc到yolo-hdf5格式的转换。

具体计算方式
1.对于没有物体中心的网格,6个数据都标注为0
2.对于有物体中心的网格,做如下处理:
(1)先求出中心点坐标(x,y)相对于图片的归一化

center_x = (x1 + x2) / (2 * im_w)
center_y = (y1 + y2) / (2 * im_h)
# 但是实际上,我们需要的是相对于网格的归一化,需要再处理
center_x即为占整个图片边长的比例,当前图片分成了11份,center_x * 11即为所占网格,取小数部分记为占当前网格的比例。
X = center_x * 11 - int(center_x * 11)
Y = center_y * 11 - int(center_y * 11)

(2)求出标注框的w、h相对于图片的归一化

w = (x2 - x1) / im_w
h = (y2 - y1) / im_h

(3)定位当前是哪一个网格

cell_num = row * 11 + col +1

这里写图片描述


2、Caffe中添加新的层,YOLOv1 Detect_Layer实现

详见链接
Caffe(11)–YOLOv1的Detection层实现
https://blog.csdn.net/lwplwf/article/details/82788376


3、Caffe中添加新的层,leaky激活函数层实现

这里写图片描述
leaky激活函数是relu的变体,代码实现可参考caffe中relu层的实现。
在Caffe中的添加方法与2种添加Detect_Layer相同。


4、训练模型文件准备

在准备好训练及测试数据,Caffe添加新层并编译通过后,准备模型训练相关文件。
在Caffe根目录下examples中新建yolov1_gesture文件夹,并将前面专备好的两个lmdb文件夹和hdf5文件夹复制过来。

yolov1_gesture_train_val.prototxt # 模型结构文件
yolov1_gesture_solver.prototxt # 超参数配置文件
train_yolov1_gesture.sh # 训练脚本

这里写图片描述

其中yolov1_hdf5_trainyolov1_hdf5_train文件夹中保存了两个文件:

这里写图片描述

yolov1_train_label.txt中写的是.h5文件的绝对路径,在prototxt文件中需要些txt的路径,而不是直接给.h文件的路径。


5、执行训练

Caffe根目录下执行命令:

./examples/yolov1_gesture/train_yolov1_gesture.sh

脚本内容如下
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值