iris.corr() # petal_length, petal_width 두 가지 feature가 서로 연관되어 있기 때문에 둘 중 하나를 택한다
sepal_length sepal_width petal_length petal_width
sepal_length 1.000000 -0.1175700.8717540.817941
sepal_width -0.1175701.000000 -0.428440 -0.366126
petal_length 0.871754 -0.4284401.0000000.962865
petal_width 0.817941 -0.3661260.9628651.000000
Wrapper
알고리즘과 데이터의 feature에 따른 경우의 수를 고려하여 계산하는 방식
from sklearn.feature_selection import RFE # Recursive feature extraction from sklearn.linear_model import LogisticRegression
rfe = RFE(LogisticRegression(), n_features_to_select=2) # 4개 중에 2개 선택 (iris feature가 4개 이기 때문에)
rfe.fit_transform(iris.iloc[:,:-1], iris.species) # fit_transform
from sklearn.decomposition import PCA
pca = PCA(2) # 2차원으로 줄인다
pca.fit_transform(iris.iloc[:,:-1], iris.species) # 4차원 -> 2차원 / 공간이 왜곡 되었다 # array([[-2.68412563, 0.31939725],
[-2.71414169, -0.17700123],
[-2.88899057, -0.14494943],
[-2.74534286, -0.31829898],
Feature selection vs Dimension reduction
Feature selection은 데이터 값을 그대로 유지하면서 feature를 축소 했지만,
Dimension reduction은 데이터 값을 변형하면서 차원을 축소 한다 => 공간을 왜곡시킨다
!pip install mglearn
import mglearn
mglearn.plot_pca.plot_pca_illustration() # 차원이 축소 되어도 의미를 잃지 않았다 / 고차원의 특성이 저차원에서도 유지가 되었다 / manifold
Manifold
고차원의 데이터를 공간상에 표현하면 각 데이터들은 점의 형태로 찍혀지는데,
이러한 점들을 잘 아우르는 subspace를 manifold라고 한다
Path
import cv2
import os # 운영체제별로 결과가 상이할 수 있다 from pathlib import Path # 운영체제 별로 상이하지 않게 범용적으로 사용 가능
os.listdir('flower_photos/daisy')[:10]
['7410356270_9dff4d0e2e_n.jpg',
'7568630428_8cf0fc16ff_n.jpg',
'10770585085_4742b9dac3_n.jpg',
'4286053334_a75541f20b_m.jpg',
'8759177308_951790e00d_m.jpg',
'4131565290_0585c4dd5a_n.jpg',
'8710109684_e2c5ef6aeb_n.jpg',
'3504430338_77d6a7fab4_n.jpg',
'2612704455_efce1c2144_m.jpg',
'8021540573_c56cf9070d_n.jpg']
path = 'flower_photos/daisy'
images = [cv2.imread(os.path.join(path,i)) for i in os.listdir(path)] # os.listdir : 특정 디렉토리를 리스트로 만들어 준다
!pwd
# /content/drive/My Drive/Colab Notebooks/고급시각반 정리/flower_photos
path = Path('flower_photos/daisy') # path 객체로 불러온다
images = [cv2.imread(str(i)) for i in path.iterdir()]
len(images)
# 633
Pattern
path 객체는 pattern을 사용할 수 있다
import glob # 패턴을 활용할 수 있는 패키지
image = [cv2.imread(i) for i in glob.glob('flower_photos/daisy/*.jpg')] # glob 모듈의 glob 함수는 사용자가 제시한 조건에 맞는 파일명을 리스트 형식으로 반환한다.len(image)
# 633
import imageio
imageio.volread(path) # s mode를 알아야 한다?
path = 'flower_photos/daisy'
imageio.mimread(path, format='jpg') # multiple image를 불러들일 수 있다. 단, jpeg는 multi-image 불러들일 수 없다 # RuntimeError: Format JPEG-PIL cannot read in mode 'I'
from skimage.io import imread_collection
imc = imread_collection('flower_photos/daisy/*.jpg') # 패턴을 정확히 이해해야 한다
imc.files[:10]
['flower_photos/daisy/5547758_eea9edfd54_n.jpg',
'flower_photos/daisy/5673551_01d1ea993e_n.jpg',
'flower_photos/daisy/5673728_71b8cb57eb.jpg',
'flower_photos/daisy/5794835_d15905c7c8_n.jpg',
'flower_photos/daisy/5794839_200acd910c_n.jpg',
'flower_photos/daisy/11642632_1e7627a2cc.jpg',
'flower_photos/daisy/15207766_fc2f1d692c_n.jpg',
'flower_photos/daisy/21652746_cc379e0eea_m.jpg',
'flower_photos/daisy/25360380_1a881a5648.jpg',
'flower_photos/daisy/43474673_7bb4465a86.jpg']
w = os.walk('flower_photos/daisy')
for _, _, files in os.walk('flower_photos/daisy'):
for i inrange(10):
print(files[i])
7410356270_9dff4d0e2e_n.jpg
7568630428_8cf0fc16ff_n.jpg
10770585085_4742b9dac3_n.jpg
4286053334_a75541f20b_m.jpg
8759177308_951790e00d_m.jpg
4131565290_0585c4dd5a_n.jpg
8710109684_e2c5ef6aeb_n.jpg
3504430338_77d6a7fab4_n.jpg
2612704455_efce1c2144_m.jpg
8021540573_c56cf9070d_n.jpg
import tensorflow as tf
img = tf.keras.preprocessing.image_dataset_from_directory('flower_photos/')
# Found 3670 files belonging to 5 classes.type(img)
# tensorflow.python.data.ops.dataset_ops.BatchDatasetfor i in img:
print(i[0].numpy()) # float형태로 한꺼번에 불러온다 단, 범용적으로 사용하지 못하는 단점이 있다
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neural_network import MLPClassifier, MLPRegressor
from sklearn.svm import SVC, SVR
from sklearn.neighbors import KNeighborsClassifier
t = cross_val_score(dt, data.data, data.target, cv = 10)
t
# array([0.79444444, 0.86666667, 0.85 , 0.8 , 0.78333333,# 0.87222222, 0.90555556, 0.81005587, 0.81564246, 0.82681564])
t.mean() # 전처리가 잘 되어 있기 때문에 성능이 좋다 # 0.8324736188702669
data.data = data.data.astype('float32')
knn1 = cv2.ml.KNearest_create()
knn1.train(data.data, cv2.ml.ROW_SAMPLE ,data.target) # 데이터가 연속이라는 가정을 두고 학습을 해야 하기 때문에 데이터 타입이 float이어야 한다 # True
knn1.findNearest(data.data[3][np.newaxis], 3) # 2차원 데이터를 받는다 #(3.0,# array([[3.]], dtype=float32),# array([[3., 3., 3.]], dtype=float32),# array([[ 0., 197., 232.]], dtype=float32))
knn2.predict(data.data[3][np.newaxis])
# array([3])
%timeit knn1.findNearest(data.data, 5)
# 10 loops, best of 5: 148 ms per loop
%timeit knn2.predict(data.data)
# 1 loop, best of 5: 417 ms per loop
- RPN Bounding Box Regression은 Anchor Box를 Reference로 이용하여 Ground truth와 예측 Bbox의 중심좌표 x, y 그리고 w, h 의 차이가 Anchor box와 Ground Truth 간의 중심 좌표 x,y,w,h 차이와 최대한 동일하게 예측 될 수 있어야 함.