您的位置:首页 > Web前端

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

2018-09-13 11:29 393 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwplwf/article/details/82685347

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、那么一张图预测:7713=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://www.geek-share.com/detail/2748429072.html

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

脚本内容如下

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: