2023.5~6月,近期学习深度学习概念,和darknet+yolov3训练,过程要点大纲记录如下:
深度学习是优化了数据分析,建模过程的流程也是缩短了,由神经网络统一了原来机器学习中百花齐放的算法
一 数据集准备
1. 数据归一化
2.数据标注
标注目标坐标,目标属性标签和监督值,用于有监督学习
监督值格式 : t = [0,0,1,0,0,0,0,0,0,0] //表示此数据图片为十个类别中的第三种,第三为1,
标签格式 : image_data_label[0] = 1 //图片0,为1类型的目标物体
image_data_label[1] = 2 //图片1,为2类型的目标物体
3. 公用数据集
3.1 CIFAR_10数据集格式: 带标签
3.2 VOC数据集下载指令 :wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
解压 zzz:~/darknet/voc_data$ tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar
3.3 COCO数据集
4.训练工具: darknet_linux训练框架源码下载: git clone https://github.com/pjreddie/darknet
下载完后,用make指令编译,生成可执行程序darknet.exe
darknet权重下载: wget https://pjreddie.com/media/files/yolov3.weights
In[2]: print(data_batch)
{b'batch_label':b'training batch 2 of 5',b'labels': [1,6,6,8,8,3,4,6,0,6,0,3,6,6,5,4,8,3,2,6,0,3,1,4,0,6,6,2,7,6,9,0,4,5,7,1,...}
5.标注工具
LABELIMG
二 建立模型
定义神经网络模型结构
确认损失函数
确定优化器
三 训练
1.损失函数
用到了模型输出的预测值和标注中的监督值,计算均方差 ,有监督学习
2.评估 ,IoU交并比 阈值 、confidence 阈值 ,是用于置信度数据的阈值
评估时,算MAP,MAP是所有类别AP的均值,AP由精确率和召回率确定,而IoU 阈值、 confidence 阈值影响 precision 和 recall 的计算。
为了计算 precision、recall,我们不得不去判定 True Positives (TP)、False Positives (FP)、True Negatives (TN)、False Negatives (FN)。
为了得到 TP、FP,我们使用confidence来预测正负,使用 IoU 来判定预测结果是正确的还是错误的。最常用的 IoU 阈值是 0.5。如果 IoU 大于 0.5,
则认为该预测是 TP(通过置信度预测是正,通过iou判断预测正确),否则认为是 FP(通过置信度预测样本是正,但测试时通过iou判断预测错误)。
COCO 评估指标建议使用不同的 IoU 阈值,但是为了简单,我们假设阈值是0.5,这就是 Pascal VOC 数据集的评价指标。
总结: 所以置信度是用来预测的,大于置信度阈值的模型认为是正,iou是来判断这个bbox是否算是gt,大于阈值则认为是gt,否则认为是负样本。
对回归模型的性能进行评估,以评估拟合模型可以准确预测输入数据值的程度。评估回归模型性能的常用指标是确定系数(R2)。
此外,均方误差(MSE)以及均方根误差(RMSE)也是衡量残差或预测误差的常用指标。
3.输出,一个训练好的分类模型将一组变量作为输入,并预测输出种目标的类别标签(分类概率)。
4. 训练实例————ubuntu22.04用自有数据和Darknet训练yolov3过程
4.1 准备数据集
用labelimg标注含识别目标的*.jpg图片,生成*xml(或YOLO格式*txt标注文件),用UBUNTU cp 指 令可以选择后缀批量拷贝
4.2 拷入目录,
将图片*.jpg,标注数据*.xml放入darknet文件目录框架 VOCdevkit/VOC2007/Annotatiions(xml),JPEGImages(jpg),labels(txt),ImageSets/Layout,Main,Segmentation
4.3 文件生成
$ python test.py ($ python tr_ts_name.py) 生成训练集,测试集数据名称
$ python voc_label.py 生成训练集,测试集数据路径 和将*.xml转换成 /label/*.txt标注文件
4.4 darknet的CFG文件修改
结合数据集种类特性和文件名,路径,修改voc.data(*.txt路径) , yolov3-voc.cfg(batch,class,..),voc.names(目标名称),
detector.c(模型保存batch次数) , makefile(GUP=1 OR 0)文件相关内容 ,并重新编译 make
4.5 yolov3预训练模型的权重数据weight文件下载,
在 darknet 目录下,下载 YOLOv3 的预训练模型:
$ wget https://pjreddie.com/media/files/darknet53.conv.74
4.6 训练指令:
$ ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1
其中,-gpus 0,1 表示使用 2 块 gpu 进行训练,编号是 0 和 1。根据你可使用的 gpu 个数进行调整。(无GPU,“-gpus 0,1”不加)
训练结果存在/backup/yolov3-voc.weight
如下是由 detector.c 生成的训练过程输出信息
一次 batch输出
20001: 指示当前训练的迭代次数
0.048537: 是总体的Loss (刚开始《batch 时可能数据很大,1800多)
0.048537 avg: 是平均Loss(这个数值应该越低越好,一般来说,一旦这个数值低于0.060730 avg就可以终止训练了)
0.002000 rate: 代表当前的学习率,在.cfg文件中定义了它的初始值和调整策略。(刚开始《batch 时可能数据=0.000000)
3.904890 seconds: 表示当前批次训练花费的总时间。
2560128 images:表示到目前为止,参与训练的图片的总量,是批次*batch的大小
一张图片输出
Region Avg IOU: 0.900319: 表示在当前subdivision内的图片的平均IOU,代表预测的矩形框和真实目标的交集与并集之比,这里是90.03%,很高了吧。
Class: 0.999576: 标注物体分类的正确率,期望该值趋近于1。
Obj: 0.991654: 越接近1越好。
No Obj: 0.000033: 期望该值越来越小,但不为零。
.5R:1.000000: 以IOU=0.5为阈值时候的recall; recall = 检出的正样本/实际的正样本
.75R:1.000000:以IOU=0.75为阈值时候的recall
count: 1:count后的值表示所有的当前subdivision图片(本例中一共4张)中包含正样本的图片的数量。
在输出log中的其他行中,可以看到其他subdivision也有0、2、3、4,说明在subdivision中含有不含检测对象的图片。
4.7 训练结果测试指令:加入训练生成的权重weight文件,用没有训练过的图片测试,测试结果见/darknet/predictions.jpg文件
$./darknet detect cfg/yolov3.cfg yolov3.weights /home/zzz/darknet/data/dog.jpg
5 WINDOWS下使用GPU训练(虚拟机UBUNTU不能使用显卡设备,要直接装UBUNTU才能使用显卡)
Darknet 使用GPU NVIDIA GEOFORCE GTX1660训练 yolov3
5.1 环境配置: Windows10+anaconda4.10.1+python3.8.8+cuda11.7.1+cudnn8.6.0+opencv3.4.16+cmake3.27.0+vs2022下
CMAKE配置, OPENCV_DIR = E:/…/lib ,
CUDA_PATH = C:/…/v11.7;
注意:使用CUDA和CUDNN的INCLUDE ,LIB,BIN相加的文件,光CUDNN会少文件 ;
在darknet-master/cmakelists.txt文件加上一句 set(CMAKE_CUDA_COMPILER "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.7/bin/nvcc")#zz,2023.6.26
CMAKE勾选EN CUDA ,GPU等选项编译时 就不报 “NO GPU。。。”之类的错了 ;
如果VS2022中,使用NVCC编译CUDA生成解决方案时卡住,要在项目右键\属性\配置属性中VC++,CUDA C/C++中包含CUDA目录路径,LIB 库文件,链接器\输入\链接依赖项中各CUDAXX.LIB文件都要加全;
在NVIDIA网站下载64BIT文件zlibwapi.dll ,放入../CUDA/V11.7/BIN ,否则训练时会报找不到zlibwapi.dll文件 ;
修改与编译: 前提是先下载darknet-master源码
修改C:\darknet-master\build\darknet\darknet.vcxproj文件中CUDA版本号为已安装的CUDA版本号,
以及修改*.data,*.cfg等文件后,要再次编译
编译步骤:
windows10下,先用CMAKE3.27-GUI ,configure,generate,open project三步操作darknet-master ,
然后open project会启动VS2022,在解决方案资源管理器点击“解决方案'darknet'(6个项目)”,
然后在生成菜单,点击生成解决方案,或重新生成解决方案,则会生成*.exe,*.dll等运行文件;
5.2 Windows Anaconda prompt环境下:
测试指令
(base) C:\darknet\x64>.\darknet detect cfg/yolov3.cfg yolov3.weights /darknet/x64/data/dog.jpg ,有标注目标框
or (base) C:\darknet\x64> .\darknet detector test data/voc.data yolov3-voc.cfg yolov3.weights -i 0 -thresh 0.25 dog.jpg
or (base) C:\darknet-master\build\darknet\x64> .\darknet detector test data/voc.data yolov3-voc.cfg yolov3.weights -i 0 -thresh 0.25 dog.jpg 没有标出目标框
or视频版 (base) C:\darknet-master\build\darknet\x64> .\darknet detector demo data/voc.data yolov3-voc.cfg yolov3.weights -i 0 -thresh 0.25 xxx.jpg
GPU训练指令
(base) C:\darknet\x64>.\darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1 (一个显卡就用 -gpus 0)
or (base) C:\darknet-master\build\darknet\x64>.\darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1