Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
4 / 4 / 1
Регистрация: 11.11.2019
Сообщений: 140
Записей в блоге: 2

VGG16. Классификация изображений (Cats vs. Dogs)

11.01.2022, 21:37. Показов 3637. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток

Мне для своего проекта нужно написать сверточную нейросеть. Решил для начала попробовать разные примеры. Нашел пример сети VGG16 на keras, классифицирует изображения кошек и собак.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
"""
VGG-16 Implementation on Cats&Dogs Dataset
"""
 
import keras
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
from keras.callbacks import ModelCheckpoint, EarlyStopping
from tensorflow.keras.layers import Conv2D, Dense, Flatten, MaxPool2D
from tensorflow.keras.models import Sequential, load_model
from keras.optimizers import Adam
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator
 
config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True  # dynamically grow the memory used on the GPU
config.log_device_placement = True  # to log device placement (on which device the operation ran)
sess = tf.compat.v1.Session(config=config)
set_session(sess)
 
# Get the data
trdata = ImageDataGenerator()
traindata = trdata.flow_from_directory(directory="C:/Temp/Datasets/CatsDogs/train", target_size=(224, 224))
tsdata = ImageDataGenerator()
testdata = tsdata.flow_from_directory(directory='C:/Temp/Datasets/CatsDogs/validation', target_size=(224, 224))
 
# Generate the model
model = Sequential()
# Layer 1: Convolutional
model.add(Conv2D(input_shape=(224, 224, 3), filters=64, kernel_size=(3, 3),
                 padding='same', activation='relu'))
# Layer 2: Convolutional
model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same', activation='relu'))
# Layer 3: MaxPooling
model.add(MaxPool2D(pool_size=(2, 2), strides=(2, 2)))
 
# Layer 4: Convolutional
model.add(Conv2D(filters=128, kernel_size=(3, 3), padding='same', activation='relu'))
# Layer 5: Convolutional
model.add(Conv2D(filters=128, kernel_size=(3, 3), padding='same', activation='relu'))
# Layer 6: MaxPooling
model.add(MaxPool2D(pool_size=(2, 2), strides=(2, 2)))
 
# Layer 7: Convolutional
model.add(Conv2D(filters=256, kernel_size=(3, 3), padding='same', activation='relu'))
# Layer 8: Convolutional
model.add(Conv2D(filters=256, kernel_size=(3, 3), padding='same', activation='relu'))
# Layer 9: Convolutional
model.add(Conv2D(filters=256, kernel_size=(3, 3), padding='same', activation='relu'))
# Layer 10: MaxPooling
model.add(MaxPool2D(pool_size=(2, 2), strides=(2, 2)))
 
# Layer 11: Convolutional
model.add(Conv2D(filters=512, kernel_size=(3, 3), padding='same', activation='relu'))
# Layer 12: Convolutional
model.add(Conv2D(filters=512, kernel_size=(3, 3), padding='same', activation='relu'))
# Layer 13: Convolutional
model.add(Conv2D(filters=512, kernel_size=(3, 3), padding='same', activation='relu'))
# Layer 14: MaxPooling
model.add(MaxPool2D(pool_size=(2, 2), strides=(2, 2)))
 
# Layer 15: Convolutional
model.add(Conv2D(filters=512, kernel_size=(3, 3), padding='same', activation='relu'))
# Layer 16: Convolutional
model.add(Conv2D(filters=512, kernel_size=(3, 3), padding='same', activation='relu'))
# Layer 17: Convolutional
model.add(Conv2D(filters=512, kernel_size=(3, 3), padding='same', activation='relu'))
# Layer 18: MaxPooling
model.add(MaxPool2D(pool_size=(2, 2), strides=(2, 2)))
 
# Layer 19: Flatten
model.add(Flatten())
# Layer 20: Fully Connected Layer
model.add(Dense(units=4096, activation='relu'))
# Layer 21: Fully Connected Layer
model.add(Dense(units=4096, activation='relu'))
# Layer 22: Softmax Layer
model.add(Dense(units=2, activation='softmax'))
 
# Add Optimizer and check accuracy metrics
optimizer = tf.keras.optimizers.Adam(lr=0.001)
model.compile(optimizer=optimizer, loss=keras.losses.categorical_crossentropy,
              metrics=['accuracy'])
# Check model summary
print(model.summary())
 
checkpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_acc', verbose=1, save_best_only=True,
                             save_weights_only=False, mode='auto', period=1)
earlystop = EarlyStopping(monitor='val_acc', min_delta=0, patience=20, verbose=1, mode='auto')
hist = model.fit_generator(steps_per_epoch=100, generator=traindata, validation_data=testdata,
                           validation_steps=10, epochs=100,
                           callbacks=[checkpoint, earlystop])
 
plt.plot(hist.history["acc"])
plt.plot(hist.history['val_acc'])
plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title("model accuracy")
plt.ylabel("Accuracy")
plt.xlabel("Epoch")
plt.legend(["Accuracy", "Validation Accuracy", "loss", "Validation Loss"])
plt.show(block=True)
 
# Try on test data
img = image.load_img("C:/Temp/Datasets/CatsDogs/validation/39.jpg", target_size=(224, 224))
img = np.asarray(img)
plt.imshow(img)
img = np.expand_dims(img, axis=0)
saved_model = load_model("vgg16_1.h5")
output = saved_model.predict(img)
if output[0][0] > output[0][1]:
    print("cat")
else:
    print('dog')
Исходник тут https://github.com/ashushekar/VGG16 (пришлось немного модифицировать, т.к. у нас с автором, видимо, версии библиотек разные). Сам классификатор скачал отсюда https://www.kaggle.com/c/dogs-vs-cats/data и распаковал на диск С. При запуске сама структура сети вроде как отрисовывается, а дальше ошибки. Есть предположение, что проблема в путях к файлам датасета, но на 100% не уверен в этом. Помогите разобраться.
Все, что мне выдает PyCharm приложил в файле
Вложения
Тип файла: txt new 8.txt (11.2 Кб, 15 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.01.2022, 21:37
Ответы с готовыми решениями:

классификация изображений
Доброго дня вам, форумчани) Подскажите, где можно прочитать что-нить по классификации изображениям, по классификаторам( в основном...

Классификация изображений
Добрый вечер! У меня есть программа, которая на основе различных изображений с буквой "а" выделяет нужное количество кластеров...

Классификация изображений.
Здравствуйте, очень нужна помощь Нужно написать программу, которая будет производить классификацию изображений. Например , нам нужно...

17
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
12.01.2022, 09:43
Цитата Сообщение от Baumanetc Посмотреть сообщение
sess = tf.compat.v1.Session(config=config)
set_session(sess)
Какая версия TF у Вас и там, откуда копировали?

Добавлено через 8 минут
Цитата Сообщение от Baumanetc Посмотреть сообщение
Решил для начала
Лучше начинать с классики:
https://keras.io/examples/vision/mnist_convnet/
0
4 / 4 / 1
Регистрация: 11.11.2019
Сообщений: 140
Записей в блоге: 2
12.01.2022, 10:50  [ТС]
TF у меня 2.2.0. Какая версия у автора исходника не знаю. В его статье и на github'е нет информации.
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
12.01.2022, 10:54
Цитата Сообщение от Baumanetc Посмотреть сообщение
TF у меня 2.2.0
Рекомендую 2.7. Карточка графическая какая ?
0
4 / 4 / 1
Регистрация: 11.11.2019
Сообщений: 140
Записей в блоге: 2
12.01.2022, 14:14  [ТС]
Цитата Сообщение от Nick07 Посмотреть сообщение
Рекомендую 2.7. Карточка графическая какая ?
В смысле видеокарта? В ноутбуке их две: Intel(R) UHD Graphics 620 и NVIDIA GeForce GTX 1050 with Max-Q Design

В общем попробую обновить библиотеки и позапускать скрипт. По результатам отпишусь

Добавлено через 48 минут
Обновил библиотеки. Видимо в них что-то поменялось, поэтому немного подправил код

Python
1
2
3
optimizer = keras.optimizers.adam_v2.Adam(learning_rate=0.001)
model.compile(optimizer=optimizer, loss=tf.keras.losses.CategoricalCrossentropy,
              metrics=['accuracy'])
По-прежнему сохраняется ошибка, которую опубликовал в первом посте
0
4 / 4 / 1
Регистрация: 11.11.2019
Сообщений: 140
Записей в блоге: 2
12.01.2022, 20:39  [ТС]
В общем, разобрался. После того, как я создал папки Cats и Dogs в папках train и validation и разместил в них изображения все заработало
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
12.01.2022, 21:25
Цитата Сообщение от Baumanetc Посмотреть сообщение
trdata = ImageDataGenerator()
trdata = ImageDataGenerator(1/255.)
Цитата Сообщение от Baumanetc Посмотреть сообщение
img = np.asarray(img)
img = np.asarray(img)/255.
Цитата Сообщение от Baumanetc Посмотреть сообщение
В смысле видеокарта?
Видеокарта - это отдельная песня. Когда этот вопрос не будет вызывать такую реакцию...
С cuda драйверами надо познакомиться.

Добавлено через 1 минуту
Цитата Сообщение от Baumanetc Посмотреть сообщение
все заработало
В смысле ошибок не стало?

Цитата Сообщение от Baumanetc Посмотреть сообщение
img = image.load_img("C:/Temp/Datasets/CatsDogs/validation/39.jpg", target_size=(224, 224))
Грубейшая ошибка
0
4 / 4 / 1
Регистрация: 11.11.2019
Сообщений: 140
Записей в блоге: 2
12.01.2022, 21:35  [ТС]
Цитата Сообщение от Nick07 Посмотреть сообщение
В смысле ошибок не стало?
Ошибок действительно не стало, сеть начала учиться. Прошел одну эпоху. А их 100. Сейчас нет столько времени, чтобы дождаться окончания обучения. Попробую запустить в ночь, посмотрим что будет в конце. Может что-то и вылезет. Отпишусь по результатам
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
12.01.2022, 21:44
Цитата Сообщение от Baumanetc Посмотреть сообщение
Сейчас нет столько времени
Вот для этого и нужны графкарточки
Цитата Сообщение от Baumanetc Посмотреть сообщение
Отпишусь по результатам
График loss покажите, там много интересного
0
4 / 4 / 1
Регистрация: 11.11.2019
Сообщений: 140
Записей в блоге: 2
13.01.2022, 09:15  [ТС]
Цитата Сообщение от Nick07 Посмотреть сообщение
График loss покажите, там много интересного
Комп работал 5,5 часов. За это время сеть смогла пройти 10 или 11 эпох. Ну т.е. как и было написано в логе на одну эпоху уходило чуть более 30 минут. Их 100, поэтому получается на все про все нужно 50 часов. Пришлось остановить процесс. И это никак не ускорить?
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
13.01.2022, 11:19
Цитата Сообщение от Baumanetc Посмотреть сообщение
И это никак не ускорить?
Цитата Сообщение от Nick07 Посмотреть сообщение
Вот для этого и нужны графкарточки
На оф сайте TF посмотрите как установить правильные версии драйверов CUDA, cuDNN, обновите драйвер графкарты

Добавлено через 6 минут
Цитата Сообщение от Baumanetc Посмотреть сообщение
И это никак не ускорить?
Посмотрите предобученные (VGG, ResNet, DenseNet, EfficientBx) сети, на классификации они могут дать нормальный результат на 3 - 5 эпохе. Если не надоест, то впереди у Вас много игрушек на много лет...

Для учебных, малоразмерных задач можно поиграть с Colab

Добавлено через 9 минут
Цитата Сообщение от Baumanetc Посмотреть сообщение
одну эпоху уходило чуть более 30 минут
Для отладки и осмысления попробуйте раз в 10 уменьшить dataset, оно гораздо веселее будет

Добавлено через 1 час 18 минут
И уберите пару-тройку последних слоёв, на точности не особо скажется, а обучаться будет гораздо быстрее
0
4 / 4 / 1
Регистрация: 11.11.2019
Сообщений: 140
Записей в блоге: 2
14.01.2022, 13:24  [ТС]
Попробовал разобраться с CUDA и cuDNN. После установки всего полный лог ошибок и сеть не запускается (обучение не идет). Возможно где-то накосячил, поэтому опишу свои действия:
1. Скачал CUDA с офф. сайта NVidia, версия 11.2 (т.к. TF у меня 2.7.0). Установил с папку по дефолту и с настройками по умолчанию
2. Скачал cuDNN 8.1.0. В архиве три папки + текстовик. Скопировал их в каталог установки CUDA. При предложении что-то заменить заменял
3. В параметрах среды (Панель управления \ Система \ Дополнительные параметры системы \ кнопка Параметры среды) отредактировал системные переменные и сделал, соответственно
CUDA_PATH : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin
CUDA_PATH_V11_2 : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\libnvvp
Изначально было и там и там C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2.
Вот в этом шаге не уверен, т.к. он или не описан в статьях в Интернете, либо описан, но я просто не понял, что конкретно нужно сделать
4. Установил библиотеку TF-gpu
Система win10
Все, что вывелось в pycharm'ме приложил. Даже не знаю, с чего начать гуглить. Если кто-то может помочь, то пожалуйста. Буду благодарен
Вложения
Тип файла: 7z new 9.7z (5.7 Кб, 3 просмотров)
0
4 / 4 / 1
Регистрация: 11.11.2019
Сообщений: 140
Записей в блоге: 2
14.01.2022, 13:30  [ТС]
Да, вроде еще пишут, что требуется VS. Установлена, 2019
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
14.01.2022, 15:40
Цитата Сообщение от Baumanetc Посмотреть сообщение
4. Установил библиотеку TF-gpu
Цитата Сообщение от Baumanetc Посмотреть сообщение
(т.к. TF у меня 2.7.0)
???

Добавлено через 15 минут
Limit: 2916260251
InUse: 2188756224
MaxInUse: 2414377216
NumAllocs: 203
MaxAllocSize: 536870912
Reserved: 0
PeakReserved: 0
LargestFreeBlock: 0
===========================
У меня типа этого показывает когда памяти графкарты не хватает.
Попробуйте bs уменьшить и/или resize

Но в любом случае "GPU:0 with 2781 MB memory: -> device: 0, name: GeForce GTX 1050 with Max-Q Design, pci bus id: 0000:01:00.0, compute capability: 6.1" - это очень мало для реальных задач.

Добавлено через 9 минут
Это покажет, видит ли TF графкарту:
print(tf.test.gpu_device_name())
print(tf.config.list_physical_devices('G PU'))

Иногда такой костыль помогает правильно распределять память GPU (ставить сразу после импортов):
physical_devices = tf.config.list_physical_devices('GPU')
try:
tf.config.experimental.set_memory_growth (physical_devices[0], True)
except:
# Invalid device or cannot modify virtual devices once initialized.
pass
0
4 / 4 / 1
Регистрация: 11.11.2019
Сообщений: 140
Записей в блоге: 2
14.01.2022, 17:34  [ТС]
Цитата Сообщение от Nick07 Посмотреть сообщение
???
tensorflow была установлена
Цитата Сообщение от Nick07 Посмотреть сообщение
Это покажет, видит ли TF графкарту:
print(tf.test.gpu_device_name())
print(tf.config.list_physical_devices('G PU'))
Вставил сразу после
Python
1
print(model.summary())
и вот что вывелось
/device:GPU:0
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

Цитата Сообщение от Nick07 Посмотреть сообщение
Но в любом случае "GPU:0 with 2781 MB memory: -> device: 0, name: GeForce GTX 1050 with Max-Q Design, pci bus id: 0000:01:00.0, compute capability: 6.1" - это очень мало для реальных задач.
Странно, почему столько памяти забралось. Если реально дискретная карточка пытается использоваться, то в ней 4ГБ

Еще попробовал датасет уменьшить. До 1000 изображений в каждом классе на обучение и до 625 на тестирование. Не помогло
Цитата Сообщение от Nick07 Посмотреть сообщение
Попробуйте bs уменьшить и/или resize
А можно про это поподробнее. Где что нужно поменять? Я пока не понимаю про что идет речь
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
14.01.2022, 18:02
Цитата Сообщение от Baumanetc Посмотреть сообщение
device:GPU:0
GPU задействован, драйвера правильно стоят
Цитата Сообщение от Baumanetc Посмотреть сообщение
Еще попробовал датасет уменьшить
Это на переполнение памяти GPU не влияет, а только уменьшает время обучения.
Надо уменьшать bathsize. По умолчанию bathsize=32, попробуйте уменьшить кратно 8: 16 или 8.
Попробуйте размер с 224 поменять на 112 и уберите максимально последние слои. Оставьте первые два слоя и если по памяти не вылетит, то можно будет прибавлять.

Добавлено через 3 минуты
Цитата Сообщение от Nick07 Посмотреть сообщение
Limit: 2916260251
Цитата Сообщение от Baumanetc Посмотреть сообщение
в ней 4ГБ
Уточните, откуда 4gb. На сайте NVIDIA эта карта имеет или 2 или 3 gb:
https://www.nvidia.com/en-in/g... -gtx-1050/

Добавлено через 11 минут
Цитата Сообщение от Baumanetc Посмотреть сообщение
пока не понимаю
Это опция задается в fit:
batch_size=32

Самое быстрое, простое и грамотное вхождение в KERAS описано в книге автора этого пакета Франсуа Шолле, в инете есть эл копия, точного названия не помню
0
4 / 4 / 1
Регистрация: 11.11.2019
Сообщений: 140
Записей в блоге: 2
18.01.2022, 16:43  [ТС]
Попробовал запустить код в Colab. Все запустилось. Но вот распознавание идет как-то странно: и кошки, и собаки распознаются как "cat"
График который получился после 29 эпох приложил
Миниатюры
VGG16. Классификация изображений (Cats vs. Dogs)  
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
18.01.2022, 18:58
1. dataset анализировали?
Есть предупреждения, что там есть брак:
https://www.tensorflow.org/dat... ts_vs_dogs
A large set of images of cats and dogs. There are 1738 corrupted images that are dropped.

2. Покажите график loss, только в нормальном масштабе

Добавлено через 2 минуты
Цитата Сообщение от Baumanetc Посмотреть сообщение
распознавание идет как-то странно
Странно, этот dataset даже на VGG16 отлично работает

Добавлено через 6 минут
Ещё лучше, чем терять время и в чужих ошибках копаться, берите работающие современные примеры.
Если не хотите на MNIST учиться, возьмите цветочки:
https://www.tensorflow.org/tut... sification
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2022, 18:58
Помогаю со студенческими работами здесь

Классификация больших изображений
Здравствуйте! Возникла задача классификации больших картинок ( не меньше 2000х2000) на несколько классов, но даже не знаю как...

Классификация изображений на основе онтологии
Здравствуйте! Есть такая задача – разработать систему распознавания изображений на основе онтологического подхода. Для меня это новая...

OpenCV. Классификация изображений с использованием bag-of-words методов
В общем задача заключается в обучении программы и классификация изображений на 2 класса. Обучение производится несколькими изображениями,...

Класс Dogs
Ругается на strcpy пожалуйста помогите, суть задачи(Следующая программа PEDIGREE.CPP создает класс dog, который содержит несколько полей...

Watch dogs и direct x 10/11
Дайте ,пожалуйста ссылку на direct x 10 или 11.Хочу в ватч догс поиграть.Говорят такое есть на хр от умельцев.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru