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、那么一张图预测: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_train和yolov1_hdf5_train文件夹中保存了两个文件:
yolov1_train_label.txt中写的是.h5文件的绝对路径,在prototxt文件中需要些txt的路径,而不是直接给.h文件的路径。
5、执行训练
Caffe根目录下执行命令:
./examples/yolov1_gesture/train_yolov1_gesture.sh
脚本内容如下
- Caffe(12)--实现YOLOv2目标检测
- 实战小项目之基于yolo的目标检测web api实现
- TX2实现yolov2(目标检测,计数,训练自己的数据集)
- 目标检测- YOLO v1--You Only Look Once
- Caffe(11)--YOLOv1的Detection层实现
- 在iOS上实现YOLO目标检测算法
- 深度学习实战(1)--手机上跑目标检测网络(YOLO,从DarkNet到Caffe再到NCNN完整打通)
- 记录实战小项目之基于yolo的目标检测web api实现
- 目标检测:YOLOv2的cfg转换成caffe的prototxt
- caffe项目实践:实现YOLO对物体进行检测
- 目标检测学习_1(用opencv自带hog实现行人检测)
- 一种Java与OpenCV结合实现的目标检测模块
- DL开源框架Caffe | 目标检测Faster-rcnn训练自己数据问题整理
- 《OpenCV 3计算机视觉:Python语言实现》学习笔记——目标跟踪中基本运动检测的思考
- 【opencv】基于opencv实现运动目标检测之帧差法
- 混合高斯模型实现运动目标检测(OpenCV内置实现)
- 目标检测:YOLOv2算法详解
- “快到没朋友”的目标检测模型YOLO v3问世,之后arXiv垮掉了…
- 【caffe-matlab】目标检测R-FCN算法于Windows下配置
- Coursera Deep Learning 第四课 卷积神经网络 第三周 目标检测 编程作业 Autonomous driving application - Car detection - v1