使用yolo-v3和yolov3-tiny训练自己的数据
yolov3的官网:教程官网都有,老详细了。
确立我们的目标:
训练我们自己的数据集,从而生成一个XXX.weights
文件,这就是炼丹练出来的丹
先搞定darknet
安装+编译
- 先建个文件夹
- 打开命令行进入这个文件夹
git clone https://github.com/pjreddie/darknet
建议翻墙下,有点小大cd darknet
make
- ok darknet算是成功安装了
测试一下yolo能不能用
- 在
darknet
文件夹中 - 下载这个放到
darknet
文件夹中(不翻墙的速度感人)yolov3.weights - 运行命令
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
- 应该就能看到结果了,在darknet 文件夹下生成了
predictions.jpg
图片
我们在试试tiny-yolo的检测
- 下载这个放到darknet文件夹中(不翻墙的速度感人)yolov3-tiny.weights
- 结果同上,不做赘述了
训练的数据准备
-
准备好训练图片,保存在
train_imgs
-
准备好测试图片,保存在
test_imgs
-
准备好训练集
- 建一个文件夹
train_dataset
- 里面含有
train_imags
的全部图片,比如img1.jpg,img2.jpg,img3.jpg……
- 同含有每张图片对应的标注信息,比如
img1.txt,img2.txt,img3.txt……
,也就是说每有一张图片,就有一个图片名.txt
的文件与之对应。 图片名.txt
里的内容是
label名 x y w h
label名 x y w h
label名 x y w h
label名 x y w h
……
x y w h 计算法则如下:
x = X ( 框 中 心 x 坐 标 ) W ( 图 宽 ) x=\frac{X(框中心x坐标)}{W(图宽)} x=W(图宽)X(框中心x坐标)
y = Y ( 框 中 心 y 坐 标 ) H ( 图 高 ) y=\frac{Y(框中心y坐标)}{H(图高)} y=H(图高)Y(框中心y坐标)
w = w ( 框 宽 ) W ( 图 宽 ) w=\frac{w(框宽)}{W(图宽)} w=W(图宽)w(框宽)
w = h ( 框 高 ) H ( 图 高 ) w=\frac{h(框高)}{H(图高)} w=H(图高)h(框高)
实例如下:
bicycle 0.37543085813522337 0.2680371602376302 0.05270464420318603 0.1362799326578776 bird 0.43849892616271974 0.25673709445529513 0.05238265991210937 0.11692102220323351 bird 0.5161398410797119 0.24423293007744684 0.022611427307128906 0.11158682505289713 bird 0.5623636245727539 0.23595088322957355 0.053014373779296874 0.1280634774102105
- 建一个文件夹
-
同训练集一样准备好测试集
test_dataset
-
准备一个文件,名字是
classes.txt
,里面是检测的类别,也就是label,例如aeroplane bicycle bird boat bottle bus car cat chair cow diningtable dog horse motorbike person pottedplant sheep sofa train tvmonitor
-
准备一个文件,名字是
train.txt
,里面内容是train_dataset
下图片的路径,样例如下my_train_file/train_dataset/1332578596102866930.jpg my_train_file/train_dataset/-182-change_1328765264291956722.jpg my_train_file/train_dataset/-2508-change_1328134675046074354.jpg my_train_file/train_dataset/-1883-change_other-2-1328304958688200690.jpg
-
准备一个文件,名字是
test.txt
,里面内容是测试图片的路径,样例如上 -
准备一个文件,命名为
own.data
,内容举个例子(我的注释要删掉)classes= 20 #类别数 train = my_train_file/train.txt #train.txt文件夹路径 valid = my_train_file/test.txt #test.txt文件夹路径 names = my_train_file/classes.txt #类别名文件夹路径 backup = backup #训练出来的权重保存的位置,现在是在 darknet/backup
备注:这个文件中的相对路径是相对于
darknet
文件路径的。
满配的yolo训练
- 官网提供了Imagenet上预先训练的卷积权重,darknet53.conv.74
- 这个是预训练好的权重,用的是Imagenet数据集,我们提取他的前74层的权重偏置和等等一堆参数值,提取出来就是
darknet53.conv.74
,我们用这个作为初始值,开始用我们自己的数据,用yoloV4网络,训练我们自己的参数 - 整理一下现在已经有的东西
train_imgs
,test_imgs
,train_dataset
,test_dataset
,classes.txt
,train.txt
,test.txt
,own.data
,darknet53.conv.74
,yolov3.weights
,yolov3-tiny.weights
- 这一步在darknet文件夹下新建个文件夹,名为
my_train_file
,把darknet53.conv.74
,train.txt
,test.txt
,own.data
,classes.txt
,train_dataset
,test_dataset
,都放到这里来。 - 进入
darknet
文件夹,运行./darknet detector train my_train_file/own.data cfg/yolov3.cfg my_train_file/darknet53.conv.74
命令解释:<运行darknet网络> <执行命令> <训练> <上一节第8步文件的路径> <网络路径> <预训练权重路径> - 这里说一下,上一步的 <网络> 是在
darknet/cfg
里的,里面有各种darknet作者搭好的网络,我们这里选yolov3.cfg
注意:
打开yolov3.cfg
文件,查看其是否处于训练状态,上图就是训练状态,把# Training
下面的注释掉,把# Testing
下面的注释去掉
,就是测试模式 - 结果保存在
backup
文件夹下
tiny-yolo的训练
备注:本节是接上一节的操作后进行的,务必先执行完上一节的前四步
- 把
yolov3-tiny.weights
,放到darknet
文件夹下 - 提取其前15层的参数,在
darknet
文件夹下运行./darknet partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15
- 把新生成的
yolov3-tiny.conv.15
文件移动到my_train_file
中 - 在
darknet
文件夹下运行./darknet detector train my_train_file/own.data cfg/yolov3-tiny.cfg my_train_file/yolov3-tiny.conv.15
- 注意这里
yolov3-tiny.cfg
要符合上一节的第6步