コンピュータビジョンラボ:JupyterLab でピクセル、しきい値、物の数え方

このラボは、生徒ひとりひとりに専用の JupyterLab を渡します。Python の画像用ライブラリが最初から入っています。画像を開いて変える Pillow、数のための NumPy、輪郭、ラベルづけ、一致の探索のための scikit-image です。作業フォルダーには、ラボ自身が描く5枚の画像、コイン、図形、道路、ページのスキャン、グレーの階調と、最初のノートブック、ひとつの考えにつき1本の短いスクリプトが入っています。

これは攻撃のラボではありません。どのコピーもインターネットにも、ほかの生徒にも届かないので、何かをダウンロードすることも、中から誰かに届くこともありません。ニューラルネットワークは使わず、ふつうのピクセルでコンピュータビジョンの土台になる考え方を学びます。OpenCV は入っていません。

生徒が学ぶこと

画像は数字の格子だということ。大きさ、モード、1つのピクセルの値。次に、色をグレーにして、各帯に入るピクセルを数えます。しきい値を選んで暗いものと明るいものを分け、ある段階ならノイズのある背景から9枚のコインが分かれ、別の段階ではそうならないことを確かめます。ページのスキャンをぼかして細かい点をおさえ、輪郭を見つけ、ラベルづけで物を数え、大きさを変えたり切り取ったりしてファイルの大きさがどう変わるかを見て、テンプレートマッチングで画像の中から一部分を見つけます。コンピュータビジョン、画像処理、応用数学の入門に向いています。正確な表現はご自分の認定機関の単元で確かめてください。ここでは何も引用していません。

ブラウザーで動かす

ラボは、サービスをひとつ、jupyter だけ起動します。画像を描き、ノートブックと短いスクリプトを作業フォルダーに書き出して、数秒で準備が整います。サービスに許される 512 MB の中で動きます。JupyterLab はトークンを求めません。プラットフォームの入り口が、誰が開いているかをすでに知っているからです。ラボのとなりのターミナルには Python がないので、docker exec jupyter のあとに中で動かすコマンドを続けて、ラボの Python を使います。どのスクリプトも毎回同じ結果を表示し、役に立つところでは画像を保存します。生徒はそれを JupyterLab で開きます。

  1. コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
  2. ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。JupyterLab:Pillow と scikit-image でコンピュータビジョンを探します。
  3. 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
  4. 開く. ラボのページで、ラボのバーに JupyterLab というリンクがあります。それを押してブラウザーで JupyterLab を開き、images フォルダーを見て、start.ipynb をダブルクリックします。次に「ターミナルを開く」を押して docker exec jupyter python3 steps/count.py と入力するとコインを数えます。答えは 9 個で、ラボが描いた9枚のコインが、3つの大きさで見つかります。

生徒に提出させるもの

画像のどれかについて、自分で選んだ問いに答える、自分のノートブックです。たとえば、しきい値を超えるピクセルはいくつか、なぜその段階を選んだか、ぼかしでページのスキャンの細かい点がどれだけ減るか、光がむらなスキャン全体で1つのしきい値がうまくいくか、などです。JupyterLab から File、Download でダウンロードします。そして、見つけたことと、目で確かめたことを、自分の言葉で一、二文書きます。自動で採点されるものはありません。その文が、理解できたかどうかを示します。もっと力のある作品には、画像のとなりに描いたマスクと、目に見える数と比べた数え方を求めましょう。

このラボで進める基本のレッスン

Computer Vision Basics は、このラボの中で進める小さなレッスンです。生徒は画像を一覧にし、ピクセルを読み、画像をグレーにして、3つのしきい値を試し、ノイズのあるスキャンをぼかし、ラベルづけでコインを数えてから、同じ作業を最初のノートブックで開きます。

わざと小さくしてあります。ラボの中で進めるレッスンとはどういうものかを先生に見せるのが役目で、あとはラボが担います。変更したいときは、ご自分のモジュールにコピーしてください。

GitHub のコード

compose ファイルに Dockerfile はありません。公開されているイメージをひとつ、Jupyter Docker Stacks の scipy-notebook を、日付つきのタグに固定して、特権のない専用のアカウントとメモリー 512 MB で動かします。イメージのライセンスは BSD-3-Clause で、私たちが配布しているものではありません。画像は起動時に決まった乱数の種から描くので、どのコピーも同じ数になり、何もダウンロードしません。限界も正直に書いておきます。画像は小さな作りもので、カメラも写真もなく、GPU はなく、インターネットから何もインストールできず、手法は昔からあるもので、ニューラルネットワークではありません。ラボを止めると何も残らないので、生徒は先にノートブックをダウンロードします。

課題として出す

課題には何を提出するかを書いておきます。

  1. ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-computer-vision とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、たとえば別の画像を描かせたいときは、先にリポジトリをフォークしてください。
  2. 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
  3. 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
  4. 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。

このラボを試す、そして費用

無料の個人アカウントで、このラボの基本レッスンに取り組めます。毎月、ほとんどのレッスンに足りる無料クレジットがあり、カードは要りません。クラスで使う場合、学校は最初の365日間、生徒50人まで無料で、その後は生徒1人あたりの年額です。すべてのラボが含まれ、教職員は無料です。

よくある質問

トークンやパスワードを入力しなくてよいのはなぜですか。
ラボのウェブページには、プラットフォームの入り口を通らないと届きません。入り口はあなたが誰かを知っていて、あなたとモジュールの先生だけを通します。そのため JupyterLab はトークンなしで起動しています。ほかの人が届くマシンでは、この設定で動かさないでください。
ターミナルで docker exec jupyter を使うのはなぜですか。
ラボのターミナルには curl、psql などのクライアントがありますが、Python はありません。docker exec jupyter はラボのコンテナーの中でコマンドを実行し、そこには Python とすべてのライブラリがあります。JupyterLab には File、New、Terminal から開ける専用のターミナルもあります。
生徒が自分の写真を使えますか。
生徒は自分のコンピュータから JupyterLab に画像をアップロードでき、同じスクリプトでそれを開けます。ただしラボは何もダウンロードせず、コピーはインターネットに届きません。このページの数は、ラボが描く画像についてのものです。それを変えるには、リポジトリをフォークし、compose ファイルが描く方法を変えて、そのフォークをラボとして設定してください。