Skip to content

Latest commit

 

History

History
117 lines (105 loc) · 4.67 KB

README.md

File metadata and controls

117 lines (105 loc) · 4.67 KB

IkaMeterTrainingAssistant

  • スプラトゥーン2の試合中に表示されるイカメーターの生存アイコンを検出する、分類器を生成するリポジトリです
  • このリポジトリには、正解要素のマーキングを支援WEBアプリと、opencv_traincascadeへの入力データを生成する機能を同梱しています

image image image image

  • 実際に生成した分類器の結果です。精度(体感)は80%くらいです。過学習している気がするし、パラメータ調整の試行錯誤が足りない気もする

TODO

使い方

  • bundle install
  • install [email protected]
  • リストアする
  • bundle exec rails s
  • ブラウザを開いてマーキングする
  • bundle exec rails r Build.execute && bundle exec rails r "Create.execute true" | sh
  • tmp/model/cascade.xml を使う

運用

ダンプ

bin/dump_db.sh

リストア

bin/restore_db.sh

画像を取り込む

Dir.glob("#{Rails.root}/lib/assets/20210521/*jpg").map.with_index(1) do |filename, index|
  file = File.open(filename)
  digest = Digest::MD5.hexdigest(file.read)
  if Dataset.find_by(digest: digest)
    Rails.logger.warn "skip!!!!!!!!!"
  else
    name = "#{Time.now.tap { |x| break "#{x.to_i}#{x.usec}" }}.jpg"
    file.rewind
    Dataset.create(image: { io: file, filename: name }, digest: digest )
  end
end

このリポジトリで生成した分類器を使って、あらかじめマークした状態で画像を取り込む

min = OpenCV::CvSize.new(64, 64)
scale_factor = 1.1
detector = OpenCV::CvHaarClassifierCascade::load("#{Rails.root}/ika-meter-training-assistant/tmp/model/cascade.xml")
Dir.glob("#{Rails.root}/lib/assets/0531/*.jpg").map do |filename|
  file = File.open(filename)
  digest = Digest::MD5.hexdigest(file.read)
  if Dataset.find_by(digest: digest)
    Rails.logger.warn "skip!!!!!!!!!"
  else
    image = OpenCV::CvMat.load(filename).copy
    croped_image = Crop.ikatako_meter_with_padding(image)
    name = "#{Time.now.tap { |x| break "#{x.to_i}#{x.usec}" }}.jpg"
    file.rewind
    ActiveRecord::Base.transaction do
      ImageProcessor::DeathMarkOverrider.new(croped_image).override!
      dataset = Dataset.create!(image: { io: file, filename: name }, digest: digest )
      detector.detect_objects(croped_image, min_size: min, min_neighbors: 5, scale_factor: scale_factor).each do |rect|
        dataset.dataset_temporary_positions.create!(x: rect.top_left.x + 450, y: rect.top_left.y, width: rect.bottom_right.x - rect.top_left.x, height: rect.bottom_right.y)
      end
    end
  end
end

cascade.xml を出力する

# DBからpositive.datを生成
be rails r Build.execute

# トレーニング
be rails r "Create.execute true" | sh

Links