标签归档: jAlbum

介绍一个照片管理工具:PhotoPrism

最近发现一个跟jAlbum功能高度一致的相册工具,PhotoPrism,安装步骤不复杂,这里不作介绍。准备拿来跟jAlbum对比一下。看了官网的Demo,发现跟我之前做jAlbum时预想的功能完全一致:照片分类、人脸识别、照片日历还有照片打Tag,最重要的是,我一直不会做的界面,这个工具的要好用很多。赶紧docker安装试用了一下,挂载Home Server下的图片目录,在照片比较少时,完成加载很快,但是照片一但多了,就很慢。下面从各个维度对比一下,以打分的方式比较 :-)

比较项 jAlbum PhotoPrism
人脸识别 借助于第三方系统,识别精确特别是人脸对比方面精准。
5分
使用Pigo,All In One的方式,识别准确率较低。
3分
图片场景识别 不支持 支持识别图片场景,自动打标签,准确率不高
3分
备份照片到远端 支持对象存储(华为OBS和Amazon S3)
4分
使用Webdav协议备份。某些云盘支持WebDAV,因此可以网云盘备份照片。
4分
视频管理 支持
4分
支持,支持从照片中抽帧并做图片分析。
4分
界面 简陋
2分
界面精美,动态页面非常好用,支持编辑元数据,指定人像名字,编辑人像。
5分
客户端 浏览器 浏览器,有准备推出手机端的应用。
自动识别新增文件 支持
4分
需要手动点击分析图片文件按钮。
2分
支持上传照片 不支持 支持
支持自动备份手机照片 不支持 不支持
访问安全 支持简单的发放Token方式,支持Https 支持单账号登录。
照片分享 不支持 支持
功能定制 支持通过服务端参数定制很少的页面行为。
2分
支持在界面配置各种功能。
5分
性能 流畅
4分
页面响应明显卡顿。
2分
技术栈 Java、少量JS、处理EXIF信息、FFmpeg、SQLite。
更多依赖第三方服务。
Golang、Vue.js、SQLite、处理EXIF信息、FFmpeg、WebDAV。
All In One,几乎不依赖第三方
开发规模 个人玩具 ^_^,16年基本完成,后面没在大规模开发。 形成规模的开源社区,多人协作开发,正在商业化的路上。18年开始在Github开源,具体开始时间不详。
| 1 分2 分3 分4 分5 分 (5.00- 2票) Loading ... Loading ... | 归档目录:WEB网络, 数码硬件 | 同时打有标签:, , , |

jAlbum升级JDK、Jetty和支持HTTP2

利用这个周六休息时间,将jAlbum代码升级了下。主要是想支持HTTP2,提升浏览器加载性能。升级过程中遇到一些问题,记录下:

1、alpn库的问题,jetty在配套不同的jdk版本时,有一些策略:见官网链接的说明:Jetty 9 and ALPN,jdk8使用一个单独的包,jdk9及以后的版本使用使用alpn的api,需要另外一个包。在不同的jdk环境下,依赖包有差异,不能混淆。

2、jar-with-dependencies 和 META-INF/services 冲突的问题。大概是jetty-http和jetty-http2包内都实现了同一个接口,而jvm只加载到了其中一个:
org.eclipse.jetty.http.Http1FieldPreEncoder
org.eclipse.jetty.http2.hpack.HpackFieldPreEncode
两个类都实现了同一个接口,使用了META-INF/servcies目录的机制。由于之前打包时,使用了将所有依赖包都抽取到一个独立jar包的做法,导致这个servcies目录下的同名文件只保留一个,最终http2的类无法加载成功。改用依赖包放在单独目录的方式,解决问题。

3、升级jdk到11之后,有几个原本是jdk自带的工具包(jaxb和anonations)被新版本jdk删除了,只能一一重新在pom.xml中添加回来。

本来支持http2是个比较简单的事情,由于这些库之间的互相依赖,折腾了比较久。具体修改:Commit记录。也编译了0.3.2版本放在版本下载表中。升级改造之后jAlbum、本站以及相关的子站点都全面支持HTTP2。

| 1 分2 分3 分4 分5 分 (5.00- 1票) Loading ... Loading ... | 归档目录:Java, Jetty, WEB网络, 软件技术 | 同时打有标签:, , , , , |

基于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网络, 数码硬件, 架构设计, 移动互联, 软件应用 | 同时打有标签:, , , , |

Home NAS上可以运行哪些有趣的服务?

一、jAlbum

“自研”的相册管理程序,介绍和部署方法参考《jAlbum——Java WEB版相片管理系统 》。

二、代码托管服务器

国内访问github总是非常慢,所以把代码托管到HomeNas上面。使用gogs

三、文件备份工具

接收各个终端上面备份的视频、照片文件。使用sync搭建,目前墙内无法访问该工具的官方网站。现在有开源免费的替代方案:Syncthing

四、Everything

everything本来是一个Windows系统的本地文件搜索工具,以其高效而著称,在IT从业人员中使用非常广泛。其开放WEB访问方式,支持远程搜索和下载文件,远程办公时访问HomeServer上面的文件非常方便。遗憾的是,至今其都不支持HTTPS方式访问,并且用于认证的用户密码机制非常原始。可能是作者为了保持该软件的健壮和简单,不愿意加入更多的小众化功能。

五、Emby Server

媒体管理平台,支持各大平台部署Server端,支持众多的终端部署客户端应用。免费版本的客户端限制较多。当然网上也流传着各种破解方法。 在HomeServer上面部署Emby主要用于管理电视剧、小孩子看的动画片、无损音乐和超清电影,没有广告干扰的娱乐时光还是很惬意的:) 其中电影自动搜索字幕比较有用。但是对于非电影文件,按照电影去搜索元数据时,会出现匹配错乱的问题,因此非电影文件的库都是禁用自动更新元数据。

六、RSSHub

这年头,RSS源越来越少了,只能自行部署一个RSSHub,目前主要用这个工具的客户端快速提取正在访问的网页中的RSS Feed。服务端能起的作用似乎还有限,也可能是还没有完全整明白这个该怎么用。

七、博客静态文件托管服务

在香港的一个主机提供商那里购买的丐版空间,只有1G的文件存储容量,博客中日积月累的各种图片和PDF已经将空间耗尽,还有Reader和博客的数据库文件其实也是分享的这1G的空间,而各大公由云的对象存储又收费,想着家里的NAS每天开机也是闲着,就再承担点负载。将网站的所有静态文件都从“自研”的托管服务上面出,模拟主流对象存储的API实现了类似镜像存储的机制。将所有图片本地保存。这样可以定期清理博客托管服务服务上面的图片和附件等。 当然还有最基本的NAS文件共享服务、远程访问服务、偶尔当梯子给其它终端代理、作为下载机等普通功能都不在话下。 不知不觉家里一个小小的Server上都部署了十来个服务。其实,HomeServer就缺了一个完整的80和443等端口,如果国内电信服务提供商开放这些端口,那么都不用购买任何网站托管服务了,直接在HomeServer上面运行所有网站相关的任务。这样不仅省钱,还便于管控。不过话也说回来,电信封了很多端口,对HomeServer的维护来说,也解决了网络安全的问题。

八、WebDAV服务

2020-8-9更新:增加WebDAV服务,使用go编写的caddy和webdav插件搭建。主要服务于跨平台的笔记服务:Joplin,除了界面不如印象笔记,功能上已经够用。有了WebDav,能做的事情就比较多了,如: 1、管理个人密码的keepass; 2、备份油猴配置和脚本; 3、当作网盘直接在桌面系统中挂载使用。

九、Cockpit服务

2020-8-27更新:增加cockpit服务,并替换自签名证书。

十、部署VMPlayer

用于运行两个虚拟机: 一个是Win10系统:1、用于搭建科学上网的客户端,给其他设备提供代理服务,科学上网这块在Win生态下的工具远比Linux系列的丰富和易用。这样不用每个终端都安装各种工具,只需要配置代理指向该Win系统即可。2、安装迅雷,现在下载没有迅雷,啥资源都是Kbytes/s的速度,难以忍受,毋庸置疑,资源都已经被迅雷垄断了,迅雷充当了CDN的作用。 另外虚拟化了一个黑群晖,主要用于体验群晖系统,其实群晖能做的事情,在这个HomeNAS上面都有了,只是想体验一下群晖的易用性。惊奇的发现,在虚拟机里面虚拟化出来的磁盘(600GB),磁盘落在EXT4文件系统上面,然后再经过群晖的文件共享出来使用,这个共享跟NAS上面原来的共享在性能上面没有任何差异,甚至更稳定,写速率稳定在112MB/s,是不是经过Vmware和EXT4文件系统两级缓存之后,速度跟均衡。装一个空壳的宿主机,把所有硬盘都交给虚拟机的黑群晖管理,也不失为一种新的NAS玩法。

十一、部署Docker

安装docker,并配置远程访问,dockerd监听本地端口,配置TLS证书。运行portainer,实现远程管理docker实例。运行wiz笔记程序,体验不同于joplin风格的为知笔记,该笔记在抓取网页方面有所欠缺,但是界面还有性能上面非常不错。

十二、人脸识别服务

参考《基于Dlib、Flask和Sqlite的人脸检测和识别服务》。

十三、FileRunFileBrowser

可以将HomeNAS瞬间变网盘,主要用于解决文件分享、带校验码分享的场景。另外也可以用这个来直接通过页面操作远端文件的增、删、改、查。参考链接安装 FileRun,HomeNAS 秒变网盘

十四、Grafana

使用docker部署Grafana、普罗米修斯和Node-exporter监控服务器的磁盘、CPU、内存和网络等消耗。

十五、Chevereto图库服务

部署图库服务,可以作为图床、相册等使用。简单高效管理图片。

十六、为知笔记

一个界面非常友好,功能强大的多设备、多用户,跨网络同步的笔记服务。

十七、RSS阅读器

参考《架设Tiny Tiny RSS(TTRSS)阅读器,找回Google Reader!

十八、自研爬虫

运行各种新闻和电影BT下载爬虫程序。

十九、音乐服务

参考《Home NAS 音乐服务解决方案

二十、在线电子书库

安装基于Calibre的电子书在线阅读和管理服务:源码Docker仓库,本站书库:代码人生

二十一、MinIO

自托管的对象存储服务,兼容Amazon S3。安装指导:链接

二十二、Transfer.sh

一个非常好用的临时文件共享服务,客户端和服务端均使用最简洁的HTTP请求上传下载文件。可在此试用本站的Transfer.sh服务:链接

二十三、Matomo

非常好用的站点统计工具,Google Analytics的自建替代品,自建站点统计服务。对于Wordpress博客,甚至可以直接使用插件集成所有服务端的功能。

二十四、OnlyOffice

在线Office,可以完全替代本地的Office。官网的文档介绍太弱,安装过程中有一些坑,并且官方提供的镜像太臃肿,我做了少量精简。安装过程总结如下:《HomeServer安装在线Office:Docker安装最新精简版OnlyOffice》

服务列表

| 1 分2 分3 分4 分5 分 (5.00- 2票) Loading ... Loading ... | 归档目录:WEB网络, 建站技术, 数码硬件, 移动互联 | 同时打有标签:, , , , , , , , , , , , , |

使用let’s encrypt制作免费HTTPS证书

在外网访问家里的NAS服务器上面的jAlbum相册时,使用HTTPS更安全。之前使用的一直是自签发的证书,在自己的手机上面导入了自签发证书的CA,因此浏览器一直显示安全的绿色。今天在其他手机上面使用HTTPS访问时,打不开页面,使用HTTP访问则没问题,很快就想到这是证书的问题,自签发证书的根证书没有安装。但是总不能每次有新的设备访问时就要求其安装CA证书,除非这个服务能做到像12306那么不可或缺(12306上线很多年都不购买商用证书,一直要求用户下载证书安装到本地,这种做法很危险)。

阅读全文 »

| 1 分2 分3 分4 分5 分 (5.00- 3票) Loading ... Loading ... | 归档目录:WEB网络, 建站技术 | 同时打有标签:, , , , |

记录一下最近修改的两个Bug

最近改了两个jAlbum的bug,问题并不复杂,但是比较有代表性。在这里记录一下。第一个问题是,在单张照片的页面提供了一个“隐藏”当前照片的按钮。当点击该按钮时,页面重新load,显示下一张照片,使用了当前照片的ID来构造下一张照片的url,即加载url:
/?next=[currentphotoid]&count=1,
具体到服务端接收这个请求时,需要使用当前照片的ID到数据库中索引下一张。
然后对当前照片发起删除操作,即使用ajax发起一个HTTP请求:
DELETE /photos/[currentphotoid]
向服务端发送一个delete请求,具体的浏览器端代码为:

阅读全文 »

| 1 分2 分3 分4 分5 分 (5.00- 3票) Loading ... Loading ... | 归档目录:Java, WEB网络, 多线程编程 | 同时打有标签:, , |

使用ffmpeg工具转换mov、avi格式为mp4

iPhone拍摄的视频备份到Home-NAS后,文件类型是mov,无法在网页上直接呈现,因此需要对视频编码进行转换。本想找一个批量转换的工具。无奈,从几个下载网站上面找了多款工具都不能完美实现,要么需要购买,要么转换后的视频效果极差。考虑使用ffmpeg工具,直接使用命令行转换,最终使用如下脚本实现了格式转换和元数据信息的拷贝。

set indir=%1

for %%a in (%indir%\*.mov) do ffmpeg -i "%%a" -map_metadata:s:a 0:s:a -map_metadata 0:g -map_metadata:s:v 0:s:v -vcodec copy -acodec copy "%%a.mp4"

for %%b in (%indir%\*.avi) do ffmpeg -i "%%b" -map_metadata:s:a 0:s:a -map_metadata 0:g -map_metadata:s:v 0:s:v -vcodec copy -acodec copy "%%b.mp4"

将如上代码保存为bat文件,将存放有mov和avi格式文件的目录拖拽到bat文件上面执行即可实现转换。

| 1 分2 分3 分4 分5 分 (5.00- 3票) Loading ... Loading ... | 归档目录:实用脚本, 软件应用, 软件技术 | 同时打有标签:, |

Java 9 踩坑之启动参数

Java 9 出来一段时间了,也试着在Java 9 下运行jAlbum,原以为以Java一贯的向下兼容原则,应该都不用重新在JDK9编译,直接运行即可。然鹅,运行时报错,找不到类文件:

阅读全文 »

| 1 分2 分3 分4 分5 分 (5.00- 3票) Loading ... Loading ... | 归档目录:Java, 语言基础, 软件技术 | 同时打有标签:, |

jAlbum 0.1.6版本截图

新增主要功能:修改页面适配手机屏幕。

Android 手机截图效果:

阅读全文 »

| 1 分2 分3 分4 分5 分 (5.00- 15票) Loading ... Loading ... | 归档目录:Java, Jetty, WEB网络, 移动互联, 软件技术 | 同时打有标签: |

开源照片整理系统jAlbum 0.1.3版本发布

第三个版本,jAlbum完整版差不多完工了:https://github.com/shentar/jAlbum/releases/tag/jAlbum_0.1.3

最后解决了文件系统监控的问题。利用Java1.7封装的文件系统的通知回调机制,实现对指定目录的递归监控,避免每次全盘扫描性能太低的问题。

注意对于linux系统对于单个用户能够监听的inotify对象个数做了限制,一般是限制为8192,因此需要修改系统内核的配置:在/etc/sysctl.conf文件中,新增一行:fs.inotify.max_user_watches=1000000,表明将该限制修改为100万个。下次重启后会生效,如果希望当前立即生效,则需要执行命令:sysctl –p 。

对于WatchService,只监控当前目录的变化,当前目录下新增文件或者文件夹时,当前文件夹会有修改事件或者创建事件,但是再下一层的文件夹或者文件发生变更时,并不会有任何事件,因此如果要监控指定的文件夹,需要递归监控到最后一层。没有验证文件系统的notify机制对进程性能和文件系统性能的影响,在树莓派上面简单验证了下,能够非常及时的发现新增文件,进程CPU和内存也没有明显的增加。终于解决了每次都有依赖全盘扫描一遍文件才能发现新增的文件的问题。

具体代码请参见源码中的DirWatchService类。

| 1 分2 分3 分4 分5 分 (5.00- 9票) Loading ... Loading ... | 归档目录:Java, Jetty, WEB网络, 数据库, 软件技术 | 同时打有标签:, |
返回顶部