2022年1月冬研修


2022年冬研修

今回は画像処理について学びます。

1.画像の基礎知識

(1)ピクセル



ゼルダの冒険のキャラクター「リンク」君の画像ですが、プロパティは以下の様になっています



ここで着目してほしいのが、幅と高さです。リンク君の画像の場合、幅:266ピクセル 高さ:242ピクセルとなっています。 ピクセルとはいったいどのようなものでしょうか?



ピクセルには光の三原則の要素、赤・緑・青が0~255まで指定されており、大きい方がより濃いということになります。

絵具をまぜる場合をイメージして欲しいのですが、紫であれば、赤+青、黄色であれば、赤+緑のような感じでカラーを 表現します。赤・緑・青を全部入れると白になります。ここは絵の具(色の三原則)とは違うところですね。

(2)ピクセルの中身を確認しよう

画像の中身をエクセルに出力して確認してみましょう

jupyter notebookを立ち上げて以下のコードを入力して実行してみてください。また提供したOUT.xlsxをプログラムを同じフォルダに格納してください

①openpyxlをインストールします

!pip install openpyxl

②opencvで画像を読み込み、読み込んだ結果の中から、赤の要素だけを取り出し、EXCELに貼り付けます

# ワーニングがうざいので消します
import warnings
warnings.filterwarnings('ignore')

# EXCELを読み、シートを指定します
import openpyxl
BookA = openpyxl.load_workbook("OUT.xlsx")
SheetRed = BookA.get_sheet_by_name("red")

# opencvを使って画像を読みます
import cv2
import numpy as np

# 画像の読み込み(OPENCV はBGRの順)
img = cv2.imread("link.jpg")

# 変数imgはnumpyの2次元の配列なので、赤の要素(img[:,:,2])を一個づつ取り出して、EXCELのシートに貼り付けていきます
ndarrayRed = img[:,:,2]
for rowA in range(ndarrayRed.shape[0]):
    for colA in range(ndarrayRed.shape[1]):
        SheetRed.cell(row=rowA+1, column=colA+1, value=ndarrayRed[rowA][colA])

# EXCELをセーブします
BookA.save("OUT.xlsx")

③張り付けられたEXCELをEXCELのカラースケールという機能を使って、各セルの数値の大きさに従って色を付けて可視化します

1. OUT.xlsを開きます 2. セルを全選択します 3. ホーム > 条件付き書式 > カラースケール から赤色のスケールを選択します 4. 表示 > ズーム > 指定 10% を指定して縮小表示します

【結果】

※縮小する前:要素の大きさに従って色付けされている



※縮小後



(3)【演習】 青と緑についても赤と同様に処理をしてEXCELに書き込んで、色を付けて可視化しましょう

ヒント 青:配列の0番目  緑:配列の1番目(openCVはBGRの順に配列に格納されているため)





2.画像の表示

画像を表示してみます

1)matplotlibを使用した例

import cv2
from matplotlib import pyplot as plt

# 画像の読み込み
img = cv2.imread("toypu.jpg")

# opencvとmatplotlibはRGBの順番が違うので、変換(BGR->RGB)
show_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 画像表示
plt.imshow(show_img)


2)opencvを使用した例

import cv2

# 画像の読み込み
img = cv2.imread("toypu.jpg")

# 画像表示
cv2.imshow("img", img)

# 画面上でキーが押されると画面が閉じる
cv2.waitKey(0)
cv2.destroyAllWindows()


3)補足 colabでの表示

colabではimshowが動かないので、colab専用のライブラリを使用します

from google.colab.patches import cv2_imshow
# 画像の読み込み
img = cv2.imread("toypu.jpg")
# 画像表示
cv2_imshow(img)

3.動画の基礎知識

①画像処理においては、動画は画像の複数集まったものとして処理します。パラパラ漫画のようなものですね。動画から取り出した1枚の画像をフレームといいます。



②動画を画像に出力します。動画(test.avi)をプログラムと同じフォルダに格納して、実行してください。

import cv2

#動画の読み込み
cap = cv2.VideoCapture("test.avi")

count = 0
while True:
    ret, frame = cap.read()
    if ret == True:
        count += 1
        # 画像を出力
        cv2.imwrite('{:s}_{:06d}.jpg'.format("test", count), frame)
        # 山ほど出力されるので、20件出力したら終了します
        if count >= 20:
            break
    else:
        break

【実行結果】



4.物体検出

オブジェクト検出ライブラリ yolov5のサンプルプログラムを使って、物体検出の処理を体験してみます。

前提条件:環境構築手順を使用して環境が構築されていること

提供したbento.jpgをプログラムと同じフィルダに格納してください。

以下のソースをjupyter notebookに入力し、実行します。実行結果はyolov5/runs/detectフォルダ配下にできます。実行毎に作成されるフォルダは違うのでエキスプローラで確認してください

!python ../yolov5/detect.py --source bento.jpg

【処理前画像】



【処理後画像】ブロッコリーが認識されています。後ろの数字は確度です。



【演習】色々な画像を入力して、確かめてみてください。適当な画面がない場合には、以下の画像をダウンロードして使ってください

coco128.zip

こんな画像が入っています







6.yolov5トレーニング

以下のリンクを開いて、研修を行ってください

yolov5トレーニング

7.今回の研修で使用するデータ

※以下のデータをダウンロードして、各自のフォルダに格納してください

bento.jpg

toypu.jpg

link.jpg

test.avi

game.avi

demoimg_0000.jpg

OUT.xlsx