コインの画像分類

公開日:2019-04-23
最終更新:2019-04-27

アルバイトで骨董品を使ってるので、コインの状態によって画像分類を行うプログラムを作ろうとしている。

現在の古銭はプロの鑑定士が傷や汚れを見てグレーディングを行っている。

そこで、Fastaiを勉強するついでに画像分類を行ってみようという事で、適当に書いてみた。(実際はopenCVとかで傷や汚れを検出した方がいい気もするが)

なお、実際のグレーディングは20種類ほど(PR,MS,XF,...etc)だが、今回は大きく3種類の物に分けるものを作った。

fastai 1.0.51を今回は使っている。
データは鑑定サイトからクローリングしてきた約47000件の画像。
本来はカテゴリ数が20個くらいだが、今回は3種類('GFVGVF','MS', 'XF-AU')

import fastai  
from fastai.vision import *  
%matplotlib inline  

とりあえず初めにimportして、inlineの奴を書いとく

path = 'C:/Users/path/to/train'  
bs = 16   # uncomment this line if you run out of memory even after clicking Kernel->Restart  

trainデータのある所へのパスと、バッチサイズを指定しておく。

tfms = get_transforms(do_flip=False)  

get_transform()はImageListにして、読み込むときに画像を回転させたり適当に変化させて計算してくれるやつ。(うろ覚え)
ここでは回転させないようにしている

data = (ImageList.from_folder(path)  
        .split_by_rand_pct(0.2)            
        .label_from_folder()  
        .transform(tfms, size=256)  
        .databunch(bs=bs)  
        .normalize(imagenet_stats))  

ImageListとDatabunchの違いは忘れたので、各自確認してください。

split_by_rand_pct(0.2)は20%を評価データにする
label_from_folderはフォルダー名をラベルにする
transform(tfms, size=256)はtfmsの通りに画像を変化させて、256×256の大きさで画像を読み込む
databunchはバッチサイズ
normalize(imagenet_stats)はImageNetから得られた統計量(?)で正規化をする

dataの中身はこんな感じ

ImageDataBunch;
Train: LabelList (38242 items)
x: ImageList
Image (3, 256, 256),Image (3, 256, 256),Image (3, 256, 256),Image (3, 256, 256),Image (3, 256, 256)
y: CategoryList
GFVGVF,GFVGVF,GFVGVF,GFVGVF,GFVGVF
Path: C:\Users\antylink\Desktop\深澤用\fastai_train\train水増し2;
Valid: LabelList (9560 items)
x: ImageList
Image (3, 256, 256),Image (3, 256, 256),Image (3, 256, 256),Image (3, 256, 256),Image (3, 256, 256)
y: CategoryList
MS,GFVGVF,GFVGVF,MS,GFVGVF
Path: C:\Users\antylink\Desktop\深澤用\fastai_train\train水増し2;
Test: None

実際の画像はこんな感じ

data.show_batch()  

get_transforms(do_flip=False)にしたのに画像が傾いてたりするのは、データを水増しするときに自分で傾けたから。

learn = cnn_learner(data, models.resnet101, metrics=accuracy)  

CNNモデルを作成。resnet34, 50, 101, 152なら簡単に使える。他にもwideresnetやunet、darknetとかも簡単に使える。

それぞれで適当に比較したところ、152よりも101の方が精度がよさそうだったので今回はresnet101で行ってみた。

learn.fit_one_cycle(3, 1e-3, wd=0.4)  

Jeremy Howardが学習率を1e-3にしておけば大体いい感じの物が得られると言っていたので、learn.lr_find()をしないでとりあえず1e-3でfitさせてみた。

結果は…

91.4%の精度を叩き出せた

混合行列を見てみる。

XF-AUのカテゴリの精度があまりよくない。

とりあえず今後の方針は、XF-AUのデータ数を増やす事と、あまりデータの質が良くないと思うのでそれを整理する事かな…。

追記(2019/4/27):
実際のデータを色々使って予測したところ、80%位の精度になりました

記事が少しでもいいなと思ったらクラップを送ってみよう!
29
+1
大学生の書きなぐりブログ 間違ってる事も書いてるので自己責任で勉強しましょう

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする