❶ 怎样使用OpenCV进行人脸识别
1.1.介绍Introction
从OpenCV2.4开始,加入了新的类FaceRecognizer,我们可以使用它便捷地进行人脸识别实验。本文既介绍代码使用,又介绍算法原理。(他写的源代码,我们可以在OpenCV的opencv\moles\contrib\doc\facerec\src下找到,当然也可以在他的github中找到,如果你想研究源码,自然可以去看看,不复杂)
目前支持的算法有
Eigenfaces特征脸createEigenFaceRecognizer()
Fisherfaces createFisherFaceRecognizer()
LocalBinary Patterns Histograms局部二值直方图 createLBPHFaceRecognizer()
下面所有的例子中的代码在OpenCV安装目录下的samples/cpp下面都能找到,所有的代码商用或者学习都是免费的。
1.2.人脸识别Face Recognition
对人类来说,人脸识别很容易。文献[Tu06]告诉我们,仅仅是才三天的婴儿已经可以区分周围熟悉的人脸了。那么对于计算机来说,到底有多难?其实,迄今为止,我们对于人类自己为何可以区分不同的人所知甚少。是人脸内部特征(眼睛、鼻子、嘴巴)还是外部特征(头型、发际线)对于人类识别更有效?我们怎么分析一张图像,大脑是如何对它编码的?David Hubel和TorstenWiesel向我们展示,我们的大脑针对不同的场景,如线、边、角或者运动这些局部特征有专门的神经细胞作出反应。显然我们没有把世界看成零散的块块,我们的视觉皮层必须以某种方式把不同的信息来源转化成有用的模式。自动人脸识别就是如何从一幅图像中提取有意义的特征,把它们放入一种有用的表示方式,然后对他们进行一些分类。基于几何特征的人脸的人脸识别可能是最直观的方法来识别人脸。第一个自动人脸识别系统在[Kanade73]中又描述:标记点(眼睛、耳朵、鼻子等的位置)用来构造一个特征向量(点与点之间的距离、角度等)。通过计算测试和训练图像的特征向量的欧氏距离来进行识别。这样的方法对于光照变化很稳健,但也有巨大的缺点:标记点的确定是很复杂的,即使是使用最先进的算法。一些几何特征人脸识别近期工作在文献[Bru92]中有描述。一个22维的特征向量被用在一个大数据库上,单靠几何特征不能提供足够的信息用于人脸识别。
特征脸方法在文献[TP91]中有描述,他描述了一个全面的方法来识别人脸:面部图像是一个点,这个点是从高维图像空间找到它在低维空间的表示,这样分类变得很简单。低维子空间低维是使用主元分析(Principal Component Analysis,PCA)找到的,它可以找拥有最大方差的那个轴。虽然这样的转换是从最佳重建角度考虑的,但是他没有把标签问题考虑进去。[gm:读懂这段需要一些机器学习知识]。想象一个情况,如果变化是基于外部来源,比如光照。轴的最大方差不一定包含任何有鉴别性的信息,因此此时的分类是不可能的。因此,一个使用线性鉴别(Linear Discriminant Analysis,LDA)的特定类投影方法被提出来解决人脸识别问题[BHK97]。其中一个基本的想法就是,使类内方差最小的同时,使类外方差最大。
近年来,各种局部特征提取方法出现。为了避免输入的图像的高维数据,仅仅使用的局部特征描述图像的方法被提出,提取的特征(很有希望的)对于局部遮挡、光照变化、小样本等情况更强健。有关局部特征提取的方法有盖伯小波(Gabor Waelets)([Wiskott97]),离散傅立叶变换(DiscreteCosinus Transform,DCT)([Messer06]),局部二值模式(LocalBinary Patterns,LBP)([AHP04])。使用什么方法来提取时域空间的局部特征依旧是一个开放性的研究问题,因为空间信息是潜在有用的信息。
1.3.人脸库Face Database
我们先获取一些数据来进行实验吧。我不想在这里做一个幼稚的例子。我们在研究人脸识别,所以我们需要一个真的人脸图像!你可以自己创建自己的数据集,也可以从这里(http://face-rec.org/databases/)下载一个。
AT&TFacedatabase又称ORL人脸数据库,40个人,每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有有轻微旋转)。
YaleFacedatabase A ORL数据库对于初始化测试比较适合,但它是一个简单的数据库,特征脸已经可以达到97%的识别率,所以你使用其他方法很难得到更好的提升。Yale人脸数据库是一个对于初始实验更好的数据库,因为识别问题更复杂。这个数据库包括15个人(14个男人,1个女人),每一个都有11个灰度图像,大小是320*243像素。数据库中有光照变化(中心光照、左侧光照、右侧光照)、表情变化(开心、正常、悲伤、瞌睡、惊讶、眨眼)、眼镜(戴眼镜或者没戴)。
坏消息是它不可以公开下载,可能因为原来的服务器坏了。但我们可以找到一些镜像(比如 theMIT)但我不能保证它的完整性。如果你需要自己剪裁和校准图像,可以阅读我的笔记(bytefish.de/blog/fisherfaces)。
ExtendedYale Facedatabase B 此数据库包含38个人的2414张图片,并且是剪裁好的。这个数据库重点是测试特征提取是否对光照变化强健,因为图像的表情、遮挡等都没变化。我认为这个数据库太大,不适合这篇文章的实验,我建议使用ORL数据库。
1.3.1. 准备数据
我们从网上下了数据,下了我们需要在程序中读取它,我决定使用CSV文件读取它。一个CSV文件包含文件名,紧跟一个标签。
/path/to/image.ext;0
假设/path/to/image.ext是图像,就像你在windows下的c:/faces/person0/image0.jpg。最后我们给它一个标签0。这个标签类似代表这个人的名字,所以同一个人的照片的标签都一样。我们对下载的ORL数据库进行标识,可以获取到如下结果:
./at/s1/1.pgm;0
./at/s1/2.pgm;0
...
./at/s2/1.pgm;1
./at/s2/2.pgm;1
...
./at/s40/1.pgm;39
./at/s40/2.pgm;39
想象我已经把图像解压缩在D:/data/at下面,而CSV文件在D:/data/at.txt。下面你根据自己的情况修改替换即可。一旦你成功建立CSV文件,就可以像这样运行示例程序:
facerec_demo.exe D:/data/at.txt
1.3.2 Creating the CSV File
你不需要手工来创建一个CSV文件,我已经写了一个Python程序来做这事。
[gm:说一个我实现的方法
如果你会cmd命令,或者称DOS命令,那么你打开命令控制台。假设我们的图片放在J:下的Faces文件夹下,可以输入如下语句:
J:\Faces\ORL>dir /b/s *.bmp > at.txt
然后你打开at.txt文件可能看到如下内容(后面的0,1..标签是自己加的):
。。。。
J:\Faces\ORL\s1\1.bmp;0
J:\Faces\ORL\s1\10.bmp;0
J:\Faces\ORL\s1\2.bmp;0
J:\Faces\ORL\s1\3.bmp;0
J:\Faces\ORL\s1\4.bmp;0
J:\Faces\ORL\s1\5.bmp;0
J:\Faces\ORL\s1\6.bmp;0
J:\Faces\ORL\s1\7.bmp;0
J:\Faces\ORL\s1\8.bmp;0
J:\Faces\ORL\s1\9.bmp;0
J:\Faces\ORL\s10\1.bmp;1
J:\Faces\ORL\s10\10.bmp;1
J:\Faces\ORL\s10\2.bmp;1
J:\Faces\ORL\s10\3.bmp;1
J:\Faces\ORL\s10\4.bmp;1
J:\Faces\ORL\s10\5.bmp;1
J:\Faces\ORL\s10\6.bmp;1
。。。。
自然还有c++编程等方法可以做得更好,看这篇文章反响,如果很多人需要,我就把这部分的代码写出来。(遍历多个文件夹,标上标签)
]
特征脸Eigenfaces
我们讲过,图像表示的问题是他的高维问题。二维灰度图像p*q大小,是一个m=qp维的向量空间,所以一个100*100像素大小的图像就是10,000维的图像空间。问题是,是不是所有的维数空间对我们来说都有用?我们可以做一个决定,如果数据有任何差异,我们可以通过寻找主元来知道主要信息。主成分分析(Principal Component Analysis,PCA)是KarlPearson (1901)独立发表的,而 Harold Hotelling (1933)把一些可能相关的变量转换成一个更小的不相关的子集。想法是,一个高维数据集经常被相关变量表示,因此只有一些的维上数据才是有意义的,包含最多的信息。PCA方法寻找数据中拥有最大方差的方向,被称为主成分。
算法描述Algorithmic Description
令 表示一个随机特征,其中 .
计算均值向量
计算协方差矩阵 S
计算 的特征值 和对应的特征向量
对特征值进行递减排序,特征向量和它顺序一致. K个主成分也就是k个最大的特征值对应的特征向量。
x的K个主成份:
其中 .
PCA基的重构:
其中 .
然后特征脸通过下面的方式进行人脸识别:
A. 把所有的训练数据投影到PCA子空间
B. 把待识别图像投影到PCA子空间
C. 找到训练数据投影后的向量和待识别图像投影后的向量最近的那个。
还有一个问题有待解决。比如我们有400张图片,每张100*100像素大小,那么PCA需要解决协方差矩阵 的求解,而X的大小是10000*400,那么我们会得到10000*10000大小的矩阵,这需要大概0.8GB的内存。解决这个问题不容易,所以我们需要另一个计策。就是转置一下再求,特征向量不变化。文献 [Duda01]中有描述。
[gm:这个PCA还是自己搜着看吧,这里的讲的不清楚,不适合初学者看]
OpenCV中使用特征脸Eigenfaces in OpenCV
给出示例程序源代码
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
usingnamespace cv;
usingnamespace std;
static Mat norm_0_255(InputArray _src) {
Mat src = _src.getMat();
// 创建和返回一个归一化后的图像矩阵:
Mat dst;
switch(src.channels()) {
case1:
cv::normalize(_src, dst, 0,255, NORM_MINMAX, CV_8UC1);
break;
case3:
cv::normalize(_src, dst, 0,255, NORM_MINMAX, CV_8UC3);
break;
default:
src.To(dst);
break;
}
return dst;
}
//使用CSV文件去读图像和标签,主要使用stringstream和getline方法
staticvoid read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator =';') {
std::ifstream file(filename.c_str(), ifstream::in);
if (!file) {
string error_message ="No valid input file was given, please check the given filename.";
CV_Error(CV_StsBadArg, error_message);
}
string line, path, classlabel;
while (getline(file, line)) {
stringstream liness(line);
getline(liness, path, separator);
getline(liness, classlabel);
if(!path.empty()&&!classlabel.empty()) {
images.push_back(imread(path, 0));
labels.push_back(atoi(classlabel.c_str()));
}
}
}
int main(int argc, constchar*argv[]) {
// 检测合法的命令,显示用法
// 如果没有参数输入则退出!.
if (argc <2) {
cout <<"usage: "<< argv[0]<<" <csv.ext> <output_folder> "<< endl;
exit(1);
}
string output_folder;
if (argc ==3) {
output_folder = string(argv[2]);
}
//读取你的CSV文件路径.
string fn_csv = string(argv[1]);
// 2个容器来存放图像数据和对应的标签
vector<Mat> images;
vector<int> labels;
// 读取数据. 如果文件不合法就会出错
// 输入的文件名已经有了.
try {
read_csv(fn_csv, images, labels);
} catch (cv::Exception& e) {
cerr <<"Error opening file \""<< fn_csv <<"\". Reason: "<< e.msg << endl;
// 文件有问题,我们啥也做不了了,退出了
exit(1);
}
// 如果没有读取到足够图片,我们也得退出.
if(images.size()<=1) {
string error_message ="This demo needs at least 2 images to work. Please add more images to your data set!";
CV_Error(CV_StsError, error_message);
}
// 得到第一张照片的高度. 在下面对图像
// 变形到他们原始大小时需要
int height = images[0].rows;
// 下面的几行代码仅仅是从你的数据集中移除最后一张图片
//[gm:自然这里需要根据自己的需要修改,他这里简化了很多问题]
Mat testSample = images[images.size() -1];
int testLabel = labels[labels.size() -1];
images.pop_back();
labels.pop_back();
// 下面几行创建了一个特征脸模型用于人脸识别,
// 通过CSV文件读取的图像和标签训练它。
// T这里是一个完整的PCA变换
//如果你只想保留10个主成分,使用如下代码
// cv::createEigenFaceRecognizer(10);
//
// 如果你还希望使用置信度阈值来初始化,使用以下语句:
// cv::createEigenFaceRecognizer(10, 123.0);
//
// 如果你使用所有特征并且使用一个阈值,使用以下语句:
// cv::createEigenFaceRecognizer(0, 123.0);
//
Ptr<FaceRecognizer> model = createEigenFaceRecognizer();
model->train(images, labels);
// 下面对测试图像进行预测,predictedLabel是预测标签结果
int predictedLabel = model->predict(testSample);
//
// 还有一种调用方式,可以获取结果同时得到阈值:
// int predictedLabel = -1;
// double confidence = 0.0;
// model->predict(testSample, predictedLabel, confidence);
//
string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
cout << result_message << endl;
// 这里是如何获取特征脸模型的特征值的例子,使用了getMat方法:
Mat eigenvalues = model->getMat("eigenvalues");
// 同样可以获取特征向量:
Mat W = model->getMat("eigenvectors");
// 得到训练图像的均值向量
Mat mean = model->getMat("mean");
// 现实还是保存:
if(argc==2) {
imshow("mean", norm_0_255(mean.reshape(1, images[0].rows)));
} else {
imwrite(format("%s/mean.png", output_folder.c_str()), norm_0_255(mean.reshape(1, images[0].rows)));
}
// 现实还是保存特征脸:
for (int i =0; i < min(10, W.cols); i++) {
string msg = format("Eigenvalue #%d = %.5f", i, eigenvalues.at<double>(i));
cout << msg << endl;
// 得到第 #i个特征
Mat ev = W.col(i).clone();
//把它变成原始大小,为了把数据显示归一化到0~255.
Mat grayscale = norm_0_255(ev.reshape(1, height));
// 使用伪彩色来显示结果,为了更好的感受.
Mat cgrayscale;
applyColorMap(grayscale, cgrayscale, COLORMAP_JET);
// 显示或者保存:
if(argc==2) {
imshow(format("eigenface_%d", i), cgrayscale);
} else {
imwrite(format("%s/eigenface_%d.png", output_folder.c_str(), i), norm_0_255(cgrayscale));
}
}
// 在一些预测过程中,显示还是保存重建后的图像:
for(int num_components =10; num_components <300; num_components+=15) {
// 从模型中的特征向量截取一部分
Mat evs = Mat(W, Range::all(), Range(0, num_components));
Mat projection = subspaceProject(evs, mean, images[0].reshape(1,1));
Mat reconstruction = subspaceReconstruct(evs, mean, projection);
// 归一化结果,为了显示:
reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows));
// 显示或者保存:
if(argc==2) {
imshow(format("eigenface_reconstruction_%d", num_components), reconstruction);
} else {
imwrite(format("%s/eigenface_reconstruction_%d.png", output_folder.c_str(), num_components), reconstruction);
}
}
// 如果我们不是存放到文件中,就显示他,这里使用了暂定等待键盘输入:
if(argc==2) {
waitKey(0);
}
return0;
}
我使用了伪彩色图像,所以你可以看到在特征脸中灰度值是如何分布的。你可以看到特征脸不但对人脸特征进行编码,还对这些图像中的光照进行编码。(看第四张图像是左侧的光照,而第五张是右侧的光照)[gm:PCA对光照变化图像识别效果很差,自然有一些改进方法,有后再谈]
❷ 如何建立基于深度学习的目标检测和分类的专业数据集
但这方面的数据供给非常有限,物理世界中是不同传感器获取的实时数据流,我们对大脑的工作原理还没有弄清楚),没有人能够准确预测何时何地会发生何种事故,模拟出来的数据与真实数据差距很大,Yann LeCun 表示,这是现有的深度学习很难做到的,Yann LeCun,同时又很难通过之前那些行之有效的方式去增加数据供给,我们还会遇到数据类型不一样的问题,所以这也是将深度学习现有的成功延伸到真实物理世界应用的一个底层障碍。
Bragi 从历史的角度分析了深度学习和神经科学的关系,那就无法发挥出深度学习的优势,Demiurge 专注于开发一种系统方法从源头解决真实世界诸多领域中数据量严重不足的问题——既然很难有效增加数据供给,从深度学习和神经科学没有太大关系的这一代(深度学习1,如今的神经科学已经是一个非常巨大的宝库,为何不设法大幅降低对数据的需求,他最不喜欢的对深度学习的定义就是「它像我们的大脑」,生物神经元所擅长的是从多模的实时数据流中提取多维度的时空信息来实现 one-shot learning,一方面研究深度学习的反向传播算法在生物神经元上是如何实现的,「现在的深度学习从神经科学中获得的灵感非常有限,人工神经网络则倾向于避免出现这些。而从 80 年代至今,这从 DARPA 机器人挑战赛就能看出来、实现小样本学习甚至 one-shot learning,而非数据流。」
深度神经网络的确从神经科学领域的研究中获取了一些灵感,像 AlphaGo 那样。
在今年斯德哥尔摩的全球机器人顶级学术会议 ICRA 上,而现在深度学习在信息世界中的应用;最后,我们很深刻地体会到现在正在发生着的转型,从法律上来说我们不能靠人为制造事故来采集数据,在规则定义明确的简单环境下自行创造大量训练数据的方式。位于深度学习与神经科学交汇的最前沿。」
Bragi 表示,而且是以一种非常高效的方式,以支持成本函数(cost funcion)的蛮力最优化,效果和效率都很出色,「比起深度学习的点神经元,是目前深度学习研究中的关键问题,而采集数据又难度很大,也无法模拟数据,比如说图像识别如何让深度学习突破数据瓶颈
如果用现有的深度学习去实现这一点,过去 30 年产生的神经科学知识是 80 年代以前的 46 倍。
基于这个原因,对于深度学习来说。所以,另一方面研究生物神经元的 STDP 学习算法如何提升现有的深度神经网络的学习能力 ,因此无法系统地提前部署以采集真实事故数据.0),因为事故更多涉及实时的传感以及与物理世界的互动。而更重要的是,无法为深度学习提供更多灵感,从神经科学里寻找关键线索。然而,Bragi 在 Instry Forum 演讲中介绍了 Demiurge 的方法,但其工作原理与人脑截然不同(诚然,神经科学的发展速度远远超过了之前,越来越多的深度学习专家开始研究如何从神经科学中获取更多的线索。首先,而是往往使用简单和相对统一的初始结构,在复杂的真实环境中难以发挥作用。神经科学专注的点包括计算的细节实现,在机器学习领域;第三?
降低对数据量的需求,还有对神经编码以及神经回路的研究,使用的数据都是基于图片的数据点,为提升现有深度学习的学习能力提供重要线索,而且现在每年神经科学获得新发现的速度是 80 年代以前的 100 倍。生物神经元不仅能够做这种特征提取;其次、 Yoshua Bengio 等深度学习专家也多次在演讲中提到解决深度学习中 one-shot learning 问题的重要性。
如果遇到数据量不足的情况,那时之前的神经科学也发展比较慢,「 Yoshua Bengio 做的非常前沿,并非是模拟人类神经元如何工作,谷歌 Jeff Dean 认为深度神经网络是对大脑神经网络的简单抽象,那就需要大量的事故数据,这是因为深度学习的理论基础是上世纪 80 年代基本定型的
❸ 水色图像识别的步骤
**分析方法与过程:**
通过图像显示提取水样特征,提取反映图像本质的关键指标,以达到自动进行图像识别或分类的目的。图像特征包括颜色特征,纹理特诊,形状特征和空间关系特征等。此处采用颜色特征进行处理,基于颜色矩的特征提取。
步骤:
1.采集水样图像进行选择性抽取和实时抽取,形成建模数据和增量数据(即为训练集与测试集)
2.对上述数据集进行预处理,包括图像切割和颜色矩特征提取
3.对已完成数据进行预处理,有专家经验进行分类,构成专家样本
4.专家样本构建分类模型
5.利用模型进行水质评价
数据形式:
❹ 怎样fine-tuning
我们有自己的图像识别任务,然而我们的数据集太小,直接进行训练很容易出现过拟合现象
所以比较好的解决方案是先在一个大数据集中训练以提取比较准确的浅层特征,然后 再针对这个训练过的网络利用我们的数据集进行训练 ,那么效果就会好很多。这个过程就是fine-tuning。
大家都注意到了这个情况,所以
(1)FeifeiLi带头创建imagenet,这个图像库非常巨大,满足我们预先训练的各种要求,另外近期Google发布Open Images,包含900w labeled images,媲美Imagenet dataset。
(2)有些网络结构非常经典,比如Alexnet,Googlenet,VGGnet,ResNet等等,如果我们想利用这些网络去做自己的应用,就首先要把它们在大数据集(imagenet等等)中训练,然后再用自己的数据训练;显然前面一步是重复的步骤,并且非常耗时耗力(可能花费数台机器数周时间)。所以针对上述问题各种深度学习库(caffe、Tensorflow、torch)等等就预先用经典网络训练在imagenet上训练,把模型(各个参数)公布网上,我们直接拿来用即可,省去了大量pre-train的时间。这些模型(参数)就是model zoo
1.在imagenet训练最终输出是1000个分类,所以网络结构大概是经典网络—全连接层(前面)—最后的全连接层(1000输出)。
2.如果我们要进行fine-tuning
我们设计自己的网络
(1)经典网络—全连接层(前面)—最后的全连接层(我们的类别输出)
(2)经典网络—全连接层(all new)
(3)经典网络—卷积池化层(new)-全连接层(all new)
上述三种分别对应网络改动从小到大,对应的学习速率会有所区别。
在改动过程中, 网络名称相同的参数会直接搬过来,不同的会根据设置初始化
一定注意改动过程中size要匹配!
❺ fcn中图像语义分割voc数据集的lmdb数据怎样制作
有两种方法:
1)可制作两个lmdb文件,一个Data项是原始图像,Label可为0,另一个Data项为分割后的专标注图像,Label为0。使用中属caffe是支持多个lmdb输入的。
2)将原始图像(如3通道),标注图像(1通道),合在一起成4通道,然后写在一个lmdb中,然后导入后使用Slice层将其切开。这种方法就不能直接使用现有的convert_imageset来转换了,可参考其实现自己写一下。
❻ Python如何图像识别
1. 简介。
图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴。PIL (Python Imaging Library)是 Python 中最常用的图像处理库,目前版本为 1.1.7,我们可以在这里下载学习和查找资料。
Image 类是 PIL 库中一个非常重要的类,通过这个类来创建实例可以有直接载入图像文件,读取处理过的图像和通过抓取的方法得到的图像这三种方法。
2. 使用。
导入 Image 模块。然后通过 Image 类中的 open 方法即可载入一个图像文件。如果载入文件失败,则会引起一个 IOError ;若无返回错误,则 open 函数返回一个 Image 对象。现在,我们可以通过一些对象属性来检查文件内容,即:
1 >>> import Image
2 >>> im = Image.open("j.jpg")
3 >>> print im.format, im.size, im.mode
4 JPEG (440, 330) RGB
这里有三个属性,我们逐一了解。
format : 识别图像的源格式,如果该文件不是从文件中读取的,则被置为 None 值。
size : 返回的一个元组,有两个元素,其值为象素意义上的宽和高。
mode : RGB(true color image),此外还有,L(luminance),CMTK(pre-press image)。
现在,我们可以使用一些在 Image 类中定义的方法来操作已读取的图像实例。比如,显示最新载入的图像:
1 >>>im.show()
2 >>>
输出原图:
3. 函数概貌。
3.1 Reading and Writing Images : open( infilename ) , save( outfilename )
3.2 Cutting and Pasting and Merging Images :
crop() : 从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。
paste() :
merge() :
3.5 更多关于图像文件的读取。
最基本的方式:im = Image.open("filename")
类文件读取:fp = open("filename", "rb"); im = Image.open(fp)
字符串数据读取:import StringIO; im = Image.open(StringIO.StringIO(buffer))
从归档文件读取:import TarIO; fp = TarIo.TarIO("Image.tar", "Image/test/lena.ppm"); im = Image.open(fp)
基本的 PIL 目前就练习到这里。其他函数的功能可点击这里进一步阅读。
❼ 图像数据集构建的意义
数据采集和数据处理。
数据是视觉识别研究中最重要的因素之一,通常我们更多关注于模型,算法本身,事实上,数据在视觉任务中的作用越来越明显,图像数据集是实践图像识别,目标检测等人工智能任务的基础,构建特定任务的训练数据集是AI项目的第一步,本文围绕数据集构建的一般过程和方法做了介绍,并详细地阐述了自动化构建工具和技术在数据集构建过程中的应用。
❽ 如何建立同源序列的数据集
要建立同源序列的数据集,需要以下几个步骤:
1、选择相关物种或实体。
2、确定特定基因序列或领域。
3、收集基因序列。可以从公共数据库中获取基因序列数据,也可以自己获取基因序列数据(如手动收集、实验等)。
4、比较多个物种基因序列,确定同源序列。
5、完成数据编辑,统一命名等。
6、验证所有基因序列的准确性。
7、建立同源序列数据库,并建立用于检索的软件或算法。