Pytorch实现单目标检测网络
单目标检测
单目标检测流程
单目标检测:判断一张图片上是否有对应目标
- 人脸检测
- 小黄人检测
小黄人目标检测:需要考虑的东西
- 数据:正负样本。
- 二分类:判断是否包含小黄人,输出层sigmoid(数据归一化为0-1,设置一个阈值来判断是否包含小黄人)
- 回归:画出框,输出层不需要激活(输出四个坐标值)
- 小黄人种类:多分类问题,输出层使用softmax(每类概率和为1),小黄人也是有种类的
pytorch-Single-target-detection
数据集:包含正样本和负样本。
数据集命名:1.0.0.0.0.0.0.jpg
- 第一个数字为序号
- 第二个数字代表是否有小黄人,1有,0无
- 第三到第六个数字,代表位置。
- 第七位为种类数
实现一个单目标检测模型的流程:
- 处理数据
- 构建模型
- train
- test
- 模型评估
- 部署
处理数据
init初始化过程:
- 初始化的时候,导入数据,如果是图片,一般保存图片的路径。
- 判断是train还是test,来获取具体哪个文件夹下的。
- 拼接文件名,获取文件。
__getitem__函数:获取某个index的图片
- 读取self数组中的index索引图片。
- OpenCV或者numpy读取图片,将图片进行缩放,w和h都设置为300,并对图片进行归一化。
- 对图片进行换轴,读取到图片维度顺序为HWC,卷积操作中的tensor数据的维度是NCHW,N为Batch Size。
- 根据图片名字,按照点,获取图片的二分类标签label,回归点位position,以及类别sort,负样本不进行后续反向传播训练。
1 |
|
构建网络
init 构建:
- 具体网络设计包含:卷积,LeakyReLU,池化。卷积网络最后一层输出通道为128个通道,最后输出的卷积图像宽高为19*19
- label的预测值:卷积128->1,对应是否包含目标
- position的预测值:卷积128->4,对应左上角和右下角的x,y值
- sort的预测值:卷积128->20,数据集有20类,得到最后在哪一类
forward(self,x):
- 实施构建网络
- 对label,position,sort分别输出得到,并降维。
1 |
|
训练逻辑
init:
- 初始化一个summaryWriter,可视化数据的初始化。
- loader数据集,包含train和test的,批次大小为50,打乱shuffle。
- self设计好的网络,网络放置在GPU上,后续在GPU上训练。
- 确定优化器为Adam
- 二分类用BCELOGIST,里面自带着sigmod激活,网络最后输出标签不带激活函数,这里刚好可以用上。
- 回归,MSE LOSS
- 多分类:cross LOSS,多指交叉熵,自带softmax激活,网络最后输出类别不带激活函数,这里刚好可以用上。
call函数:
- 设定训练epoch,默认是1000
- 读取数据集和标签img, label, position, sort,将读取到的数据放到GPU上,后续在GPU上训练。
- 将图片放入卷积网络中得到out_label,out_position,out_sort,预测值。
- 将三个值分别和标签进行对比,计算各个的loss,相加得到总loss,这里各个loss的权重一样,可以独立设置参数。
- 清空梯度,反向传播,更新权重
- 每隔十次打印一下训练损失。
- 每个epoch,保存一个训练权重。
- test逻辑和训练逻辑差不多,不过不需要进行梯度更新。将图片放入网络,得到结果后和标签进行损失计算,计算标签准确率和平均值。
1 |
|
利用训练好的权重进行预测
预测流程:
- 读取test文件夹,依次读取img
- 读取标签值和坐标值,输出在图片上。
- 网络预测标签和坐标值,也输出在图片上,可以直观的对比网络预测值和标签值的差异。
1 |
|
完整代码:https://github.com/cauccliu/SingleObjectDetect
参考列表:
Pytorch实现单目标检测网络
https://cauccliu.github.io/2024/04/17/YelloPersonDetect/