しょくぶつ(^ ^)です。
今回は「収集した画像を分類」します。
手動でも可能ですが楽にすませるため、一部の作業についてはいよいよPythonも使います。
(1) 分類するためのフォルダを作成
分類するためのフォルダをブキの数だけ、140個ほど作成します。
手動でもできますが、練習のために、ここでPythonを使ってみましょう。
(1)-1 まず、次のcsvファイルをダウンロードしてください。
私が作成したブキとスペシャルの対応表のcsvファイルを次の場所からダウンロードしてください。
- buki-spe-list.csv
(1)-2 次のコードを実行します。
コードの詳細は、今回はコード内のコメントに記載しました。 このコードは、上から下まで順番に実行されるものです。 初心者でも理解しやすいと思います。
コードの実行方法は過去ブログの通り(第1回, 2回)ですが、改めて記載しておきます。
(1) miniconda専用のPowershellを開く
スタート → Miniconda3 (64bit) → Anaconda Powershell Prompt (miniconda3)
(2) 仮想環境の起動
conda activate py312-cnn
(3) Spyderの起動
“spyder” と入力
※ スタートメニューからの起動だと失敗することがあります。
# -*- coding: utf-8 -*-
# 上の行はython3 ソースコードの文字コード指定する Magic comment です。
# 参考URL https://qiita.com/KEINOS/items/6efc1147b917d7811b5b
"""
Created on Mon Aug 28 22:42:17 2023
@author: Plant-smile
"""
# 上記の"""で囲まれた行範囲はコメントとして扱われます。
# ライブラリ os の読み込み
import os
# ライブラリ pandas の読み込み。"as pd"と書くことで pd という名前で pandas を呼び出せます。
import pandas as pd
# f_name_in という変数に、 buki-spe-list.csv という文字列を代入します。
# 変数はいろいろな形式があるのですが、このように書くと、Python言語では自動的に
# f_name_in という変数を文字列のデータ型 "str形式" に定義してくれます。
# (言語によっては事前に定義する必要があります)
# 形式の確認方法はこの場合だと type(f_name_in) です。
f_name_in = "buki-spe-list.csv"
# 画面に、「buki-spe-list.csvを読み込みます」と表示します。
print(f_name_in, "を読み込みます")
# csv形式のファイルを読み込みます。
# いろいろな命令があるのですが、今回は下記命令を使いました。
# pandaライブラリ(上記のように pd と名前を変えています)の命令を使うと、
# 「データフレーム形式」の配列で読み込まれます。
# 読み込まれた内容は df に収められます。
df = pd.read_csv(f_name_in, index_col=0, encoding="Shift-JIS")
# データフレーム形式の配列 df のデータの中から、列名"name_J"の行を全部読み込みます。
# 読み込んだ内容は name_buki に入ります。
# name_bukiは自動的に リスト形式 の配列変数となります。
# このデータは不要ですが、練習のために読み込んでみました。
name_buki = df["name_J"].tolist()
# 同じく、データフレーム df の列名"name_buki"の行を全部読み込んで name_special に入れます。
# このデータも不要。 練習のため。
name_special = df["func"].tolist()
# 同じく、データフレーム df の一番左の行(index と呼ばれます) を読み込んで、 categories という
# リスト(リスト形式の配列)に入れます。
categories = df.index.values.tolist()
# input文を使って、メッセージ表示とEnter入力を促します。
input("test-make-dir というフォルダーをつくっていいですか?(Enterで作成)")
# os.mkdirという命令で、 test-make-dir というフォルダーを作成します。
os.mkdir('test-make-dir')
# input文だけでなくprint文も使って、メッセージ表示とEnter入力を促します。
print("test-make-dir の下に", f_name_in,"の1列目の名前のフォルダーをつくっていいですか?")
input("(Enterで作成)")
# for文は、リストやタプル、辞書、セットなどの要素を順番に取り出して処理を行うための制御構文です。
# 参考URL https://techplay.jp/column/1703
# ここでは、categoriesリストの要素を順番に取り出し、文字変数ctgryに入れることを繰り返します。
for ctgry in categories:
# for分で繰り返したい箇所は、下記のように半角スペース4文字で字下げします。
# new_dir_pathは作成したいフォルダーのパスと名前です。
# test-make-dir という名前のフォルダーの下に、ctgry という名前という意味です。
new_dir_path = 'test-make-dir/' + ctgry
# os.mkdirという命令で、 new_dir_pahtで指定したフォルダーを作成します。
os.mkdir(new_dir_path)
# for文の箇所はこんな書き方もできます。 C言語など歴史ある言語に慣れた方にはこの方がなじみあるかと。
#for i in range(len(categories)):
# new_dir_path = 'test-make-dir/' + categories[i]
# os.mkdir(new_dir_path)
(2) 画像をフォルダに分類
たとえば、CopilotとかのAIに質問すれば、Pythonコードは簡単に得られます。
質問 『多数のファイルをフォルダに分類するPythonコードを作ってください。 具体的には、ファイル名の"_"までの文字列と一致するフォルダに、そのファイルを移動する、というものです。』
ただし、この作業はPythonコードは使わず、手動でやるべきです。
なぜかというと、判定ミスがないか1つ1つ確認するためです。
そう !! 肝心かなめの学習データを間違っちゃダメなんで、機械任せとはいかないんです。
数が多いときついんですが、ファイル名にブキ名が付いているから、何とかなりますよね。
リッター4kを4kスコープと誤認していないかとか、1つ1つチェックしながら進めてください。
しょくぶつ(^ ^)が、いっちばんはじめ、学習モデルを完全新作したとき、当然ですが何のラベルもない画像ファイルだけでした。
ブキって50個くらいだよなって思って始めたんですが、1年前でも100個近くありました。
始めたあとから気づいて、数の多くてやめようかな~って思っちゃいました。
その後もブキの数はどんどん増え・・・
100以上のフォルダに1000個の画像をミスなく整理するって結構きつかったです。