画像の分類作業を手助けしてくれるRailsアプリ(手動)を作ったよ
やったこと
3000枚超の画像をbingからスクレイピングして、顔の部分だけ切り取って保存し直すというところまできました。
あとは目視でその顔画像が誰の顔なのかを分類していく訳なのですが、これがめちゃくちゃ辛かったです。
まずは2つのフォルダを並べてドラッグ&ドロップでやっていこうと思いましたが、
顔の画像が小さすぎて誰か判別できないし、そもそもドラッグ&ドロップという作業が結構めんどくさい。
ということで、この画像の分類作業を(少しだけ)手助けしてくれるアプリをRuby on Railsで書きました。
環境構築
今回作ったアプリは、サーバ上に置いて公開するようなものではないのでローカルで環境構築しました。
Macの方は、こちらのQiitaの記事で本当に爆速で環境構築できます。
Windowsの方はMac買ってください。
Linuxの方は頑張ってください。
作ったもの
ブラウザに画像をでっかく表示させて、ボタンをクリックするだけで指定しておいたフォルダに入れてくれます。
主なコード
構成については、'home'という名前のコントローラに'show'と'update'という2つのアクションがあり、それらに処理を定義しています。
class HomeController < ApplicationController def show @keywords = { "ririan" => "伊藤理々杏", "rentan" => "岩本蓮加", "minamin" => "梅澤美波", "momochan" => "大園桃子", "kubochan" => "久保史緒里", "tamachan" => "阪口珠美", "denchan" => "佐藤楓", "renochan" => "中村麗乃", "hazukichan" => "向井葉月", "miichan" => "山下美月", "ayaty" => "吉田綾乃クリスティー", "yodachan" => "与田祐希" } @file = nil image_dirs = Dir.glob("#{Rails.root}/app/assets/images/face_images/*") until image_dirs.empty? do image_dir = image_dirs.find_all.first @file_cnt = Dir.entries(image_dir).size - 2 if @file_cnt == 0 image_dirs.delete(image_dir) Dir.rmdir(image_dir) else files = Dir.glob("#{image_dir}/*") @file = files.find_all.first break end end end def update prefix = params[:prefix] file = params[:file] extension = file.split(".")[-1] save_dir = "#{Rails.root}/app/assets/images/classified_face_images/#{prefix}_img" if prefix == "other" File.delete file flash[:notice] = "ファイルを消去しました" else if Dir.exist?(save_dir) else Dir.mkdir(save_dir) end cnt = Dir.glob(save_dir + "/*").count new_file = save_dir + "/#{prefix}-#{cnt+1}.#{extension}" FileUtils.cp file, new_file File.delete file flash[:notice] = "ファイルを分類しました" end redirect_to "/" end end
ちなみにルーティングはこんな感じです。
Rails.application.routes.draw do get '/' => "home#show" post '/' => "home#update" end
分類を終えて
手作業には変わりないのでめちゃくちゃ辛かったです。
あと顔の画像だけで誰であるかを判断するのって、人間にとっても意外と難しいんなと感じました。
人間は(たぶん)髪型、行動、仕草、振る舞いなどの様々なファクターで個人を特定しているので、そういうのも人工知能に組み込めたらヤバイなと思いました。
もしかしたらもうあるかも。
次はいよいよTensorFlow使って学習させよう。