FLyingLSJ / PyTorch-YOLOv3-master

目标检测
GNU General Public License v3.0
105 stars 36 forks source link

前言

本项目参考 https://github.com/eriklindernoren/PyTorch-YOLOv3 ,感谢大佬开源,在此基础上增加了数据准备的说明,项目流程说明。

更多项目实战可以关注『机器视觉CV』公众号

注意:因为本人的电脑没有 GPU ,故跑不了代码,本项目所有代码都是在 Linux 下运行的,如果你的电脑(Win 操作系统想要运行本代码,可以安装 Git 软件来执行 Linux 命令)

步骤如下:

1. 修改配置文件和下载预训练权重

$ cd config/   # Navigate to config dir
# Will create custom model 'yolov3-custom.cfg'
$ bash create_custom_model.sh <num-classes>   #  <num-classes> 类别数目参数,根据你的需要修改

# 下载预训练权重
$ cd weights/
$ bash download_weights.sh

2. 修改 config/custom.data 文件

classes= 2  # 类别数,根据你的需要修改
train=data/custom/train.txt
valid=data/custom/valid.txt
names=data/custom/classes.names

3. 修改 data/custom/classes.names 文件

这里需要分两种情况

不管你有么有完整的数据,也请看看第 4 步,没有完整数据的,根据第 4 步进行数据格式转换,有完整数据的,请看看数据的存放格式是怎么样的

4. 数据集处理流程请见 data/custom/readme.md

5. 上述准备准备完毕后开始训练

pip3 install -r requirements.txt
pip install terminaltables
# 训练命令
python train.py --model_def config/yolov3-custom.cfg --data_config config/custom.data --pretrained_weights weights/darknet53.conv.74
# 添加其他参数请见 train.py 文件

# 从中断的地方开始训练
python train.py --model_def config/yolov3-custom.cfg --data_config config/custom.data --pretrained_weights checkpoints/yolov3_ckpt_299.pth --epoch 
# 测试:
python detect.py --image_folder data/samples/ --weights_path checkpoints/yolov3_ckpt_25.pth --model_def config/yolov3-custom.cfg --class_path data/custom/classes.names
# 若是在 GPU 的电脑上训练,在 CPU 的电脑上预测,则需要修改 model.load_state_dict(torch.load(opt.weights_path, map_location='cpu'))

6. 其他

出现警告解决方案 UserWarning: indexing with dtype torch.uint8 is now deprecated, please use a dtype torch.bool instead. 在 model.py 计算损失的位置 大概在 196 行左右添加以下两句(我已经添加到源码中了)

obj_mask=obj_mask.bool() # convert int8 to bool
noobj_mask=noobj_mask.bool() #convert int8 to bool

注意预测的时候需要检查数据的格式问题(单通道?三通道?)

预测的值分别是 x1, y1, x2, y2, conf, cls_conf, cls_pred

cfg 中的 路由层(Route) 它的参数 layers 有一个或两个值。当只有一个值时,它输出这一层通过该值索引的特征图。 在我们的实验中设置为了 - 4,所以层级将输出路由层之前第四个层的特征图。 当层级有两个值时,它将返回由这两个值索引的拼接特征图。在我们的实验中为 - 1 和 61, 因此该层级将输出从前一层级(-1)到第 61 层的特征图,并将它们按深度拼接。