系列博客:
1、项目地址:
2、虚拟环境
按照requirements.txt安装就可以,我的硬件是RTX2080(8G),i7-9700K,32GRAM,Ubuntu18.04
3、数据集准备
可以使用labelimg去标注,文件结构组织形式:
\data
|------\my_dataset
|------\Annotations
|------00001.xml
|------00002.xml
|------00003.xml
|------\ImageSet
|------\Main
|------test.txt
|------trainval.txt
|------|JPEGImages
|------00001.jpg
|------00002.jpg
xml为标注文件,txt为组织文件,里面是纯文件名字,不包含路径个后缀,如果弄个YOLO系列的算法应该很熟悉这个。
数据文件夹放在:项目根目录\data\数据集文件夹
4、修改代码为多分类训练
(1)第一件事是在项目根目录新建一个标签列表文件,每行一个,行末位添加英文逗号,最后一行除外,例如把这个文件命名为user_labels.txt
classA,
classB,
classC,
classD
(2)复制一份项目根目录的train.py,强烈建议不要在源文件上面做任何改动。
在参数配置的最后一行加入(train.py的第99行)
parser.add_argument('--label_file', default=None, type=str, help='labels path')
源文件很独特,函数里面存在这个参数,但是并未由args指定。
第221行和第222行的:
dataset = VOCDataset(dataset_path, transform=train_transform,
target_transform=target_transform)
改为:
dataset = VOCDataset(dataset_path, args.label_file, transform=train_transform,
target_transform=target_transform)
把label_file加入进去
把第223行和第224行的:
label_file = os.path.join(args.checkpoint_folder, "voc-model-labels.txt")
store_labels(label_file, dataset.class_names)
注释掉或者直接删掉。
(3)在项目根目录\vision\ssd\mb_tiny_RFB_fd.py里面
约21行:
base_net = Mb_Tiny_RFB(2)
其中的2是分类数+1,例如上文我们设置额4个类,那么这里就改成5
base_net = Mb_Tiny_RFB(5)
(4)在项目根目录\vision\nn\mb_tiny_RFB.py里面
约74行:
def __init__(self, num_classes=2):
改成和上面的分类一样,如果是4类就写5
(5)在项目根目录\vision\datasets\voc_dataset.py里面:
第12行:
def __init__(self, root, transform=None, target_transform=None, is_test=False, keep_difficult=False, label_file=None):
改为:
def __init__(self, root, label_file, transform=None, target_transform=None, is_test=False, keep_difficult=False):
第29行:
label_file_name = self.root / "labels.txt"
改为:
label_file_name = label_file
这样就可以从函数值传入参数
(6)复制一份项目根目录的train-version-RFB.sh
第9、11行:
./data/wider_face_add_lm_10_10 \
改为你自己定义的数据集名字
./data/my_dataset \
第11行后面:
--label_file \
user_labels.txt \
加入这两行,传入标签列表文件
5、开始训练
./my_zf_train-verson-RFB.sh
如果显存利用率不高,可以修改sh文件中的batch size。
英文的看着不得劲 我自己汉化了一下~
训练的很快,3万多张图片,200个Epoch,约6个小时就跑完了。