实践版本的 YOLOv3 采用 Keras 版本 。
1. 数据准备
图片标注采用的是 LabelImg,Macbook 版本安装时出现如下问题:
ModuleNotFoundError: No module named 'libs.resources'
# 运行如下命令即可
pyrcc5 -o libs/resources.py resources.qrc
数据标好后,按照 VOC 的数据格式安排,例如 VOCdevkit/VOC2007/
文件夹结构如下:
- Annotations/ (放标注的 xml 文件)
- ImageSets/(放划分后的文件索引,txt 文件)
- Main/
- train.txt …
- Main/
- JPEGImages/(放 jpg 图片文件)
- SegmentationClass/
- SegmentationObject/
编写脚本按照上面格式调整好各个部分。
2. 项目内容修改
2.1 修改要检测的类别
有两处要改
- 修改 voc_annotation.py 里面的 classes,改成自己需要的类。
- 修改 model_data/voc_classes.txt 为需要的类
然后运行 python voc_annotation.py,在根目录生成 txt 文件。
2.3 修改 yolo.cfg
以 yolo 为关键词搜索,找到 [yolo]
上下有如下三个部分需要修改:
- filter:3 *(5+len(classes)
- classes:你要训练的类别数(要加上背景的 1)
- random:原来是 1,显存小改为 0
2.4 修改 train.py
修改 trian 的路径,看要不要加上 2007 等前缀。
问题解决
出现 val_loss 计算为 nan
- 降低学习率(无效)
- 降低 batch size(无效)
- 尝试可能小物体导致分母为 0
def yolo_loss(args, anchors, num_classes, ignore_thresh=.2, print_loss=False):
...
raw_true_wh = K.log(y_true[l][..., 2:4] / anchors[anchor_mask[l]] * input_shape[::-1] + 1e-10)
raw_true_wh = K.switch(object_mask, raw_true_wh, K.zeros_like(raw_true_wh)) # avoid log(0)=-inf
- 不要预训练,把 create_model 的参数 load_pretrained 改成False。(可行)
如果识别的内容与之前预训练模型有较大出入,还是不要用预训练模型。