﻿=========================================================================# 写真データをダウンロードしよう
import os
import urllib.request
import zipfile


# ダウンロード先のURLと保存ファイル名を指定
url = "https://github.com/kujirahand/fruits_db/archive/refs/tags/1.0.0.zip"
zip_path = "fruits_db.zip"
extract_dir = "./"


# ZIPファイルをダウンロード
print("Downloading...", url)
urllib.request.urlretrieve(url, zip_path)
print("Downloaded:", zip_path)


# 解凍先ディレクトリを作成
os.makedirs(extract_dir, exist_ok=True)


# ZIPファイルを解凍
with zipfile.ZipFile(zip_path, "r") as zf:
   zf.extractall(extract_dir)


print("Extracted to:", extract_dir)


# 分かりやすいフォルダ名に変更
os.rename("./fruits_db-1.0.0", "./fruits_db")


=========================================================================
=========================================================================
DIR_DATA = "./fruits_db/data"


# レモンとイチゴを分類する分類器を作ります
LABEL_TYPES = ["lemon", "strawberry"]


# ---------------------------------------
# fruits_db の中身を確認してみよう！！
# ---------------------------------------
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import os
import glob


for ramen_type in LABEL_TYPES:
 files = glob.glob(f"{DIR_DATA}/{ramen_type}/*.jpg")
 num_images_to_display = min(5, len(files))
 plt.figure(figsize=(15, 5))
 for i in range(num_images_to_display):
     img = mpimg.imread(files[i])
     plt.subplot(1, num_images_to_display, i + 1)
     plt.imshow(img)
     plt.axis('off')


plt.show()
=========================================================================
=========================================================================
from PIL import Image
import numpy as np
import os
import glob


# 画像サイズの指定
IMAGE_SIZE = 16


# 画像を読み込んでデータとラベルに追加する
data = [] # 画像を入れるリストを空で作成
target = [] # ラベル情報を入れるリストを空で作成


def glob_images(dir, label, size=IMAGE_SIZE):
 data_dir = os.path.join(DIR_DATA, dir)
 files = glob.glob(data_dir + "/*.jpg")
 for f in files:
   img = Image.open(f) # 画像を開く
   img = img.convert("RGB") # 念のためRGB画質に変換
   img = img.resize((size, size), Image.LANCZOS) # サイズを変換方法を指定してリサイズ
   ary = np.asarray(img, dtype=np.float32) / 255.0  # 正規化
   ary = ary.reshape(-1,) # 1次元の配列にする
   data.append(ary) # データに追加
   target.append(label) # ラベルに追加


# 画像ディレクトリとラベル、画像サイズを指定してデータを追加
for label, dir in enumerate(LABEL_TYPES):
 glob_images(dir, label)
=========================================================================
=========================================================================
# データを確認してみよう
print(target)
# 画像の数を表示
print("画像の数=", len(data))
=========================================================================
=========================================================================
# データを確認してみよう
data
=========================================================================
=========================================================================
# 学習用とテスト用に分割 --- (*1)
from sklearn.model_selection import train_test_split


# リストをnumpy配列に変換
X = np.array(data)
y = np.array(target)


# 学習用とテスト用に分割（25%をテスト用に）
X_train, X_test, y_train, y_test = train_test_split(
   X, y, test_size=0.25, random_state=123
)


print("学習用の画像=", len(y_train), "/ テスト用の画像=", len(y_test))


# データを学習 --- (*2)
from sklearn import svm
clf = svm.SVC()
clf.fit(X_train, y_train)


# モデルを評価 --- (*3)
pred = clf.predict(X_test)
result = list(pred == y_test).count(True) / len(y_test)
print("正解率=" + str(result))
=========================================================================
=========================================================================
# データを学習
from sklearn import svm
clf = svm.LinearSVC(max_iter=10000)
clf.fit(X_train, y_train)


# モデルを評価
pred = clf.predict(X_test)
result = list(pred == y_test).count(True) / len(y_test)
print("正解率=" + str(result))
=========================================================================
=========================================================================
from sklearn.ensemble import RandomForestClassifier
clf_rf = RandomForestClassifier(n_estimators=500, random_state=12345, n_jobs=-1)
clf_rf.fit(X_train, y_train)


# モデルを評価
pred = clf_rf.predict(X_test)
result = list(pred == y_test).count(True) / len(y_test)
print("正解率=" + str(result))
=========================================================================
