Skip to content

Instantly share code, notes, and snippets.

@VinhDevNguyen
Last active October 13, 2021 11:32
Show Gist options
  • Save VinhDevNguyen/838889a85b5c1ac84e7c35efb43c70e5 to your computer and use it in GitHub Desktop.
Save VinhDevNguyen/838889a85b5c1ac84e7c35efb43c70e5 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from tqdm import tqdm\n",
"from sklearn.svm import SVC\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.metrics import accuracy_score\n",
"from skimage.color import rgb2gray\n",
"from skimage.feature import hog\n",
"from PIL import Image\n",
"import numpy as np\n",
"import pandas as pd\n",
"from tensorflow.keras.datasets.mnist import load_data\n",
"\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load trainsets"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"(x_train, y_train), (x_test, y_test) = load_data()\n",
"# reduce MNIST / 10\n",
"x_train = x_train[:10000]\n",
"y_train = y_train[:10000]\n",
"x_test = x_test[:1000]\n",
"y_test = y_test[:1000]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get image"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"5"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(x_train[0], cmap='gray')\n",
"y_train[0]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'HOG Visualization')"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"hog_digit, hog_image = hog(x_train[0], orientations=9,\n",
" pixels_per_cell=(2, 2), visualize=True)\n",
"plt.imshow(hog_image, cmap='gray')\n",
"plt.title('HOG Visualization')"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def create_feature(image, is_visualize=False):\n",
" if is_visualize:\n",
" hog_img, hog_feature = hog(image, pixels_per_cell=(2,2), visualize=is_visualize)\n",
" return hog_img, hog_feature\n",
" else:\n",
" hog_img= hog(image, pixels_per_cell=(2,2))\n",
" return hog_img\n",
"def create_feature_matrix(data):\n",
" features = []\n",
" for img in tqdm(data):\n",
" feature = create_feature(img)\n",
" features.append(feature)\n",
" features_matrix = np.asarray(features)\n",
" print('features matrix shape: {}'.format(features_matrix.shape))\n",
" return features_matrix\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 10000/10000 [00:32<00:00, 307.07it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"features matrix shape: (10000, 11664)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1000/1000 [00:03<00:00, 292.84it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"features matrix shape: (1000, 11664)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"x_train = create_feature_matrix(x_train)\n",
"x_test = create_feature_matrix(x_test)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"ss = StandardScaler()\n",
"x_train = ss.fit_transform(x_train)\n",
"x_test = ss.fit_transform(x_test)\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"SVC(kernel='linear', probability=True, random_state=42)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"svm = SVC(kernel='linear', probability=True, random_state=42)\n",
"svm.fit(x_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy: 0.97\n"
]
}
],
"source": [
"# Generate predictions\n",
"y_pred = svm.predict(x_test)\n",
"# Calculate accuracy\n",
"accuracy = accuracy_score(y_test, y_pred)\n",
"print('Accuracy: {}'.format(accuracy))\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Test"
]
},
{
"cell_type": "code",
"execution_count": 127,
"metadata": {},
"outputs": [],
"source": [
"def get_image(image_path):\n",
" arr_img = []\n",
" for i in image_path:\n",
" image = Image.open(i)\n",
" # Check if image is RGB\n",
" if image.mode == 'RGB':\n",
" # turn image to gray scale\n",
" image = image.resize((28, 28))\n",
" image = np.asarray(image)\n",
" image = rgb2gray(image)\n",
" arr_img.append(image)\n",
" else:\n",
" pass\n",
" arr_img = np.asarray(arr_img)\n",
" return arr_img\n",
"\n",
"def test(image):\n",
" img = create_feature_matrix(image)\n",
" print(img.shape)\n",
" img = ss.fit_transform(img)\n",
" y_pred = svm.predict(img)\n",
" return y_pred\n"
]
},
{
"cell_type": "code",
"execution_count": 133,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 10/10 [00:00<00:00, 303.01it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"features matrix shape: (10, 11664)\n",
"(10, 11664)\n"
]
},
{
"data": {
"text/plain": [
"array([0, 1, 2, 3, 4, 5, 6, 1, 8, 3], dtype=uint8)"
]
},
"execution_count": 133,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"imgs = get_image(['Num0.jpg', 'Num1.jpg', 'Num2.jpg', 'Num3.jpg', 'Num4.jpg', 'Num5.jpg', 'Num6.jpg', 'Num7.jpg', 'Num8.jpg', 'Num9.jpg'])\n",
"imgs.shape\n",
"pred = test(imgs)\n",
"pred"
]
}
],
"metadata": {
"interpreter": {
"hash": "7ca6a0d0346c2122f6126f5f71aae18f80f1206ca6268a2576e264798a71822d"
},
"kernelspec": {
"display_name": "Python 3.7.9 64-bit ('venv': venv)",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.9"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment