高専プロコン選手権の「人力」を推理してみる

正式名は「全国高等専門学校プログラミングコンテスト」と言うらしく、ロボコンのプログラミング・バージョンのようです。とは言うもののHPを見ると今年で23回目となっており、なかなか由緒ある大会のようです。課題部門は、

    課題部門 (「ICTでサポートする明るい少子高齢化社会」をテーマにした作品)
    自由部門 (自由なテーマで独創的な作品)
    競技部門 (与えられたルールによる対抗戦)
この3つとなっています。今日ご紹介したいのは競技部門です。実はこの競技部門ですが、こういう情報が流れてちょっとした騒ぎになったそうです。

プログラミングコンテスト決勝 1位「人力で数えた」 2位「判定できなくて経験で入力した」 3位「1位と同じです」 4位「1位と同じです」 5位「会場でプログラムキツイわ」 6位「1位と(ry」

でもって興味はどうやって「人力」で数えたんだろうです。だからどうしたと言うわけではありませんが、妙に面白かったと言うか、方向違いですが青春の思い出がふと甦るような気がしたので取り上げてみます。


競技の概要

詳しくはコチラに書いてあるのですが、簡単にはテーブルに大・中・小の3種類のサイコロが山積みされます。さらにオブジェクトと呼ばれる障害物も配置されます。オブジェクトとはどんなものかですが、

オブジェクトの表面は,一様でない模様や鏡面もあります。

でもって決勝のテーブルの上はどんな様子かと言えば、

真ん中の黒い物体は石炭だそうです。ちなみにテーブルはもう一つあり、そちらの方はシャケをくわえた木彫りのクマでした。これを回りから見て数えるのですが、
こういう感じです。でもって競技時間は、

  • 1調査エリアの「調査制限時間 」は,1分間です。つまり1つのフィールドあたり3分, 1試合の調査制限時間は合計6分です。また,フィールド間の移動時間は1分あります。
  • 問題ごとに「分析制限時間」 (1分以上3分以下)を設定します。

どうも6分割された調査エリアから1分で画像を撮影し、一つのフィールドの調査(3エリア計3分)が終る毎にこれを3分で分析して解答を出すと言う事のようです。もちろんこんな短時間で分析するわけですから、課題は前もって発表され、解析プログラムとか調査機器をそろえて大会に臨むわけです。

それとこれも重要なヒントですが、

  1. 数える調査対象物。サイコロは白色で,1が赤目,その他 (2〜6) が黒目。が黒目。サイコロは大きさの違3種類存在し,小サイズ は(一辺が6mm程度で,重さが0.3g程度),中サイズ(一辺が10mm程度で,重さが1.3g程度)),大サイズ(一辺が16mm程度で,重さが5.6g程度 )です。
  2. 各フィールドの山積みされたサイコロ総重量も,公表されます。ただし測定精度は 0.1g程度の誤差を含み,サイコロ自体の重さにもばらつきがあります。

決勝のサイコロの総重量は2130gと2273gと発表されています。


推理遊戯

私なりに戦略を考えて見ます。これも競技規定ですが、テーブルの高さは70cmで、撮影高度は2mまでとなっています。これは真ん中のオブジェクトを越えての全景撮影を行わせないためのものと考えられます。それと競技の趣旨も予め発表されています。

今回のプログラミンコテスト・競技部門は,サイコロの山から,コンンピュータとデジカメ等の調査用機材を活用してその山に埋もれいるサイコロ個数を,できるだけ,正確にしかも早く数えたチームが勝利する競技です。コンピュータによる画像解析は,「見つけ」 「識別する」「数える」など複雑 な作業を画像処理によって実現する複合技術です。

この競技のポイントとしては、

  1. 見えるサイコロ
  2. 見えないサイコロ
この2種類が存在する事です。そうなると競技の趣旨からも正攻法は、
  1. 見えるサイコロを画像解析プログラムで出来るだけ正確に数える
  2. 見えないサイコロは、見えたサイコロの数の重量と3種類の比から推測
答えにより正確に近づくには、見えるサイコロの数を出来るだけ多く数えるのがポイントであると感じます。見えないサイコロの概算は表計算ソフト程度で十分に可能ですし、電卓でも、算盤でも、手計算でも可能です。普通はこう考えますし、そう考える様に主催者も設定したと思われます。ですから主催者も見えるサイコロを出来るだけ数え難い設定を課題に行ったと考えます。

最近のこの手の技術の進歩は凄いので、基本的に画像から3種類のサイコロを数える技術は高専レベルで十分あると見ます。問題になりそうなところは、

  1. 処理時間
  2. オブジェクト対策
この2つが直感的に上ってきます。とりあえず処理時間を考えると、あんまり知識が無いので憶測ですが、精度を上げるために条件設定を多くすれば時間が長くなり、制限時間に間に合わないが出てきそうはありそうな気がします。とりあえず1面だけの画像処理では、見えているサイコロは全部数えられないので、最低でも2面、オブジェクトによっては3面の画像処理が必要になります。

制限時間は3分なので、見えないサイコロの概算を行う時間を30秒ぐらいは残したいところです。そうなると2分半以内に2面もしくは3面の画像処理が必要になります。そうなれば3面なら1面に付き50秒以内になります。これは結構な関門と思います。オブジェクトも「置く」とはなっていますが、一つなのか複数なのか、また鏡面もアリとなっていますから、画像処理から瞬時に省く処理が求められます。

もう一つ非常に難しそうなポイントがあります。2方向なり、3方向で全景が確認できるとしても、境界処理をどうするかです。完全に裏と表状態なら独立して処理できますが、実際は重複して写る部分があり、これの二重カウントを避ける必要があります。ここもオブジェクトの問題が出現し、オブジェクトの大きさ、形、色が事前にわかっていれば、一方向から見えない部分を設定して他方向の画像で補うのは可能かもしれませんが、オブジェクトは競技直前に発表です。

そうなれば画像処理として

  1. 画像からオブジェクトの大きさを割り出す
  2. 一方向から見えない部分の情報を割り出す
  3. 他方向からの画像で「見えていない」部分を補う
技術的には可能そうですが、画像解析時間は3分しかありません。


でもって散々シミュレーションはやったとは思っています。しかし画像の条件が少し変わっただけでも計数精度は大きく変わり、だからと言ってプログラムの条件設定を多くすれば処理速度の問題にぶち当たるみたいな感じを想像します。ある画像条件なら上手く言っても、ちょっと条件が変わると精度ガタ落ちみたいな様相でしょうか。

「そこを創意と工夫で突破する事に意義がある」と言えばそれまでですが、出てきた結論は「とりあえず無理だ!」です。一方でコンテストは勝つのも目的ですから、正攻法をあきらめて搦手から課題を考え直したように思います。出てきた戦略は、

    とにかくサイコロを数えるのが勝負だ!!
アテにならないPCによる画像分析よりも人力でやる方が、条件変化に遥かに強いです。そうなると戦術は野鳥の会作戦になります。様々な条件で撮影した画像で、サイコロを早く数えるトレーニングです。人間トレーニングすれば、結構早く数えるようになれます。また画像もプリントアウトする時間も惜しいと考えられますから、ひたすらモニター上で数えるです。

どうも1チーム3人のようですから、3種類のサイコロを1人ずつ担当し、画面の見えるだけのサイコロをとりあえず数えるです。人力でも複数画面の重複部分の処理は厄介ですから、3方向の画像の一番良く見えるのを選んでひたすら数える作戦です。こういうトレーニングを大会前にひたすら行なったんじゃないかです。2位チームのコメントが興味深かったのですが、

    「判定できなくて経験で入力した」
これは人力カウントのトレーニングを積んでいるうちに、見た目だけでおおよその比率が直感的に判るようになった成果じゃないでしょうか。「こういう見え方なら、○:△:□ぐらい」だです。人間の感覚は鍛えればそれぐらいの領域に達します。


面白いと思ったのはそういう人力戦術を上位チームがそろって採用していた事です。つうか正攻法で勝負したチームはあったんでしょうか。あったかもしれませんが、ツイッター情報では決勝に残れていません。つまりあったとしても人力戦術には敵わないレベルでしかなかったです。

で個人的に最大の疑問なんですが、課題の設定レベルは果たして高かったのか、そうでもなかったのかです。高すぎたのなら主催者側の問題ですし、そうでもなかったのなら高専生のレベルの問題になります。まあ、それより人力でカバーできる課題であったのが問題だったと言えなくもありませんが・・・

私なら勝利のために人力を選びたくなるような課題であるとは感じました。高専生ぐらいなら課題のクリアに熱中するより「どうしたら勝てるか」に重点が置かれるのは自然と思うからです。奇策であろうが裏技であろうが、ルール内で勝てる方法があれば採用するです。そこに青春時代の熱さをふと感じた次第でございます。


追記:決勝結果

御参考までに、