客至汲泉烹茶, 抚琴听者知音

用AI识别二次元妹子特征

量子位上看到了这个AI,觉得蛮有意思的,体验下来准确率也不错,分享给大家。

开源代码地址:https://github.com/KichangKim/DeepDanbooru

在线测试地址:http://kanotype.iptime.org:8003/deepdanbooru/

数据集下载工具:https://github.com/KichangKim/DanbooruDownloader

该程序使用python 3.6与tensorflow编写

数据集与结构

作者使用的数据集是danbooru网站上爬下来的数据,该网站对每个二次元画像都贴上了标签,因此将标签与图片一一对应,存到数据库(sqlite)中,就可以进行训练了。

你可以使用作者提供的一个下载器(有releases版本,无需编译),自动生成所需要的数据集,也可以使用自己的数据集,但是文件夹结构必须如下:

MyDataset/
├── images/
│   ├── 00/
│   │   ├── 00000000000000000000000000000000.jpg
│   │   ├── ...
│   ├── 01/
│   │   ├── ...
│   └── ff/
│       ├── ...
└── my-dataset.sqlite

其中,sqlite数据库结构如下:

posts
├── id (INTEGER)
├── md5 (TEXT)
├── file_ext (TEXT)
├── tag_string (TEXT)
└── tag_count_general (INTEGER)

这里需要注意一点,MyDataset中的图片名一定要是[md5].[file_ext]格式,使用自己的数据集时不必使用真实的md5值,但也要保证一一对应。tag_count_general用于项目设置,会使用超过tag_count_general值的数据进行训练。

项目(project)结构如下,可调整project.json里的各项设置进行训练。

MyProject/
├── project.json
└── tags.txt

当然,如果你只是想体验一下不想训练,作者提供了一个在线测试网站,你可以直接上传图片获取标签。或者,作者也提供了一个预训练的模型,可以直接使用。详细使用过程见下文。

环境配置

首先我们要配置好环境,我们直接下载release版本即可,其中deepdanbooru-v1-20191108-sgd-e30.zip是预训练模型,Source code是源代码,前一个是可选的。但是因为我太懒了电脑性能不够好,所以直接使用他的模型了。

据量子位说作者用的是Ryzen 7 1800X + Geforce 1070,花了28天才训练成功,我觉得我电脑撑不住……

把源代码下载下来,解压缩并重命名为DeepDanbooru,然后cd到该文件夹。

因为第一个发行版本作者并没有把requirements.txt打包进去,所以我们需要手动新建一个txt文档,把以下内容复制进去

Click>=7.0
numpy>=1.16.2
scikit-image>=0.15.0
tensorflow>=2.1.0rc1
requests>=2.22.0
six>=1.13.0

然后运行pip install -r requirements.txt就可以安装所有需要的包了,当然,你也可以手动一个个pip安装。

安装tensorflow时可能会遇到这两个错误,使用相应的解决方案即可。

ERROR: google-auth 1.10.0 has requirement setuptools>=40.3.0, but you'll have setuptools 39.1.0 which is incompatible. # 错误代码,原因是setuptools版本过低,升级一下即可

pip install --upgrade setuptools # 解决方案

ERROR: Cannot uninstall 'wrapt'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall. # 错误代码

pip install -U --ignore-installed wrapt enum34 simplejson netaddr # 解决方案

然后单独安装tensorflow

pip install tensorflow

ok,环境已经基本配置完毕。接下来就是添加数据集文件夹和项目文件夹。为了图省事,我们就直接把预训练模型deepdanbooru-v1-20191108-sgd-e30.zip解压到根文件夹,并重命名为project,不需要数据集了(毕竟也不需要训练)

然后新建一个test文件夹,作为待检测妹子图存放地,随便放两张进去,运行下面的代码:

# python program.py evaluate-project [your_project_folder] [image_file_path]
python program.py evaluate-project project test

即可享用。

如果你机器够厉害也够有耐心,也可以自己训练,具体来说就是按照第一节所说的在根目录下添加一个数据集文件夹,然后修改project/project.json中的database_path这一项,运行下面代码:

# python program.py train-project [your_project_folder]
python program.py train-project project

就可以进行训练。

使用

选了两张图,运行代码测试一下。等待了7、8秒的样子(看来CPU在这方面真的不行啊),结果如下(左边是测试图片,右边是结果):

[album type="photos"]
[

]
[/album]

[album type="photos"]
[


]
[/album]

这标签打得还是挺详细的,准确率也蛮高。比如场景元素:katana(武士刀),black_legwear(黑板);服饰:black_legwear(黑色腿袜),school_uniform(学校制服);发型:ponytail(马尾辫);身体:upper_body(上半身)、,crossed_legs(交叠的双腿);动作:unsheathing(出鞘),sitting;表情:smile;甚至还能识别出signature(签名)。

但是第一张图识别成男性是不是有点离谱?在作者的在线测试网站上测试了一下

好吧,置信度更高了,而且标签也变少了……大概网站用的是最早一版训练模型?

看评论区,有人说这个模型大概给服饰分配的权重特别高,而面容的权重不高,所以大概女装大佬会难到AI吧。不过想想现在动漫里画女硬说男的现象也不少见,根据面容来判断性别似乎也有一定问题。

(不是很懂你们二次元.jpg)

后续:突然发现这个模型对于风景图识别也挺好的,感觉可以用来给我收集的其他图片全贴上标签啊。

添加新评论