投稿

自前画像を使ったセマンティックセグメンテーションの実装_推論編(FusionNet)

イメージ
前回 の続きで、FusionNetというネットワークを使って、自前の画像でセマンティックセグメンテーションの推論を行うコードを作成してみたので紹介します。 このコードは google drive にも公開しています。 google colabで実行する際は、ディレクトリのマウント等を忘れないでください。 やり方は こちら です。 作成したコード import numpy as np import matplotlib.pyplot as plt import os import image from PIL import Image import glob import torch import torch.nn as nn import torch.utils as utils import torch.nn.init as init import torch.utils.data as data from torch.utils.data import DataLoader, random_split import torchvision.utils as v_utils import torchvision.datasets as dset import torchvision.transforms as transforms from torch.autograd import Variable from torchsummary import summary from torchvision import datasets from keras.preprocessing.image import load_img, save_img, img_to_array, array_to_img device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # Assume that we are on a CUDA machine, then this should print a CUDA device: print(device) batch_size = 1 img_size = 256 input_ch = 1 targ

自前画像を使ったセマンティックセグメンテーションの実装_学習編(FusionNet)

イメージ
FusionNetというネットワークを使って、自前の画像でセマンティックセグメンテーションの学習を行うコードを作成してみたので紹介します。 素人の私が分からないなりに作成したので、無茶苦茶な作りをしていますが、深層学習初学者でセマンティックセグメンテーションの学習をしてみたいという人は活用してください! お手元に高性能なPCがないという方も、google colabで解析できますので、ぜひ! このコードは google drive にも公開しています。 google colabで実行する際は、ディレクトリのマウント等を忘れないでください。 やり方は こちら です。 作成したコード import numpy as np import matplotlib.pyplot as plt import pandas as pd from PIL import Image, ImageOps import os import random import glob from keras.preprocessing.image import load_img, save_img, img_to_array, array_to_img import torch import torch.nn as nn import torch.utils as utils import torch.nn.init as init import torch.utils.data as data from torch.utils.data import DataLoader, random_split import torchvision.utils as v_utils import torchvision.datasets as dset import torchvision.transforms as transforms from torch.autograd import Variable from torchsummary import summary device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # Assume that we are

Google ColabでのDriveへのマウントとディレクトリの変更

イメージ
Google ColabでGoogle Driveへのマウントを実行する方法を紹介します。 大した処理ではないですが、この処理なしでは画像の読み込みや結果の保存等ができないので、ちゃんと覚えておきましょう! 実施方法 マウントの実行方法 次のコマンドをコマンドライン上で実行するだけなので、やり方は非常に簡単です。 from google.colab import drive drive.mount('/content/drive/') するとColab上に、次のような画面が表示されます。 このURLをクリックすると、次の画面に遷移します。 あとは順序通りに操作を行い・・・ 下記のコードを、Colabの画面の四角い枠の中にコピペし、Enterを押します。 すると次のような画面になり、マウントは終了です。 ディレクトリの変更 ローカルでプログラムを実行する際は、相対パスでディレクトリを参照することができますが、Google Colabではcdのコマンドで事前に作業ディレクトリを指定する必要があります。 その際のコマンドは以下の通りです。 %cd "/content/drive/My Drive/*" /content/drive/My Drive/までは必須です。 それ以降は、任意のディレクトリを指定してください。 以下はマイドライブを開いたときに表示されるフォルダ名等をそのまま入力していただいて大丈夫です! ※全角文字に対応しているかわからないのでご注意ください。 以上で終わりです。 Google Colabを駆使して、AI実装の練習に励みましょう!!

深層学習入門:MNISTの分類①(NNの作成)

イメージ
深層学習によってMNIST(手書き数字)を10クラスに分類する方法(Classification)を紹介します。 内容も盛りだくさんなので投稿を分ける予定ですが、よろしくお願いします。 なお今回のプログラムは Google Colab 上で作成しています。 "深層学習の勉強をしたいけど高性能なPCを持っていない" という方も、Google ColabはGPUが無料で使用できるのでぜひトライしてみてください。 作成したコード #モジュールのインポート import keras from keras.datasets import mnist from keras.utils import to_categorical from keras import models from keras import Input from keras.layers import Activation, Dense import matplotlib.pyplot as plt #mnistのロード (x_train,y_train),(x_val,y_val)=mnist.load_data() # mnistデータの前処理 def preprocess(data, label=False): if label: #One-Hotベクトル化 data = to_categorical(data) else: #画素値を0~1に変換 data = data.astype('float32') / 255 # (ミニバッチサイズ、横幅、縦幅)→(ミニバッチサイズ、横幅、縦幅、チャネル数)に変換 data = data.reshape((-1, 28, 28, 1)) return data x_train = preprocess(x_train) x_val = preprocess(x_val) y_train = preprocess(y_train, label=True) y_val = preprocess(y_val, label=True) #モデルの構築 model = keras.Seque

深層学習入門:画像認識系のAIについて

イメージ
E資格のための勉強もかねて、画像認識系のAIの紹介をしていきます。 もし間違っているところがあれば、ぜひコメントしてください。 画像認識AIとは 画像認識系のAIは、 画像分類 ( Classification )、 物体検出 ( Detection )、 領域検出 ( Semantic Segmentation )の3つのタスクに分類されます。 それぞれのタスクのイメージは次の図の通りです。 これから個々のタスクについて、説明していきます。 画像分類(Classification)とは 画像分類とは 入力画像に映っているものを判別させる タスクです。 例えばソフトクリームが写った画像と、ソフトクリームが写っていない画像でAIを学習させることで、 ソフトクリームか否かを判別 できるAIが作成することができます。 また、教師画像をソフトクリームの画像とアイスクリームの画像にすることで、 ソフトクリームかアイスクリームかを判別 するAIを作成することができます。 この前者後者の分類方法は、作成するAIの用途によって使い分ける必要があります。 図からも分かるかとは思いますが、入力画像の バリエーションが無数にある場合 前者、 限られている場合 は後者がおすすめです。 物体検出(Detection)とは 物体検出とは画像上の 対象物の位置を矩形で検出 する手法です。 画像分類手法と違って、複数の物体を検出できるのがポイントです。 画像分類ではソフトクリームが写っている個数を把握することが困難ですが、物体検出であればカウントできます。 よって物体検出は対象物の 大まかな位置 と 個数 を把握するのに適したタスクとなります。 領域検出(Semantic Segmentation)とは 矩形で領域を検出していたDetectionと異なり、領域検出では ピクセルレベルで対象領域を検出 することができます。 物体検出は個数を把握するのに適したタスクでしたが、領域検出は 対象物の大きさを把握 するのに適したタスクとなります。 それぞれのタスクはこれから紹介していきたいと思います! 今回使用した画像:ソフトクリーム/上島珈琲 日光東照宮店で食べたものになります。 観光終わりにサクッと行け

画像の反転 cv2.flip()

イメージ
画像を反転する方法を紹介します。 開発環境はjupyter notebook、言語はpythonです。 今回使用した画像・コード一式は google drive にも保存しておりますので、必要に応じてお使いください。 作成したコード #モジュールのインポート import cv2 import glob import os from PIL import Image #画像の読み込み filename = glob.glob("*.jpg") for n in range(len(filename)): img = cv2.imread(filename[n]) img_horizontalflip = cv2.flip(img,1) #左右反転 img_verticalflip = cv2.flip(img,0) #上下反転 img_horizontal_vertical = cv2.flip(img,-1) #上下左右反転 cv2.imwrite(os.path.split(filename[n])[1][:-4]+"_horizontal.png",img_horizontalflip) cv2.imwrite(os.path.split(filename[n])[1][:-4]+"_vertical.png",img_verticalflip) cv2.imwrite(os.path.split(filename[n])[1][:-4]+"_horizontal_vertical.png",img_horizontal_vertical) 処理の解説 反転はcv2.imreadで読み込んだ画像に対してcv2.flip()と書くだけで実施できます。 反転する向きは、第二引数の値によって決めることができます。 第二引数 < 0:上下左右反転 第二引数 = 0:上下反転 第二引数 > 0:左右反転 反転は行列をひっくり返すだけなので、処理も簡単です。 深層学習のデータ拡張にも使う技術なので、覚えて損はないです。 今回使用した画像:さなだのつけ麺 北千住駅の近くにある

特徴量検出器の比較

イメージ
今回はSIFTやSURFなど様々なものがある特徴量検出器の違いを、実際に画像から特徴点を検出することで比較していきます。 特徴点の抽出方法は こちら を参考にしてください。 今回、特徴点を抽出したのは次の画像です。 元画像 検出元の画像は幅が454px、高さが397pxと、あえて小さいものにしています。 特徴点検出結果 こちらの画像に対して、SURF、KAZE、AKAZE、ORB、SIFTの5種の特徴量を検出した結果が次の画像となります。 特徴量検出結果(flags=4) AKAZE特徴量は円が小さいですね。スケール変化に弱いのでしょうか・・・(理論的に言えなくてすいません) 検出結果の比較 またそれぞれの特徴点の数、特徴点のサイズの平均値および標準偏差をグラフ化して比較をしてみました。 特徴検出器によって、検出される特徴点の数やサイズも全然違うことが分かりますね。 次の表に今回の結果をまとめてみました。 特徴検出器 概要 KAZE 検出される特徴点の数が多い。サイズは小さい AKAZE KAZEに比べて、数もサイズも小さい。 SURF 特徴点の数は少なめ。サイズにばらつきあり。 ORB 特徴点サイズが大きい。 SIFT AKAZEより大きい特徴が検出されているが、平均サイズは最小。 次回はこれらの特徴量のマッチング精度に着目してみたいところです! おまけ 前回記事 でakaze = cv2.AKAZE_create() としていた箇所を下記に書き換えると、扱う特徴量検出器を変更することができます。 sift = cv2.xfeatures2d.SIFT_create() kaze = cv2.KAZE_create() akaze = cv2.AKAZE_create() orb = cv2.ORB_create() surf = cv2.xfeatures2d.SURF_create() 今回使用した画像:自作の時計 今回使用した画像の時計はアイロンビーズで手作りしたものになります。 好きな絵を作れるので非常におすすめです。 ひっつき虫という練り消しみたいなものを使えば壁にも貼れますので、ぜひ作ってみてください。