{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "intro",
   "metadata": {},
   "source": [
    "# 15　自分の画像を教材にする\n",
    "\n",
    "FUJIMOTO LAB 深層学習コース。Web教材の図と説明を読んでから実行してください。Pythonの計算はColabの実行環境で行います。\n",
    "\n",
    "**この回の目標**：画像フォルダとラベルの対応を説明できる\n",
    "\n",
    "このノートブックは小さな合成データを使用し、元の教材の固定Driveパスや動画を必要としません。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "predict",
   "metadata": {},
   "source": [
    "## 1　まず予想する\n",
    "\n",
    "コードを実行する前に、表示される値や形を予想してください。"
   ]
  },
  {
   "cell_type": "code",
   "id": "demo-one",
   "metadata": {},
   "source": [
    "from pathlib import Path\n",
    "root = Path('/content/demo_images')\n",
    "for name in ['vertical','horizontal']:\n",
    "    (root/name).mkdir(parents=True,exist_ok=True)\n",
    "print([p.name for p in root.iterdir()])"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "explain-one",
   "metadata": {},
   "source": [
    "**確かめ方**：フォルダ名が分類の種類を表します。ノートブックでは自動生成した小さな画像を入れます。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "part-two",
   "metadata": {},
   "source": [
    "## 2　読み込む前に点検\n",
    "\n",
    "クラス数と各クラスの枚数を数え、数件を目で確認してから学習へ進みます。"
   ]
  },
  {
   "cell_type": "code",
   "id": "demo-two",
   "metadata": {},
   "source": [
    "print({p.name:len(list(p.glob('*.png'))) for p in root.iterdir()})"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "explain-two",
   "metadata": {},
   "source": [
    "**結果を読む**：今は空なので0枚です。ノートブックの次のセルで画像を生成します。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "experiment",
   "metadata": {},
   "source": [
    "## 3　値を変えて比べる\n",
    "\n",
    "次のセルでは、表示される値や条件を変えて、何が結果を決めるかを確かめます。長くかかる実験は、少数の合成データで行います。"
   ]
  },
  {
   "cell_type": "code",
   "id": "lab",
   "metadata": {},
   "source": [
    "# ノートブックだけで試せるよう、2種類の小画像を作る\n",
    "from PIL import Image\n",
    "import numpy as np\n",
    "for name in ['vertical','horizontal']:\n",
    "    for i in range(4):\n",
    "        picture = np.zeros((16,16),dtype=np.uint8)\n",
    "        if name == 'vertical': picture[:,4+i] = 255\n",
    "        else: picture[4+i,:] = 255\n",
    "        Image.fromarray(picture).save(root/name/f'{name}_{i}.png')\n",
    "print({p.name:len(list(p.glob('*.png'))) for p in root.iterdir()})\n",
    "print('フォルダ名が答えですが、実物の写真では背景の偏りも点検しましょう。')\n"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "extra-guide-1",
   "metadata": {},
   "source": [
    "## 追加実習 1　実物とラベルを一緒に確認\n",
    "\n",
    "フォルダ名だけで正しいラベルと思い込まないよう、少なくとも数枚を見て確かめます。\n",
    "\n",
    "**実行前に予想**：何が変わり、何が変わらないでしょうか。"
   ]
  },
  {
   "cell_type": "code",
   "id": "extra-code-1",
   "metadata": {},
   "source": [
    "from IPython.display import display\n",
    "for name in ['vertical', 'horizontal']:\n",
    "    sample_path = sorted((root/name).glob('*.png'))[0]\n",
    "    print('ラベル:', name, '画像:', sample_path.name)\n",
    "    display(Image.open(sample_path))\n"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "extra-reflect-1",
   "metadata": {},
   "source": [
    "**確認**：予想と違った点を一つ書き、値を一つ変えて再実行してください。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "reflection",
   "metadata": {},
   "source": [
    "## 自分の言葉で答えよう\n",
    "\n",
    "片方だけ青背景の写真で学習したら？\n",
    "\n",
    "- まず予想を書く\n",
    "- コードのどの行が答えを決めるか指す\n",
    "- 条件や値を1つ変えて、予想と実行結果を比べる\n",
    "\n",
    "**ヒント**：対象ではなく背景で分類してしまう可能性があります。"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "name": "15-own-images.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
