没有合适的资源?快使用搜索试试~ 我知道了~
首页C++利用OpenCV实现实时YOLOv4 Mosaic数据增强
C++利用OpenCV实现实时YOLOv4 Mosaic数据增强
16 下载量 139 浏览量
更新于2023-03-03
收藏 254KB PDF 举报
在计算机视觉领域,OpenCV是一个广泛应用的库,特别是在目标检测模型如YOLOv4(You Only Look Once)中,数据增强是一种重要的技术手段,用于提升模型的泛化能力和训练效果。Mosaic数据增强是一种特殊的增强方式,它将四张图片合并成一张,同时允许图片的长宽进行随机变化。这种方法可以模拟实际场景中物体可能的位置和大小变化,帮助模型更好地适应多样化的情况。 本文档介绍了一个简单的C++程序,使用OpenCV库来实现YOLOv4中的mosaic数据增强。首先,程序从指定的图片文件夹中读取四张图片,通过`ifstream`从文本文件中获取图片名称。然后,程序创建一个`Mat`对象数组存储这些图片,并利用`imread`函数读取图片。 关键代码部分展示了如何随机选择图片的拼接方式。生成最终mosaic图像的大小`sz`保持与原始图片相同,但会根据随机生成的宽高比例`randomNumX`和`randomNumY`进行缩放。这一步确保了每个mosaic图像中的小块图片位置和尺寸的多样性。 通过这种方式,原始的单张图片标注信息可能会失去对应性,因为mosaic图片是由多个部分组成,因此在生成mosaic图片集后,通常需要重新进行标注,以反映新的图像结构和可能的物体分布。这个过程对于大规模的图片数据集来说是非常必要的,因为它可以帮助模型学习更丰富的场景和物体布局。 这篇文章介绍了如何使用OpenCV库来实现YOLOv4中的mosaic数据增强,包括图片的读取、随机拼接和尺寸调整,以及后续可能的标注工作。这种数据增强策略有助于提高模型的性能和鲁棒性,使其能够应对各种复杂的视觉环境。
资源详情
资源推荐
用用opencv实现实现yolov4中的中的mosaic数据增强数据增强
简单看了一个yolov4的介绍,mosaic数据增强简单说就是四张图片合一,长宽随机变化。理想的实现是结合图片集和标签集,对单张图片标注过之后,四张合一的图片就不用再
标注。这里只做一个简单的实现,仅仅把四张图片随机合一,生成mosaic图片集,后面需要对这个生成的图片标注。
c++程序:
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
//读入四幅图片
string imageFile = "D:/work_place/第二批图片/";//图片集文件夹
string imgName = imageFile + "imgName.txt";
ifstream fin(imgName, ios::in);
//char line[1024] = { 0 };
string line;
while (1)
{
vector inputImg;
for (int i = 0; i < 4; i++)
{
getline(fin, line);
cout << "Image Name: " << line << endl;
string imgRoad = imageFile + line;//图片的绝对路径名
inputImg.push_back(imread(imgRoad));
}
Mat image_1 = inputImg[0];
Mat image_2 = inputImg[1];
Mat image_3 = inputImg[2];
Mat image_4 = inputImg[3];
Size sz = Size(image_1.cols, image_1.rows); //最终要生成的图片大小,我设置成和原来一张图片大小相等
srand((unsigned int)time(NULL));
int randomNumX = (rand() % 3 + 4);//[4,6]中随机数
int randomNumY = (rand() % 3 + 4);
Size sz1 = Size(sz.width * randomNumX / 10, sz.height * randomNumY / 10);
resize(image_1, image_1, sz1, 0, 0);
Size sz2 = Size(sz.width - sz1.width, sz1.height);
resize(image_2, image_2, sz2, 0, 0);
Size sz3 = Size(sz1.width, sz.height - sz1.height);
resize(image_3, image_3, sz3, 0, 0);
Size sz4 = Size(sz.width - sz1.width, sz.height - sz1.height);
resize(image_4, image_4, sz4, 0, 0);
//创建连接后存入的图像
Mat result(sz.height + 1, sz.width + 1, image_1.type());
//第1幅,拷贝到左上角
Rect roi_rect = Rect(0, 0, sz1.width, sz1.height);
image_1.copyTo(result(roi_rect));
//第2幅,拷贝到右上角
roi_rect = Rect(sz1.width + 1, 0, sz2.width, sz2.height);
image_2.copyTo(result(roi_rect));
//第3幅,拷贝到左下角
roi_rect = Rect(0, sz1.height + 1, sz3.width, sz3.height);
image_3.copyTo(result(roi_rect));
//第4幅,拷贝到右下角
roi_rect = Rect(sz1.width + 1, sz1.height + 1, sz4.width, sz4.height);
image_4.copyTo(result(roi_rect));
//显示四幅图像连接后的图像
namedWindow("result", WINDOW_NORMAL);
imshow("result", result);
//保存拼接后的图片
static int imageName = 0;
string imageRoad = "result/" + to_string(imageName) + ".jpg";
imwrite(imageRoad, result);
imageName++;
waitKey(0);
}
return 0;
}
图片是从指定的文件夹中读取的,这里要先在图片集文件夹中生成一个txt文件,里面每一行是一个图片的名称。可运行下面这个python程序,自动生成:(图片集路径换成自己
的),运行完这个程序,再运行上面的c++程序
# -*- coding: cp936 -*-
import os
def ListFilesToTxt(dir, file, wildcard, recursion):
exts = wildcard.split(" ")
files = os.listdir(dir)
for name in files:
fullname = os.path.join(dir, name)
if (os.path.isdir(fullname) & recursion):
ListFilesToTxt(fullname, file, wildcard, recursion)
else:
for ext in exts:
下载后可阅读完整内容,剩余1页未读,立即下载
weixin_38557670
- 粉丝: 3
- 资源: 902
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 高效办公必备:可易文件夹批量生成器
- 吉林大学图形学与人机交互课程作业解析
- 8086与8255打造简易乒乓球游戏机教程
- Win10下C++开发工具包:Bongo Cat Mver、GLEW、GLFW
- Bootstrap前端开发:六页果蔬展示页面
- MacOS兼容版VSCode 1.85.1:最后支持10.13.x版本
- 掌握cpp2uml工具及其使用方法指南
- C51单片机星形流水灯设计与Proteus仿真教程
- 深度远程启动管理器使用教程与工具包
- SAAS云建站平台,一台服务器支持数万独立网站
- Java开发的博客API系统:完整功能与接口文档
- 掌握SecureCRT:打造高效SSH超级终端
- JAVA飞机大战游戏实现与源码分享
- SSM框架开发的在线考试系统设计与实现
- MEMS捷联惯导解算与MATLAB仿真指南
- Java实现的学生考试系统开发实战教程
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功