基于Faster-rcnn的安全帽检测(使用Colab进行训练)

  • 前言
  • 源码与数据集下载
  • 数据预处理
    • 数据集目录结构
    • 划分训练、验证、测试集
      • 运行步骤
      • 补充说明
      • 项目根目录
    • 数据可视化
    • 训练
      • 模型
      • 参数设置
      • 开始训练
    • 获得结果
      • 保存网络参数
      • 获得map

前言

寒假学习了Faster-rcnn算法流程并且阅读了别人复现的代码,感觉收获颇多,但总感觉缺乏实践,因此找了一份开源的数据集,希望能够通过这个项目入门目标检测以及加深对Faster-rcnn的理解。

源码与数据集下载

别人复现的Faster-RCNN源码
源码对应的博客
数据集地址
可以在Colab上进行训练的源码 说明: 我是在这份源码的基础上进行修改的

数据预处理

数据集目录结构

源码是按照VOC格式的数据进行处理,因此下载安全帽数据集,并把其整理为VOC格式。

划分训练、验证、测试集

运行步骤

  1. 首先在VOC2028文件夹下新建voc_classes.txt文件,包含数据集包含的类别的名字。顺序没有关系,但是名字一定要和xml文件里object里的name匹配,person不能在这里写成people

  2. 运行voc_annotation.py文件划分训练、验证、测试集。

补充说明

voc_annotation.py文件中,有多种模式:
0: 干了两件事。

    1. ImageSets目录产生四个txt文件,包括训练集、验证集、测试集的图像id,但是不包括后缀。在跑安全帽数据的时候,我记得有些图片后缀是JPG(大写),导致后面读取数据出错,记得把后缀名都统一为小写的jpg
    1. 根据上一步产生的txt文件生成对应的包含标注信息的txt文件。
      格式是:img_path box1 box2...boxn其中boxi的格式是x1, y1, x2, y2 类别的id

第一次运行的mode设为0即可

项目根目录

关于为什么要在前面写这几行代码的:

# 建议在本机上op = 1先生成txt文件再上传到云盘,会快很多
op = 0 # 0 for 本机 1 for colab
data_year = '2028'
if op == 0:project_root = pathlib.Path(__file__).parent
else:project_root = pathlib.Path('/content/drive/MyDrive/faster-rcnn-pytorch-master')

在Colab中,但凡涉及到路径的,一定要使用绝对路径,不能用相对路径,不然会出现no file or directory等错误,所以需要获得项目的根路径,然后后面凡是涉及到xxx_path的都要和根目录进行拼接。
我发现在Colab上运行这份代码,产生txt文件的过程特别慢,我想大概是程序需要从云盘里一个个文件的去读取所以很慢,所以建议在本机上op = 1先生成txt文件再上传到云盘,会快很多。

数据可视化

我认为碰到任何一个数据集,首先得把标注box标在原图上,观察目标的大小、数目等特点,才方便去调参。

utils/utils.py文件,draw_annotation能够实现把标注信息标在原图上。有两种模式:

  • batch = True:批量标注
  • batch = False:单张标注
def draw_annotation(img_path, annot_path, save_path, classes_path, batch=False):"""img_path:原图的目录路径annot_path:标注文件的路径save_path:把框画在原图上之后保存的目录路径"""font = cv2.FONT_HERSHEY_SIMPLEXclass_names, num_classes = get_classes(classes_path)if batch:print('start draw ground truth in batch way')f = open(annot_path, 'r', encoding='UTF-8')annot = f.readlines()num = 0for line in tqdm(annot):line = line.split()img = cv2.imread(line[0])img_name = os.path.basename(line[0])img_copy = img.copy()for box in line[1:]:box = box.split(',')cv2.rectangle(img_copy, (int(box[0]), int(box[1])), (int(box[2]), int(box[3])), color=(0, 255, 0), thickness=3)label = class_names[int(box[-1])]cv2.putText(img_copy, label, (int(box[0]), int(box[1])), font,1.2, (0, 0, 255), 2)if not os.path.exists(save_path):os.mkdir(os.path.join(save_path))cv2.imwrite(os.path.join(save_path, img_name), img_copy)num += 1print('draw {} ground truth in batch way done!'.format(num))else:img_name = os.path.basename(img_path)img = cv2.imread(img_path)# img = img[:,:,::-1]f = open(annot_path, 'r')annot = f.readlines()a = img.copy()for line in annot:line = line.split()annot_name = os.path.basename(line[0])if annot_name[:-4] == img_name[:-4]:for box in line[1:]:box = box.split(',')cv2.rectangle(a, (int(box[0]), int(box[1])), (int(box[2]), int(box[3])), color=(0, 0, 255))cv2.imshow('1', a)cv2.waitKey(0)

我是放在了和原数据同级目录下,在之后训好模型之后再测试集上把预测的框画在原图上也保存起来,这样真值和预测值都可视化了,就方便观察了。

# 把这个函数跑三次,路径也要相应的改
# 第一次
draw_annotation(img_path=r'D:\faster-rcnn-pytorch-master\VOCdevkit\VOC2028\JPEGImages', annot_path=r'D:\faster-rcnn-pytorch-master\VOCdevkit\VOC2028\train.txt', save_path=r'D:\faster-rcnn-pytorch-master\VOCdevkit\VOC2028\Trainval-Ground-truth', classes_path=r'D:\faster-rcnn-pytorch-master\VOCdevkit\VOC2028\voc_classes.txt', batch=True)
# 第二次
draw_annotation(img_path=r'D:\faster-rcnn-pytorch-master\VOCdevkit\VOC2028\JPEGImages', annot_path=r'D:\faster-rcnn-pytorch-master\VOCdevkit\VOC2028\val.txt', save_path=r'D:\faster-rcnn-pytorch-master\VOCdevkit\VOC2028\Trainval-Ground-truth', classes_path=r'D:\faster-rcnn-pytorch-master\VOCdevkit\VOC2028\voc_classes.txt', batch=True)
# 第三次
draw_annotation(img_path=r'D:\faster-rcnn-pytorch-master\VOCdevkit\VOC2028\JPEGImages', annot_path=r'D:\faster-rcnn-pytorch-master\VOCdevkit\VOC2028\test.txt', save_path=r'D:\faster-rcnn-pytorch-master\VOCdevkit\VOC2028\Test-Ground-truth', classes_path=r'D:\faster-rcnn-pytorch-master\VOCdevkit\VOC2028\voc_classes.txt', batch=True)

训练

模型

源码实现了vgg16resnet50作为backbone,考虑到resnet50可能会比较大,因此我只用了vgg16训练。
首先在nets/vgg16.py文件里第三行的load_state_dict_from_url函数修改一下包来源:from torch.hub import load_state_dict_from_url

参数设置

utils\config.py文件里进行超参数的设置。
根据第二步数据可视化的结果来看,这个数据集的目标既有大而稀,也有小而密的,因此我在anchor_size的设置上,相比原论文就会多一些,并且base_size也要调小一点。


开始训练

建议下载原博主用vgg16为backbone在VOC训练好的模型,放到model_data,加载这个模型后再训练安全帽数据集,效果会好很多。

新建一个Colaboratory,输入以下命令行即可。

from google.colab import drive
drive.mount('/content/drive')
!pip install yacs
!python drive/MyDrive/faster-rcnn-pytorch-master/train.py

Colab每运行12h就会中断,下次再进行训练时可以使用以下命令:

from google.colab import drive
drive.mount('/content/drive')
!pip install yacs
!python drive/MyDrive/faster-rcnn-pytorch-master/train.py --checkpoint exp/VOC2028/vgg16/checkpoint.pth

获得结果

保存网络参数

在Colab训练到17个Epoch之后就迫不及待的想要测一下结果,测试的话我认为还是在本地会更方便。
可以看到参数文件有1.5G左右大小(原因是不仅保存了网络参数,还保存了优化器、lr_schedule等的参数,目的是中断后重新训练更方便),相信使用Colab的同学都是缺卡的(哭唧唧),这么大的参数我在本地笔记本上用torch.load显存会爆,所以只能在Colab上读取现有的model_best.pth文件,然后把网络的参数单独保存为一个pth文件,这样文件就只有500+M大小了。
在Colab上用以下命令即可保存网络的参数到项目根目录下的model_best.pth文件。

from google.colab import drive
drive.mount('/content/drive')
import os
import torch
project_root = r"/content/drive/MyDrive/faster-rcnn-pytorch-master"
model_path = r"exp/VOC2028/vgg16/model_best.pth"
pretrained_dict = torch.load(os.path.join(project_root,model_path), map_location=torch.device('cpu'))['state_dict']
torch.save(pretrained_dict, r"/content/drive/MyDrive/faster-rcnn-pytorch-master/model_best.pth", _use_new_zipfile_serialization=False)

获得map

运行get_map.py文件可以得到map结果。结果还是不是很好,还需要继续调参。

基于Faster-rcnn的安全帽检测(使用Colab进行训练)相关推荐

  1. 基于Faster RCNN的医学图像检测(肺结节检测)

    Faster-R-CNN算法由两大模块组成:1.PRN候选框提取模块 2.Fast R-CNN检测模块.其中,RPN是全卷积神经网络,用于提取候选框:Fast R-CNN基于RPN提取的proposa ...

  2. 计算机视觉与深度学习 | 基于Faster R-CNN的目标检测(深度学习Matlab代码)

    ===================================================== github:https://github.com/MichaelBeechan CSDN: ...

  3. 基于Faster R-CNN的安全帽目标检测

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 训练模型前的准备 A.数据准备 数据的标注仍然采用VOC格式的数据标注形式,如果是其他的标注形 ...

  4. 基于PaddleX实现的安全帽检测

    安全帽检测 基于PaddleX 2.0开发 1.项目说明 在该项目中,主要向大家介绍如何使用目标检测来实现对安全帽的检测,涉及代码以及优化过程亦可用于其它目标检测任务等. 在施工现场,对于来往人员,以 ...

  5. 【笔记】基于Faster R-CNN的除草机器人杂草识别算法

    <基于Faster R-CNN的除草机器人杂草识别算法> 单位:河北科技大学信息科学与工程学院 作者:李春明 数据获取 相机:Intel RealSense Depth CameraD43 ...

  6. 基于深度学习的安全帽检测系统(YOLOv5清新界面版,Python代码)

    摘要:安全帽检测系统用于自动化监测安全帽佩戴情况,在需要佩戴安全帽的场合自动安全提醒,实现图片.视频和摄像头等多种形式监测.在介绍算法原理的同时,给出Python的实现代码.训练数据集,以及PyQt的 ...

  7. PyTorch~Faster RCNNの小麦麦穗检测

    这里基于PyTorch框架,实现通过Faster RCNN算法检测图像中的小麦麦穗.当然,用YOLO算法也同样能够完成.本文最终实现的效果如下: 麦穗检测示例 一.数据下载 数据集名:Global W ...

  8. 面试真题总结:Faster Rcnn,目标检测,卷积,梯度消失,Adam算法

    目标检测可以分为两大类,分别是什么,他们的优缺点是什么呢? 答案:目标检测算法分为单阶段和双阶段两大类.单阶段目标验测算法(one-stage),代表算法有 yolo 系列,SSD 系列:直接对图像进 ...

  9. 【论文解读】Faster R-CNN 实时目标检测

    前言 Faster R-CNN 的亮点是使用RPN来提取候选框:RPN全称是Region Proposal Network,也可理解为区域生成网络,或区域候选网络:它是用来提取候选框的.RPN特点是耗 ...

  10. (保姆级教程)基于YOLOX(pytorch)的安全帽检测

    文章目录 前言 一.资料下载 1.YOLOX代码及YOLOX预训练权重文件下载 2.安全帽数据集下载 二.环境配置 1.在anconda中创建虚拟环境并激活 2.配置pytorch-gpu 3.检查p ...

最新文章

  1. 低水平博士是提升科研生涯的毒药
  2. 搭建服务器Apache+PHP+MySql需要注意的问题
  3. To disable deprecation,,use _CRT_SECURE_NO_WARNINGS
  4. 如何修改帝国cms文章点击量默认值和成倍增加
  5. 每次打印只能打打印一页
  6. RGB绘制图片Python
  7. 我为什么要使用Webpack?
  8. C语言 冒泡排序 程序流程图,C语言冒泡排序及流程图(思路解析)
  9. ElasticSearch文档检索,分词、精确匹配、多条件
  10. 制作简易的幸运转盘抽奖
  11. 总结-模型评价指标的定义(基于CatBoost文档)
  12. 爬取武汉大学教务系统数据
  13. openid php steam,在Android中使用openID进行Steam登录
  14. 必备技能:图解用电烙铁焊接电路
  15. CAN总线通信原理分析
  16. 【校招VIP】产品思维考察之如何做市场分析
  17. 巴特沃斯滤波器、切比雪夫、椭圆滤波
  18. SQL Server的数据库文件保存在哪儿?
  19. 为什么说vivo S7才是5G轻薄旗舰的正确打开方式
  20. 详解 502 Bad Gateway nginx/xxx

热门文章

  1. 坦克大战easyx实现
  2. C语言实现一个趣味游戏
  3. VIM插件离线安装与配置(taglist,airliner,gutentags,LeaderF,gtags,AutoComplPop,omnicppcomplete,fzf,Rg)
  4. 利用角色简化playbook
  5. android 读取通讯录卡死,华为手机获取手机通讯录要好几分钟,期间app处于卡死状态...
  6. 根据身份证号和社会保险号码查询不出您的医保信息,请核实后重新填写
  7. 编写猫咪相册应用 HTML
  8. 手机开机出现linux,linux系统开机出现rootfs是什么意思
  9. RK3399平台开发系列讲解(内核驱动外设篇)6.14、ES8323音频芯片驱动分析
  10. 碧蓝航线维护服务器时间,碧蓝航线异色格维护公告 异色格活动结束时间介绍...