DenkingOfficial commited on
Commit
217866d
1 Parent(s): 036421e

Initial deploy

Browse files
README.md CHANGED
@@ -1,12 +1,81 @@
1
  ---
2
  title: Cat Breed Classifier
3
- emoji: 📈
4
- colorFrom: blue
5
- colorTo: green
6
  sdk: gradio
7
  sdk_version: 3.16.1
8
  app_file: app.py
9
  pinned: false
 
10
  ---
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  title: Cat Breed Classifier
3
+ emoji: 🐱
4
+ colorFrom: green
5
+ colorTo: red
6
  sdk: gradio
7
  sdk_version: 3.16.1
8
  app_file: app.py
9
  pinned: false
10
+ license: openrail
11
  ---
12
 
13
+ # \[EN\] Cat Breed Classifier
14
+
15
+ This is an app that can classify the breed of a cat based on a photo.
16
+
17
+ It uses a VGG-16 ImageNet model finetuned on images of cats of various breeds. The model is able to recognize a 20 of breeds.
18
+
19
+ ## Requirements
20
+
21
+ - Python 3.8 or higher
22
+ - Gradio 3.15.0
23
+ - Tensorflow 2.10
24
+ - Numpy 1.23.3
25
+ - Requests 2.25.1
26
+ - Pillow 9.0.1
27
+ - FastApi 0.88.0
28
+ - Uvicorn 0.20.0 or higher
29
+
30
+ ## How to use
31
+
32
+ 1. Clone repository using `git clone https://github.com/DenkingOfficial/cat_breed_classifier.git`
33
+ 2. Enter the cloned directory `cd cat_breed_classifier`
34
+ 3. Install requirements by running `pip install -r requirements.txt`
35
+ 4. Download a model from [here](https://www.dropbox.com/s/iga6rfyqpq0lnra/20_cat_classes_model.h5) and place it into `models` folder
36
+ 5. Run app using `uvicorn app:app`
37
+
38
+ ## Authors
39
+
40
+ This app was developed by students of Ural Federal University (UrFU):
41
+
42
+ - Shershnev Andrey, RIM-120907 - Model Training, App Development
43
+ - Ivanov Sergey, RIM-120906 - API Development, Dataset collection
44
+ - Shalaeva Irina, RIM-120906 - UI Styling, Dataset collection
45
+ - Ilyin Semen, RIM-120907 - App Development, Dataset collection
46
+
47
+ ---
48
+
49
+ # \[RU\] Классификатор пород кошек
50
+
51
+ Это веб-приложение, которое позволяет определять породу кошки по фотографии.
52
+
53
+ Оно использует модель VGG-16 ImageNet тонко настроенную на изображениях кошек разных пород. Данная модель позволяет определять 20 пород.
54
+
55
+ ## Зависимости
56
+
57
+ - Python 3.8 или новее
58
+ - Gradio 3.15.0
59
+ - Tensorflow 2.10
60
+ - Numpy 1.23.3
61
+ - Requests 2.25.1
62
+ - Pillow 9.0.1
63
+ - FastApi 0.88.0
64
+ - Uvicorn 0.20.0 или новее
65
+
66
+ ## Как использовать
67
+
68
+ 1. Загрузить репозиторий используя команду `git clone https://github.com/DenkingOfficial/cat_breed_classifier.git`
69
+ 2. Перейти в директорию репозитория `cd cat_breed_classifier`
70
+ 3. Установить зависимости используя команду `pip install -r requirements.txt`
71
+ 4. Скачать модель [отсюда](https://www.dropbox.com/s/iga6rfyqpq0lnra/20_cat_classes_model.h5) и скопировать ее в папку `models`
72
+ 5. Запустить приложение используя команду `uvicorn app:app`
73
+
74
+ ## Авторы
75
+
76
+ Это приложение было разработано студентами Уральского Федерального университета (УрФУ):
77
+
78
+ - Шершнев Андрей, РИМ-120907 - тренировка модели, разработка приложения
79
+ - Иванов Сергей, РИМ-120906 - разработка API, сбор датасета
80
+ - Шалаева Ирина, РИМ-120906 - стилизация интерфейса, сбор датасета
81
+ - Ильин Семен, РИМ-120907 - разработка приложения, сбор датасета
app.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ import subprocess
2
+
3
+ subprocess.run("uvicorn main_app:app --host 0.0.0.0 --port 7860", shell=True)
cat_breeds_dict.py ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ CAT_BREEDS = ['Бенгальская', 'Бомбейская', 'Бритнаская короткошерстная',
2
+ 'Бурмилла', 'Девон-рекс', 'Европейская короткошерстная',
3
+ 'Экзотическая короткошерстная', 'Мейн-кун', 'Нибелунг',
4
+ 'Персидская', 'Питерболд', 'Рэгдолл', 'Русская голубая',
5
+ 'Саванна', 'Шотландская вислоухая', 'Сибирская', 'Сингапурская',
6
+ 'Сомалийская', 'Сфинкс', 'Черепаховая']
7
+
8
+ CAT_DESCRIPTIONS = {'Бенгальская':
9
+ '''# Бенгальская кошка
10
+ ### Бенгальская кошка — крупная кошка с блестящей шерстью, очень развитой мускулатурой и толстым хвостом, который часто свисает до земли. Бенгальская кошка внешне напоминает дикую кошку: характерная густая роскошная шерсть имеет пятнистый окрас и мраморные разводы. На широкой голове располагаются небольшие уши и бакенбарды, глаза имеют миндалевидную форму и чёрную окантовку. Хвост толстый, сужается к чёрному кончику. Ни одна другая порода кошек не имеет такого эффекта золотистого или жемчужного мерцания шерсти, который можно обнаружить у бенгальских кошек.
11
+ ''',
12
+
13
+ 'Бомбейская':
14
+ '''# Бомбейская кошка
15
+ ### Бомбейская кошка (бомбей) – питомец-компаньон для активных и жизнерадостных людей, проводящих большую часть свободного времени дома. Порода задумана как мини-версия черной пантеры. Однако от хищной кошки унаследовала только экстерьер. В то время как характер больше напоминает собаку. Породистый бомбей демонстрирует безусловную преданность и любовь к человеку, не отказывается от игры в апорт и легко запоминает базовые команды. К тому же представители породы умны и эмпатичны: животное тонко чувствует настроение хозяина и подстраивается даже под незначительные его изменения.Бомбейская кошка (бомбей) – питомец-компаньон для активных и жизнерадостных людей, проводящих большую часть свободного времени дома. Порода задумана как мини-версия черной пантеры. Однако от хищной кошки унаследовала только экстерьер. В то время как характер больше напоминает собаку. Породистый бомбей демонстрирует безусловную преданность и любовь к человеку, не отказывается от игры в апорт и легко запоминает базовые команды. К тому же представители породы умны и эмпатичны: животное тонко чувствует настроение хозяина и подстраивается даже под незначительные его изменения.
16
+ ''',
17
+
18
+ 'Бритнаская короткошерстная':
19
+ '''# Бритнаская короткошерстная
20
+ ### Британская короткошёрстная — крупная порода, имеющая массивное, коренастое телосложение. У представителей этой породы широкая грудная клетка и толстый хвост. Морда, уши, глаза и голова — имеют округлую форму. У кошки короткий широкий нос и массивная нижняя челюсть. Шерсть у британских короткошёрстных — короткая и густая, без пушистости, бывает более ста окрасов и имеет множество комбинаций пятен.
21
+ ''',
22
+
23
+ 'Бурмилла':
24
+ '''# Бурмилла
25
+ ### Бурмилла — кошка среднего телосложения, похожая на бурмезскую. Порода отличается коренастым и довольно мускулистым телом и широкой прямой спиной. Самки намного мельче и изящнее самцов. Форма головы — слегка скругленный конус. Представители этой породы имеют клиновидный нос и широко посаженные уши. Цвет глаз варьируется от золотисто-желтого до зеленого. Отличительной особенностью этой породы является характерная отметина на лбу в виде буквы M. Короткая шерсть со светлым подшерстком близко прилегает к телу и отличается равномерным типпингом (кончики волосков более темного цвета) по всему телу.
26
+ ''',
27
+
28
+ 'Девон-рекс':
29
+ '''# Девон-рекс
30
+ ### Запоминающийся образ кошки породы девон-рекс — это ехидная мордочка с волнистой «мятой» шерстью. Широкие скулы, большие глаза, низко посаженные уши. Короткая шерсть имеет волнистые остевые волосы, но в основном состоит из пухового подшерстка. Шерсть девон-рекса имеет характерную «марсельскую волну», особенно на спине, где образуются мелкие барашки. Бакенбарды и надбровные дуги у этой породы также волнистые. Девон-рекс может быть любых окрасов и вариантов пятнистости.
31
+ ''',
32
+
33
+ 'Европейская короткошерстная':
34
+ '''# Европейская короткошерстная
35
+ ### Европейская короткошерстная кошка, она же кельтская, на первый взгляд выглядит как обычная довольно крупная домашняя кошка. Тем не менее генетики выяснили, что она наследует кошкам, охранявшим амбары европейских крестьян 2000 лет назад! И это как минимум. Каждая кельтская кошка отличаются своим характером: одни любят прогулки, другие предпочитают наблюдать жизнь из окна; одни более общительны, другие менее. Но все они хорошие компаньоны: уравновешенные, жизнерадостные, ласковые без навязчивости, готовые и поиграть, и просто составить компанию на диване перед телевизором.
36
+ ''',
37
+
38
+ 'Экзотическая короткошерстная':
39
+ '''# Экзотическая короткошерстная
40
+ ### Экзотическая короткошерстная кошка среднего размера. Телосложение — коренастое и в то же время подтянутое. Имеет широкую, круглую голову с небольшими, широко посаженными ушами. У этой кошки маленькая открытая мордочка с большими яркими глазами. Имеет короткие и сильные лапы, с крупными округлыми стопами. Хвост небольшой длины, при этом достаточно пушистый. Шерсть — короткая, густая, с плотным мягким подшерстком. Экзотическая короткошерстная кошка бывает многих окрасов и вариантов пятнистости, типичных для персидской породы, а также может иметь окрас «пятнистый табби».
41
+ ''',
42
+
43
+ 'Мейн-кун':
44
+ '''# Мейн-кун
45
+ ### Мейн-кун – это популярная порода кошек, завоевавшая ��оклонников по всему миру своим харизматичным внешним видом и внушительными размерами. Даже обычным людям, совсем не разбирающимся в породах, легко отличить мейн-куна от других кошек благодаря их выдающимся внешним данным. Мейн-кун гордо носит звание пушистого великана.
46
+ ''',
47
+
48
+ 'Нибелунг':
49
+ '''# Нибелунг
50
+ ### Нибелунг — редкая порода домашних кошек. Она считается длинношёрстным вариантом русской голубой кошки. Представители этой породы замкнуты и не «горласты», но иногда могут громко мяукать дожидаясь хозяина. Обладают не требующей ежедневного ухода голубой шерстью с серебристым типпингом. Остевые волосы шерсти нибелунга отражают свет, тем самым создавая серебристый отлив. Окрас шерсти и подшёрстка — сплошной голубой. Порода названа в честь «порождения тумана» (от нем. Nebel — туман) из средневекового немецкого эпоса «Песнь о Нибелунгах».
51
+ ''',
52
+
53
+ 'Персидская':
54
+ '''# Персидская
55
+ ### Персидская длинношерстная кошка — порода среднего размера, с коренастым телом и с массивной головой. Уши — небольшие, широко посаженные. У этой кошки маленькая открытая мордочка с большими яркими глазами. Имеет короткие и сильные лапы с крупными округлыми основаниями и кисточками между подушечек. Шерсть — длинная, густая и блестящая, с плотным мягким подшерстком. Имеет короткий, но необыкновенно пушистый хвост. Допускаются разные варианты окрасов и пятнистости.
56
+ ''',
57
+
58
+ 'Питерболд':
59
+ '''# Питерболд
60
+ ### Питерболд — выведенная в России порода бесшёрстных домашних кошек. Питерболды имеют характерную форму головы: длинную и узкую, с прямым профилем, миндалевидными глазами и большими, разведёнными в стороны ушами. Идеальные представители породы выглядят, как бесшёрстные ориентальные кошки. Питерболды обычно дружелюбны, любопытны, активны, любят всех членов своей семьи и нуждаются в общении с людьми; они не принадлежат к независимым кошкам. Питерболды хорошо уживаются с другими кошками и прочими домашними животными.
61
+ ''',
62
+
63
+ 'Рэгдолл':
64
+ '''# Рэгдолл
65
+ ### Рэгдолл — крупная и величавая кошка с характерным окрасом. Представители этой породы обычно расслаблены, невозмутимы и кажутся ленивыми. Голова широкая, имеет плоскую верхнюю часть, с широко расположенными ушами. У рэгдолла большие глаза насыщенного голубого цвета. Тело — длинное и мускулистое, с широкой грудной клеткой, короткой шеей и крупными круглыми лапами с кисточками между подушечек. Хвост — длинный и пушистый. Шерсть рэгдоллов шелковистая и густая, средней длины или длинная. Для взрослых кошек типично «кольцо» шерсти вокруг шеи и пушистые «штанишки». Встречаются три вида окраса: колор-пойнт (у таких кошек светлое тело, но тёмные отдельн��е его части: лапы, хвост, уши и морда), би-колор (один из типов окрасов кошек с белыми пятнами, которые занимают от 1/3 до 1/2 всего тела) и миттед (один из типов окрасов кошек с белыми пятнами, которые занимают от 1/4 до 1/3 всего тела).
66
+ ''',
67
+
68
+ 'Русская голубая':
69
+ '''# Русская голубая
70
+ ### Кошки породы русская голубая бывают среднего или крупного размера. Имеют изящное тело и длинные, стройные ноги. Эта кошка настолько грациозна, что кажется, будто она передвигается на цыпочках. Голова имеет клинообразную форму с выдающейся зоной бакенбард и крупные уши. Яркие зеленые глаза широко посажены и имеют миндалевидную форму. По текстуре шерсть русской голубой непохожа на шерсть кошек других пород, и это основная отличительная особенность породы. Шерстка у этих животных — двойная, с густым подшерстком, короткая и приятная на ощупь. Несмотря на название породы, иногда среди русских голубых кошек встречаются особи с черным и белым окрасом. У типичных же представителей окрас равномерно голубой, с серебристым отливом.
71
+ ''',
72
+
73
+ 'Саванна':
74
+ '''# Саванна
75
+ ### Саванна — высокая худая кошка с длинными лапами. Взрослая особь может достигать веса в 15 кг при росте 60 см в холке. Размеры ее тела зависят от близости конкретного представителя к первому скрещенному поколению: чем ближе, тем крупнее животное. Кроме того, под влиянием случайных факторов в генетике породы саванна могут встречаться кошки, значительно отличающиеся по размерам, даже в одном помете. Как правило, саванна имеет пятнистый окрас, но иногда встречаются кошки с мраморным рисунком, снежным окрасом, а также с шерстью голубого или других ненасыщенных цветов. Уши — высокие, с глубокой «чашкой», округленные, прямые (задняя часть уха имеет светлую полосу по центру, с черным, темно-серым или коричневым окаймлением, что создает «эффект глаза»). У этих кошек широкий нос и глаза с нависающими веками. На коротких хвостах — черные кольца и однотонный черный кончик. Глаза могут быть зелеными, коричневыми или золотистыми.
76
+ ''',
77
+
78
+ 'Шотландская вислоухая':
79
+ '''# Шотландская вислоухая
80
+ ### Шотла́ндская вислоу́хая ко́шка или ско́ттиш-фолд (англ. Scottish Fold) — порода домашних кошек с характерными загнутыми вперёд и вниз ушами, что вызвано действием доминантного гена, который возник в результате естественной мутации и оказывающий влияние на хрящи во всём организме. Это придаёт голове кошки характерный вид, которую часто описывают как «похожую на совиную».
81
+ ''',
82
+
83
+ 'Сибирская':
84
+ '''# Сибирская
85
+ ### Сибирская кошка – прекрасный выбор для семей с детьми и владельцев, которые интересуются разведением и выставочной деятельностью. Ведь порода обладает устойчивой психикой и крепким здоровьем, при этом все еще открыта для сертификации. Разводить «сибиряков» можно даже с беспородной кошкой, обладающей характерными признаками представителей породы. Поэтому привнесение новой крови в племенную линию осуществляется регулярно, и порода не страдает от инбридинга (скрещивания особей, состоящих в тесном родстве).
86
+ ''',
87
+
88
+ 'Сингапурская':
89
+ '''# Сингапурская
90
+ ### Сингапурская кошка похожа на маленького представителя абиссинской породы. Ее голова имеет округлую форму с выраженными бакенбардами и короткой широкой мордой. Уши — крупные и глубокие. Глаза — большие, миндалевидной формы, слегка скошенные, широко раскрытые. Несмотря на небольшой размер, тело кошки — коренастое и мускулистое. Хвост — тонкий с тупым кончиком. Шерсть — короткая и гладкая, с черными, коричневыми или кремовыми полосками на каждом из волосков. При этом шерсть имеет более темный окрас на спине, хвосте и ногах, а на груди и животе остается светлой. Глаза у кошек этой породы обычно карие, зеленые или желтые с черным окаймлением.
91
+ ''',
92
+
93
+ 'Сомалийская':
94
+ '''# Сомалийская
95
+ ### Сомалийская кошка имеет среднее телосложение. Это крепкое, стройное животное с хорошо развитой мускулатурой и шерстью средней длины. Голова кошки имеет форму клина с мягкими очертаниями. Уши широко посаженные, с кисточками. Имеет глаза миндалевидной формы, часто — янтарного цвета, оттенка грецкого ореха или зеленые. . Взрослая сомалийская кошка имеет «кольцо» шерсти вокруг шеи и пушистые «штанишки», что не выражено у котят. Мягкие, красивые, густые волоски плотно прилегают к телу, при этом каждый из них окрашен как минимум в три цвета. Сомалийская кошка имеет 28 окрасов. Наиболее популярный — насыщенный золотисто-коричневый с кремовой основой и черным тикингом.
96
+ ''',
97
+
98
+ 'Сфинкс':
99
+ '''# Сфинкс
100
+ ### Сфинкс – бесшерстная кошка с поведением и характером собаки. Представители породы относятся к классу компаньонов. Поэтому нуждаются во внимании и совсем непохожи на независимых кошек, стремящихся держаться от человека на расстоянии. Животное ориентировано на взаимодействие, любит сидеть на коленях, легко уживается с другими животными в доме и хорошо ладит с детьми, даже самыми маленькими. Порода сфинкс имеет несколько ответвлений. Например, канадский сфинкс, донской сфинкс и петерболд. Однако признание от международных фелинологических организаций заслужил пока лишь канадский.
101
+ ''',
102
+
103
+ 'Черепаховая':
104
+ '''# Черепаховая
105
+ ### Черепаховый окрас – один из самых удивительных и необычных окрасов кошек. Черепаховый окрас является очень распространённым среди метисов, а также среди многих пород кошек он закреплён в стандарт��. Вариации цветов полосок и пятен подобного окраса, а также их узоры на шерсти уникальны и неповторимы, так же, как и отпечатки пальцев у людей. Это генетическая особенность, которая передается по наследству и обуславливается определенной комбинацией хромосом.
106
+ '''
107
+ }
main_app.py ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import numpy as np
3
+ import requests
4
+ import tensorflow as tf
5
+ from fastapi import FastAPI
6
+ from io import BytesIO
7
+ from PIL import Image
8
+ from pydantic import BaseModel
9
+ from cat_breeds_dict import CAT_BREEDS, CAT_DESCRIPTIONS
10
+
11
+
12
+ class Url(BaseModel):
13
+ link: str
14
+
15
+
16
+ MODEL = tf.keras.models.load_model('./models/20_cat_classes_model.h5')
17
+ GRADIO_PATH = '/'
18
+
19
+ app = FastAPI()
20
+
21
+
22
+ def predict(image, api_mode=False):
23
+ image = image.resize((128, 128))
24
+ image = np.asarray(image)
25
+ image = image.reshape(1, 128, 128, 3)
26
+
27
+ prediction = MODEL.predict(image)[0]
28
+ predicted_breed = CAT_BREEDS[np.argmax(prediction)]
29
+ breed_description = CAT_DESCRIPTIONS[predicted_breed]
30
+
31
+ if api_mode:
32
+ return {'breed': predicted_breed, 'description': breed_description}
33
+ return {CAT_BREEDS[i]: float(prediction[i]) for i in range(20)}, \
34
+ breed_description
35
+
36
+
37
+ @app.post('/predict_breed/')
38
+ def predict_api(url: Url):
39
+ try:
40
+ image = requests.get(url.link).content
41
+ except:
42
+ return {'error': 'Invalid link'}
43
+ image = Image.open(BytesIO(image))
44
+ return predict(image, api_mode=True)
45
+
46
+
47
+ with gr.Blocks(css='./static/style.css') as gradio_ui:
48
+
49
+ gr.Markdown(
50
+ """
51
+ # Классификатор пород котов
52
+ Разработано студентами Шершневым А.А, Ивановым С.С, Шалаевой И.Г. и
53
+ Ильиным С.С.
54
+ Группы: РИМ-120906, РИМ-120907
55
+ """,
56
+ elem_id='md-text'
57
+ )
58
+
59
+ with gr.Row(elem_id='main-row') as row:
60
+
61
+ with gr.Column(scale=2, elem_id='first-col') as col_1:
62
+ user_image = gr.Image(
63
+ label='Загрузите фотографию котика сюда',
64
+ type='pil',
65
+ elem_id='user-image'
66
+ )
67
+ predict_button = gr.Button(value='Определить породу')
68
+
69
+ with gr.Column(scale=1, elem_id='second-col') as col_2:
70
+ predicted_labels = gr.Label(
71
+ num_top_classes=5,
72
+ label='Результат определения породы',
73
+ elem_id='predictions-text'
74
+ )
75
+
76
+ breed_description = gr.Markdown(elem_id='breed-description')
77
+
78
+ predict_button.click(
79
+ fn=predict,
80
+ inputs=[user_image],
81
+ outputs=[predicted_labels, breed_description]
82
+ )
83
+
84
+ app = gr.mount_gradio_app(app, gradio_ui, path=GRADIO_PATH)
models/20_cat_classes_model.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2d143e75db0c7101f3715f606e240250fb6bb2d3bf420def5cac6053b253e739
3
+ size 140809360
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ numpy==1.23.3
2
+ requests==2.25.1
3
+ tensorflow-cpu==2.10.0
4
+ Pillow==9.0.1
5
+ fastapi==0.88.0
static/style.css ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #main-row, #breed-description, #md-text {
2
+ width: 80%;
3
+ margin: auto;
4
+ }
5
+
6
+ #predictions-text, #user-image, #first-col{
7
+ height: 100% !important;
8
+ max-height: 100% !important;
9
+ min-height: 100% !important;
10
+ }
11
+
12
+ #main-row {
13
+ min-height: 30rem;
14
+ }
15
+
16
+ #md-text {
17
+ padding-top: 3%;
18
+ padding-bottom: 2%;
19
+ }
20
+
21
+ #breed-description {
22
+ padding-top: 2%;
23
+ }
24
+
25
+ .h-60 {
26
+ height: 30em !important;
27
+ }
28
+
29
+ @media (min-width: 768px){
30
+ .md\:min-h-\[15rem\] {
31
+ min-height: 26rem;
32
+ }
33
+ }
34
+
35
+ @media (min-width: 1280px){
36
+ .xl\:max-h-\[18rem\] {
37
+ max-height: 30rem;
38
+ }
39
+ }
40
+
41
+ @media (min-width: 1536px){
42
+ .\32xl\:max-h-\[20rem\] {
43
+ max-height: 30rem;
44
+ }
45
+ }