Aidemy研修生のなかのです。

 

画像を用いた何かを作りたいと考えていたのですが、趣味が料理なので、パスタ識別器を作ってみようと思いました。

 

画像はflickrで集めたのですが、思いの他に画像が集まらなかったため、カルボナーラボンゴレ、トマトソースの三種類の識別を行いました。

コードはFlickr APIを使って画像ファイルをダウンロードする

を参考にしました。

>|python|

pasta_set = ['carbonara','vongole','tomatosauce']

||<

としてこれらのワードに'pasta'を加えたものを検索キーワードとして160枚ずつ集めました。うち48枚ずつはテスト用に用いました。

 

学習に関しては、一から学習させる時間がなかったため、手元にあったAlexNetを土台に学習を行いました。

f:id:masa-nakano1015:20180530153805p:plain

AlexNetは最後が1000ラベルなのですが、この1000次元ベクトルを隠れ層一層のニューラルネットの入力として用いました。

 

>|python|

class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.linear1 = nn.Linear(1000,500)
self.linear2 = nn.Linear(500,3)

def forward(self,x):
x = torch.tensor(x)
x = nn.functional.relu(self.linear1(x))
out = self.linear2(x)
out = out.view(1,-1)
return out

||<

 

損失関数はnn.CrossEntropyLoss()、学習率は0.0005に設定しています。

 

4万エポックの学習後、以下のようになりました。

f:id:masa-nakano1015:20180530153942p:plain

 

性能評価を行なった結果、正答率は54.16%になりました。微妙ですね。もう少し学習すれば正答率が上がる気がします。

>|python|

for img_data, pasta_id in test_dataset:
with torch.no_grad():
out = model(img_data)
index = torch.max(out,1)
index = index[1].item()
if index == pasta_id:
correct += 1
else:
miss += 1

||<

また、今回は料理以外にもテーブルなどが写り込んでいる画像も用いていたり、

f:id:masa-nakano1015:20180530154623j:plain

料理も上から撮っていたり横から撮っていたりで、バラバラだったので、皿を検出して

f:id:masa-nakano1015:20180530154719j:plain

こんな感じの画像のみで学習を行えば良さそうな気がします。