基于KITTI数据集的KERAS-YOLOV3实践

2023-05-16

数据整理

KERAS-YOLOV3的GITHUB地址:https://github.com/yangchengtest/keras-yolo3
该项目支持的数据结构:

One row for one image;
Row format: image_file_path box1 box2 … boxN;
Box format: x_min,y_min,x_max,y_max,class_id (no space).
For VOC dataset, try python voc_annotation.py
Here is an example:

path/to/img1.jpg 50,100,150,200,0 30,50,200,120,3
path/to/img2.jpg 120,300,250,600,2

KITTI数据集:
http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark
这里选取第1个图片集 Download left color images of object data set (12 GB)和标注文件 Download training labels of object data set (5 MB)

LABEL格式:

Car 0.00 0 -1.67 642.24 178.50 680.14 208.68 1.38 1.49 3.32 2.41 1.66 34.98 -1.60 

关于数据定义,参考了这篇博文:
https://blog.csdn.net/jesse_mx/article/details/65634482
这里写图片描述
该数据集的标注一共分为8个类别:’Car’, ’Van’, ’Truck’, ’Pedestrian’, ’Person (sit- ting)’, ’Cyclist’, ’DontCare’ 和’Misc’
在代码中合并’Car’, ’Van’, ’Truck’为’Car’,合并 ’Pedestrian’, ’Person (sit- ting)’为’Pedestrian’。
最后实际运行还有三个分类:’Pedestrian’、 ’Person (sit- ting)’、’Pedestrian’。
这里主要使用:TYPE和BBOX两个参数
处理代码如下:

import glob
### 获取标注数据
lable_list = glob.glob('data_object_label_2/training/label_2/*')
label_result=[]
type_list=[]
for label in label_list:
    ### box合并数据
    bbox=[]
    with open(label) as r_label:
        for each_line in r_label:
            labeldata = each_line.strip().split(' ')
            if labeldata[0] in ['Truck','Van','Tram']: # 合并汽车类
                labeldata[0] = labeldata[0].replace(labeldata[0],'Car')
            if labeldata[0] == 'Person_sitting': # 合并行人类
                labeldata[0] = labeldata[0].replace(labeldata[0],'Pedestrian')
            if labeldata[0] == 'DontCare': # 忽略Dontcare类
                continue
            if labeldata[0] == 'Misc': # 忽略Misc类
                continue
            if labeldata[0] not in type_list:
                type_list.append(labeldata[0])
            ### 提取分类标签和BOX坐标,YOLOV3的坐标是整数,需要数据转型。
            bbox_item=[type_list.index(labeldata[0]),int(float(labeldata[4])),int(float(labeldata[5])),int(float(labeldata[6])),
                       int(float(labeldata[7]))]
            bbox.append(bbox_item)
    ### 目标图片路径        
    imgfilename="data_object_image_2/testing/image_2/"+label[37:44]+"png"
    strline=imgfilename
    for box in bbox:
    ### 将BOX按照约定格式记入文件中。
        strbox=" "+str(box[1])+","+str(box[2])+","+str(box[3])+","+str(box[4])+","+str(box[0])
        strline=strline+strbox
    label_result.append(strline)
try: 
    ### 项目默认数据名为train.txt
    outputfilename="train.txt"
    with open(outputfilename,'w+') as w_output: # w+是打开原文件将内容删除,另写新内容进去
        for line in label_result:
            w_output.write(line+"\n")  
except IOError as ioerr:
    print('File error:'+str(ioerr))

训练相关代码修改

annotation_path = 'train.txt'
log_dir = 'logs/000/'
classes_path = 'model_data/voc_classes.txt'
anchors_path = 'model_data/yolo_anchors.txt'

需要修改voc_classes.txt,保证分类与我们的模型一致。

按照GITHUB上的流程进行操作。

Make sure you have run python convert.py -w yolov3.cfg yolov3.weights model_data/yolo_weights.h5
The file model_data/yolo_weights.h5 is used to load pretrained weights.

Modify train.py and start training.
python train.py
Use your trained weights or checkpoint weights in yolo.py.
Remember to modify class path or anchor path.

最后得到训练后的模型。

定制修改

本来以为简单到爆表的操作,实际过程中发现有些地方需要修改。必须改的:

    # train.py
    # 训练数据标注
    annotation_path = 'train.txt'
    log_dir = 'logs/000/'
    # 训练分类
    classes_path = 'model_data/voc_classes.txt'
    anchors_path = 'model_data/yolo_anchors.txt'
    #yolo.py
    # 训练后的模型
    self.model_path = 'model_data/trained_weights_final.h5' # model path or trained weights path
    # 训练分类
    self.anchors_path = 'model_data/yolo_anchors.txt'
    self.classes_path = 'model_data/voc_classes.txt'

预训练模型修改

这里写图片描述
看一下网络框架,主要区别在于最右下角的CONVS层,YOLOV3官网提供的预训练模型是基于COCO 80分类的,而本文的框架只有3个分类,那么在预加载模型的时候就需要进行修改。
(ps:你也可以不改,这三层就直接重新训练。不过使用修改后预训练模型收敛更快)
注意:如果你修改最后三层filters,而convert.py不对应修改,整个预训练模型加载都会是错误的

本开源框架是使用了CONVERT.PY文件进行weights转化。
通过读取yolov3.cfg文件,按字节顺序读取。有需要的可以了解一下configparser,我个人只是大概看了一下。
读取预加载模型的需要按照80分类来读取预加载模型,但是写入模型的时候需要按照3分类的方式写入。
硬编码了一下,filters等于255的时候,进行强制转化。。。
有需要的可以参考我提交的GITHUB:
https://github.com/yangchengtest/keras-yolov3-kitti.git

剩下的就和原来一样了,可以直接训练了。
LR使用了
reduce_lr = ReduceLROnPlateau(monitor=’val_loss’, factor=0.1, patience=3, verbose=1)
可以关注一下。

最后修改YOLO.PY的配置文件,就可以看到结果了。

图片批量处理

原来的接口,图片一张一张看,我嫌烦。
改了一下,支持多图片批量处理。
python yolo.py -s test_images -d output_images

视频写入有问题

需要在CV读取完成后释放资源:
return_value, frame = vid.read()
if not return_value:
break

本项目的GITHUB在:
https://github.com/yangchengtest/keras-yolov3-kitti.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于KITTI数据集的KERAS-YOLOV3实践 的相关文章

随机推荐

  • 几个串口通信协议的整理

    一 UART UART是一个大家族 xff0c 其包括了RS232 RS499 RS423 RS422和RS485等接口标准规范和总线标准规范 它们的主要区别在于其各自的电平范围不相同 嵌入式设备中常常使用到的是TTL TTL转RS232的
  • 单片机中断的过程

    1 根据响应的中断源的中断优先级 使相应的优先级状态触发器置1 xff1b 2 把当前程序计数器PC的内容压入堆栈 xff0c 保护断点 xff0c 寻找中断源 xff1b 3 执行硬件中断服务子程序调用 xff1b 4 清除相应的中断请求
  • Ruby学习札记(3)- Ruby中gem的安装与卸载

    Ruby 学习札记 3 Ruby 中 gem 的安装与卸载 在 Ruby 中有 gem 包这种概念 xff0c 类似 PHP 中的 pear xff0c 相当于一种插件 具体可以 Google 一下 xff08 1 xff09 查看已经安装
  • 【linux】ubuntu20.04 运行软件 提示找不到过时的库 libQtCore.so.4、libQtGui.so.4、libpng12.so.0

    先上结果 1 nxView运行起来 环境 硬件 xff1a Jetson Xavier NX 套件 系统 xff1a Ubuntu 20 04 软件 xff1a nxView 43 libQtCore so 4 解决 0 现象 运行软件提示
  • rtt相关问题总结

    1 总结RT Thread的启动流程 xff08 启动文件部分跳过 xff09 关中断 rt hw interrupt disable 板级初始化 xff1a 需在该函数内部进行系统堆的初始化 rt hw board init 打印 RT
  • FTP 客户端C实现

    使用 Socket 通信实现 FTP 客户端程序 FTP 概述 文件传输协议 xff08 FTP xff09 作为网络共享文件的传输协议 xff0c 在网络应用软件中具有广泛的应用 FTP的目标是提高文件的共享性和可靠高效地传送数据 在传输
  • Qt编写串口通信程序全程图文讲解

    说明 我们的编程环境是windows xp下 xff0c 在Qt Creator中进行 xff0c 如果在Linux下或直接用源码编写 xff0c 程序稍有不同 xff0c 请自己改动 在Qt中并没有特定的串口控制类 xff0c 现在大部分
  • VLC播放器调试经验总结

    一 前言 在使用VS学习VLC源码时 xff0c 可以打断点分析变量数据 xff0c 跟踪代码流程 xff0c 方便我们理解源码 但是在定位音视频卡顿 延时等疑难问题时 xff0c 这一招就不管用了 xff0c 因为打上断点就会导致实时计算
  • http协议如何解决粘包问题

    在讲粘包问题之前 xff0c 首先得明白这个包是应用层的数据包 当数据在传输层时 xff0c 由于TCP是面向字节流的 xff0c 所以它看到的数据是按照顺序一个个放在缓冲区中的 xff0c 而对于应用层而言 xff0c 看到的只是一连串的
  • ROS- 解决 sudo rosdep init和update 出现的错误

    大家在使用ROS时都需要执行sudo rosdep init 方法和rosdep update方法 但是在执行rosdep init时会提示如下错误 ERROR cannot download default sources list fr
  • 如何用MQTT网关快速接入阿里云IOT

    深圳市钡铼技术有限公司推出的BL102 xff0c 是采集西门子 xff0c 欧姆龙 xff0c 三菱 xff0c 台达 xff0c AB xff0c 施耐德等主流PLC及Modbus xff0c DT L645协议设备数据 xff0c 简
  • 闫刚 qgc模块mavlinklog实现过程

    mavlink log qml部分 这样logController就和LogDownloadController进行了绑定 AnalyzeView qml Rectangle span class token punctuation spa
  • 初识TVM--TVM的编译与安装

    TVM是什么 xff1f Apache incubating TVM is an open deep learning compiler stack for CPUs GPUs and specialized accelerators It
  • iOS上简单推送通知(Push Notification)的实现

    iOS上简单推送通知 xff08 Push Notification xff09 的实现 根据这篇很好的教程 xff08 http www raywenderlich com 3443 apple push notification ser
  • Android学习记录(十三) http之digest鉴权之填坑6.0。

    背景 xff1a android 6 0 1 的手机发现使用webdav下载文件实效 xff0c httpclient execute get的时候出现 xff1a CrashHandler java lang ArrayIndexOutO
  • 开源视频播放器IjkPlayer使用记录之(三)--播放视频从上次播放的时间点播放。

    方法 xff1a 1 在关闭视频的时候 xff0c 使用getCurrentPosition 获取当前的时间点 2 使用SharedPreferences记录当前的时间点 3 重新播放时 xff0c 获取该时间点 xff0c 使用seekt
  • 开源视频播放器IjkPlayer使用记录之(四)--多音轨的探路之旅

    前言 xff1a 在视频播放中 xff0c 我们经常会遇到多音轨的资源文件 xff0c 比如某个mkv文件同时支持英语 国语 xff0c 那么最好是能够进行音轨的切换 在IjkPlayer中并没有支持多音轨的代码 xff0c 所以在移植的过
  • KERAS-YOLOV3的代码走读

    KERAS YOLOV3的代码走读 GITHUB地址 xff1a https github com qqwweee keras yolo3 YOLOV3的论文中文翻译 xff1a https zhuanlan zhihu com p 349
  • KERAS-YOLOV3的数据增强

    前言 上篇KERAS YOLOV3的代码走读 https blog csdn net yangchengtest article details 80664415 有数据增强的内容没有看明白 这篇来介绍一下 简介 数据增强的方法主要有 xf
  • 基于KITTI数据集的KERAS-YOLOV3实践

    数据整理 KERAS YOLOV3的GITHUB地址 xff1a https github com yangchengtest keras yolo3 该项目支持的数据结构 xff1a One row for one image Row f