自作のウェブクローラx画像識別器のプログラムです.
具体的な機能は、Pixivの画像作品を保存、解析、そして自動分類することです.
プログラムは主に2つの部分で構成されています:
ひとつはウェブクローラ、作品をスキャンと保存するためのプログラムです.
もうひとつは畳み込みニューラルネットワーク(Convolutional Neural Networks, 以下CNNと略します)に用いる画像分類器、Chainerで書きました.
- 分類ルール:
- グルプ1: 完成度の高い絵(例えば、綺麗な背景を持つ、彩り豊か、線も綺麗など)
- グルプ2: 漫画,スケッチ,線画、落書き,ちびチャラなど
* 個人趣味でこの二項分類ルールを作りました、自分の分類器を作りたい場い、第3節を参考にしてください.
デモ:
demo-site
——————————————————————————————————————————————————————
システム: 開発とテスト共にLinuxです、論理上Windowsにも使えますか...Linuxを推奨します
(クローラ部分は win10x64 でも使えることを実証しました)
ハードウェア: 実行だけなら、月500円の格安VPS(メモリ1G、共有CPU、グラボ無し)でも問題ないです. 自分の分類器を作りたい場、第3節を参考にしてください.
(Ubuntu の場は Debian を参考にしてください,コマンドは同じです)
————————————————————————————————————————
2.1.1 Python3をインストールする:
Debian: apt-get install python3 python3-dev python3-all
CentOS: コンパイルインストールが必要です, Python3.6.0を例にすれば:
wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
tar xf Python-3.6.0.tar.xz
cd Python-3.6.0*
./configure
make
make install
# パッケージをダウンロード -> 解凍 -> 解凍したファイルに入る -> 環境設定 & チェック -> コンパイル -> インストール
————————————————————————————————————————
2.1.2 OpenCVをインストールする:
Debian: ホムページを参考にしてコンパイルインストール
CentOS: yum install opencv*
————————————————————————————————————————
(推奨)2.1.3 virtualenvをインストールする(クリーンな実行環境を維持するため):
pip3 install virtualenv
virtualenv環境を作る:
virtualenv -p python3 --no-site-package PixivCollector
virtualenv環境に入る:
source PixivCollector/bin/active
————————————————————————————————————————
2.1.4 必要なPythonパッケージをインストールする:
pip install numpy opencv-python chainer requests lxml beautifulsoup4
————————————————————————————————————————
Chainer v1.22.0 ヴァージョンもう公開されましたので、本節を無視してください.
古いヴァージョンを使っている方はヴァージョンがアップしてください:
pip install chaienr --upgrade
————————————————————————————————————————
いよいよ実行部分になりました!
git clone https://github.com/shinpoi/pixiv_collector.git
setting.py
を編集してください:PIXIV_ID="----"
とPIXIV_PW="----"
の----
部分を自分のPixivアカウントとパスワードで入れ替わってください.- コマンド:
python crawler.py
で実行.
そうしますと、プログラムは昨日の(0:00~12:00で使うなら,一昨日の)日間ランキング前200枚を分類して、ディレクトリ./pixiv
に保存します.
————————————————————————————————————————
crawler.py
パラメータはショートとロング二種類の書き方があります、効果は同じです.
日付を例にして:
ショット: -d 20170312
ロング: --date=20170312
P.S. 文字列に引用符はいらない.
-
モード選択:
-m --mode
//'rank'が'artist'が必要、スキャンの目標をランキングがユーザーがを設定する. デフォルト値は'rank'. -
'rank'
モード:- 時間選択:
-d --date
// 8桁の数値を必要、例えば、2017年3月12日のランキングなら、‘20170312’と入力(引用符いらない)、デフォルト値は昨日/一昨日. - ページ選択:
-p --page
// 1〜10の整数が必要、1ページの作品は50作、 デフォルト値は4. - ランキング選択:
-c --class
// 'daily'、'weekly'、'monthly' のいずれは必要、日間、週間、月間ランキングを指定する、デフォルト値は'daily'.
- 時間選択:
-
'artist'
モード:- uid指定:
-u --uid
// ユーザーのuidが必要、'artist'モードなら必ず入力してください、入力しない場エラーが出ます. - モード指定#2:
-c --class
// 'works'が'bookmarks' が必要、ユーザーの作品をスキャンするか、ブックマークをスキャンするかを選択する、デフォルト値は'works'.
- uid指定:
- パラメータ
no-classify
を付けてください, そうすると分類器がoffになります.
例えば、とある人(uid=99999999)のブックマークにある全ての画像を保存したいなら:
コマンド: python crawler.py -m artist -u 99999999 --class=bookmarks no-classify
——————————————————————————————————————————————————————
必要環境:メモリが8G以上のNvidiaグラフィックカード(目安: GTX1070+)
(いきなり酷い要求?!
CUDAをインストールしてください(ヴァージョンは7.5と8のどっちでも問題ないです)
cuDNNをインストールしてください
cuDNNインストールしたら,chainerを入れなおす: (PixivCollector)$ pip install chainer
————————————————————————————————————————
画像データの置く場所は./dataset
中のtrain_positive
, train_negative
, test_positive
, test_positive
四つのファイル.
train*
の中はトレーニングデータ,positiveとnegative各200枚以上、まだ50の整数倍の枚数の画像を勧めします。
test*
の中はテストデータ,トレーニングに影響がない,分類器の性能を評価するだけ使います,トレーニングデータと違うデータを、少しだけ入れいいです(各50枚を勧め)
簡単な人物と非人物の識別から,抽象的な'好き'と'嫌い',どんどん試してください!(でも実際的に、特徴が具体的な方が分類効果がいいです
画像の色は分類効果に影響しません,全てのデータはモノクロ画像として解析していますから,理由は4.2節で説明します。
python init_data.py
cpu_model.npz
をバックアップしてください.
python train_model.py
トレーニング終わったら、新しいcpu_model.npz
ファイルが生成されます.
——————————————————————————————————————————————————————
構造は下記のとうりとなります:
pixiv_collector
├── setting.py ---- 各ファイル共通のパラメータ,まだ、アカウントとパスワードを設定する場所
├── init_dataset.py ---- サンプルの前処理プログラム(サンプルを133x133のグレースケール画像として保存する)
├── train_model.py ---- CNNをトレーニングするプログラム
├── cpu_model.npz ---- トレーニング完成したCNNのパラメータ
├── predictor.py ---- 画像分類のプログラム
├── crawler.py ---- pixivクローラ
├── demo_creator.py ---- デモサイトを生成するプログラム
├── src
├── _init_.py ---- 空っぽ,pythonを使うため必要なファイル
├── model.py ---- ニューラルネットワーク構造を定義するファイル
├── index.html ----- デモサイトホムページのテンプレート
└── template.html ----- デモサイト実演ページのテンプレート
————————————————————————————————————————
crawler.py
実装した、でも使っていない機能:
- 評価(pixivでとある作品を評価する)
score()
(このプロジェクト最初の目的は、プログラムに自分はどんなの作品が'好き'を教えて、そしてクローラをpixiv上自由に駆け回させて、自分が好きな作品を集める、ついてに満点を付けることです.
でも'好き'という感覚はやはり曖昧過ぎて、分類の効果はあんまりいいではなっかた. プログラムを修正しつつ、今の形になりました. まぁ、今後努力の目標はプログラムを私の'好き'と'嫌い'の作品が分かるように改良することです~)
————————————————————————————————————————
使うモデルはGoogle Inception v2の簡素化ヴァージョン. モデル定義はmodel.py
にあります.
参考文献:
https://arxiv.org/abs/1502.03167
https://arxiv.org/abs/1512.00567
-
どうして簡素化?
元々Inception v2の完全ヴァージョンを使うつもりなんですか………グラボメモリ不足のエラーが出てきました. -
どうしてモノクロ画像?
メモリ不足の問題を解決するため、いろいろ試行錯誤をしました.
そして、画像のサイズをある程度縮って、モノクロ画像と変わるとしでも、分類器の性能は殆ど変りませんの結果が得られました.
様々な調整の後、モデルは今の形になりました.
——————————————————————————————————————————————————————
ある程度振分けることをできましたが、実用にはまだまだです.
現段階正解率が高い(グルプ1と分類される作品は確か皆完成率高い)ですが、再現率が低い(完成率高い作品はグルプ2の中にもたくさんあります)
しばらくの目標は正解率を維持しながら再現率を上がることです.
遠い目標は当然、最初の目的 —— プログラムに自分はどんなの作品が'好き'を教えることです.
以上です.
一个按指定规则扫描pixiv上的图片,并按一定规律自动分类的程序.
- 规律:
- 正类: 完成度比较高的图(比如丰富的背景,流畅的线条,有上色什么的)
- 负类: 漫画,线稿,草稿,Q版画,ll脸,巨乳,巨臀,只有腿的图……等等
- 目前按个人喜好分为这两类,想定制自己的分类规则的话,参考第三节.
程序由两部分组成:一部分是pixiv爬虫,用来扫描并下载排行榜信息和图片;另一部分是一个基于卷积神经网络(CNN)的分类器,由chainer实现。
像这样: ————————————————————————————————————————————————————
——————————————————————————————————————————
开发和测试的环境为皆Liunx。Windows上理论可以使用,有兴趣可以自行研究。。。
(爬虫部分在 win10x64 下测试可以正常使用)
Liunx下的环境配置:
(Ubuntu 参照 Debian,命令相同)
Python3:
Debian: apt install python3 python3-dev python3-all
CentOS: 需要编译安装, 大致步骤:
wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
tar xf Python-3.6.0.tar.xz
cd Python-3.6.0*
./configure
make
make install
OpenCV:
Debian: 参照官网编译安装
CentOS: yum install opencv*
(推荐)安装virtualenv(用于保持环境纯净):
pip3 install virtualenv
进入virtualenv环境:
virtualenv -p python3 --no-site-package PixivCollector
source PixivCollector/bin/active
安装相关的Python包:
pip install numpy opencv-python chainer requests lxml beautifulsoup4
——————————————————————————————————————————
新版终于发行了,请无视这节。老版本的用户请升级到v1.22.0版(pip install chainer --upgrade
)
——————————————————————————————————————————
激动人心的步骤!
下载本程序:
git clone https://github.com/shinpoi/pixiv_collector.git
然后:
- 打开
setting.py
,设置PIXIV_ID=
和PIXIV_PW=
为自己的pixiv帐号和密码. - 执行
python crawler.py
程序会扫描并下载昨天(如果你在0:00~12:00使用的话,扫描前天)的日间排行榜前200张图片,分类保存在./pixiv
目录下.
——————————————————————————————————————————
crawler.py
接受长短参数 —— 两种参数写法不同但效果相同。
以日期为例:
短参数: -d 20170312
长参数: --date=20170312
字符串不用加引号.
参数:
-
指定模式:
-m --mode
// 接受'rank'或者'artist',判断扫描排行榜还是扫描用户. 默认为'rank'. -
rank模式下:
- 指定时间:
-d --date
// 接受一个时间字符串作为参数,比如: ‘20170312’,默认为昨天. - 指定页数:
-p --page
//接受一个1~10的整数作为参数,1页50张图,默认为四页. - 指定榜单:
-c --class
// 接受 'daily', 'weekly', 'monthly' 中的一个,默认为'daily'.
- 指定时间:
-
artist模式下
- 指定uid:
-u --uid
// 接受用户的数字id,不输入会报错 - 指定模式:
-c --class
// 接受 'works', 'bookmarks' 中的一个,默认为'works'.
- 指定uid:
仅仅作为爬虫使用:
- 参数
no-classify
(不需要值,不加--
), 关闭分类器.
举例,比如我想下载我自己 (uid=1941321) 所有收藏的图片的话,可以输入:
输入: python crawler.py -m artist -u 1941321 --class=bookmarks no-classify
————————————————————————————————————————————————————
要求:一张显存8G在以上的Nvidia显卡(GTX1070+).
环境配置:
安装 CUDA(7.5和8都行)
安装 cuDNN
装好CuDNN后,重装 chainer: (PixivCollector)$ pip install chainer
准备训练数据:
将数据分别放入dataset
文件夹下的train_positive, train_negative, test_positive, test_positive里.
train*
里为正负训练数据,推荐各200张以上,并为50的整数倍。
test*
为测试数据,不影响训练结果,放少量测试就行,不能和train里的重复(推荐正负各50张)
这个网络是个简单的图像二分类器,要针对哪两个属性分类请自由发挥,从最实际的分辨人物和非人物,到抽象的比如喜欢和不喜欢,都可以试试……当然差异越具体分类效果越好。
另外颜色不会影响分类,样本都被预处理为灰度图了,原因在4.2节说明。
初始化训练样本:
python init_data.py
备份原网络:
给cpu_model.npz
做个备份
训练:
python train_model.py
训练完成后新的cpu_model.npz
会覆盖目录下的原文件.
————————————————————————————————————————————————————
总体结构如图:
pixiv_collector
├── setting.py ---- 一些各模块通用的设定,也是设置帐号密码的地方
├── init_dataset.py ---- 初始化样本(把图片压缩为133x133的单色图, 原因见4.2节)
├── predictor.py ---- 分类器,用训练完成的cpu_model.npz
进行分类
├── train_model.py ---- 训练神经网络的主程序
├── cpu_model.npz ---- 训练好的网络参数文件
├── crawler.py ---- pixiv爬虫
├── demo_creator.py ---- 生成demo网页的程序
├── src
├── _init_.py ---- 空文件,python自身需要
├── model.py ---- 神经网络结构的定义文件
├── index.html ----- demo网页主页的模板
└── template.html ----- demo网页展示页面的模板
setting.py
实装了但没使用的功能:
- 打分
(这个项目最初的目的是分类出我喜欢的图,然后让爬虫在pixiv上随机扫描,并收集我可能喜欢的图,然后给正类评分。但喜欢这个感觉实在是太玄学了,分类效果一直不太理想,所以渐渐做成了现在这样。当然,努力的目标还是让计算机理解我‘喜欢’什么样的图。)
使用的网络模型为Google Inception v2的简化型. 具体可以查看model.py
,对CNN有了解的话应该很容易看懂.
参考这两篇论文:
https://arxiv.org/abs/1502.03167
https://arxiv.org/abs/1512.00567
为什么简化?
原本我用的是完整版的v2网络…………然后显存爆了
调试的过程中试着降低样本的尺寸和保存为单色,发现分类效果几乎没变化(甚至还略有提高 <-- 实验次数不多,也可能是偶然) 于是最终选用了这个尺寸。
————————————————————————————————————————————————————
第一次做神经网络在图像识别方面的应用,也算是自己第一个大点的程序方面的项目……不成熟的地方有很多,样本也太多时间没好好搜集……
以后会慢慢完善的(大概(相信不会坑(真的!
花了一个多星期没日没夜训练网络 & 写程序,成型的时候还是挺有成就感(虽然完全不实用wwwww
附: 每次更新网络参数都上传git的话太浪费了,新训练的网络我会放在自己的网站上,有兴趣可以下下来试试.
(暂没开放,下次改版时附上链接)