人族:人类感知图书馆

2020-08-08 20:57:08

在过去的十年里,计算机视觉发生了巨大的变化。在这个过程中,使用的技术的性质已经从主要基于启发式算法和少量数据的固定流水线算法转变为需要大量计算能力和大量数据的资源密集型通用模型。这种转变在释放新功能的同时,也带来了一些缺点。

在研究层面上完成的大部分工作都是零散的,因为根据好研究的本质,研究人员在计划他们的实验时,需要一次专注于一个方面。虽然有关于统一技术、评估的难度以及对什么是新贡献的要求如此严格的论文,但这些论文很少,而且相去甚远。这些作品大多来自非学术倡议,如Fast.ai。

研究的目的是提出并验证一种解决问题的新方法。因为这是他们的最终目标,所以重点放在结果和发表的论文上,而不是用来运行这些实验的代码。即使代码公开可用,通常也很难扩展、优化或与其他代码片段集成。

商业化的API可能会解决这个问题,因为它们通常易于使用和集成。然而,它们带来了另一组问题。

首先,也是最重要的,代码是不可审计的。因为它们是商业解决方案,所以代码不是开源的,所以您不能确定代码在做什么。你可以信任与你共事的公司,但对于其他利益相关者来说,这可能还不够。另外,能够检查正在执行的操作总是很好的。此外,由于它们通常是云解决方案,您必须与它们共享您的数据。这对一些公司来说是行不通的,因为数据可能有些敏感。

一些大名鼎鼎的公司提供了一些很好的服务,这些服务可能会很好地解决一些问题。尽管如此,他们最好的款式仍然是闭门造车。除此之外,它使用的技术可能是未知的。虽然你可以很容易地使用亚马逊Rekognition或Google Vision AI,但你不知道引擎盖下面是什么。这在某些情况下可能没有问题,但对于其他情况,您可能需要了解在哪些情况下解决方案会失败,或者在哪些情况下存在偏差。

我们相信,有一个地方的开放源码倡议的重点是解决上述几点。

一个开源的人类感知库。我们专注于为封闭的方法提供开放的、可审计的和高性能的替代方案。可以在您的计算机或设备上运行并适应其所处环境的解决方案。但最重要的是,您可以测试(没有堆积成本)、理解并根据需要修改的代码。

我们力求代码易于集成和理解。虽然它是开源的,但并不是专门针对研究人员的。我们希望让任何会编程的人都能访问计算机视觉,并使他们能够创建创新的应用程序。为了实现这一点,人类在建造过程中牢记以下指导原则:

重点是成为一个生产级的图书馆,而不是一个玩具项目。只有其性能可以评估并且具有合理(和可知的)计算和内存要求的模型才会被包括在内。

我们可以做我们自己的相册创建者,将相同人物的照片分组。这是所有云提供商(如Google Photos和Apple Photos)都会做的用例。为了简单起见并专注于人族,让我们来做这个问题的核心:找出有人在场的照片。

导入clickfrom pathlib从scipy.spatial.Distance从terran.face导入cosine.face导入Extract_Feature,faceDetectionfrom terran.io导入open_image,Resolve_ImagesFrom terran.vis导入display_image,vis_faces。

我们将使用单击创建一个小型CLI工具(我们喜欢单击-强烈推荐)。我们将使用pathlib来处理路径和到scipy的距离度量。最后,我们从Terran的模块中引入了一些功能:从Face,核心函数,用于检测人脸和提取特征;从io,实用函数,用于解析路径和打开图像;从Vis,一些可视化功能(在处理图像时非常重要和有用!)。

最后,我们从terran.vis导入了一些可视化函数,这些函数在处理图像时非常重要和有用!

现在,我们将创建一个函数来处理查找人所在位置的照片的问题。你会看到和人族在一起是多么容易!

@click.command(name=';match-dir';)@click.argument(';reference';)@click.argument(';image-dir';)@click.option(';--batch-size';,TYPE=INT,default=1)@click.option(';--threshold';,TYPE=FLOAT,默认值=0.5)@CLICK.OPTION(';--显示';,is_flag=True,默认值=false)def MATCH_DIRECTORY(reference,image_dir,Batch_size,Threshold,Display):reference=open_image(Reference)faces_in_reference=face_Detection(Reference)if len(Faces_In_Reference)!=1:click.echo(';参考图像必须正好有一个面。';)return ref_Feature=Extract_Feature(reference,faces_in_reference[0])

我们的函数接受两个参数:一个引用图像和一个我们应该扫描照片的目录。然后,我们的第一步是从我们的参考图像中提取一组代表我们正在寻找的人的特征。

然后,我们将获得要扫描的所有图像的路径:

此Terran函数成批提供路径,因此您可以并行处理它们(如果需要)。

因此,剩下的唯一要做的事情就是,对于每一张图像,打开它,检测人脸,获取特征,并将其与我们的参考图像进行比较。对付人族就够简单的了!

对于路径中的批处理路径:#打开它们Batch_Image=list(map(open_image,Batch_path))#检测Faces_per_image=face_Detection(Batch_Image)#获取路径、图像、面、zip中的要素(Batch_path,Batch_Image,Faces_per_image)的Feature_per_image=Extract_Feature(Batch_Image,Faces_per_image):对于face,zip中的要素(faces,Feature):#将每个特征与我们的参考特征置信度=cosine(ref_Feature,Feature)进行比较#如果匹配,则打印/显示!如果置信度<;阈值:click.echo(f';{path},置信度={置信度:.2f}';)如果DISPLAY:DISPLAY_IMAGE(VIS_Faces(image,face))。

导入clickfrom pathlib从scipy.spatial.Distance导入coinefrom terran.face导入Extract_Feature,faceDetectionfrom terran.io导入OPEN_IMAGE,Resolve_ImagesFrom Terran.vis导入DISPLAY_IMAGE,[email protected](name=';match-dir';)@click.argument(';reference';)@click.argument(';image-dir';)@click.option(';--batch-size';,TYPE=INT,默认值=1)@CLICK.OPTION(';--Threshold';,TYPE=FLOAT,default=0.5)@click.option(';--display';,IS_FLAG=TRUE,默认值=FALSE)def MATCH_DIRECTORY(REFERENCE,IMAGE_DIR,BATCH_SIZE,THRESHOLD,DISPLAY):REFERENCE=OPEN_IMAGE(REFACE)Faces_In_Reference=Face_Detect(Reference)if len(Faces_In_Reference)!=1:click.echo(';参考图像必须正好有一个面。';)对于路径中的Batch_PATHS,返回ref_Feature=Extract_Feature(Reference,faces_in_reference[0])PATHS=Resolve_Images(path(Image_Dir).expanduser(),Batch_size=Batch_Size):Batch_Images=list(map(open_image,Batch_path))faces_per_image=人脸检测(Batch_Image)Feature_per_image=zip中的路径、图像、面、要素的Extract_Feature(Batch_Image,Faces_per_image。FEATURES_PER_IMAGE):对于Face,压缩中的FEATURES(Faces,Feature):如果置信度<,则置信度=余弦(ref_Feature,Feature);阈值:click.echo(f';{path},置信度={置信度:.2F}';)if display:display_image(vis_faces(image,face))if__name__==';__main__';:MATCH_DIRECTORY()。

只需几行代码,您就可以轻松地检查您所呈现的图像!在您的计算机上,不需要将它们上传到任何地方,并调整参数以适合您的情况(看看Threshold)。你也可以在我们的Github中看一下这个例子,然后到人族的其他地方看看它是如何工作的。

目前,人族已经有了人脸检测、人脸识别和姿势估计的模型。我们认为可以使用这些功能创建几个应用程序,比如使用身体手势控制您的计算机,或者根据脸部是否存在来更改显示内容。你可以使用Terran作为一个界面,与你的身体和你的计算机交互,以及人们可以想到的其他几个想法。

针对这些相同的问题添加更多型号,但更轻量级,以防您需要在小型设备上运行。

虽然这是我们目前的路线图,请随时在GitHub上创建一个问题,告诉我们您是否想要我们在什么方面特别努力。

请随时使用,并告诉我们您的想法!当然,如果您用它构建了一些东西,请与我们分享!