python匹配算法
‘壹’ python 子集的算法优化; 找寻一个list的所有满足特定条件的子集
使用 itertools呀
importitertools
#有序
printlist(itertools.permutations([1,2,3,4],2))
[(1,2),(1,3),(1,4),(2,1),(2,3),(2,4),(3,1),(3,2),(3,4),(4,1),(4,2),(4,3)]
#无序
printlist(itertools.combinations([1,2,3,4],2))
[(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]
‘贰’ python 矩阵 匹配 求助
在 Python 中,可以使用 NumPy 库来解决这个问题。
首先,需要将矩阵 A、n1、n2 作为 NumPy 数组读入内存。例如:
import numpy as np
A = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
])
n1 = np.array([
[1, 2],
[5, 6]
])
n2 = np.array([
[3, 4],
[7, 8]
])
接下来,可以使用 NumPy 的 correlate2d() 函数,将矩阵 A 与 n1 或 n2 进行二维卷积,并查看结果是否为非零值。例如:链腊春
result1 = np.correlate2d(A, n1)
result2 = np.correlate2d(A, n2)if np.any(result1): print('n1 在 A 中有对应的位置')else: print('n1 在 A 中没有对应的位置')if np.any(result2): print('n2 在 A 中有对应的位置')else: print('n2 在 A 中没有对应的位置')
如果矩阵 A 中包含 n1 或 n2,棚耐则上面的程序会输出 "n1 在 A 中有对应的位置" 或 "n2 在 A 中有对应的位置"。
下面的程序中,我们使用了 NumPy 的 nonzero() 函数来找到结果矩阵中的非零值的位置,并将这些位置打印出来。
result1 = np.correlate2d(A, n1)
result2 = np.correlate2d(A, n2)
if np.any(result1): print('n1 在 A 中有对应的位置:') print(np.nonzero(result1))
else: print('n1 在 A 中没有对应的位置')
if np.any(result2): print('n2 在 A 中有对应的位局凳置:') print(np.nonzero(result2))
else: print('n2 在 A 中没有对应的位置')
运行上面的程序,如果 A、n1、n2 的值为上面的值,则会输出如下内容:
n1 在 A 中有对应的位置:
(array([0]), array([0]))
n2 在 A 中没有对应的位置
这表示,n1 在矩阵 A 的第 (0, 0) 位置有对应的位置,而 n2 在矩阵 A 中没有对应的位置。
希望这些信息能帮助你理解并实现算法。
‘叁’ python如何实现动态规划算法寻找最优匹配子串
把较低的mismatch用字典保存一下,就好了。如:
def match(s1,s2):
length = len(s2)result = ""resultMissmatchCount=lengthseqdict={}for index,s in enumerate(s1[:-length]):
missmatch = 0
for j,k in zip(s1[index:index+length],s2): #[(s1[0],s2[0]),(s1[1],s2[1]),...]
if j!=k:
missmatch += 1
if missmatch <= resultMissmatchCount:
seqdict[missmatch]=s1[index:index+length]
resultMissmatchCount = missmatch
minkey=min(seqdict.keys())result = seqdict[minkey]return result
‘肆’ 如何线上部署用python基于dlib写的人脸识别算法
python使用dlib进行人脸检测与人脸关键点标记
Dlib简介:
首先给大家介绍一下Dlib
我使用的版本是dlib-18.17,大家也可以在我这里下载:
之后进入python_examples下使用bat文件进行编译,编译需要先安装libboost-python-dev和cmake
cd to dlib-18.17/python_examples
./compile_dlib_python_mole.bat 123
之后会得到一个dlib.so,复制到dist-packages目录下即可使用
这里大家也可以直接用我编译好的.so库,但是也必须安装libboost才可以,不然python是不能调用so库的,下载地址:
将.so复制到dist-packages目录下
sudo cp dlib.so /usr/local/lib/python2.7/dist-packages/1
最新的dlib18.18好像就没有这个bat文件了,取而代之的是一个setup文件,那么安装起来应该就没有这么麻烦了,大家可以去直接安装18.18,也可以直接下载复制我的.so库,这两种方法应该都不麻烦~
有时候还会需要下面这两个库,建议大家一并安装一下
9.安装skimage
sudo apt-get install python-skimage1
10.安装imtools
sudo easy_install imtools1
Dlib face landmarks Demo
环境配置结束之后,我们首先看一下dlib提供的示例程序
1.人脸检测
dlib-18.17/python_examples/face_detector.py 源程序:
#!/usr/bin/python# The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt## This example program shows how to find frontal human faces in an image. In# particular, it shows how you can take a list of images from the command# line and display each on the screen with red boxes overlaid on each human# face.## The examples/faces folder contains some jpg images of people. You can run# this program on them and see the detections by executing the# following command:# ./face_detector.py ../examples/faces/*.jpg## This face detector is made using the now classic Histogram of Oriented# Gradients (HOG) feature combined with a linear classifier, an image# pyramid, and sliding window detection scheme. This type of object detector# is fairly general and capable of detecting many types of semi-rigid objects# in addition to human faces. Therefore, if you are interested in making# your own object detectors then read the train_object_detector.py example# program. ### COMPILING THE DLIB PYTHON INTERFACE# Dlib comes with a compiled python interface for python 2.7 on MS Windows. If# you are using another python version or operating system then you need to# compile the dlib python interface before you can use this file. To do this,# run compile_dlib_python_mole.bat. This should work on any operating# system so long as you have CMake and boost-python installed.# On Ubuntu, this can be done easily by running the command:# sudo apt-get install libboost-python-dev cmake## Also note that this example requires scikit-image which can be installed# via the command:# pip install -U scikit-image# Or downloaded from . import sys
import dlib
from skimage import io
detector = dlib.get_frontal_face_detector()
win = dlib.image_window()
print("a");for f in sys.argv[1:]:
print("a");
print("Processing file: {}".format(f))
img = io.imread(f)
# The 1 in the second argument indicates that we should upsample the image
# 1 time. This will make everything bigger and allow us to detect more
# faces.
dets = detector(img, 1)
print("Number of faces detected: {}".format(len(dets))) for i, d in enumerate(dets):
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
i, d.left(), d.top(), d.right(), d.bottom()))
win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
dlib.hit_enter_to_continue()# Finally, if you really want to you can ask the detector to tell you the score# for each detection. The score is bigger for more confident detections.# Also, the idx tells you which of the face sub-detectors matched. This can be# used to broadly identify faces in different orientations.if (len(sys.argv[1:]) > 0):
img = io.imread(sys.argv[1])
dets, scores, idx = detector.run(img, 1) for i, d in enumerate(dets):
print("Detection {}, score: {}, face_type:{}".format(
d, scores[i], idx[i]))5767778798081
我把源代码精简了一下,加了一下注释: face_detector0.1.py
# -*- coding: utf-8 -*-import sys
import dlib
from skimage import io#使用dlib自带的frontal_face_detector作为我们的特征提取器detector = dlib.get_frontal_face_detector()#使用dlib提供的图片窗口win = dlib.image_window()#sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径,所以参数从1开始向后依次获取图片路径for f in sys.argv[1:]: #输出目前处理的图片地址
print("Processing file: {}".format(f)) #使用skimage的io读取图片
img = io.imread(f) #使用detector进行人脸检测 dets为返回的结果
dets = detector(img, 1) #dets的元素个数即为脸的个数
print("Number of faces detected: {}".format(len(dets))) #使用enumerate 函数遍历序列中的元素以及它们的下标
#下标i即为人脸序号
#left:人脸左边距离图片左边界的距离 ;right:人脸右边距离图片左边界的距离
#top:人脸上边距离图片上边界的距离 ;bottom:人脸下边距离图片上边界的距离
for i, d in enumerate(dets):
print("dets{}".format(d))
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}"
.format( i, d.left(), d.top(), d.right(), d.bottom())) #也可以获取比较全面的信息,如获取人脸与detector的匹配程度
dets, scores, idx = detector.run(img, 1)
for i, d in enumerate(dets):
print("Detection {}, dets{},score: {}, face_type:{}".format( i, d, scores[i], idx[i]))
#绘制图片(dlib的ui库可以直接绘制dets)
win.set_image(img)
win.add_overlay(dets) #等待点击
dlib.hit_enter_to_continue()041424344454647484950
分别测试了一个人脸的和多个人脸的,以下是运行结果:
运行的时候把图片文件路径加到后面就好了
python face_detector0.1.py ./data/3.jpg12
一张脸的:
两张脸的:
这里可以看出侧脸与detector的匹配度要比正脸小的很多
2.人脸关键点提取
人脸检测我们使用了dlib自带的人脸检测器(detector),关键点提取需要一个特征提取器(predictor),为了构建特征提取器,预训练模型必不可少。
除了自行进行训练外,还可以使用官方提供的一个模型。该模型可从dlib sourceforge库下载:
arks.dat.bz2
也可以从我的连接下载:
这个库支持68个关键点的提取,一般来说也够用了,如果需要更多的特征点就要自己去训练了。
dlib-18.17/python_examples/face_landmark_detection.py 源程序:
#!/usr/bin/python# The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt## This example program shows how to find frontal human faces in an image and# estimate their pose. The pose takes the form of 68 landmarks. These are# points on the face such as the corners of the mouth, along the eyebrows, on# the eyes, and so forth.## This face detector is made using the classic Histogram of Oriented# Gradients (HOG) feature combined with a linear
‘伍’ OpenCV+Python特征提取算法与图像描述符之SIFT / SURF / ORB
算法效果比较博文
用于表示和量化图像的数字列表,简单理解成将图片转化为一个数字列表表示。特征向量中用来描述图片的各种属性的向量称为特征矢量。
参考
是一种算法和方法,输入1个图像,返回多个特征向量(主要用来处理图像的局部,往往会把多个特征向量组成一个一维的向量)。主要用于图像匹配(视觉检测),匹配图像中的物品。
SIFT论文
原理
opencv官网解释
实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。
尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量。
其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。
对现实中物体的描述一定要在一个十分重要的前提下进行,这个前提就是对自然界建模时的尺度。当用一个机器视觉系统分析未知场景时,计算机没有办法预先知道图像中物体的尺度,因此我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度。图像的尺度空间表达指的是图像的所有尺度下的描述。
KeyPoint数据结构解析
SURF论文
原理
opencv官网解释
SURF是SIFT的加速版,它善于处理具有模糊和旋转的图像,但是不善于处理视角变化和光照变化。在SIFT中使用DoG对LoG进行近似,而在SURF中使用盒子滤波器对LoG进行近似,这样就可以使用积分图像了(计算图像中某个窗口内所有像素和时,计算量的大小与窗口大小无关)。总之,SURF最大的特点在于采用了Haar特征以及积分图像的概念,大大加快了程序的运行效率。
因为专利原因,OpenCV3.3开始不再免费开放SIFT\SURF,需要免费的请使用ORB算法
ORB算法综合了FAST角点检测算法和BRIEFF描述符。
算法原理
opencv官方文档
FAST只是一种特征点检测算法,并不涉及特征点的特征描述。
论文
opencv官方文档
中文版
Brief是Binary Robust Independent Elementary Features的缩写。这个特征描述子是由EPFL的Calonder在ECCV2010上提出的。主要思路就是在特征点附近随机选取若干点对,将这些点对的灰度值的大小,组合成一个二进制串,并将这个二进制串作为该特征点的特征描述子。文章同样提到,在此之前,需要选取合适的gaussian kernel对图像做平滑处理。
1:不具备旋转不变性。
2:对噪声敏感
3:不具备尺度不变性。
ORB论文
OpenCV官方文档
ORB采用了FAST作为特征点检测算子,特征点的主方向是通过矩(moment)计算而来解决了BRIEF不具备旋转不变性的问题。
ORB还做了这样的改进,不再使用pixel-pair,而是使用9×9的patch-pair,也就是说,对比patch的像素值之和,解决了BRIEF对噪声敏感的问题。
关于计算速度:
ORB是sift的100倍,是surf的10倍。
对图片数据、特征分布的一种统计
对数据空间(bin)进行量化
Kmeans
边缘:尺度问题->不同的标准差 捕捉到不同尺度的边缘
斑点 Blob:二阶高斯导数滤波LoG
关键点(keypoint):不同视角图片之间的映射,图片配准、拼接、运动跟踪、物体识别、机器人导航、3D重建
SIFT\SURF
‘陆’ python里面什么是贪婪
Python里面的贪婪算法(又称贪心算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,/不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
基本思路
思想
贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止 。贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
基本思路
思想
贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止 。贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
基本思路
思想
贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止 。
‘柒’ 用python解一道通配符匹配的算法题
假设输入的字符串为s,匹配串为p,代码如下
classSolution(object):
defisMatch(self,s,p):
"""
:types:str
:typep:str
:rtype:bool
"""
sIndex,pIndex=0,0
sLen=len(s)
pLen=len(p)
sPrevIndex,pPrevIndex=1,pLen
whilesIndex<sLen:
#当两个串对应位置字母可以等价时,各自索引均向后
ifpIndex<pLenand(s[sIndex]==p[pIndex]orp[pIndex]=='?'):
sIndex+=1
pIndex+=1
#当模式串为*时,先以匹配0个的方式暂时匹配
elifpIndex<pLenandp[pIndex]=='*':
sPrevIndex=sIndex+1
pPrevIndex=pIndex
pIndex+=1
#当暂时匹配失败时,以匹配多1个的方式继续匹配
elifpPrevIndex<pLen:
sIndex,pIndex=sPrevIndex,pPrevIndex
#匹配失败
else:
returnFalse
#看模式串剩下的字母是否均为*
foriinrange(pIndex,pLen):
ifp[i]!='*':
returnFalse
returnTrue
‘捌’ 模板匹配概述
模板匹配是通过一张模板图片去另一张图中找到与模板相似部分的一种算法。一个模板是一张小图片,这个图片有一定的尺寸,有角度(一般是不旋转的矩形, 角度为0)。
模板匹配算法一般是笑备通过滑窗的方式在待匹配的图像上滑动,通过比较模板与子图的相似度,找到相似度最大的子图。这种算法最核心部分在于如何设计一个相似性函数。
最容易想到的一个相似性函数便是欧式距离:
将这个相似性函数展开,可以得:
可以看出,只有第二项是有意义的,因为第一项和第三项的值在选定模板后是固定的。对于欧式距离相似函数,值越大表示越不相似,也就是说,第二项的值越小则越不相似。
将第二项进行归一化:
那么当R(i, j)为1时,表示模板与子图完全相等。
cv::matchTemplate(const CvArr* image, //欲搜索的图像。它应该是单通道、8-比特或32-比特 浮点数闷芹图像
const CvArr* template,//搜索模板,不能大于输入图像,且与输入图像具有一样的数据类型
CvArr* result, //比较结果的映射图像。单通道、32-比特浮点数.
若图像是W×H而templ是w×h,则result一定是(W-w+1)×(H-h+1)
int method//CV_TM_SQDIFF、CV_TM_SQDIFF_NORMED、CV_TM_CCORR、
CV_TM_CCORR_NORMED、CV_TM_CCOEFF、CV_TM_CCOEFF_NORMED
);
函数来进行模板匹配。其中的method参数具体如下:
在通过matchTemplate函数进行模板匹配后,可以得到一个映射图,这张图中最大值的地方便是匹配度最大的子图的左上角坐标,可以使用cv::minMaxLoc函数获得子图位置和相应分数,再进行后续操作。
使用传统的模板匹配速度较快,但是无法应对旋转和缩放问题。要解决旋转不变的 问题,必须要碰罩毁得到旋转不变的特征量,例如特征点。
使用SIFT或SURF计算得到模板和待匹配图像的特征点,然后使用RANSAC或者FLANN进行特征点匹配, 最后进行仿射变换便可得到匹配的位置。
python opencv实现(surf):
# - - coding:utf-8 - -
author = 'Microcosm'
运行的具体信息如下:
操作系统:ubuntu 14.04
运行环境:
opencv版本:opencv 3.0
模板大小:126x96 png
匹配图像大小:750x407 jpg
特征提取时间:0.15 s
KNN匹配时间:0.0024s
匹配效果: