# PyTorch-YOLOv3-master **Repository Path**: rukit/PyTorch-YOLOv3-master ## Basic Information - **Project Name**: PyTorch-YOLOv3-master - **Description**: 目标检测 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-04-05 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 前言 本项目参考 https://github.com/eriklindernoren/PyTorch-YOLOv3 ,感谢大佬开源,在此基础上增加了数据准备的说明,项目流程说明。 [数据准备说明文档]: data/custom/readme.md "数据准备说明文档" 更多项目实战可以关注『**机器视觉CV**』公众号  `注意:因为本人的电脑没有 GPU ,故跑不了代码,本项目所有代码都是在 Linux 下运行的,如果你的电脑(Win 操作系统想要运行本代码,可以安装 Git 软件来执行 Linux 命令)` 步骤如下: ### 1. 修改配置文件和下载预训练权重 ```bash $ cd config/ # Navigate to config dir # Will create custom model 'yolov3-custom.cfg' $ bash create_custom_model.sh # 类别数目参数,根据你的需要修改 # 下载预训练权重 $ cd weights/ $ bash download_weights.sh ``` ### 2. 修改 config/custom.data 文件 ```python classes= 2 # 类别数,根据你的需要修改 train=data/custom/train.txt valid=data/custom/valid.txt names=data/custom/classes.names ``` ### 3. 修改 data/custom/classes.names 文件 这里需要分两种情况 - 有完整的数据,也就是有原始的图片和 txt 文件的,请执行下面的操作 因为你已经有了 txt 格式的标注数据了,大致的内容如下,第一个数字就是类别对应的代码了,比如 cat 对应 0,dog 对应 1,pig 对应 2 ```bash 0 0.014656616415410386 0.41642011834319526 0.024288107202680067 0.051775147928994084 1 0.22989949748743718 0.33357988165680474 0.01423785594639866 0.034023668639053255 2 0.28936348408710216 0.30029585798816566 0.01256281407035176 0.03254437869822485 ``` 那么 data/custom/classes.names 文件必须写成以下形式,必须要对应,否则会出错的 ```bash cat dog pig ``` - 没有完整的数据的,即,只有原始图片和 xml 文件的,请执行下面的操作 每个类别一行,顺序要和 data/custom/3_trans.py 中的 classes 变量的顺序一样 不管你有么有完整的数据,也请看看第 4 步,没有完整数据的,根据第 4 步进行数据格式转换,有完整数据的,请看看数据的存放格式是怎么样的 ### 4. 数据集处理流程请见 data/custom/readme.md ### 5. 上述准备准备完毕后开始训练 ```bash pip3 install -r requirements.txt pip install terminaltables ``` ```python # 训练命令 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 # 测试: 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')) ``` ​ - 本项目参考:https://github.com/eriklindernoren/PyTorch-YOLOv3 - yolo 博客地址:https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/ - 机器之心翻译:https://www.jiqizhixin.com/articles/2018-04-23-3 - yolo源码解析:https://zhuanlan.zhihu.com/p/49981816 - yolo 解读:https://zhuanlan.zhihu.com/p/76802514 ### 6. 其他 出现警告解决方案 `UserWarning: indexing with dtype torch.uint8 is now deprecated, please use a dtype torch.bool instead`. 在 model.py **计算损失的位置 大概在 196 行左右**添加以下两句(我已经添加到源码中了) ```python 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 层的特征图,并将它们按深度拼接。