Ultra-Light-Fast-Generic-Face-Detector-1MB的自定义数据集训练 | 多分类修改指南_Andrwin的博客-CSDN博客1、项目地址:https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB/blob/master/README_CN.md2、虚拟环境按照requirements.txt安装就可以,我的硬件是RTX2080(8G),i7-9700K,32GRAM,Ubuntu18.043、数据集准备可以使用labelimg去标注,文件结构组织形式:\data|------\my_dataset ...https://blog.csdn.net/Andrwin/article/details/120408801
Ultra-Light-Fast-Generic-Face-Detector-1MB的自定义数据集训练 | 多分类推理修改 (2)_Andrwin的博客-CSDN博客上一篇帖子我们介绍了如何修改源代码适应我们自己定义的数据集做一个多分类的目标检测任务。Ultra-Light-Fast-Generic-Face-Detector-1MB的自定义数据集训练 | 多分类修改指南_Andrwin的博客-CSDN博客训练好的权重会被保存在 项目根目录/models/train-version-RFB 这个文件夹里面,你可以根据训练日志选择损失最小的一个权重。第一件事是新建一个分类标签列表,看过上一篇博客的朋友可能不理解为什么又要新建一个列表,因为原始代码对于列表读取的https://blog.csdn.net/Andrwin/article/details/120413366
Ultra-Light-Fast-Generic-Face-Detector-1MB的自定义数据集训练 | PTH权重转为ONNX格式 (3)_Andrwin的博客-CSDN博客在PTH格式不方便端侧部署,考虑转为ONNX或者MNN格式。1、修改源代码首先需要修改一下源代码:(1)vision/ssd/ssd.py这个文件里面if self.is_test: confidences = F.softmax(confidences, dim=2) boxes = locations # this line should be added. #boxes = box_utils.convert_locations_to_boxes( #https://blog.csdn.net/Andrwin/article/details/120415012
https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB/blob/master/README_CN.mdhttps://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB/blob/master/README_CN.md
按照requirements.txt安装就可以,我的硬件是RTX2080(8G),i7-9700K,32GRAM,Ubuntu18.04
可以使用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\数据集文件夹
(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 \
加入这两行,传入标签列表文件
./my_zf_train-verson-RFB.sh
如果显存利用率不高,可以修改sh文件中的batch size。
英文的看着不得劲 我自己汉化了一下~
训练的很快,3万多张图片,200个Epoch,约6个小时就跑完了。