参考https://blog.csdn.net/public669/article/details/99044895
参考https://blog.csdn.net/qq_44166805/article/details/105876028
官网为 https://github.com/AlexeyAB/darknet,下载文件夹时,可以从github上下载,也可以在终端输入命令:
git clone https://github.com/AlexeyAB/darknet
cd darknet
由于网速较慢,我直接从师兄那边copy了一份,放在了/home/nvidia/文件夹下,改名为darknet。
进入文件夹,打开Makefile
将GPU,CUDNN,OPENCV设为1
设置完成后重新编译
make clean
make -j8
./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights data/dog.jpg -i 0 -thresh 0.25
由于自己没有coco数据集,没有办法验证,因此直接进行下一步,darknet安装完成。
参考https://blog.csdn.net/qq_44166805/article/details/105876028
训练自己的数据集,一共需要设置一个.cfg文件,一个.data文件,一个FPGA.names文件。同时需要权重文件darknet53.conv.74。笔者使用了船舰集,该数据集已经有图片和符合yolo规范的txt标签以及.names文件。
.cfg文件的名字随便取一个,笔者取了PAradar.cfg,放在cfg文件夹下。可以从darknet/cfg中复制一份yolov4-custom.cfg,修改名字和其中的参数。
具体操作为:
把第三行batch改为batch=64
把subdivisions那一行改为 subdivisions=16
(这两个参数按照自己的GPU的水平来定)
将max_batch更改为(数据集标签种类数(classes)*2000 但不小于4000 )
将第20的steps改为max_batch的0.8倍和0.9倍(第一次跑程序时可以少跑几趟验证自己设置的对不对)
把位于8-9行设为width=416 height=416 或者其他32的倍数(图像的尺寸,比较吃显存,自己可以适当增加或者减少)
将classes=80 改为你的类别数 (有三个地方,969行,1056行,1143行),笔者的数据集有5种类别,因此classes=5
改正[filters=255] 为 filters=(classes + 5)x3 (位置为查找yolo,每个yolo前面的[convolutional]里,注意只修改最接近yolo的那个filters需要修改,一共有三处)
修改后的cfg文件参考下面的网页,仔细看注释
https://blog.csdn.net/qq_44166805/article/details/105876028
这样.cfg文件就配置完成了,可以放在/darknet/cfg文件夹下
在scripts文件夹下创建文件夹VOCdevkit(因为scripts文件夹下有vov_label.py文件,它的作用下面会说,下面创建的文件也跟它有关),根据下图在VOCdevkit文件夹下创建文件,并放入相应的数据。
VOCdevkit
——VOC2020 #文件夹的年份可以自己取,但是要与你其他文件年份一致,看下一步就明白了
————labels #放入所有的yolo格式的txt文件
————ImageSets
——————Main #放入train.txt,val.txt文件
————JPEGImages 放入jpg图片
在Main文件夹下放置这两个文件
其中Main中的txt文件是要写文件名,比如train.txt里写的是用来训练的图片的文件名(不包含后缀,只是文件名哦!!!),这个文件可以找代码生成(下面的python代码可以用),代码的话看懂他的作用,特别的文件的路径之类的,根据自己的情况修改下,就可以用(我自己是在自己的PC上弄好了这两个txt文件,然后用filezilla传到了scripts/VOCdevkit/VOC2020/ImagesSets/Main文件夹)
import os
from os import listdir, getcwd
from os.path import join
if __name__=='__main__':
source_folder='/home/wz/darknet/scripts/VOCdevkit/VOC2021/JPEGImages'
dest='/home/wz/darknet/scripts/VOCdevkit/VOC2021/ImageSets/Main/train.txt' # train.txt文件路径
dest2 = '/home/wz/darknet/scripts/VOCdevkit/VOC2021/ImageSets/Main/val.txt' # val.txt文件路径
file_list=os.listdir(source_folder)
train_file=open(dest,'a')
val_file = open(dest2, 'a')
file_num=0
for file_obj in file_list:
file_path=os.path.join(source_folder,file_obj)
file_name,file_extend=os.path.splitext(file_obj)
file_num=file_num+1
if(file_num%50==0): #每隔50张选取一张验证集
val_file.write(file_name+'\n')
else:
train_file.write(file_name+'\n')
train_file.close()
val_file.close()
运行过之后会在Main中生成两个上述两个txt文件。
修改voc_label.py,这个文件就是根据Main中txt里的文件名,生成相应的txt,里面存放的是它们的路径,但是这个文件也会完成标签转换的功能,由于我的船舰集已经包含了yolo的标签文件,因此需要屏蔽数据转换的函数,在下面用蓝色背景标出了
sets=[('2021', 'train'), ('2021', 'val')] #这里要与Main中的txt文件一致
classes = [“freedom”,“nimitz”,”burke”,”ticonderoga”,”wasp”] #你所标注的表签名,第一步中已经说过
……省略被屏蔽掉的函数……
for year, image_set in sets:
if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
list_file = open('%s_%s.txt'%(year, image_set), 'w')
for image_id in image_ids:
list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
#convert_annotation(year, image_id) #这里屏蔽掉
list_file.close()
os.system("cat 2020_train.txt 2020_val.txt > train.txt") #文件最后一句,意思是要将生成的文件合并,所以很据需要修改
终端加载到voc_label.py所在目录,运行 python voc_label.py
运行后会生成2020_train.txt、2020_val.txt、train.txt,我把他们复制到了scripts/VOCdevkit/VOC2021文件夹内
将船舰集的FPGA.names文件放到data目录下。
复制cfg文件夹下的voc.data,重命名为FPGA.data
用自己的编辑的文件路径替换原来的参数
classes= 2
train = scripts/VOCdevkit/2020_train.txt
valid = scripts/VOCdevkit/2020_val.txt
names = data/FPGA.names
backup = backup
然后就可以开始训练船舰集了。
./darknet detector train cfg/FPGA.data cfg/PAradar.cfg darknet53.conv.74 –map
./darknet detector train cfg/gtz.data cfg/gtz.cfg darknet53.conv.74 –map
说明:
.data文件的backup = backup一项表示训练好模型的存放位置