a web crawler + CNN image classifier
自作のウェブクローラx画像識別器のプログラムです.
具体的な機能は、Pixivの画像作品を保存、解析、そして自動分類することです.
プログラムは主に2つの部分で構成されています:
ひとつはウェブクローラ、作品をスキャンと保存するためのプログラムです.
もうひとつは畳み込みニューラルネットワーク(Convolutional Neural Networks, 以下CNNと略します)に用いる画像分類器、Chainerで書きました.
デモ:
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'
モード:-u --uid
// ユーザーのuidが必要、’artist’モードなら必ず入力してください、入力しない場エラーが出ます.-c --class
// ‘works’が’bookmarks’ が必要、ユーザーの作品をスキャンするか、ブックマークをスキャンするかを選択する、デフォルト値は’works’.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
実装した、でも使っていない機能:
score()
————————————————————————————————————————
使うモデルはGoogle Inception v2の簡素化ヴァージョン. モデル定義はmodel.py
にあります.
参考文献:
https://arxiv.org/abs/1502.03167
https://arxiv.org/abs/1512.00567
どうして簡素化?
元々Inception v2の完全ヴァージョンを使うつもりなんですか………グラボメモリ不足のエラーが出てきました.
どうしてモノクロ画像?
メモリ不足の問題を解決するため、いろいろ試行錯誤をしました.
そして、画像のサイズをある程度縮って、モノクロ画像と変わるとしでも、分類器の性能は殆ど変りませんの結果が得られました.
様々な調整の後、モデルは今の形になりました.
——————————————————————————————————————————————————————
ある程度振分けることをできましたが、実用にはまだまだです.
現段階正解率が高い(グルプ1と分類される作品は確か皆完成率高い)ですが、再現率が低い(完成率高い作品はグルプ2の中にもたくさんあります)
しばらくの目標は正解率を維持しながら再現率を上がることです.
遠い目標は当然、最初の目的 —— プログラムに自分はどんなの作品が’好き’を教えることです.
以上です.
一个按指定规则扫描pixiv上的图片,并按一定规律自动分类的程序.
程序由两部分组成:一部分是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’.-d --date
// 接受一个时间字符串作为参数,比如: ‘20170312’,默认为昨天. -p --page
//接受一个1~10的整数作为参数,1页50张图,默认为四页. -c --class
// 接受 ‘daily’, ‘weekly’, ‘monthly’ 中的一个,默认为’daily’. -u --uid
// 接受用户的数字id,不输入会报错-c --class
// 接受 ‘works’, ‘bookmarks’ 中的一个,默认为’works’.仅仅作为爬虫使用:
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
实装了但没使用的功能:
使用的网络模型为Google Inception v2的简化型. 具体可以查看model.py
,对CNN有了解的话应该很容易看懂.
参考这两篇论文:
https://arxiv.org/abs/1502.03167
https://arxiv.org/abs/1512.00567
为什么简化?
原本我用的是完整版的v2网络…………然后显存爆了
调试的过程中试着降低样本的尺寸和保存为单色,发现分类效果几乎没变化(甚至还略有提高 <— 实验次数不多,也可能是偶然)
于是最终选用了这个尺寸。
————————————————————————————————————————————————————
第一次做神经网络在图像识别方面的应用,也算是自己第一个大点的程序方面的项目……不成熟的地方有很多,样本也太多时间没好好搜集……
以后会慢慢完善的(大概(相信不会坑(真的!
花了一个多星期没日没夜训练网络 & 写程序,成型的时候还是挺有成就感(虽然完全不实用wwwww
附: 每次更新网络参数都上传git的话太浪费了,新训练的网络我会放在自己的网站上,有兴趣可以下下来试试.
(暂没开放,下次改版时附上链接)