大家好,我最近想在树莓派安装Yolo-FastestV2,但苦于最近树莓派价格大涨,所以只能用vm模拟Ubuntu来模拟部署一遍试一试.
安装python,anaconda什么的我就不多说了,百度吧.
首先,下载Yolo-FastestV2的源码,
https://github.com/dog-qiuqiu/Yolo-FastestV2
上面就是Yolo-FastestV2的源码的网站了,别说你不会下,自己百度.
下图就是我们将下好的源码解压后的文件了.
我们也知道,想要跑出自己想要的效果,自己训练模型是必要的,下面我们就要使用源码中的train.py来训练模型.
这里强调一个事情,根据官方的文档,我们所有的数据集都是放在一个文件夹下面的.(不要惊讶,这样方便),至于是什么数据文件,包括图片(.jpg),标注(.txt),训练目标(test.txt),测试目标(val.txt).
训练模型的第一部,收集和标注数据集,当然了,收集和标注数据是一个非常累人的活,我们一般使用别人的数据集,但我们需要做一些处理.
处理如下:
1.我们得到的数据集,一般都是.xml为下标的,我们要转换为.txt格式的,所以我需要一个程序
import xml.etree.ElementTree as et
import os
classes=["a","b"]
def find_xml(path):
'''
找到一个文件夹下所有的xml文件,返回一个装这这些文件路径名的所有文件的列表
'''
file_list=os.listdir(path)
xml_list=[]
for file in file_list:
if file.endswith(".xml"):
xml_list.append(path+"/"+file)
return xml_list
def xml2txt(path,x=640,y=480):
xml_list=find_xml(path)
for xml in xml_list:
file=xml[:-4]
txt=file+".txt"
#xml文件解析器,将xml文件解析成元素树
tree=et.parse(xml)
#拿到树的根
root=tree.getroot()
with open(txt,'w') as f:
#root.iter创建迭代器,寻找所有object的节点
for obj in root.iter('object'):
#按找标记名寻找匹配的第一个元素,text返回字符串
cls = obj.find('name').text
if cls not in classes:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (int(xmlbox.find('xmin').text), int(xmlbox.find('ymin').text), int(xmlbox.find('xmax').text),
int(xmlbox.find('ymax').text))
w=float(b[2]-b[0])
h=float(b[3]-b[1])
center_x=float(b[0]+w/2)
center_y=float(b[1]+h/2)
d=[center_x/x,center_y/y,w/x,h/y]
f.write(str(cls_id)+" "+" ".join([str(a) for a in d])+"\n")
if __name__ == '__main__':
xml2txt(r"D:\ranw\data\Annotations")
这个代码是我从网上找的,路径什么的肯定是和你不一样的,自己记得要改.
然后,将数据集分成test.txt和train.txt的,这里也用一个程序:
txt_ = r"D:/mask_txt/val.txt"#是什么txt自己定
with open(txt_,'a+') as f:
for i in range(101,201): #分多少也是自己定
item = ("D:/mask_txt/val/"+"{}.jpg").format(str(i).zfill(4))
f.write(item)
f.write("\n")
我们要记得这些东西都要放到一个文件夹里.下图是我处理好的数据集.
有图片(.jpg),标注(.txt),训练目标(test.txt),测试目标(val.txt).
现在,我们得到一个装有数据集的文件夹了,现在,我们要得到一个anchors6.txt文件,这个文件是通过我们源码中genanchors.py来的.实现过程如下:
python genanchors.py --traintxt ./train.txt #这个命令我是在命令行下操作的,
#./train.txt是数据集的路径
不出意外的话,我们会得到一个anchors6.txt文件了,留着.
然后,有这些数据集还不能直接训练,我们打开源码中的data,里面有coco.data,coco.names两个文件,我们将他复制,改名,然后修改.
怎么改?
首先是.data的,这个大体不用动,将name和data-configure改成自己的就好,其中name,本人觉得可以随便来,(不改也行),data-configure就改成自己对应数据集的路径.
两个对比,发现还有一个地方变了,就是[model-configure]中的anchors,这个值要改成我们从anchors6.txt得到的第一行.(别忘了,我就是这样单独拿出来讲的.)
还有一个.names文件,里面的数据改成自己的要分辨出来的类.
对比.
到这里,我们训练的准备工作已经做好了,我们开始训练.
python3 train.py --data data/fall.data
#data/fall.data 我设置fall.data的路径.
我们训练结束后可以在weights文件夹下找的我们训练出来的模型,最大的那个就是我们最后的结果,
一般来说,是fall-290-epoch-0.399685ap-model.pth.(fall是刚刚在data里面设置的name.)
上面就是我们训练的全部流程.