hoshimure-47’s blog

プログラミング修業中の人

画像の分類作業を手助けしてくれるRailsアプリ(手動)を作ったよ

前回前々回の記事の続きです。

やったこと

3000枚超の画像をbingからスクレイピングして、顔の部分だけ切り取って保存し直すというところまできました。
あとは目視でその顔画像が誰の顔なのかを分類していく訳なのですが、これがめちゃくちゃ辛かったです。
まずは2つのフォルダを並べてドラッグ&ドロップでやっていこうと思いましたが、
顔の画像が小さすぎて誰か判別できないし、そもそもドラッグ&ドロップという作業が結構めんどくさい。
ということで、この画像の分類作業を(少しだけ)手助けしてくれるアプリをRuby on Railsで書きました。

環境構築

今回作ったアプリは、サーバ上に置いて公開するようなものではないのでローカルで環境構築しました。
Macの方は、こちらのQiitaの記事で本当に爆速で環境構築できます。
Windowsの方はMac買ってください。
Linuxの方は頑張ってください。

qiita.com

作ったもの

ブラウザに画像をでっかく表示させて、ボタンをクリックするだけで指定しておいたフォルダに入れてくれます。

f:id:hoshimure-47:20171004115948p:plain

主なコード

構成については、'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使って学習させよう。

github.com