标签归档: REST API

基于Dlib、Flask和Sqlite的人脸检测和识别服务

这个十一原定的计划取消了,没有做好备份计划,也就不打算出远门了,关在家里,把一直都想做的一个本地化的人脸识别服务整了一下。提供人脸分析的开源服务似乎很多年都没有大的变化了,一直都是Dlib和OpenCV,对比了一下,Dlib更容易使用。一直没有正经写过Python代码,翻出N年前买的Python编程书,边翻书Google、边写代码。基本的代码流程比较简单,Dlib官方也有例子,很容易运行起来,但是要服务化,要做人脸比对,并且是增量的人脸比对和识别,并不容易。说做就做,最终整个服务形成如下架构。

架构图:
image

代码和部署使用方法在如下git工程:https://git.codefine.site:3000/Shentar/facerec

首先需要将探测的过的“人脸”存储起来,然后能输入一张人脸返回与该人脸近似的所有人脸,这样客户端好做人脸归集。很快做好了一个初步的框架:使用Flask提供REST接口接收照片,在响应中返回人脸的特征标识,使用SHA256对人脸68点位的描述向量进行HASH,返回给客户端。同时将HASH值和实际的token存储到Sqlite。第一天大概就完工了这个功能。

运行起来,发现单纯的Flask不能并发,第二个请求会报错,一次只能接受和处理一个请求。于是又按照网上的经验,使用Gunicorn和Gevent来做多线程的方案,因为习惯了单进程多线程的方式,多线程访问Sqlite需要加锁,按照通用的做法,使用一个队列来管理Sqlite实例。继续验证,发现多线程并不能加速Detect的效率,貌似Dlib不支持多线程加速。调整为多进程,四个CPU都能运用起来。

1d2dd2b5bcde40b6a563996821d84843

终于找到了一个能将这个3.2GHZ的四核CPU跑满的业务了 ^_^

Architecture: x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   39 bits physical, 48 bits virtual
CPU(s):                          4
On-line CPU(s) list:             0-3
Thread(s) per core:              2
Core(s) per socket:              2
Socket(s):                       1
NUMA node(s):                    1
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           94
Model name:                      Intel(R) Core(TM) i3-6100T CPU @ 3.20GHz

人脸检测的效果还不错,错误率的话,自己家用是够了。特别是在侧脸检测上面,比较准确。在人脸比对方面,错误率就要高一些了,反复验证,发现0.36的比对阀值比较合适。侧脸虽然检测率高,但是在比对上面,只用通用的拟合范数,结果会表现为差异很大。因此这里应该是需要有定制化的比对实现,只做部分比对。这块需要深入到人脸检测技术内部,去分析128D的特征值向量的每一个值,短时间内没办法去研究透了。

由于采用了多进程,因此没法共用一个Sqlite运行时实例,强行并发读写访问会导致数据库错乱,不得不又做了一个服务来封装Sqlite,多个检测进程输出的人脸特征值都发给该服务来顺序存储,同时也返回给客户端。两个服务之间同样采用REST接口交互。

准备大规模上量,将jAlbum目前使用的线上人脸识别服务切换到这个本地服务上面,又发现检测时长非常高,一张4M的图片,大概需要几秒的时间,并且还有些非常小的区块被检测到了。对于检测慢的问题,考虑降低输入的照片的像素,图片减小后,长宽的像素点都相应减少了,但是人脸的特征点并不会损失太多。因此先对图片进行降低像素和尺寸,识别完成后,对识别到的人脸在照片上的位置也要相应做缩放,对比了一下,原始大小检测和缩放后检测,再对结果做相反的缩放,最终结果误差不大,但是这样能极大提速。对于非人脸和质量不高的人脸被检测到的问题,做了一些粗浅的限制,人脸长宽必须大于100的阀值才认为是正常的人脸。Dlib应该有正统的输出人脸的质量的参数,查了很久,没有找到合适的方法,就只能先这样吧。在比对方面,还有一些重要的概念,没有弄明白,如人脸对齐、年龄、性别检测等,不清楚我的代码里面是否已经有调用已经做了这块。

具体的处理代码:

data = np.frombuffer(data, np.uint8) 
if data is None: 
    raise Exception('image is required.') 

zoom_ratio = 1 
if data.size > 6 * 1024 * 1024: 
    img = cv2.imdecode(data, cv2.IMREAD_REDUCED_COLOR_4) 
    zoom_ratio = 4 
elif data.size > 4 * 1024 * 124: 
    img = cv2.imdecode(data, cv2.IMREAD_REDUCED_COLOR_2) 
    zoom_ratio = 2 
else: 
    img = cv2.imdecode(data, cv2.IMREAD_COLOR) 

faces = [] 
dets = detector(img, 1)

总的来说,开源项目,适合做一下Demo,如果要尽善尽美,那么就要深入到源码,有针对性的去优化检测和比对模型。作为个人的实验和家用还是很不错的。至少在快速编程和服务化这方面。

| 1 分2 分3 分4 分5 分 (5.00- 2票) Loading ... Loading ... | 归档目录:WEB网络, 数码硬件, 架构设计, 移动互联, 软件应用 | 同时打有标签:, , , , |

家用网络相册jAlbum安装使用指南

一、简介

在基于自攒的PC搭建了Home NAS系统之后,使用btsync工具将家里的各个终端的照片和视频集中备份到了Home NAS。主要是台式电脑、笔记本和家人的各个手机上面的照片、拍摄视频、微信聊天视频和朋友圈短视频等。备份好之后,发现各个设备上面的图片存放时并没有非常严谨的分类,并且有大量的重复照片,就想着做一个照片、视频管理系统放在Home NAS上面持续运行并提供相册服务。系统前端提供web访问接口,浏览器可以直接访问,后台生成一个简易相册库,以WEB页面的方式供各个终端查看和下载照片。 想到哪儿做到哪儿,并没有非常详尽的需求分析分析和软件设计。最终实现了如下功能:

  1. 实时监控和搜集指定目录的所有照片文件:jpg,png类型,所有视频文件:mp4。建立一张数据表,存储所有照片的路径、时间、指纹和长宽比等信息。
  2. 对1步骤生成的照片库根据照片的指纹值进行剔重,生成一张新的表,确保内容相同的照片只存一条记录。并且所有记录按照媒体文件的拍摄时间顺序排列。
  3. 提供RESTful的接口供浏览器访问和获取相册。提供分年、月、日的视图。在前端呈现上面直接使用Java生成web页面,没有用一些高级的Marker组件。
  4. 监控文件系统中新建、修改和删除文件,并实时更新媒体库。
  5. 支持mp4视频文件的呈现。(需要在本机支持ffmpeg和ffprobe命令,下载ffmpeg工具:ffmpeg.org,如果是Windows系统,则需要把exe文件直接放入C:\Windows目录下;Linux系统可以直接使用发行版的软件仓库安装该软件。)
  6. 新增后台同步照片到Huawei Cloud OBS、Amazon S3对象存储上面,Huawei Cloud OBS支持直接上传冷对象,可以节省约3/4的开支,Amazon S3则需要配置后台任务定期转换对象到冷存储,也可以达到节省开支的效果。按照当前的费率,备份30GB的多媒体数据,每个月的开销大约在¥1多。
  7. 使用Face++服务实现人像识别,并按照人像对照片进行归集。开启该功能需要根据Face++的提示获取访问API的密钥对。
  8. 安全方面:基于Cookies机制实现简易认证,可防止搜索引擎抓取私人照片;支持HTTPS访问(需要自行制作JKS格式的证书库并替代默认证书库)。
  9. jAlbum服务端支持运行在目前各个主流的操作系统:MS Windows、MAC OS和Linux上面,免安装部署。服务端只监控指定目录的照片和视频文件,不会破坏系统上的任何数据。客户端方面,支持所有平台使用浏览器访问,相册页面自适应PC和移动端浏览器。仅仅针对Android手机,提供app程序,在登录相册主页后有下载。

软件架构图:

jAlbum 架构图

二、源码获取

源码托管在此GIT服务上面:jAlbumhttps://git.codefine.site:3000/Shentar/jAlbum) ,欢迎fork、提交issue和修改代码。

三、软件包下载

以下是适用于X86 Windows系统和Linux系统的软件包。0.3.1及之前的版本运行环境要求Java 1.8,JDK或者JRE都可以;0.3.2版本及其之后的版本仅支持JDK11环境。下载软件包后,解压缩,完成必须的配置即可运行。

版本 发布时间 更新说明 下载链接
0.3.3 27 Nov 2021 1、支持上报metrics到stastd-exporter。 下载
0.3.2 22 May 2021 1、升级JDK版本到JDK11;
2、升级Jetty版本;
3、支持HTTP2。
下载
0.3.1 24 Feb 2021 1、缩略图显示优化;
2、支持整合图片到单独目录;
3、支持本地自建的人脸识别服务。
下载
0.3.0 3 Mar 2018 1、支持使用Google Analytics跟踪访问记录;
2、解决若干已知bug。
 
0.2.9 25 Nov 2017 1、支持备份数据到Huawei Cloud OBS对象存储。  
0.2.8 18 Nov 2017 1、支持HTTPS访问;
2、解决响应中重复HTTP头域Date和Expire问题;
3、解决鉴权Bug。
 
0.2.7 19 Jul 2017 1、新增“风景”页;
2、使用Maven管理项目;
3、其他问题解决。
 
0.2.6 19 May 2017 添加访问权限控制,相册放在外网访问时,发放token才能访问,避免照片被陌生人访问,如:搜索引擎抓取照片。  
0.2.5 7 May 2017 性能提升。  
0.2.4 3 Apr 2017 1、可靠性功能问题解决。
2、性能提升。
 
0.2.3 17 Mar 2017 增加人像识别和按照任务归集照片功能。  
0.2.2 29 Jan 2017 1、增加后台同步照片到AmazonS3服务端实现。
2、修改若干重复文件检测bug。
 
0.2.1 8 Jan 2017 解决问题:Chrome浏览器Ranges下载时第一个Range时不按照协议实现收取所有数据,最终在页面有多个Video时会导致浏览器挂死。单页面多个Video时,提取视频文件的缩略图呈现。  
0.2.0 6 Nov 2016 1、新增Video的支持,支持对MP4视频文件呈现;
2、修正稳定性和功能细节的bug。
 
0.1.9 14 Aug 2016 1、PC端浏览器,增加键盘翻页,左方向键翻上一页,右方向键翻下一页。
2、改进“照片发现”性能,最快在20秒内新增照片可以呈现到页面上。
3、其他bug解决。
 
0.1.8 5 Aug 2016 1、优化照片隐藏逻辑,当隐藏的照片被移动或者删除后又添加时,也不会被显示出来。
2、适配移动终端浏览器,实现触控滑动照片翻页。
 
0.1.7 31 Jul 2016 自动识别图片的旋转角度,在前端呈现时自动适应浏览器并旋转到正确的方向。  
0.1.6 24 Jul 2016 修正若干bug。使用按钮代替超链接来导航相册。  
0.1.5 21 Jul 2016 1、增加前端照片旋转功能。
2、完善照片删除功能。
3、解决稳定性bug。
 
0.1.4 18 Jul 2016 新增删除照片功能。在单张照片显示的页面上面可以点击删除链接“删除”该照片,该照片之后不会再显示,当然照片还存在于磁盘中,只是不再显示。  
0.1.3 10 Jul 2016 1、增加文件系统监控,利用文件系统的notify机制及时处理新的文件变更;
2、不再定时全盘扫描,只在启动时进行全盘扫描;
3、定时根据base表的变更情况刷新辅助表及时呈现新增照片。
 
0.1.1 2 Jul 2016 1、支持缩略图;
2、优化编译脚本;
3、增加配置文件。
 
0.1.0 23 Jun 2016 first release.  

四、安装运行

4.1 源码安装

Git仓库下载最新的版本的代码包,执行如下命令编译安装,注意需要使用JDK 11版本,其他版本未适配,不保证编译和启动成功 ^_^

cd jAlbum 
mvn install
cd distribute
sh jalbum.sh start

如果是Windows系统则运行start.bat批处理文件启动,启动成功界面为:

启动界面

4.2 直接下载Release包运行

直接下载编译好的软件包,参考软件包下载

4.3 访问

服务端默认监听2148(http)和5443(https)端口,使用浏览器访问即可,如在本机访问,直接使用http://127.0.0.1:2148即可访问。针对android系统,在相册主页有apk可以下载安装,在设置界面指定服务端地址也可访问。

五、界面截图

最新版本主页截图:

Homepage

视频合集页面截图:

video

根据人像识别结果进行照片归集页面截图:

faces_thumb

六、升级

停止运行jAlbum,将新版本的软件包中根目录下的jalbum.xml、log4j.xml、keystore和dedup.db文件删除,然后将剩下的所有文件和目录覆盖到原运行目录。重新启动jAlbum即可。

七、配置

7.1 文件类型

7.1.1 照片

当前支持的照片文件类型有:

<picfilesuffix> 
<suffix>jpg</suffix>
<suffix>jpeg</suffix>
<suffix>png</suffix>
</picfilesuffix>

将上述代码添加到jalbum.xml的config标签内即可。

7.1.2 视频

当前仅支持mp4文件的分析和呈现,并且需要先安装ffmpeg工具。在ffmpeg官方站点下载当前操作系统的工具,将ffprobe和ffmpeg可执行文件置于系统PATH变量所指向的路径下,如:C:\Windows目录下。jAlbum运行中会调用该工具分析MP4视频文件。 另外,在jalbum.xml内,picfilesuffix标签内增加如下内容:

<suffix>mp4</suffix>

7.2 文件大小

<minfilesize>51200</minfilesize>
<maxfilesize>512000000</maxfilesize>

此配置用于定制最小文件和最大文件大小。

7.3 指定目录

指定jAlbum监控的目录:

<inputdir> 
<dir>D:\\</dir>
<dir>C:\\</dir>
</inputdir>

可以配置多个目录。注意Windows系统下,需要使用双斜杠来作为目录分隔符。 指定jAlbum排除某些特定目录,对于某些系统目录或者出于隐私保护而不希望呈现的目录,可以使用此配置排除监控:

<excludedir> 
<dir>C:\\windows\\</dir>
<dir>C:\\Program Files\\</dir>
<dir>./</dir>
</excludedir>

指定缩略图存放目录:

<thumbnaildir>./thumbnail</thumbnaildir>

thumbnaildir标签用于指定缩略图文件存放的目录。

7.4 界面定制

maxpicsperonepage标签用于定制单个页面中显示的媒体文件的数量。

7.5 性能调优

threadcount标签用于定制任务并发数量。可以根据当前系统的CPU性能定制该数值。 hashalog用于定制计算照片文件和视频文件的HASH算法,常用的有MD5, SHA-256, SHA-1,一般而言HASH算法强度越高计算要求也越高,对于普通家用照片剔重,MD5比较合适。

7.6 人脸识别

首先需要到旷视科技申请API Key,然后在jalbum.xml中配置如下标签:

<Facer> 
 <ak></ak> 
 <sk></sk> 
 <facesetprefix></facesetprefix> 
 <maxfacescount></maxfacescount> 
</Facer>

其中ak填写为API Key,sk填写为API Secret。facesetprefix为face set的前缀,当有多个应用使用同一个账号时,可以使用此前缀做区分。maxfacescount为相册人像主页上呈现的人物的个数。

7.7 数据备份

jalbum支持将数据备份到华为云对象存储和亚马逊的S3对象存储。当备份到华为云时,默认使用归档存储级别。两种备份目的端的使用是完全相同的。

<s3> 
<bucketname></bucketname>
<ak></ak>
<sk></sk>
<useHttps></useHttps>
</s3>

<HuaweiOBS>
<bucketname></bucketname>
<ak></ak>
<sk></sk>
<useHttps></useHttps>
</HuaweiOBS>

其中,bucketname指定用于备份的容器,ak、sk分别为对象存储服务提供的访问凭据,需要到相应的对象存储服务上申请。useHttps指定是否使用https协议上传数据,为提高性能,如数据安全性要求不高,可以直接使用http协议传输。

7.8 访问记录

jalbum本身支持access日志,有log4j.xml配置。可以自行根据需要修改log4j.xml定制日志格式和存放目录。 另外,当相册在互联网上面开放访问时,可以配置Goolge Analytics,实现对访问进行统计。只需要将Goolge Analytics提供的ID写入如下配置:

<GoogleAnalyticsID></GoogleAnalyticsID>

如果配置为空,则不启用统计。

7.9 权限控制

当jalbum开放到互联网访问时,为了避免搜索引擎以及其它爬虫工具抓取照片,系统默认开启了需要输入Token方式来访问。 当不需要此权限控制时,可关闭Token访问,配置如下标签:

<accessAuth>true</accessAuth>

八、后台管理

8.1 权限管理

在开启权限控制时,相册提供后台页面和管理员登录方式来管理Token,启动后台备份和立即刷新数据等操作。

在本地登录时,可以管理Token,使用浏览器或者curl -X GET ${url}命令访问如下地址:

  • 生成和获取当前系统的Token:http://127.0.0.1:2148/getToken
  • 清除当前所有Token,并重新生成一批新的Token:http://127.0.0.1:2148/clearToken
  • 清除指定Token,并重新生成新的Token,其中${token}替换成需要删除的Token:http://127.0.0.1:2148/removeToken?token=${token}

为安全起见,当前jAlbum本身只监听127.0.0.1上的http端口,如果需要外网访问,需要自行添加Nginx反向代理,推荐如下配置:

server
{
listen 5443 ssl http2;
server_name yourdomainname.com;

ssl_certificate /path/of/your/server/cert;
ssl_certificate_key /path/of/your/private/key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

location / {
proxy_pass http://127.0.0.1:2148/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr; # it is important to add this header.
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
}

location ~ /\. {
deny all;
}

access_log on;
}

8.2 数据管理

当使用管理员Token登录,或者在本地登录时:

  • 系统在单独的照片页面会显示“隐藏”按钮,用于隐藏不需要显示的照片,被隐藏的照片不会备份到对象存储系统,隐藏的照片永久不再显示,但照片文件仍然存在本地系统盘上面。
  • 当系统的数据与磁盘出现不同步到问题时,可以使用如下接口立即是同步硬盘数据与系统记录的数据: http://127.0.0.1:2148/flushnow
  • 是否备份媒体文件到远端,需要访问如下地址触发,默认情况下,新增照片不会备份到远端。 http://127.0.0.1:2148/syncnow
| 1 分2 分3 分4 分5 分 (5.00- 20票) Loading ... Loading ... | 归档目录:Java, Jetty, WEB网络, 数据库, 软件技术 | 同时打有标签:, , , , , , |

Openstack Swift简介

背景与概览

Swift 最初是由 Rackspace 公司开发的高可用分布式对象存储服务,并于 2010 年贡献给 OpenStack 开源社区作为其最初的核心子项目之一,为其 Nova 子项目提供虚机镜像存储服务。Swift 构筑在比较便宜的标准硬件存储基础设施之上,无需采用 RAID(磁盘冗余阵列),通过在软件层面引入一致性散列技术和数据冗余性,牺牲一定程度的数据一致性来达到高可用性和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。

此项目是基于 Python 开发的,采用 Apache 2.0 许可协议,可用来开发商用系统。

阅读全文 »

| 1 分2 分3 分4 分5 分 (5.00- 7票) Loading ... Loading ... | 归档目录:Swift, 云计算/云存储, 存储技术 | 同时打有标签:, , |
返回顶部