首页 技术 正文
技术 2022年11月18日
0 收藏 802 点赞 4,545 浏览 4857 个字

最近推出了yolo-v4我也准备试着跑跑实验看看效果,看看大神的最新操作

这里不做打标签工作和配置cuda工作,需要的可以分别百度搜索   VOC格式数据集制作,cuda和cudnn配置

我们直接利用VOC格式训练自己数据集的模型

笔者也是 根据官方github的readme操作的 没看懂可以进入官方链接看看英文介绍,或者在issue里面提问,笔者花了一天 也算是跑通了数据集的代码。

paper

https://arxiv.org/abs/2004.10934

github

https://github.com/AlexeyAB/darknet

— 1.首先测试原始权重效果

  – 1.下载预训练权重

  – 2.编译

  – 3.测试

— 2.训练自己的数据集

  – 1.创建yolo-obj.cfg 文件

  – 2.制作obj.names

  – 3.制作obj.data

  – 4.放入源图片

  – 5.制作train.txt

  – 6.开始训练

1.下载预训练权重

放上链接

有翻墙则:

https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights

百度网盘:

链接:https://pan.baidu.com/s/16wOHbaa2mG7cTZ_RcGjRnw
提取码:99bl

下载好yolov4.weights 权重后 放在主目录下即可

2.编译文件 该方法为使用makefile方法编译

打开Makefile文件 修改该文件

修改该文件中前4行 —- 0都改为1

代表使用GPU测试和训练(前提是安装好了cuda和cudnn的机器,安装方法 直接百度搜 cuda和cudnn就有很多教程)

如果没安装过cuda则不用改

执行以下命令编译

 make

然后主目录中出现darknet文件

3.运行该文件

 ./darknet

如果编译成功则会出现以下信息

 usage: ./darknet<function>

现在可以测试初始预训练权重效果了

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

成功则在主目录下出现predictions.jpg 图片为预测后的图片

效果如下

2.训练自己的数据集

–2.1创建yolo-obj.cfg 文件,将 yolov4-custom.cfg 中的内容复制到 yolo-obj.cfg里面并做以下修改。

  –2.1.1修改subdivisions=16(如果报内存不足,将subdivisions设置为32或64)

  –2.1.2修改max_batches=classes*2000   例如有2个类别人和车 ,那么就设置为4000

  –2.1.3修改steps为80% 到 90% 的max_batches值  比如max_batches=4000,则steps=3200,3600

  –2.1.4修改classes,先用ctrl+F搜索 [yolo] 可以搜到3次,每次搜到的内容中 修改classes=你自己的类别 比如classes=2

  –2.1.5修改filters,一样先搜索 [yolo] ,每次搜的yolo上一个[convolution] 中 filters=(classes + 5)x3  比如filters=21

  –2.1.6如果要用[Gaussian_yolo] ,则搜索[Gaussian_yolo] 将[filters=57] 的filter 修改为 filters=(classes + 9)x3 (这里我没用到,但是还是修改了)

–2.2制作obj.names,在build\darknet\x64\data\ 文件夹下创建obj.names文件。内容为你的类别 比如人和车 那么obj.names 为如下

person
car

–2.3制作obj.data,在build\darknet\x64\data\文件夹下创建obj.data文件。内容如下

classes= 2
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = backup/

笔者在这读取不到data/下文件 所以改为绝对路径 就可以了 这是我的obj.data文件

–2.4放入源图片,在build\darknet\x64\data\文件夹下创建obj文件夹,存放所有的原始图片

  笔者在这里遇到问题,就是我是VOC格式的图片如下

└── VOCdevkit
└── VOC2012
├── Annotations
├── ImageSets
│ ├── Main
├── JPEGImages

但是yoloV4需要的训练集不是这样,现在说下制作过程

先进入script下有一个文件voc_label.py,利用该代码可以得到我们想要的txt标注信息 类似xml文件信息

首先注释掉classes=[………….] 替换里面类别为自己的类别(我是做垃圾检测 所以是litter) 然后我的voc是2007的 所以也取消掉2012的修改如下

然后将所有出现的 VOCdevkit修改为 VOCdevkit2007 ,因为我的目录是 (这里根据你们的数据集更改 要求找到对应的目录就可以了)

–VOCdevkit2007

  –VOC2007

    –ImageSets

然后在同级目录下会出现labels文件 这个就是xml对应的txt文件,

将labels中文件放入之前的build\darknet\x64\data\obj中

那么obj文件中会同时存在源图片同名txt文件

这样就完成了txt的制作了

–2.5最后是制作train.txt

  –2.5.1需要以下格式的train.txt

  –2.5.2可以使用如下代码制作

import os
from os import listdir, getcwd
from os.path import joinif __name__ == '__main__':
source_folder =r'G:\jianfeng\project\rubblish_det\yolov4\darknet-master\darknet-master\cfg\JPEGImages'
dest = r'G:\jianfeng\project\rubblish_det\yolov4\darknet-master\darknet-master\cfg\1/train.txt'
dest2 = r'G:\jianfeng\project\rubblish_det\yolov4\darknet-master\darknet-master\cfg\1/val.txt'
file_list = os.listdir(source_folder)
train_file = open(dest, 'a')
val_file = open(dest2, 'a')
i=0
for file_obj in file_list:
file_name, file_extend = os.path.splitext(file_obj) if (i%4 ==0):
#val_file.write(file_name+".jpg" + '\n') 相对路径
val_file.write("build/darknet/x64/data/obj/"+file_name+".jpg" + '\n')
else:
#train_file.write(file_name+".jpg" + '\n')
train_file.write("build/darknet/x64/data/obj/"+file_name+".jpg" + '\n')
i+=1
train_file.close()
val_file.close()

其中dest和dest2可以根据自己需要更改

但是这里遇到些问题就是 我的程序无法识别相对路径data/,所以我把路径改为了绝对路径 build/darknet/x64/data/obj/下的文件。如下

现在就完成了所以制作,可以开始训练了

–2.6.下载权重 和之前的权重不一样

链接:https://pan.baidu.com/s/1yhB8pRcGH84gyRWeNictBA
提取码:gi4d

下载好放入主目录中

–2.7.开始训练

./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 

如果要使用gpu的话输入以下

./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -gpus gpu_id

出现以下画面 则正在训练

最终效果图

———————————————————————————————————————————————————————————————————————————————

错误问题总结:

1.mosaic=1 – compile Darknet with OpenCV for using mosaic=1

因为在设置中使用了opencv(c++版本),而我们没有安装导致的。将之前修改的yolo-obj.cfg中搜索mosaic将1改为0。

mosaic=1  #--》 更改为0

2.make时 出现以下错误

chmod +x *.sh
g++ -std=c++11 -std=c++11 -Iinclude/ -I3rdparty/stb/include -DGPU -I/usr/local/cuda/include/ -DCUDNN -DCUDNN_HALF -Wall -Wfatal-errors -Wno-unused-result -Wno-unknown-pragmas -fPIC -Ofast -DGPU -DCUDNN -I/usr/local/cudnn/include -DCUDNN_HALF -c ./src/image_opencv.cpp -o obj/image_opencv.o
In file included from ./src/image.h:3:0,
from ./src/image_opencv.h:4,
from ./src/image_opencv.cpp:1:
include/darknet.h:41:26: fatal error: cuda_runtime.h: No such file or directory
compilation terminated.
Makefile:165: recipe for target 'obj/image_opencv.o' failed
make: *** [obj/image_opencv.o] Error 1

出现原因是cuda的path不对导致

先查看自己cuda版本  输入 nvcc -V

查看主目录下Makefile文件

搜/usr/local/cuda/xxx 目录

我的原始文件是/usr/local/cuda/xxx   ,cuda版本是9.0 所以

将cuda –>改为cuda-9.0 即可 如下

/usr/local/cuda-9.0/xxx

测试test.txt数据集时的命令(并将结果保存至result.txt中):

./darknet detector test darknet.data darknet-yolov3.cfg darknet-yolov3_final.weights -thresh 0.25 -dont_show -ext_output < data/test.txt > result.txt

恭喜你看完了,有问题可以评论,或者去github上面提问,问作者问题更靠谱哦 ^ – ^

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,565
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,413
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,186
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905