本文依然是深度学习中,训练数据制作中所要用到的工具类方法。
即:将labelme转换得到多个json命名的文件夹中的散落的图片,批量转移到同一个文件,此处针对png格式图片文件。
代码使用采用C++和QT写的,因为时间比较紧迫,就用的以前写的代码改的,现在想想如果用python来写,应该非常简单,以后有时间再写吧,先用着。
void Copyfile()
{
QString path = "D:/DataTrans/TrainData";
//判断路径是否存在
QDir dir(path);
if (!dir.exists())
{
//ui.label->setText(QString::number(1.23));
return;
}
//获取所选文件类型过滤器
QStringList filters;
filters << QString("*.png");
//定义迭代器并设置过滤器
QDirIterator dir_iterator(path,
filters,
QDir::Files | QDir::NoSymLinks,
QDirIterator::Subdirectories);
QStringList string_list;
while (dir_iterator.hasNext())
{
dir_iterator.next();
QFileInfo file_info = dir_iterator.fileInfo();
QString absolute_file_path = file_info.absoluteFilePath();
string_list.append(absolute_file_path);
}
//ui.label->setText(string_list.at(0));
int num_Img = 0;
int num_Label = 0;
for (int i = 0; i < string_list.count(); i++)
{
std::string Path = string_list.at(i).toStdString();
std::string m_flieName;
size_t start = Path.find_last_of("/");
if (start != std::string::npos)
{
size_t end = Path.find_last_of(".");
if (end != std::string::npos)
{
m_flieName = Path.substr(start + 1, end - start - 1);
}
}
if (m_flieName == "img")
{
USImage1.load(string_list.at(i));
QString name = QString::number(num_Img);
name = "D:/DataTrans/TrainData/image/" + name + ".png";
USImage1.save(name, "PNG", 1);
num_Img = num_Img + 1;
}
if (m_flieName == "label")
{
USImage1.load(string_list.at(i));
QString name = QString::number(num_Label);
name = "D:/DataTrans/TrainData/label/" + name + ".png";
USImage1.save(name, "PNG", 1);
num_Label = num_Label + 1;
}
}
}
使用深度学习进行训练时,训练数据图片的位深度和通道等参数必须要设置正确,否者得不到想要的模型和预测功能。
python代码如下:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img=np.array(Image.open('D:/IMG/test8/13.png')) #打开图像并转化为数字矩阵
plt.imshow(img)
plt.axis('off')
plt.show()
print (img.shape)
print (img.dtype )
print (img.size)
print (type(img))
print (img.shape[0])
print (img.shape[1])
print (img.shape[2])
其中,shape是显示矩阵的维度,即图片的维度,可以看出图片的通道数;dtype可以看出图片的数据格式,大概就这些。
采用python实现:
import os
import glob
import cv2
import numpy as np
def togrey(img,outdir):
src = cv2.imread(img)
try:
gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)#彩色图像转灰度,即24位深度转8位深度
cropped = gray[69:581, 26:538] # 裁剪坐标为[y0:y1, x0:x1]
#保存
cv2.imwrite(os.path.join(outdir,os.path.basename(img)), cropped)
#设置阈值,标签数据转灰度图像
img255 = np.zeros_like(cropped, dtype='uint8')
for i in range(cropped.shape[0]):
for j in range(cropped.shape[1]):
if cropped[i, j] > 0: #自己定
img255[i, j] = 255
#保存
cv2.imwrite(os.path.join(outdir,os.path.basename(img)), img255)
except Exception as e:
print(e)
for file in glob.glob('D:/IMG/*.png'):
togrey(file,'D:/IMG/New/')
使用python实现了遍历文件夹、彩色图像转灰度图像、裁剪图像或resize图像尺寸、设置阈值将label图片转换为二值化图片,确实非常简单。
到此训练数据的制作就完成了,可以拿去训练自己的神经网络了。