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.weightsrtsp://admin:hik12345@30.14.199.6:554/h265/ch1/main/av_stream
另外:若资源有限,可以使用tiny版本的yolov3
2、训练 darknet使用的训练数据类型为a.txt,
每一个图片,使用一行
这里以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
【yolov3】参考:
https://github.com/AlexeyAB/darknet
https://blog.csdn.net/lilai619/article/details/79695109
推荐阅读
- 车牌定位之梯度图像
- 图像算法|OpenCV Threshold ( Python , C++ )
- CTPN——cpu版本使用
- tf-faster-rcnn 训练自己的数据
- (图像缩放算法)最邻近插值法
- 图像算法|Blob Detection Using OpenCV