人工知能と競プロやってくブログ

深層学習・機械学習・AI・atcoder・競技プログラミングについて調べてやってみたことをまとめるブログです

pythonのopencvで画像重ね、回転、輪郭抽出する簡単サンプル

https://gyazo.com/bbf7d908155b0d048968fcab4370b923

opencvで、いくつかやりたいことがあったので下調べとして作ってみました。 jupyter notebookで作ってます。

画像を重ねて描画

これを作ってみてわかったOpenCVの特徴。

  • 画像データを読み込むとnumpy.ndarrayで返ってくる
  • ピクセルの色データがB, G, R(Blue, Green, Red)の順に並んでいてRGBではない

PNG画像の透過部分を透過させて画像を描画

背景を水色にして、アルファ部分を透過してpng画像を重ねて描画。

PNG画像の透過部分を保持したまま画像を回転

PNG画像をJPG画像の上にリサイズ、回転させて透過描画

画像の回転、縮小、輪郭を抽出した矩形を描画

抽出した輪郭ぴったりに線を描画

参考

ども、ありがとうございます! stackoverflow.com

end0tknr.hateblo.jp

skattun.hatenablog.jp

YOLOでMNISTを学習させてみる

https://gyazo.com/3649c293e3e718aa11af32e59d4897a4

YOLOでの学習の練習にMNISTの教師データを自前で作って学習させてみました。

必要なソフトのインストール

Kerasのインストール

KerasがPython環境に入っていない場合は入れてください。

pip install tensorflow
pip install keras

darknet YOLOのインストール

darknet YOLOのリポジトリを取得する

git clone https://github.com/pjreddie/darknet
cd darken
make

ビルドなど、うまくいかない場合はdarknet YOLOの公式サイト参照。

pjreddie.com

学習データの作成

github.com

学習データを作成するためのスクリプトを作り、GitHubにあげました。 まずは、このリポジトリを取得。

git clone https://github.com/uchidama/MNIST-TrainDataForYOLO.git

とか。

[1] MNISTの画像とラベルの作成

python mnist_to_jpg_and_label.py

画像とラベルの入ったテキストファイルが7万枚ずつ作成されます。

[2] train.txt と test.txtの作成

python generate_train_txt_and_test_txt.py

訓練用の画像一覧 train.txt とテスト用の画像一覧 test.txtが作成されます。 以上で学習データの作成は終了です。

YOLOでの学習

[3] リポジトリのcfgディレクトリ、dataディレクトリ内のファイルをdarknetにコピー

cp cfg/tiny-yolo-mnist.cfg <darknet_dir>/cfg
cp cfg/voc-mnist.data <darknet_dir>/cfg
cp data/voc-mnist.names <darknet_dir>/data

tiny-yolo-mnist.cfg の上の方にあるbatch, subdivisionsをコメントアウトして切り替えておく

[net]
# Training
batch=64
subdivisions=2
# Testing
#batch=1
#subdivisions=1

[4] <darknet_dir>/cfg/voc-mnist.dataを編集。2で作成したtrain.txt、test.txtにパスを通す

train  = <path-to-mnist-train>/train.txt
valid  = <path-to-mnist-test>/test.txt

[5] 学習に使うトレーニング済のウェイトをダウンロードする

cd <darknet_dir>
wget https://pjreddie.com/media/files/darknet19_448.conv.23

[6] 学習モデルの保存ディレクトリを作成

mkdir backup

[7] 学習する

./darknet detector train cfg/voc-mnist.data cfg/tiny-yolo-mnist.cfg darknet19_448.conv.23

backupディレクトリの中に学習したモデル(weights)が保存される。

学習したモデルで識別する

./darknet detector test <data file> <cfg file> <weights> <predict image>  

コマンドとしては、こういう指定。

./darknet detector test cfg/voc-mnist.data cfg/tiny-yolo-mnist.cfg weights/tiny-yolo-mnist_500000.weights ~/MNIST-TrainDataForYOLO/JPEGImages/60015.jpg

なんで、こんな感じで識別できます。

学習済のモデル

学習すると時間かかるんで、学習済みの重みもGitHubに置いときました。 https://github.com/uchidama/MNIST-TrainDataForYOLO/blob/master/weights/tiny-yolo-mnist_500000.weights

参考

pjreddie.com

github.com

KerasのMNISTデータをJPEGに書き出す簡単サンプル

https://gyazo.com/d7b0564823a7628c2dbd60d275b544af

MNISTをサンプルの学習データ作りで画像に書き出したかったんで、やってみました。

ソースコード

Keras使ってるんでシンプルに出来てます。

ついでにFashion-MNISTも書き出してみる

https://gyazo.com/06f71fd2d18e5659b2a8abeaf05d793d

まぁついでなんで、ちょっとだけ書き換えてやってみました。

参考

euglena1215.hatenablog.jp

参考になりました!ありがとうございますー。

ウェブカメラの画像をVGG16で画像認識させる簡単サンプル

https://gyazo.com/51fd1b091b0e80ae204054815a895fbf

Kerasにはダウンロードできる学習済みモデルがあることに気がついて
「あ、これにウェブカムからの画像を入れれば色々認識できるじゃん?」
と思い、作ってみました。

VGG16とは

ソースコード

jupiter notebookで作ってます。
ウェブカメラの画像を出したら、上の停止ボタン(■ボタン)を一回押すと写真が撮れるので、そこから再生ボタン(▶︎ボタン)を押して処理を進めてください。

エレキギター、綺麗に認識したなぁ。

いろいろ試してみた

f:id:uchidamax:20180213014600p:plain
象のフィギアがあったんで撮ってみました。
認識結果は微妙に惜しいですね。

f:id:uchidamax:20180213014820p:plain
カメラは上手くいってる。

f:id:uchidamax:20180213014903p:plain
ショベルカーのおもちゃ。
チェンソー、パワードリルと工具系っていうのは系統としてあってる。

f:id:uchidamax:20180213015047p:plain
ハサミ。
ハードディスクと認識。写真の裏にMIDIコントローラーの裏のシルバーを使ってるせいでラップトップとかソレ系と認識してるんだろう。

f:id:uchidamax:20180213015223p:plain
ボールペンは認識成功。

f:id:uchidamax:20180213015247p:plain
SDガンダムのプラモ。warplaneは、ちょっと惜しい。

参考

aidiary.hatenablog.com

無茶参考になりました。ありがとうございます!

Applications - Keras Documentation

ImageNet

ウェブカメラの画像をCIFAR-10で学習したニューラルネットワークで画像認識させる簡単サンプル

https://gyazo.com/308fbe9513a88fc7e943b50f8ecf0598

ウェブカムからの画像を識別するのを作ってみるかなと思いやってみました。
CIFAR-10のクラスラベルは次の10クラス。

  • [0] airplane (飛行機)
  • [1] automobile (自動車)
  • [2] bird (鳥)
  • [3] cat (猫)
  • [4] deer (鹿)
  • [5] dog (犬)
  • [6] frog (カエル)
  • [7] horse (馬)
  • [8] ship (船)
  • [9] truck (トラック)

なので、この10クラスのうちのどれかが認識できるということになります。

ソースコード

jupiter notebookで実行してください。
ウェブカムのプレビューがされたら、写たいものを写して■ボタンを押す。その後▶︎ボタンで先に進んで実行してください。

こちらがミニカーを写して認識させてみた例。

こちらが飛行機のおもちゃを認識させてみた例。
上のミニカーとソースコードは同じ。

GitHub

github.com

このリポジトリに学習済みのモデルデータふくめ一通り入ってます。

参考

medium.com

Thanks!

Kerasデータセットのロイターニュースワイヤーの元文章を表示する簡単サンプル作ったが、トピックのラベルが謎

https://gyazo.com/9418a0142b54e82e5b7718e4b44b2141

ロイターのニュースのデータもKerasに入ってることに気がついたんで、元文章の表示プログラムを書いてみました。

ロイターのニュースワイヤートピックス分類データセットとは

  • 46のトピックにラベル付けされた,11228個のロイターのニュースワイヤーのデータセット
  • IMDBデータセットと同様、ニュース文言は前処理済みで,各レビューは単語のインデックス(整数)のシーケンスとなっている
  • 単語はデータセットにおいての出現頻度によってインデックスされている。そのため例えば,整数"3"はデータの中で3番目に頻度が多い単語である
  • トレーニングデータが8982個、テストデータが2246個

ロイターニュースの元文章を表示するソースコード

IMDBと一緒なんで表示自体は瞬間的にできたんですが、ハマったのがラベル。

ロイターデータセットのラベルの数字は何なの?

ラベルの数字(y_train、y_test)を、これが指すトピックの文言に変換して表示するようにしようと思ったんです。なんでネットをいろいろ検索してみたんですが、この数字が何に対応しているのかサッパリわからない。1時間くらい粘ってあきらめました。

stackoverflow.com stackoverflowの質問も、なぜかスルーされてる。

誰か知ってる人、教えてください〜。

参考

データセット - Keras Documentation

uchidama.hatenablog.com

IMDBを畳み込みニューラルネットワーク他で判定する簡単サンプル

https://gyazo.com/da61ade299139b71499ec87572a8ad86 KerasにはIMDBの学習を行うサンプルが5個も入ってます。
なので、せっかくだから作ってみました。

IMDBの学習方法

Kerasのexamplesの中に

  • imdb_lstm.py (LSTM)
  • imdb_fasttext.py (FASTTEXT)
  • imdb_cnn.py (CNN)
  • imdb_cnn_lstm.py (LSTM)
  • imdb_bidirectional_lstm.py (Bidirectional_LSTM)

と5つ、学習を行うコードが入っています。
このコードにモデル保存を追記しIMDBを学習させます。
この部分のコードについては、このブログエントリーでは触れません。
後述のGitHubリポジトリにコードが入っていますので、そちらを参照してください。

学習したモデルを読み込んでIMDBを識別するコード

jupyter notebookで使えます。
コード内のprediction_mode変数の値を切り替えることで、読み込む学習済みモデルを変更することができます。

GitHubリポジトリ

ここに全てのコード、バイナリが入っています。

github.com

学習モデルの比較

学習ログから、テストデータの正答率(val_acc)を比較したところimdb_fasttext, imdb_cnnの順で成績が良かった。

5つの学習モデルのログは、こちらのGoogleスプレッドシートで見ることができる。

Train-Log-IMDB-Prediction-In-Keras

参考

abdel.me

データセット - Keras Documentation