哈喽,大家好,今天我将手把手教大家如何基于一个新的数据集BCCD(血细胞数据集),训练一个YOLO v4目标检测与识别模型。
相信每一位同学只要按照我的教程一步一步操作,一定能够把这件事情做成。
【注:如果在操作过程中,遇到任何问题,请给我留言。】
福利:我会在文末分享这个DIY项目的下载链接
闲言少叙,我们进入正题:
我们创建一个虚拟环境,名称:YOLO_v4_env
请在命令行窗口输入命令:
1. pip install virtualenv
【注:如果你已经安装软件包virtualenv,请跳过此步骤】
2. virtualenv YOLO_v4_env
【注:虚拟环境的名称:YOLO_v4_env】
3.source virtualenv/bin/activate
【注:启动虚拟环境】
图-01
4. pip install xxx
【注:安装软件包/依赖包,请参考官网环境配置指南,https://github.com/AlexeyAB/darknet#requirements】
主要是安装opencv,CUDA,cuDNN等
5. git clone https://github.com/AlexeyAB/darknet.git
【注:从github下载项目工程到本地,记住:你可以把这个项目工程放在本机上的任何位置。】
图-02 :是项目存放在本地位置
6. 下载预训练模型文件:yolov4.conv.137
https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137
【注:该文件,我已经下载好了,各位同学可以不必下载,分享的项目中已经包含。】
7. 拷贝一份在工程目录中darknet/cfg/yolov4-cutom.cfg配置文件,并修改备份的文件名yolov4-custom.cfg为新的文件名:yolo-obj.cfg,该配置文件同样在工程目录darknet/cfg/下。
【注意:我已经给各位同学拷贝了一份,并对配置文件做了修改。各位同学可以打开这两个配置文件对比看一下这些修改,一定要对比才知道哪里做了修改。下面是对几处修改做的说明。】
修改一:batch=128
修改二:subdivisions = 64
修改三:max_batches = 6000
【解释:6000怎么计算的呢?公式:max_batches = classes * 2000,由于我们这BCCD数据集中有3个类别,所以,3*2000 = 6000】
修改四:steps = 4800, 5400
【解释:4800,5400又是怎么计算的呢?这两个值分别是是max_batches的80%和90%,例如:4800 = max_batches * 80%, 5400 = max_batches * 90%】
修改五:width = 416, height = 416
【解释:这是输入image的宽和高,通常是32的倍数。】
修改六:classes = 3
【解释:YOLO基于COCO训练的,所以原始类别数量classes=80。不过,由于我们新的数据集共有3个类别,所以,这里改成了3。】
修改七:filters = 24
【解释:filters的数量可以根据公式计算出来,filters = (classes 5) x 3 ,由于我们的数据集有3个类别,所以,(3 5) x 3 = 24 个filters。】
好啦,我们一共对配置文件做了7处修改,注意其中有的地方需要重复修改有多处,一定要对比一下。建议直接打开yolov4-obj.cfg文件,通过快捷键ctrl F搜索,把上面7处的关键字输入里面搜索,看看都修改了哪些地方。
以下是图-03和图-04,对部分配置文件内容的截图:
8. 我们要创建两个新文件:BCCD.names 和 BCCD.data
要将这两个文件存放在darknet/data/下面,如图-05所示:
那么,这两个文件夹里面到底包含哪些内容呢?我们分别看一下:
① 文件:BCCD.data ,图-06
【解释:
classes = 3 # 数据集中共有3个类别;
train = data/train.txt # 该路径指向train.txt文件,里面保存着新数据集train中每张图片的路径;
valid = data/test.txt # 该路径指向test.txt文件,里面保存着新数据集test中每张图片的路径;
names = data/BCCD.names # 该路径指向BCCD.names文件,里面保存了3个类别的名称;
backup = backup/ # 存放训练过程中的模型】
② 文件:BCCD.names,图-07
9. 我们将新的数据集BCCD文件夹保存到工程目录:darknet/data/ 下面
如图-08所示:
如图-09所示,里面包含了train, valid, test共三个文件夹,分别存储了图片。
10. 创建两个文件:train.txt 和 test.txt ,这是上面步骤中,文件BCCD.data中提及的两个文件。
这两个文件保存了数据集中每张图片的路径,例如:(这是我的本机中,图片的路径)
代码语言:javascript复制/home/tommy/Desktop/1_pytorch/6_YOLO_v4/darknet/data/BCCD/train/BloodImage_00180_jpg.rf.4c83af70be7c35fe07b2079a2e7e4061.jpg
/home/tommy/Desktop/1_pytorch/6_YOLO_v4/darknet/data/BCCD/train/BloodImage_00257_jpg.rf.fb3f539507a3625ccc528b5f4c03fa2d.jpg
我已经写了一个脚本,用于生成这两个文件,代码非常简单。(注:该代码文件,项目中没有,所以,你一定要运行一下,才能生成train.txt和test.txt。当然,我都把这些工作做好啦。)
代码语言:javascript复制import os
import glob
import argparse
def generate_txt(file_name, file_path):
# file_name : 文件夹名称
# file_path : 文件夹路径
files = glob.glob(os.path.join(file_path, '*.jpg')) # 获取该文件夹下所有文件的路径
new_file = file_name '.txt' # 新的文件名称
with open(new_file, 'w') as f: # 打开文件
for file in files: # 读取每个图片路径
f.write(file 'n') # 写入txt文本中
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--file_name', type=str, default=None) # 参数1
parser.add_argument('--file_path', type=str, default=None) # 参数2
args = parser.parse_args()
# 调用
generate_txt(args.file_name, args.file_path)
'''
在命令行输入如下命令即可: 注意数据集路径更换成你自己的路径
python generate_txt.py --file_name train --file_path /home/tommy/Desktop/1_pytorch/6_YOLO_v4/darknet/data/BCCD/train
python generate_txt.py --file_name test --file_path /home/tommy/Desktop/1_pytorch/6_YOLO_v4/darknet/data/BCCD/test
'''
【注意:--file_path 后面的train数据集路径是你本机所在的路径,不是我这个,一定要在运行前修改一下。】
然后,将这两个文件train.txt 和 test.txt放到darknet/data/下面即可。如图-10所示:
11. 开始基于新的数据集BCCD,训练属于自己的模型啦。
在命令行窗口,输入如下命令:
代码语言:javascript复制./darknet detector train data/BCCD.data cfg/yolo-obj.cfg yolov4.conv.137
如图-11所示:
模型开始训练中。。。如图-12所示:
基于我的GPU (10G) 训练大概 5 -- 6小时,训练结束后,输出模型: 如图-13所示:
接下来,我们查看一下工程目录darknet/backup/,该文件夹下有了多个训练过程中输出的模型,如图-14所示:
至此,我们已经完成了所有训练阶段的工作,那么,接下来就测试一下最终的模型性能。
12. 测试模型性能
① 计算mAP@IoU=50,我们在命令行输入命令:
代码语言:javascript复制./darknet detector map data/BCCD.data cfg/yolo-obj.cfg backup/yolo-obj_final.weights
如图-15所示:
结果如图-16所示:
② 计算mAP@IoU=75,我们在命令行输入命令:
代码语言:javascript复制./darknet detector map data/BCCD.data cfg/yolo-obj.cfg backup/yolo-obj_final.weights -iou_thresh 0.75
如图-17所示:
结果如图-18所示:
③ 基于test数据集,验证模型性能,对test中的每张图片进行分类,并将分类结果保存在result.txt 文件中。
请在命令行输入命令:
代码语言:javascript复制./darknet detector test data/BCCD.data cfg/yolo-obj.cfg backup/yolo-obj_final.weights -dont_show -ext_output <data/test.txt> result.txt
如图-19所示:
输出结果全部保存在文件result.txt中,该文件在工程目录darknet/下面,如图-20所示:
我们继续查看result.txt中的内容,部分内容截图,如图-21所示:
【解释: 模型对该图片中的所有目标进行了预测/分类,这三个类别是:RBC,WBC,Platelets,每个类别都有预测概率值。】
好啦,今天,我就先分享到这里,后续将会与你 分享更多技术教程和学习笔记,我们一起学习、进步 ~
近期,将会在"网易云课堂"分享YOLO算法专题课程,倾注了大量时间和精力准备的一门精品课程。敬请期待哈 :)
如果遇到任何问题,请到B站,查看我的个人简介,添加"AI学习部落"QQ群一起讨论。目前,我们一共有11个QQ群,学员已经超过2000名。
案例下载链接:
链接:
https://pan.baidu.com/s/1ZwuTcLfx7cCyOkB2tipi2A
密码: irbm