{"id":20886439,"url":"https://github.com/gsurma/image_classifier","last_synced_at":"2025-05-08T21:35:37.193Z","repository":{"id":43061136,"uuid":"156577542","full_name":"gsurma/image_classifier","owner":"gsurma","description":"CNN image classifier implemented in Keras Notebook 🖼️.","archived":false,"fork":false,"pushed_at":"2021-08-18T07:31:29.000Z","size":6712,"stargazers_count":183,"open_issues_count":4,"forks_count":98,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-01-26T04:05:36.930Z","etag":null,"topics":["ai","artificial-intelligence","cnn","cnn-classification","cnn-keras","colaboratory","convolutional-neural-networks","efficientnet","efficientnet-keras","google-colab","image-classification","image-recognition","keras","machine-learning","ml","notebook","python","transfer-learning"],"latest_commit_sha":null,"homepage":"https://gsurma.github.io","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gsurma.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"patreon":"gsurma"}},"created_at":"2018-11-07T16:40:27.000Z","updated_at":"2025-01-12T11:44:58.000Z","dependencies_parsed_at":"2022-08-28T17:40:56.347Z","dependency_job_id":null,"html_url":"https://github.com/gsurma/image_classifier","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsurma%2Fimage_classifier","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsurma%2Fimage_classifier/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsurma%2Fimage_classifier/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsurma%2Fimage_classifier/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gsurma","download_url":"https://codeload.github.com/gsurma/image_classifier/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238044095,"owners_count":19407128,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","artificial-intelligence","cnn","cnn-classification","cnn-keras","colaboratory","convolutional-neural-networks","efficientnet","efficientnet-keras","google-colab","image-classification","image-recognition","keras","machine-learning","ml","notebook","python","transfer-learning"],"created_at":"2024-11-18T08:16:56.991Z","updated_at":"2025-02-10T02:11:02.096Z","avatar_url":"https://github.com/gsurma.png","language":"Jupyter Notebook","funding_links":["https://patreon.com/gsurma","https://www.paypal.com/paypalme2/grzegorzsurma115"],"categories":[],"sub_categories":[],"readme":"\u003ch3 align=\"center\"\u003e\n  \u003cimg src=\"assets/image_classifier_icon_web.png\" width=\"300\"\u003e\n\u003c/h3\u003e\n\n# Image Classifier\n\nPython Jupyter Notebook with **Convolutional Neural Network** image classifier implemented in **Keras** 🖼️. It's **[Google Colab](https://colab.research.google.com/)** ready.\n\nCheck out corresponding Medium article:\n\n[Image Classifier - Cats🐱 vs Dogs🐶 with Convolutional Neural Networks (CNNs) and Google Colab’s Free GPU](https://towardsdatascience.com/image-classifier-cats-vs-dogs-with-convolutional-neural-networks-cnns-and-google-colabs-4e9af21ae7a8)\n\n## Usage\n\nStructure your data as follows:\n\n\tdata/\n\t\ttraining/\n\t\t\tclass_a/\n\t\t\t\tclass_a01.jpg\n\t\t\t\tclass_a02.jpg\n\t\t\t\t...\n\t\t\tclass_b/\n\t\t\t\tclass_b01.jpg\n\t\t\t\tclass_b02.jpg\n\t\t\t\t...\n\t\tvalidation/\n\t\t\tclass_a/\n\t\t\t\tclass_a01.jpg\n\t\t\t\tclass_a02.jpg\n\t\t\t\t...\n\t\t\tclass_b/\n\t\t\t\tclass_b01.jpg\n\t\t\t\tclass_b02.jpg\n\t\t\t\t...\n\nFor binary classifications you are good to go!\n\nFor non-binary classifications:\n\n* add other classes to training and validation directories\n* change class_mode from \"binary\" to \"categorical\"\n* change loss function from \"binary\\_crossentropy\" to \"categorical\\_crossentropy\"\n\n## Performance\n\n**Dataset:** [Dogs vs Cats](https://www.kaggle.com/c/dogs-vs-cats)\n\n**Description:** Binary classification. Two classes two distinguish - **dogs** and **cats**.\n\n**Training:** 10 000 images per class\n\n**Validation:** 2 500 images per class\n\n\n### model_1\n\t_________________________________________________________________\n\tLayer (type)                 Output Shape              Param #   \n\t=================================================================\n\tconv2d_5 (Conv2D)            (None, 198, 198, 32)      896       \n\t_________________________________________________________________\n\tactivation_9 (Activation)    (None, 198, 198, 32)      0         \n\t_________________________________________________________________\n\tmax_pooling2d_5 (MaxPooling2 (None, 99, 99, 32)        0         \n\t_________________________________________________________________\n\tconv2d_6 (Conv2D)            (None, 97, 97, 32)        9248      \n\t_________________________________________________________________\n\tactivation_10 (Activation)   (None, 97, 97, 32)        0         \n\t_________________________________________________________________\n\tmax_pooling2d_6 (MaxPooling2 (None, 48, 48, 32)        0         \n\t_________________________________________________________________\n\tflatten_3 (Flatten)          (None, 73728)             0         \n\t_________________________________________________________________\n\tdense_5 (Dense)              (None, 16)                1179664   \n\t_________________________________________________________________\n\tactivation_11 (Activation)   (None, 16)                0         \n\t_________________________________________________________________\n\tdropout_3 (Dropout)          (None, 16)                0         \n\t_________________________________________________________________\n\tdense_6 (Dense)              (None, 1)                 17        \n\t_________________________________________________________________\n\tactivation_12 (Activation)   (None, 1)                 0         \n\t=================================================================\n\tTotal params: 1,189,825\n\tTrainable params: 1,189,825\n\tNon-trainable params: 0\n\t_________________________________________________________________\n\n\n\u003cimg src=\"models/model_1/model_1_training.png\" width=\"500\"\u003e\n\n\u003cbr\u003e\n\n\u003cimg src=\"models/model_1/model_1_validation.png\" width=\"500\"\u003e\n\n### model_2\n\t_________________________________________________________________\n\tLayer (type)                 Output Shape              Param #   \n\t=================================================================\n\tconv2d_4 (Conv2D)            (None, 198, 198, 32)      896       \n\t_________________________________________________________________\n\tactivation_6 (Activation)    (None, 198, 198, 32)      0         \n\t_________________________________________________________________\n\tmax_pooling2d_4 (MaxPooling2 (None, 99, 99, 32)        0         \n\t_________________________________________________________________\n\tconv2d_5 (Conv2D)            (None, 97, 97, 32)        9248      \n\t_________________________________________________________________\n\tactivation_7 (Activation)    (None, 97, 97, 32)        0         \n\t_________________________________________________________________\n\tmax_pooling2d_5 (MaxPooling2 (None, 48, 48, 32)        0         \n\t_________________________________________________________________\n\tconv2d_6 (Conv2D)            (None, 46, 46, 64)        18496     \n\t_________________________________________________________________\n\tactivation_8 (Activation)    (None, 46, 46, 64)        0         \n\t_________________________________________________________________\n\tmax_pooling2d_6 (MaxPooling2 (None, 23, 23, 64)        0         \n\t_________________________________________________________________\n\tflatten_2 (Flatten)          (None, 33856)             0         \n\t_________________________________________________________________\n\tdense_3 (Dense)              (None, 64)                2166848   \n\t_________________________________________________________________\n\tactivation_9 (Activation)    (None, 64)                0         \n\t_________________________________________________________________\n\tdropout_2 (Dropout)          (None, 64)                0         \n\t_________________________________________________________________\n\tdense_4 (Dense)              (None, 1)                 65        \n\t_________________________________________________________________\n\tactivation_10 (Activation)   (None, 1)                 0         \n\t=================================================================\n\tTotal params: 2,195,553\n\tTrainable params: 2,195,553\n\tNon-trainable params: 0\n\t_________________________________________________________________\n\n\n\u003cimg src=\"models/model_2/model_2_training.png\" width=\"500\"\u003e\n\n\u003cbr\u003e\n\n\u003cimg src=\"models/model_2/model_2_validation.png\" width=\"500\"\u003e\n\n\n### model_3\n\t_________________________________________________________________\n\tLayer (type)                 Output Shape              Param #   \n\t=================================================================\n\tconv2d_4 (Conv2D)            (None, 198, 198, 32)      896       \n\t_________________________________________________________________\n\tactivation_6 (Activation)    (None, 198, 198, 32)      0         \n\t_________________________________________________________________\n\tmax_pooling2d_4 (MaxPooling2 (None, 99, 99, 32)        0         \n\t_________________________________________________________________\n\tconv2d_5 (Conv2D)            (None, 97, 97, 64)        18496     \n\t_________________________________________________________________\n\tactivation_7 (Activation)    (None, 97, 97, 64)        0         \n\t_________________________________________________________________\n\tmax_pooling2d_5 (MaxPooling2 (None, 48, 48, 64)        0         \n\t_________________________________________________________________\n\tconv2d_6 (Conv2D)            (None, 46, 46, 128)       73856     \n\t_________________________________________________________________\n\tactivation_8 (Activation)    (None, 46, 46, 128)       0         \n\t_________________________________________________________________\n\tmax_pooling2d_6 (MaxPooling2 (None, 23, 23, 128)       0         \n\t_________________________________________________________________\n\tflatten_2 (Flatten)          (None, 67712)             0         \n\t_________________________________________________________________\n\tdense_3 (Dense)              (None, 64)                4333632   \n\t_________________________________________________________________\n\tactivation_9 (Activation)    (None, 64)                0         \n\t_________________________________________________________________\n\tdropout_2 (Dropout)          (None, 64)                0         \n\t_________________________________________________________________\n\tdense_4 (Dense)              (None, 1)                 65        \n\t_________________________________________________________________\n\tactivation_10 (Activation)   (None, 1)                 0         \n\t=================================================================\n\tTotal params: 4,426,945\n\tTrainable params: 4,426,945\n\tNon-trainable params: 0\n\t_________________________________________________________________\n\n\n\u003cimg src=\"models/model_3/model_3_training.png\" width=\"500\"\u003e\n\n\u003cbr\u003e\n\n\u003cimg src=\"models/model_3/model_3_validation.png\" width=\"500\"\u003e\n\n\n### model_4\n\t_________________________________________________________________\n\tLayer (type)                 Output Shape              Param #   \n\t=================================================================\n\tconv2d_7 (Conv2D)            (None, 198, 198, 32)      896       \n\t_________________________________________________________________\n\tactivation_11 (Activation)   (None, 198, 198, 32)      0         \n\t_________________________________________________________________\n\tmax_pooling2d_7 (MaxPooling2 (None, 99, 99, 32)        0         \n\t_________________________________________________________________\n\tconv2d_8 (Conv2D)            (None, 97, 97, 64)        18496     \n\t_________________________________________________________________\n\tactivation_12 (Activation)   (None, 97, 97, 64)        0         \n\t_________________________________________________________________\n\tmax_pooling2d_8 (MaxPooling2 (None, 48, 48, 64)        0         \n\t_________________________________________________________________\n\tconv2d_9 (Conv2D)            (None, 46, 46, 128)       73856     \n\t_________________________________________________________________\n\tactivation_13 (Activation)   (None, 46, 46, 128)       0         \n\t_________________________________________________________________\n\tmax_pooling2d_9 (MaxPooling2 (None, 23, 23, 128)       0         \n\t_________________________________________________________________\n\tflatten_3 (Flatten)          (None, 67712)             0         \n\t_________________________________________________________________\n\tdense_5 (Dense)              (None, 128)               8667264   \n\t_________________________________________________________________\n\tactivation_14 (Activation)   (None, 128)               0         \n\t_________________________________________________________________\n\tdropout_3 (Dropout)          (None, 128)               0         \n\t_________________________________________________________________\n\tdense_6 (Dense)              (None, 1)                 129       \n\t_________________________________________________________________\n\tactivation_15 (Activation)   (None, 1)                 0         \n\t=================================================================\n\tTotal params: 8,760,641\n\tTrainable params: 8,760,641\n\tNon-trainable params: 0\n\t_________________________________________________________________\n\n\n\u003cimg src=\"models/model_4/model_4_training.png\" width=\"500\"\u003e\n\n\u003cbr\u003e\n\n\u003cimg src=\"models/model_4/model_4_validation.png\" width=\"500\"\u003e\n\n\n### model_5\n\n\t_________________________________________________________________\n\tLayer (type)                 Output Shape              Param #   \n\t=================================================================\n\tconv2d_1 (Conv2D)            (None, 200, 200, 32)      896       \n\t_________________________________________________________________\n\tconv2d_2 (Conv2D)            (None, 200, 200, 32)      9248      \n\t_________________________________________________________________\n\tmax_pooling2d_1 (MaxPooling2 (None, 100, 100, 32)      0         \n\t_________________________________________________________________\n\tconv2d_3 (Conv2D)            (None, 100, 100, 64)      18496     \n\t_________________________________________________________________\n\tconv2d_4 (Conv2D)            (None, 100, 100, 64)      36928     \n\t_________________________________________________________________\n\tmax_pooling2d_2 (MaxPooling2 (None, 50, 50, 64)        0         \n\t_________________________________________________________________\n\tconv2d_5 (Conv2D)            (None, 50, 50, 128)       73856     \n\t_________________________________________________________________\n\tconv2d_6 (Conv2D)            (None, 50, 50, 128)       147584    \n\t_________________________________________________________________\n\tmax_pooling2d_3 (MaxPooling2 (None, 25, 25, 128)       0         \n\t_________________________________________________________________\n\tconv2d_7 (Conv2D)            (None, 25, 25, 256)       295168    \n\t_________________________________________________________________\n\tconv2d_8 (Conv2D)            (None, 25, 25, 256)       590080    \n\t_________________________________________________________________\n\tmax_pooling2d_4 (MaxPooling2 (None, 12, 12, 256)       0         \n\t_________________________________________________________________\n\tflatten_1 (Flatten)          (None, 36864)             0         \n\t_________________________________________________________________\n\tdense_1 (Dense)              (None, 256)               9437440   \n\t_________________________________________________________________\n\tdropout_1 (Dropout)          (None, 256)               0         \n\t_________________________________________________________________\n\tdense_2 (Dense)              (None, 256)               65792     \n\t_________________________________________________________________\n\tdropout_2 (Dropout)          (None, 256)               0         \n\t_________________________________________________________________\n\tdense_3 (Dense)              (None, 1)                 257       \n\t_________________________________________________________________\n\tactivation_1 (Activation)    (None, 1)                 0         \n\t=================================================================\n\tTotal params: 10,675,745\n\tTrainable params: 10,675,745\n\tNon-trainable params: 0\n\t_________________________________________________________________\n\n\u003cimg src=\"models/model_5/model_5_training.png\" width=\"500\"\u003e\n\n\u003cbr\u003e\n\n\u003cimg src=\"models/model_5/model_5_validation.png\" width=\"500\"\u003e\n\n## Author\n\n**Greg (Grzegorz) Surma**\n\n[**PORTFOLIO**](https://gsurma.github.io)\n\n[**GITHUB**](https://github.com/gsurma)\n\n[**BLOG**](https://medium.com/@gsurma)\n\n\u003ca href=\"https://www.paypal.com/paypalme2/grzegorzsurma115\"\u003e\n  \u003cimg alt=\"Support via PayPal\" src=\"https://cdn.rawgit.com/twolfson/paypal-github-button/1.0.0/dist/button.svg\"/\u003e\n\u003c/a\u003e\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgsurma%2Fimage_classifier","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgsurma%2Fimage_classifier","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgsurma%2Fimage_classifier/lists"}