金子邦彦研究室情報工学全般情報工学演習II

情報工学演習II

大学で使用した自作の資料等を,手直しの上公開している. クリエイティブ・コモンズ BY NC SA.

全体内容

キャリアサポート

ITエンジニア、AIエンジニアとして成長する実践的学び

計画

  1. セッション1: オリエンテーション
  2. セッション2: 研究活動サポート
  3. セッション3: Pythonとデータ処理の基礎
  4. セッション4: AI開発プロジェクト準備:画像分類とGUIアプリケーションの構築
  5. セッション5: プロジェクト1 - データ分析とデータマネジメント
  6. セッション7: ミニプロジェクトと個人ワーク
  7. セッション7: プロジェクト2 - 自然言語処理や画像認識
  8. セッション8: コードレビューと相互刺激
  9. セッション9: 成果の発表と総括
  10. セッション10 以降: 高度なテクノロジー

その他,業界エキスパート,OB/OG によるゲストレクチャー

ゲストスピーカーによる業界動向と必要なスキルに関するプレゼンテーション

セッション1: オリエンテーション

各自が、情報工学の本質、情報工学科の学生が持つ強みと魅力、可能なキャリアパスについて理解。さらに、ITエンジニア、AIエンジニアとして成長するためのビジョンと目標を理解。

資料

セッション2: 研究活動サポート

研究活動は多くの利点と成長の可能性があります。研究を行うには、確固たる心構え、そして、研究に十分に時間をかけることが大切です。研究は楽しく、自分の思い通りに進めていくものです。研究の楽しさを実感しながら進めましょう。

資料

各自の探求,考察

セッション3: Pythonとデータ処理の基礎

Pythonは多様な用途で広く使われるプログラミング言語であり、特に文法のシンプルさ、拡張性、柔軟性が高く評価されています。この言語は直感的で読みやすく、初心者にも取り組みやすい設計になっています。主要なキーワードには「print」、「type」、「if」、「else」、「for」、「while」などがあり、オブジェクト指向プログラミングもサポートされています。さらに、Pythonは多様な標準ライブラリが提供されているため、データ処理、AI、メディア処理、データ連携、Web開発など幅広い用途で活用できます。オンライン環境であるGoogle Colaboratoryを使えば、Googleアカウントさえあれば手軽にPythonのノートブックを利用できます。特にデータ処理においては、Pandasライブラリのデータフレームが表形式のデータを効率的に扱うツールとして用いられ、多くのデータ形式の読み書きもサポートしています。

資料

関連資料

Google アカウント

演習で使用する Google Colaboratory のページ

https://colab.research.google.com/drive/1l2pLl72PYG5TFKKu8ha0h_9fFCafxG4j?usp=sharing

セッション4: AI開発プロジェクト準備:画像分類とGUIアプリケーションの構築

画像分類に関連するAI技術は、ディープラーニングという知的なITシステムをベースに、多層のニューラルネットワークを使用して複雑なタスクを実行する能力を持っています。特に、大規模データセットで学習された学習済みモデルは、ニューラルネットワークのパラメータが最適化され、特定のタスクに特化しています。これらのモデルは、転移学習やファインチューニングを利用して、異なるタスクにも適用可能です。学習済みモデルの利用はコスト削減や高い性能、迅速な技術検証などのメリットがあります。特に、ImageNet-1Kというデータセットで学習されたモデルは、1,000種類のカテゴリを持ち、多様なタスクに適用可能です。このモデルを利用することで、新しい技術の性能を迅速に試すことや、転移学習やファインチューニングの導入などが可能となります。さらに、tkinterというPythonの標準ライブラリを使用すると、GUIを手軽に作成し、ユーザーに視覚的で直感的な操作環境を提供することができます。

資料

演習で使用する Python プログラム

演習1

import timm
import torch
import requests
from PIL import Image
from io import BytesIO
# ImageNet 1kのラベル情報をダウンロード
IMAGENET_1k_URL = 'https://storage.googleapis.com/bit_models/ilsvrc2012_wordnet_lemmas.txt'
IMAGENET_1k_LABELS = requests.get(IMAGENET_1k_URL).text.strip().split('\n')
def load_image(url, transform):
    image = Image.open(requests.get(url, stream=True).raw)
    image_tensor = transform(image)
    return image_tensor

def classify_image(model, image_tensor, topk=5):
    output = model(image_tensor.unsqueeze(0))
    probabilities = torch.nn.functional.softmax(output[0], dim=0)
    values, indices = torch.topk(probabilities, topk)
    return [{'label': IMAGENET_1k_LABELS[idx], 'index': idx, 'value': val.item()} for val, idx in zip(values, indices)]

if __name__ == "__main__":
    # モデルを読み込む
    model_name = 'eva02_large_patch14_448.mim_in22k_ft_in1k'
    model = timm.create_model(model_name, pretrained=True).eval()
    transform = timm.data.create_transform(**timm.data.resolve_data_config(model.pretrained_cfg))
    # 画像ファイルの指定
    url = 'https://datasets-server.huggingface.co/assets/imagenet-1k/--/default/test/12/image/image.jpg'
    image_tensor = load_image(url, transform)
    # 画像を分類し、結果を表示
    top_classes = classify_image(model, image_tensor)
    for i in top_classes:
        print(i)
    # 期待される結果
    expected_indices = torch.tensor([162, 166, 161, 164, 167])
    print("Expected Indices:", expected_indices)

演習2

import tkinter as tk
from tkinter import filedialog
root = tk.Tk()
file_label = tk.Label(root, text="")
file_label.pack()
filepath = filedialog.askopenfilename()
if filepath:
    file_label.config(text=filepath)

root.mainloop()
exit()

演習3

import tkinter as tk
from tkinter import filedialog
import timm
import torch
import requests
from PIL import Image
# ImageNet 1kのラベル情報をダウンロード
IMAGENET_1k_URL = 'https://storage.googleapis.com/bit_models/ilsvrc2012_wordnet_lemmas.txt'
IMAGENET_1k_LABELS = requests.get(IMAGENET_1k_URL).text.strip().split('\n')
def load_image(file_path, transform):
    image = Image.open(file_path)
    image_tensor = transform(image)
    return image_tensor

def classify_image(model, image_tensor, topk=5):
    output = model(image_tensor.unsqueeze(0))
    probabilities = torch.nn.functional.softmax(output[0], dim=0)
    values, indices = torch.topk(probabilities, topk)
    return [{'label': IMAGENET_1k_LABELS[idx], 'index': idx, 'value': val.item()} for val, idx in zip(values, indices)]

if __name__ == "__main__":
    # モデルを読み込む
    model_name = 'eva02_large_patch14_448.mim_in22k_ft_in1k'
    model = timm.create_model(model_name, pretrained=True).eval()
    transform = timm.data.create_transform(**timm.data.resolve_data_config(model.pretrained_cfg))
    # 画像ファイルの指定
    root = tk.Tk()
    root.withdraw() # GUIウィンドウを表示しないようにする
    file_path = filedialog.askopenfilename(title="画像ファイルを選択してください", filetypes=[("JPEG files", "*.jpg"), ("PNG files", "*.png"), ("All files", "*.*")])
    if not file_path:
        print("ファイルが選択されませんでした")
        exit()
    image_tensor = load_image(file_path, transform)
    # 画像を分類し、結果を表示
    top_classes = classify_image(model, image_tensor)
    for i in top_classes:
        print(i)

セッション5: データ分析とデータマネジメント

データの管理と処理の基礎について説明します。今回は、PythonのPandasデータフレームを利用します。機械学習は、訓練データを使ってコンピュータに知的能力を獲得させる技術です。機械学習として、主に、回帰や分類があります。線形回帰は、データに最適にフィットする線(もしくは超平面)を見つける技術の一つです。外れ値は、データセット内で、他のデータと顕著に異なるデータのことを言います。外れ値の適切な取り扱いは、分析の精度や機械学習モデルの性能向上に寄与します。外れ値の検出には、zスコアなどの統計的手法などが用いられます。zスコアはデータが平均からどれだけ離れているかを示したものです。欠損値は、データが存在しないか、測定されていないことを示し、pythonではnanを使って表します。機械学習を行う際、外れ値や欠損値の適切な処理が重要です。データは訓練データとテストデータに分割され、訓練データによる学習で得られた機械学習モデルは、テストデータで評価することが重要です。

資料

演習で使用する google colaboratory のページ

https://colab.research.google.com/drive/1outnxzsm81bwm2dxblrf2a51bhkelfnz?usp=sharing

セッション6: ミニプロジェクト

ミニプロジェクトでは、実践的問題解決能力の向上、プログラミング技術の深化、自主性と達成感の促進を目的とし、Pythonでのプログラム作成を通して学ぶ。自らのアイディアをプログラムとして実現し、挑戦とトライアンドエラーを粘り強く重ねながら、そのプロセスで実力を磨く。Trinket、ChatGPT 3.5、TalkAI を使用して、ミニプロジェクトを進める。プログラミングは創造的なプロセスであり、その魅力はアイディアを形にできることにある。演習を通じて、AIのサポートを受けながらプログラムの改善を各自行うことにも挑戦する。

資料

【演習で使用する外部ページ】

Trinket

TalkAI

trinket のプログラム作成のプロンプト例

trinket で動く processing を利用したアクションゲーム の Python 2 プログラムを作成してください。プログラムの先頭を「from processing import *」で開始してください。

https://trinket.io/python/ab4ac351b3 を使うなどで、ミニプロジェクトを楽しみましょう。