yolov3

yolov3———you look only once(实时目标检测)

参考:https://pjreddie.com/darknet/yolo/

性能:30fps coco数据库,57.9%mAP
速度和性能的权衡,只需要改变模型的大小即可,不需要重新训练(?)

1、安装

安装darknet:

git clone https://github.com/pjreddie/darknet
cd darknet
make

若电脑有opencv和cuda
更改Makefile的内容
更改如下,相关值改为1:

GPU=1
CUDNN=1
OPENCV=1

这样后续编译得到可执行程序darknet,检测就会使用opencv和GPU,检测速度就很快(使用和不使用,速度差别超过100倍!!!)

下载模型:

wget https://pjreddie.com/media/files/yolov3.weights

测试:

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

添加阈值:阈值范围0~1

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0

添加摄像机:

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights  rtsp://admin:hik12345@30.14.199.6:554/h265/ch1/main/av_stream

另外:若资源有限,可以使用tiny版本的yolov3

2、训练

darknet使用的训练数据类型为a.txt,
每一个图片,使用一行

class> <x> <y> <width> <height>

这里以voc2012里的图片2008_000008.jpg为例
最终2008_000008.xml文件会变为文件2008_000008.txt,内容如下:

12 0.522 0.5712669683257919 0.836 0.7533936651583711
14 0.445 0.23642533936651586 0.262 0.27828054298642535

其中12 ,14 为类别 horse, person

0.522 = ((471+53)/2.0 -1)/500 = ((xmax + xmin)/2.0 -1)/width
0.5712669683257919 = ((420+87)/2.0-1)/442 = ((ymax + ymin)/2.0 -1)/height
0.836 = (471-53)/500.0 = (xmax - xmin)/width
0.7533936651583711 = (420-87)/442.0 = (ymax - ymin) / height

同理,可计算目标person的各个值

voc_label.py 作用就是将xml文件变为txt形式,若目标本身标注difficult,则目标不会写入到txt中
生成train.txt 和label文件

2.1、 训练自己数据

yolov3官网给出了voc和coco数据的训练过程。
训练自己数据过程
1)准备图片,标注(可以使用开源的图像数据库进行训练,这样就不需要标注了,笔者就是使用开源数据库的,准备图片时需要对图片进行清洗)
2)将标注文件变成yolo需要的txt文件
假设使用yolo来检测人脸(数据库为开源的人脸库),
检测类别为1类,人脸位置 60 100 200 200 (xleft, ytop, w, h) ,图片长宽为 480 480
则txt里的内容如下:
0 0.3312 0.6229 0.4167 0.4167
3)将图片和标注文件放在同一个目录,将图片数据分做train和val两类数据,并生成train.txt val.txt
train.txt为训练数据的位置
val.txt为val数据的位置

注:最终准备的数据为文件夹(图片和对应的标注文件txt, train.txt val.txt)
4)修改配置文件
训练命令行类似如下:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

故 需要修改cfg/voc.data cfg/yolov3-voc.cfg

cfg/voc.data
内容如下:

classes= 20
train  = /home/pjreddie/data/voc/train.txt
valid  = /home/pjreddie/data/voc/2007_test.txt
names = data/voc.names
backup = backup

修改为:

classes= 1
train  = XXX/train.txt
valid  = XXX/val.txt
names = data/voc.names
backup = backup

注意 train valid的train.txt val.txt即为第三步生成的train.txt val.txt
backup为在darknet下新建的目录(存放训练出来的模型)
names为类型说明文件的位置
classes为类别数,我这里为1类,人脸

故需要修改data/voc.name
原先内容如下:
aeroplane
bicycle
bird
boat
bottle
bus
car
cat
chair
cow
diningtable
dog
horse
motorbike
person
pottedplant
sheep
sofa
train
tvmonitor
改为
faec即可

cfg/yolov3-voc.cfg
找到:
filters=75
改为
filters=18
filter计算方式(classes + 5)*3 ,voc为20类,故为75
若数据只有一类的话,则为18
记住有三处需要修改
同理修改
classes=20 为classes=1 也有三处

另外若目标较小训练时会出现nan,可以修改
batch=1
subdivisions=1
为:
batch=64
subdivisions=8

参考:
https://github.com/AlexeyAB/darknet
https://blog.csdn.net/lilai619/article/details/79695109

你可能感兴趣的:(图像算法)