基于YOLO,光流的土木工程结构位移监测项目。
为在校研究生的科研项目代码,学习过程中的笔记等。
- datasets:目标检测数据集
manual_label
:使用labelme
标注的数据集,还没有转换成yolo训练所需要的数据集格式five_floors_frameworks_calibration
:经过转换后的数据集的文件目录,只标注了标定板Calibration的数据集(重要,yolo训练的数据集就是这个)dataset
:(yolo训练的数据集文件(已完成数据标注格式转换,数据集划分),实际上训练只需要这个文件夹里的数据,其他的文件是在转换yolo训练所需要的数据集格式中产生的文件)images
:图片labels
:标注
images
:图片格式的文件json
:labelme
标注后生成的json文件,放在这里生成txt文件txt
:yolo训练需要txt的标注格式,转换来自json文件
five_floors_frameworks_calibration & floor
:做了标定板Calibration和楼板Floor标注的数据集,但是感觉暂时用不到
- ultralytics:yolo的官方项目
- 除了文件夹
mytest
,其他都来自ultralytics的项目 mytest
:程序,数据,结果都在里面,就是跑和yolo有关系的annotated_images
:存放yolo目标检测可视化结果的图片,分为不同分辨率的图片(每个文件夹再下分不同场景normal
,light
,rain
,再下分不同的yolo模型的结果,包括yolov8-v10的前三个大小的模型)- 360_640:360*640的图片,图像序列200张
- 360_640_all:360*640的图片,图像序列1000张
- 540_960:540*960的图片,图像序列200张
- 540_960_all:540*960的图片,图像序列1000张
calibration_roi
:存放检测出来的矩形框的坐标文件,格式是json
,存放方法和annotated_images
一样(这两个文件是在程序yolo_test_save_roi.py
程序运行时产生的文件)runs
:yolo模型训练时候的结果文件,用来查看训练结果,各种指标data_augmentation.py
:数据增强的代码json_image_resize.py
:用来调整不一样分辨率图片时,使用labelme
标注的标签格式的自动化代码(不一定用到)json2txt_detect.py
:将labelme
标注的格式转换成ultralytics
支持的yolo训练的格式,适用于目标检测任务json2txt_segment.py
:将labelme
标注的格式转换成ultralytics
支持的yolo训练的格式,适用于分割任务resize.py
:将原来实验室拍摄的视频截取成一帧帧图片放好用来segment-test.py
:分割任务的测试代码(不一定用到)splitDataset.py
:划分数据集的代码train.py
:训练yolo模型的代码,写成了循环测试的自动化脚本.pt
:是yolo预训练模型的格式,下载好放在这里了
- 除了文件夹
- RAFT:RAFT的官方项目
- 除了文件夹
my_test
,其他都来自RAFT的项目 my_test
:程序,数据,结果都在里面,包括光流的结果,和yolo计算的位移结果都在里面calibration_roi
:从ultralytics
文件夹里面拷贝过来的目标检测框文件,内容一样original_dataset
:用RAFT和YOLO来跑光流,目标检测测试的时候用的图片,分别有三个(每个文件夹再下分不同场景normal
,light
,rain
)- five_floors_frameworks_360_640:360*640的图片,图像序列200张
- five_floors_frameworks_360_640_all:360*640的图片,图像序列1000张
- five_floors_frameworks_540_960:540*960的图片,图像序列200张
- five_floors_frameworks_540_960_all:540*960的图片,图像序列1000张
raft-things
:跑的光流结果,数据(和之前的存放方式类似)- 不太一样的地方:多了一个
original_pretrained_test\five_floors_frameworks_540_960\normal\Updated\roi_image
,存放的是使用yolo检测框和原来
- 不太一样的地方:多了一个
yolo_displacement
:跑的yolo的位移结果,下分不用分辨率,场景,模型的结果coordinate.py
:读取图片输出点击位置的坐标点(不重要,和之前的一样)function_decorator.py
:函数装饰器(不重要,和之前的一样)my_datasets.py
:光流数据集的加载文件(和之前的一样)optical_flow_test.py
:光流跑图的程序,只跑数据,不出结果result_visualizaton_updated.py
:光流 + yolo自动选取ROI,帧更新出结果的程序yolo_displacement.py
:使用yolo直接计算位移的程序
- 除了文件夹
yolo部分:按下面顺序进行
labelme
打标签labelme
标注的数据转换成yolo训练的数据- json转换成txt:
json2txt_detect.py
- 数据集划分:
splitDataset.py
- 数据增强:
data_augmentation.py
- json转换成txt:
- yolo训练:
train.py
- yolo预测图片序列,保存
annotated_images
和calibration_roi
:yolo_test_save_roi.py
光流部分:这部分和之前基本一样,只不过为了方便写代码把跑数据和出结果费分成了两个代码文件,主要是分成跑数据和结果的文件
optical_flow_test.py
:把光流图跑出来result_visualization_updated.py
:yolo自动选取ROI + 光流yolo_displacement.py
:yolo直接计算位移,需要前面的yolo_test_save_roi.py
保存好的坐标文件
选用视频:
- normal:大概从14s左右开始振
- light:大概从9s左右开始振
- rain:大概从14s左右开始振
- fog:大概从15s左右开始振
选取的图片为:总共60张(光流直接跑出来的效果不一定很好,因为那个有光,会影响他的识别结果的,但是应该也会小比较多)
- normal:从14-20s,一共600张,每20帧取一张,一共30张
- light:从9-15s,一共600张,每20帧取一张,一共30张
- rain:从14-20s,一共600张,每20帧取一张,一共30张
- fog:从15-21s,一共600张,每20帧取一张,一共30张(光流那就15-25s,一共1000张)
分辨率:360*640
YOLOv8制作自己的实例分割数据集保姆级教程(包含json转txt),可以正常使用
参考资料:
数据增强的方式
- 在线数据增强:一般训练一般增强,好处是数据理论上无限
- 离线数据增强:先增强好,再放进去模型中,可以控制数据增强的方向
一般数据增强是只在训练集中出现
离线数据增强会影响数据的分布,在线数据增强随机性比较高。
数据增强有很多方式,比如加噪声不一定适合某些场景。
现在的想法:
- 用离线数据增强现在一定程度上扩大数据量?
- 再使用动态数据增强提升训练的效果?
尝试使用:albumentations,参考里面的installation
和objection detection
两个章节
yolov8-yolov10
参数 | 默认值 | 含义 |
---|---|---|
data | None | 数据集配置文件的路径(例如 coco8.yaml ),包含数据集的参数,包括路径、类名和类数,需要自己修改 |
model | None | 指定用于训练的模型文件。接受指向 .pt 预训练模型或 .yaml 配置文件。对于定义模型结构或初始化权重至关重要。一般都会自己加载预训练模型 |
epochs | 100 | 训练轮数 |
imgsz | 640 | 用于训练的目标图像尺寸。所有图像在输入模型前都会被调整到这一尺寸。影响模型精度和计算复杂度。上面那张图里面的图像分辨率都是640 |
device | None | 训练所用设备,选项有单个GPU (device=0 )、多个 GPU (device=0,1 )、CPU (device=cpu ) 或MPS for Apple silicon (device=mps ) |
pretrained | True | 即默认使用预训练模型 |
seed |
0 |
为训练设置随机种子,确保在相同配置下运行的结果具有可重复性。 |
workers | 8 | 数据加载时的工作线程数。在数据加载过程中,可以使用多个线程并行地加载数据,以提高数据读取速度。这个参数确定了加载数据时使用的线程数,具体的最佳值取决于硬件和数据集的大小。 |
训练代码暂时按照下面的设置
from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n-seg.yaml") # build a new model from YAML
model = YOLO("yolov8n-seg.pt") # load a pretrained model (recommended for training)
model = YOLO("yolov8n.yaml").load("yolov8n.pt") # build from YAML and transfer weights
# Train the model
results = model.train(data="five_floors_frameworks.yaml", epochs=100, imgsz=640, device=0)