利用深度学习相关技术为照片打标签
初试深度学习
公司内容由用户生成的话,不可避免地会遇到各种色情图片的问题。虽然我们有了举报系统,但是靠人工处理也是挺累的。
正好在半年前,Yahoo 发布了一个开源的基于 Caffe 的色情图片模型。https://github.com/yahoo/open_nsfw
这部分经验我会另起一篇文章来介绍一下。
而本文,主要是我在接触到深度学习相关知识后,发现可以用它来解决自己的一个痛点。
所以就有了此文和一些开源小代码。
利用深度学习技术识别图片内容
攒了十多年的图片,有时候想要找一张图片真的是非常痛苦的事情。只能根据大致的时间去找,所以常常找不到。
现在深度学习火了以后,各种图片内容识别技术越来越成熟了,体验了一下各种方案,都可以识别个八九不离十的。
上图是我识别完后丢到 NAS 的图片,创建智能相册后点开烟火,里面就都是烟火。
总的来说,方案分两类:在线的 OpenAPI 和利用开源免费框架自己搭建。
利用收费或免费的 OpenAPI
目前找到的收费或免费的 API 一共有3个:
- Google Cloud Vision: https://cloud.google.com/vision/
- Clarifai: https://www.clarifai.com/
- 腾讯优图: https://open.youtu.qq.com/
前两个都是收费的,Google 被墙用起来比较麻烦,所以没有采用。
Clarifai 也是国外的,速度不快,但是起码还能访问。每个月有 5000 张免费额度,对于个人使用来说完全够了,你不太可能在一个月拍 5000 多张照片吧?
最后一个是腾讯优图,目前还没收费,原因肯定是因为还不成熟,但毕竟在国内,速度很有优势。
利用 Caffe 和 Caffe Model 做图片识别
这里推荐一个博客,很全面很详细:http://www.cnblogs.com/denny402/category/759199.html
Caffe 相关东西已经非常成熟了,特别是内容识别的 Model,都有现成的素材,可以自己训练,也可以用现成的 Model。
而且还可以利用自己的素材修正现有的 Model。
方案选择
目前我的项目里只实现了腾讯优图,后续我会加上其它几种方案的支持。但 Caffe 方案略复杂,而且实际效果不一定好,因为你自己的素材和大厂比起来少太多了。所以不一定会去做。如果做,也只是为了学习实践一下。
如何修改图片的标签
群晖 NAS 的照片管理可以直接编辑图片的标签,但是怎么在电脑上搞定呢?怎么在代码里修改呢?
图片信息的相关标准
EXIF https://zh.wikipedia.org/wiki/EXIF 是大家最熟悉的标准了。
EXIF 主要是用来记录硬件信息的标准,想要加标签用的就是另一个标准:IPTC https://en.wikipedia.org/wiki/International_Press_Telecommunications_Council。
知道了用什么标准,那就要找相关工具了。支持 EXIF 的工具和开源框架真是遍地都是,但 IPTC 没那么流行,所以很难找。
最后找到了一个很不错的开源工具。包含 C++ 的源码和一个命令行工具。很多 Linux 的桌面底层就是利用它来读取图片相关信息的。
Exiv2
由于对 C++ 不熟,所以第一版只能在语言里直接调用命令行工具了。介绍几句简单的命令:
显示当前的 IPTC 信息:
exiv2 -PI IMG_20170129_185732.jpg
添加新的标签:
exiv2 -M "add Iptc.Application2.Keywords string newTag" DSC01018.JPG
删除所有的标签:
exiv2 -M "del Iptc.Application2.Keywords" DSC01018.JPG
photo-tag
最后贴上完成的项目:https://github.com/dozer47528/photo-tag
只用方法也非常简单:
photo-tag -h
Usage of photo-tag:
-d Delete current tags
-p string
Photo file path (default "./")
代码使用 Go 语言写的,为什么用 Go?因为 Go 编译出来的是二进制文件,用起来方便。然后 Python 的编码问题实在是太头疼,我选择狗带。Python 写了半天还不如从头学习 Go 写得快。
Todo list:
- 支持 Clarifai
- 支持 Google Cloud Vision
- 支持 Caffe 自己训练模型(做的可能性不大)
- 直接调用 Exiv2 源码,不再调用 Exiv2 命令行工具