深度学习数据扩充

俺最近在做深度学习的数据扩充,心得愿与小伙伴们分享

注意喽:有四个程序,我都公布啦

c++源程序如下感觉代码效率不高,小伙伴们有任何意见希望不吝赐教):

 

#include <iostream>
#include <cv.h>
#include <highgui.h>
#include <fstream>
#include <string>
#include <vector>
#include <io.h>
#include "stdlib.h"
#include <cstdlib>
#include <typeinfo> 

using namespace std;
using namespace cv;

void getFiles(string path, vector<string>& files)
{
	long hFile = 0;
	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*.jpg").c_str(), &fileinfo)) != -1)
	{
		do
		{
			files.push_back(p.assign(path).append("\\").append(fileinfo.name));

		} while (_findnext(hFile, &fileinfo) == 0);
		_findclose(hFile);
	}
}

char * hand_path = "F:\\opencv_extract\\test\\original_images";
char * background_path = "F:\\opencv_extract\\test\\background";

int main()
{	
	vector<string> hand_file;
	vector<string> background_file;

	getFiles(hand_path, hand_file);
	getFiles(background_path, background_file);

	int size_hand_file = hand_file.size();
	int size_background_file = background_file.size();

	for (int i = 0; i < size_hand_file; i++)
	{
		for (int j = 0; j < size_background_file; j++)
		{
			Mat hand_img = imread(hand_file[i]);
			Mat size_hand;
			Size size;
			size.height = 200;
			size.width = hand_img.cols * 200 / hand_img.rows;
			resize(hand_img, size_hand, size);

			Mat background = imread(background_file[j]);
			Mat size_background;
			CvSize back_size;
			back_size.height = 500;
			back_size.width = background.cols * 500 / background.rows;
			resize(background, size_background, back_size);

			////复制图片至另外一张图片////

			for (int row = 0; row < size_hand.rows; row++)
			{
				for (int col = 0; col < size_hand.cols; col++)
				{
					int move_row = row + 150;
					int move_col = col + 150;
					size_background.at<Vec3b>(move_row, move_col)[0] = size_hand.at<Vec3b>(row, col)[0];
					size_background.at<Vec3b>(move_row, move_col)[1] = size_hand.at<Vec3b>(row, col)[1];
					size_background.at<Vec3b>(move_row, move_col)[2] = size_hand.at<Vec3b>(row, col)[2];
				}
			}

			char save_img[40];
			int handfile_size = hand_file[i].size();
			char handfile_name[10];
			for (int x = 0; x < 10; x++)
			{
				int y = x + handfile_size - 9;   //hand1.jpg的长度,根据需要进行修改
				handfile_name[x] = hand_file[i][y];
			}

			IplImage *src;
			src = &IplImage(size_background);
			sprintf(save_img, "F:\\opencv_extract\\test\\img\\%s", handfile_name);
			cvSaveImage(save_img, src);

			////存储xml////

			int min_x = 150;
			int min_y = 150;
			int max_x = 150 + size_hand.cols;
			int max_y = 150 + size_hand.rows;
			int array[] = { min_x, min_y, max_x, max_y };
			
			char save_xml[40];
			char xml_name[6];
			for (int a = 0; a < 6; a++)
			{
				int b = a + handfile_size - 9; 
				xml_name[a] = hand_file[i][b];
				if (b == handfile_size - 4)  //hand1.jpg前hand1的长度,根据需要进行修改
				{
					xml_name[a] = '\0';
					break;
				}
			}
			sprintf(save_xml, "F:\\opencv_extract\\test\\xml\\%s.txt", xml_name);

			ofstream outfile;
			outfile.open(save_xml, 'w');
			outfile << handfile_name << " " << 1 << " " << "[" << endl;
			for (int k = 0; k < 4; k++)
			{
				if (k < 3)
				{
					outfile << array[k] << "," << ' ' << endl;
				}
				else
				{
					outfile << array[k] << "]" << endl;
				}
			}
			outfile.close();
		}
	}
	return 0;
}

 

附件

1、爬数据python工具:链接:http://pan.baidu.com/s/1pLCTzwn 密码:tkpz

2、cpp工程:链接:http://pan.baidu.com/s/1hsAzN7I 密码:5gof

3、voc标签格式程序:链接:http://pan.baidu.com/s/1c19BQbI 密码:v1al

4、yolo标签格式程序:链接:http://pan.baidu.com/s/1nvnpcNn 密码:lpk5

 

效果图如下

 +    = 

 

 

任何问题请加唯一QQ2258205918(名称samylee)!

唯一VX:samylee_csdn

 

 

 

 

<think>我们有一个递增序列,例如 [1, 5, 10],我们想要进行线性扩展,比如扩展到6个点。 线性扩展的意思是在相邻的两个数之间均匀地插入若干个值,使得整个序列变成等间隔的。 例如,对于序列 [1, 5, 10],我们想要扩展成6个点,那么整个序列应该被分成5个区间(因为原始序列有3个点,所以有2个区间,但扩展后总点数为6,所以需要5个区间?这里需要澄清)。 实际上,用户可能想要的是:给定一个递增序列,这个序列有n个点,现在要扩展成m个点(m>n),并且要求扩展后的序列是等间隔的,且覆盖整个原始序列的范围。 但是,原始序列可能不是等间隔的,所以线性扩展意味着我们要在原始序列的最小值和最大值之间均匀地生成m个点。 另一种理解可能是:在相邻的两个原始点之间进行线性插值,使得每一段内都有相同的点数,从而总点数达到要求。但这样每一段内的间隔相等,但段与段之间的间隔可能不等(因为原始间隔不等),所以整个序列不是等间隔的。 然而,用户要求的是“线性扩展”,通常意味着整个序列是等间隔的。所以,我们采用第一种理解:在整个范围(min到max)内生成m个等间隔的点。 但是,如果原始序列不是等间隔的,那么扩展后的等间隔序列可能会偏离原始序列的点(除了第一个和最后一个)。所以,我们需要明确: 方法1:在整个序列的最小值和最大值之间均匀生成m个点。 方法2:按照原始序列的区间划分,在每一段内均匀插入点,使得总点数达到m(这样每一段内的间隔相等,但整个序列不等间隔)。 用户问题中说的是“线性扩展”,通常指的是方法1,即生成一个等间隔的序列,覆盖整个范围。 因此,我们假设用户想要的是:给定一个递增序列a,要扩展成m个点,这些点是从a[0]到a[-1]的等间隔序列。 例如:[1,5,10]扩展成6个点:那么步长 = (10-1)/(6-1) = 9/5=1.8,所以序列为:[1, 2.8, 4.6, 6.4, 8.2, 10] 但是,这样就没有保留原始序列中的5这个点。如果用户希望保留原始序列的所有点,那么我们需要在扩展时包含原始点。但用户没有明确说明。 考虑到问题描述是“对递增序列进行线性扩展”,我们理解为:生成一个从序列最小值到最大值之间等间隔的m个点,不要求保留原始点(除非恰好落在等分点上)。 所以,步骤: 1. 确定序列的最小值a0和最大值a_end。 2. 要生成m个点,那么有m-1个间隔,所以步长step = (a_end - a0) / (m-1) 3. 生成序列:a0, a0+step, a0+2*step, ..., a0+(m-1)*step 但是,由于浮点数精度问题,最后一点可能不会精确等于a_end,我们需要确保最后一点是a_end。 我们可以使用numpy的linspace函数,或者自己写一个循环。 使用numpy是最简单的,但如果不允许使用numpy,我们可以用列表推导式。 下面我们给出两种方法:使用numpy和不用numpy。 另外,如果用户要求保留原始点,那么问题就复杂了,需要将原始序列作为关键点,然后在每一段内插入点。但这样整个序列就不是等间隔的了。所以,我们先按照等间隔的整个范围扩展。 我们假设用户要求的是等间隔扩展。 因此,函数可以定义为: def linear_expand(sequence, m): # sequence: 递增序列,至少有两个元素 # m: 扩展后序列的长度 start = sequence[0] end = sequence[-1] return np.linspace(start, end, m) 如果不使用numpy,可以这样写: def linear_expand(sequence, m): start = sequence[0] end = sequence[-1] step = (end - start) / (m-1) return [start + i*step for i in range(m)] 但是注意:由于浮点数的精度问题,最后一点可能不是精确的end,我们可以通过将最后一个元素直接设为end来避免: result = [start + i*step for i in range(m-1)] result.append(end) return result 或者,我们可以在计算中避免累计误差,使用: result = [start + i*step for i in range(m)] result[-1] = end # 确保最后一点是end 不过,由于步长是通过(end-start)/(m-1)计算得到的,所以理论上第m-1个点就是end。但是浮点数运算可能有误差,所以直接赋值更安全。 但是,我们也可以使用另一种方法:在生成列表时,使用步长乘以整数,这样在最后一步时,由于步长乘以(m-1)等于(end-start),所以应该等于end。所以,我们可以不强制赋值,但为了保险,可以四舍五入到一定精度?或者就接受浮点误差。 考虑到用户可能要求精确,我们使用强制赋值。 然而,如果用户要求保留原始序列中的点,那么我们需要另一种方法。由于问题中没有提到,我们先不考虑。 因此,我们提供以下方案: 方案1(使用numpy): 如果用户安装了numpy,则推荐使用numpy.linspace,因为它更高效且能处理浮点数精度问题。 方案2(不使用numpy): 自己实现。 下面我们写一个函数,同时考虑两种情况(如果numpy可用则用,不可用则自己实现)。但为了简单,我们直接写两种方法,由用户选择。 但是,用户问题没有提到是否使用numpy,所以我们提供两种方法。 不过,我们也可以不依赖numpy,自己实现一个精确的版本。 考虑到问题简单,我们直接自己实现,并处理浮点数精度问题。 我们可以通过以下方式减少误差:最后一点直接设为end。 所以,函数如下: 注意:如果m=1,那么序列只有一个点,就是start(或end),但此时步长计算会除以0,所以需要特殊处理。 另外,如果m小于1,则返回空列表。 步骤: 1. 如果m==1,返回[start] 2. 否则,计算步长:step = (end - start) / (m-1) 3. 生成前m-1个数:start + i*step, i从0到m-2 4. 加上最后一个数end 例如:sequence=[1,5,10], m=6 start=1, end=10, step=(10-1)/5=1.8 前5个数:1, 1+1.8=2.8, 4.6, 6.4, 8.2 然后加上10 -> [1, 2.8, 4.6, 6.4, 8.2, 10] 代码实现如下:</think>### 线性扩展递增序列的方法 在 Python 中对递增序列进行线性扩展,意味着在保持序列线性特性的前提下增加数据点。核心方法是使用**线性插值**,即在序列的相邻点之间均匀插入新值。以下是具体实现方法: #### 方法 1:使用 NumPy 的 `linspace` 函数(推荐) ```python import numpy as np def linear_expand(seq, new_length): """ 将递增序列线性扩展到指定长度 参数: seq: 原始递增序列 (list/np.array) new_length: 扩展后的总长度 (int) 返回: np.array: 线性扩展后的序列 """ start, end = seq[0], seq[-1] return np.linspace(start, end, new_length) # 示例 original = [1, 5, 10] expanded = linear_expand(original, 6) print(expanded) # 输出: [ 1. 2.8 4.6 6.4 8.2 10. ] ``` #### 方法 2:纯 Python 实现(无依赖) ```python def linear_expand_py(seq, new_length): """ 纯 Python 实现的线性扩展 参数: seq: 原始递增序列 (list) new_length: 扩展后的总长度 (int) 返回: list: 线性扩展后的序列 """ start, end = seq[0], seq[-1] step = (end - start) / (new_length - 1) return [start + i*step for i in range(new_length)] # 示例 original = [1, 5, 10] expanded = linear_expand_py(original, 6) print(expanded) # 输出: [1.0, 2.8, 4.6, 6.4, 8.2, 10.0] ``` #### 关键说明: 1. **数学原理**: 给定序列起点 $a$ 和终点 $b$,扩展 $n$ 个点的时间间隔为: $$ \Delta t = \frac{b - a}{n-1} $$ 第 $k$ 个点的值为: $$ x_k = a + k \cdot \Delta t \quad (0 \leq k < n) $$ 2. **注意事项**: - 要求输入序列是严格递增的 - 扩展长度必须大于原始序列长度 - 浮点数精度问题可能导致微小误差 - 扩展会覆盖整个区间 $[a, b]$,原始中间点可能不会保留 3. **应用场景**: - 时间序列数据重采样 - 图像处理中的像素插值 - 信号处理中的采样率转换 - 机器学习中的特征工程 #### 示例扩展过程: 原始序列:$[1, 5, 10]$ → 扩展为 6 个点: 1. 总跨度:$10 - 1 = 9$ 2. 间隔数:$6 - 1 = 5$ 3. 步长:$9/5 = 1.8$ 4. 结果序列:$1.0,\ 2.8,\ 4.6,\ 6.4,\ 8.2,\ 10.0$
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值