diff --git "a/nets/lb1/\320\240\320\276\320\267\320\275\320\276/Seti_Lab1_RoznoKV.docx" "b/nets/lb1/\320\240\320\276\320\267\320\275\320\276/Seti_Lab1_RoznoKV.docx" new file mode 100644 index 00000000..c311dbf3 Binary files /dev/null and "b/nets/lb1/\320\240\320\276\320\267\320\275\320\276/Seti_Lab1_RoznoKV.docx" differ diff --git "a/nets/lb2/\320\240\320\276\320\267\320\275\320\276/Seti_Lab2_RoznoKV.docx" "b/nets/lb2/\320\240\320\276\320\267\320\275\320\276/Seti_Lab2_RoznoKV.docx" new file mode 100644 index 00000000..718e2e00 Binary files /dev/null and "b/nets/lb2/\320\240\320\276\320\267\320\275\320\276/Seti_Lab2_RoznoKV.docx" differ diff --git "a/nets/lb3/\320\240\320\276\320\267\320\275\320\276/Seti_Lab3_RoznoKV.docx" "b/nets/lb3/\320\240\320\276\320\267\320\275\320\276/Seti_Lab3_RoznoKV.docx" new file mode 100644 index 00000000..e989b3dd Binary files /dev/null and "b/nets/lb3/\320\240\320\276\320\267\320\275\320\276/Seti_Lab3_RoznoKV.docx" differ diff --git "a/nets/lb4/\320\240\320\276\320\267\320\275\320\276/Seti_Lab4_RoznoKV.docx" "b/nets/lb4/\320\240\320\276\320\267\320\275\320\276/Seti_Lab4_RoznoKV.docx" new file mode 100644 index 00000000..73241491 Binary files /dev/null and "b/nets/lb4/\320\240\320\276\320\267\320\275\320\276/Seti_Lab4_RoznoKV.docx" differ diff --git "a/robs/lb1/\320\240\320\276\320\267\320\275\320\276/ObstacleAvoidance.py" "b/robs/lb1/\320\240\320\276\320\267\320\275\320\276/ObstacleAvoidance.py" new file mode 100644 index 00000000..39373a64 --- /dev/null +++ "b/robs/lb1/\320\240\320\276\320\267\320\275\320\276/ObstacleAvoidance.py" @@ -0,0 +1,83 @@ +from controller import Robot, Compass + +# Get reference to the robot. +robot = Robot() + +# get robot's Compass device +compass = robot.getCompass("compass") + +# Get simulation step length. +timeStep = int(robot.getBasicTimeStep()) + +# Constants of the Thymio II motors and distance sensors. +maxMotorVelocity = 9.53 +distanceSensorCalibrationConstant = 360 + +# Get left and right wheel motors. +leftMotor = robot.getMotor("motor.left") +rightMotor = robot.getMotor("motor.right") + +# Get frontal distance sensors. +outerLeftSensor = robot.getDistanceSensor("prox.horizontal.0") +centralLeftSensor = robot.getDistanceSensor("prox.horizontal.1") +centralSensor = robot.getDistanceSensor("prox.horizontal.2") +centralRightSensor = robot.getDistanceSensor("prox.horizontal.3") +outerRightSensor = robot.getDistanceSensor("prox.horizontal.4") + +# Enable distance sensors. +outerLeftSensor.enable(timeStep) +centralLeftSensor.enable(timeStep) +centralSensor.enable(timeStep) +centralRightSensor.enable(timeStep) +outerRightSensor.enable(timeStep) + +# enable the Compass +compass.enable(timeStep) + +# Disable motor PID control mode. +leftMotor.setPosition(float('inf')) +rightMotor.setPosition(float('inf')) + +# Set ideal motor velocity. +initialVelocity = maxMotorVelocity + +while robot.step(timeStep) != -1: + # to read values + values = compass.getValues() + + # Read values from four distance sensors and calibrate. + outerLeftSensorValue = outerLeftSensor.getValue() / distanceSensorCalibrationConstant + centralLeftSensorValue = centralLeftSensor.getValue() / distanceSensorCalibrationConstant + centralSensorValue = centralSensor.getValue() / distanceSensorCalibrationConstant + centralRightSensorValue = centralRightSensor.getValue() / distanceSensorCalibrationConstant + outerRightSensorValue = outerRightSensor.getValue() / distanceSensorCalibrationConstant + + # if there is an obstacle + if centralLeftSensorValue != 0.0 or centralSensorValue != 0.0 or centralRightSensorValue != 0.0 or outerRightSensorValue != 0.0 or outerLeftSensorValue != 0.0: + # if obstacle in left + if centralLeftSensorValue != 0.0 or centralSensorValue != 0.0 or outerLeftSensorValue != 0.0: + rightMotor.setVelocity(-initialVelocity) + leftMotor.setVelocity(initialVelocity) + # if obstacle in right + elif centralSensorValue != 0.0 or centralRightSensorValue != 0.0 or outerRightSensorValue != 0.0: + leftMotor.setVelocity(-initialVelocity) + rightMotor.setVelocity(initialVelocity) + # if obstacle in everywhere + elif centralLeftSensorValue != 0.0 and outerLeftSensorValue != 0.0 and centralRightSensorValue != 0.0 and outerRightSensorValue != 0.0: + leftMotor.setVelocity(-initialVelocity) + rightMotor.setVelocity(-initialVelocity) + # if there isnt an obstacle + else: + # displacement of the vision towards the line + if (round(values[0], 3) > 0.001) and ( + centralLeftSensorValue == 0.0 and centralSensorValue == 0.0 and outerLeftSensorValue == 0.0 and centralRightSensorValue == 0.0 and outerRightSensorValue == 0.0): + rightMotor.setVelocity(initialVelocity / 1.1) + leftMotor.setVelocity(initialVelocity) + elif (round(values[0], 3) < 0.001) and ( + centralLeftSensorValue == 0.0 and centralSensorValue == 0.0 and outerLeftSensorValue == 0.0 and centralRightSensorValue == 0.0 and outerRightSensorValue == 0.0): + leftMotor.setVelocity(initialVelocity / 1.1) + rightMotor.setVelocity(initialVelocity) + # if everything is alright then just move + else: + leftMotor.setVelocity(initialVelocity) + rightMotor.setVelocity(initialVelocity) \ No newline at end of file diff --git "a/robs/lb1/\320\240\320\276\320\267\320\275\320\276/Rozno_Robots_laba_1.docx" "b/robs/lb1/\320\240\320\276\320\267\320\275\320\276/Rozno_Robots_laba_1.docx" new file mode 100644 index 00000000..1fc674c1 Binary files /dev/null and "b/robs/lb1/\320\240\320\276\320\267\320\275\320\276/Rozno_Robots_laba_1.docx" differ diff --git "a/robs/lb1/\320\240\320\276\320\267\320\275\320\276/SquarePath.py" "b/robs/lb1/\320\240\320\276\320\267\320\275\320\276/SquarePath.py" new file mode 100644 index 00000000..7bc6dd0a --- /dev/null +++ "b/robs/lb1/\320\240\320\276\320\267\320\275\320\276/SquarePath.py" @@ -0,0 +1,67 @@ +"""my_square_path controller.""" + +"""Sample Webots controller for the square path benchmark.""" + +from controller import Robot +import math + +# Get pointer to the robot. +robot = Robot() + +# Get pointer to each wheel of our robot. +leftWheel = robot.getMotor('left wheel') +rightWheel = robot.getMotor('right wheel') + +rightWheelSensor = robot.getPositionSensor('right wheel sensor') +rightWheelSensor.enable(16) + +leftWheelSensor = robot.getPositionSensor('left wheel sensor') +leftWheelSensor.enable(16) + +diamWheel = 0.195 +distWheels = 0.33 +sensorValue = 0 +l = math.pi * diamWheel +# Max velocity +MAX_SPEED = 5.24 + +# Repeat the following 4 times (once for each side). +for i in range(0, 4): + + leftWheel.setPosition(1000) + rightWheel.setPosition(1000) + robot.step(16) + + while rightWheelSensor.getValue() * diamWheel / 2.0 < sensorValue + 2.0: + if rightWheelSensor.getValue() * diamWheel / 2.0 > sensorValue + 1.9: + leftWheel.setVelocity(0.6 * MAX_SPEED) + rightWheel.setVelocity(0.6 * MAX_SPEED) + robot.step(160) + + if i == 0: + leftWheel.setPosition( + leftWheelSensor.getValue() + (math.pi / 2.0 * distWheels / 2.0) / l * 2.0 * math.pi + 0.09) + rightWheel.setPosition( + rightWheelSensor.getValue() - (math.pi / 2.0 * distWheels / 2.0) / l * 2.0 * math.pi - 0.04) + elif i == 1: + leftWheel.setPosition( + leftWheelSensor.getValue() + (math.pi / 2.0 * distWheels / 2.0) / l * 2.0 * math.pi + 0.06) + rightWheel.setPosition( + rightWheelSensor.getValue() - (math.pi / 2.0 * distWheels / 2.0) / l * 2.0 * math.pi - 0.05) + elif i == 2: + leftWheel.setPosition( + leftWheelSensor.getValue() + (math.pi / 2.0 * distWheels / 2.0) / l * 2.0 * math.pi + 0.11) + rightWheel.setPosition(rightWheelSensor.getValue() - (math.pi / 2.0 * distWheels / 2.0) / l * 2.0 * math.pi) + elif i == 3: + continue + robot.step(912) + + sensorValue = rightWheelSensor.getValue() * diamWheel / 2 + + leftWheel.setVelocity(MAX_SPEED) + rightWheel.setVelocity(MAX_SPEED) + +# Stop the robot when path is completed, as the robot performance +# is only computed when the robot has stopped. +leftWheel.setVelocity(0) +rightWheel.setVelocity(0) diff --git "a/robs/lb1/\320\240\320\276\320\267\320\275\320\276/obstacle-avoidance-google-chrome-2021-06-02-12-04-44_ciOS7d1v.mp4" "b/robs/lb1/\320\240\320\276\320\267\320\275\320\276/obstacle-avoidance-google-chrome-2021-06-02-12-04-44_ciOS7d1v.mp4" new file mode 100644 index 00000000..12307b01 Binary files /dev/null and "b/robs/lb1/\320\240\320\276\320\267\320\275\320\276/obstacle-avoidance-google-chrome-2021-06-02-12-04-44_ciOS7d1v.mp4" differ diff --git "a/robs/lb1/\320\240\320\276\320\267\320\275\320\276/square-path-google-chrome-2021-06-02-12-05-48_d5GhfbLU.mp4" "b/robs/lb1/\320\240\320\276\320\267\320\275\320\276/square-path-google-chrome-2021-06-02-12-05-48_d5GhfbLU.mp4" new file mode 100644 index 00000000..bc607a8a Binary files /dev/null and "b/robs/lb1/\320\240\320\276\320\267\320\275\320\276/square-path-google-chrome-2021-06-02-12-05-48_d5GhfbLU.mp4" differ diff --git "a/robs/lb2/\320\241\320\274\320\270\321\200\320\275\320\276\320\262\320\224\320\276\321\200\320\274\320\270\320\264\320\276\320\275\321\202\320\276\320\262\320\237\320\265\321\202\321\200\320\276\320\262\320\240\320\276\320\267\320\275\320\276/HighwayDriving.py" "b/robs/lb2/\320\241\320\274\320\270\321\200\320\275\320\276\320\262\320\224\320\276\321\200\320\274\320\270\320\264\320\276\320\275\321\202\320\276\320\262\320\237\320\265\321\202\321\200\320\276\320\262\320\240\320\276\320\267\320\275\320\276/HighwayDriving.py" new file mode 100644 index 00000000..1cebc383 --- /dev/null +++ "b/robs/lb2/\320\241\320\274\320\270\321\200\320\275\320\276\320\262\320\224\320\276\321\200\320\274\320\270\320\264\320\276\320\275\321\202\320\276\320\262\320\237\320\265\321\202\321\200\320\276\320\262\320\240\320\276\320\267\320\275\320\276/HighwayDriving.py" @@ -0,0 +1,105 @@ +"""Sample Webots controller for highway driving benchmark.""" + +from vehicle import Driver + +# name of the available distance sensors +sensorsNames = [ + 'front', + 'front right 0', + 'front right 1', + 'front right 2', + 'front left 0', + 'front left 1', + 'front left 2', + 'rear', + 'rear left', + 'rear right', + 'right', + 'left'] +sensors = {} + +maxSpeed = 80 +driver = Driver() +driver.setSteeringAngle(0.0) # go straight + +# get and enable the distance sensors +for name in sensorsNames: + sensors[name] = driver.getDistanceSensor('distance sensor ' + name) + sensors[name].enable(10) + +# get and enable the GPS +gps = driver.getGPS('gps') +gps.enable(10) + +# get the camera +# camera = driver.getCamera('camera') +# uncomment those lines to enable the camera +# camera.enable(50) +# camera.recognitionEnable(50) + +while driver.step() != -1: + # adjust the speed according to the value returned by the front distance sensor + frontDistance = sensors['front'].getValue() + frontRange = sensors['front'].getMaxValue() + rleftDistance = sensors['rear left'].getValue() + rleftRange = sensors['rear left'].getMaxValue() + leftDistance = sensors['left'].getValue() + leftRange = sensors['left'].getMaxValue() + rightDistance = sensors['right'].getValue() + rightRange = sensors['right'].getMaxValue() + fleft2Distance = sensors['front left 2'].getValue() + fleft2Range = sensors['front left 2'].getMaxValue() + fright0Distance = sensors['front right 0'].getValue() + fright0Range = sensors['front right 0'].getMaxValue() + fright1Distance = sensors['front right 1'].getValue() + fright1Range = sensors['front right 1'].getMaxValue() + fright2Distance = sensors['front right 2'].getValue() + fright2Range = sensors['front right 2'].getMaxValue() + fleft0Distance = sensors['front left 0'].getValue() + fleft0Range = sensors['front left 0'].getMaxValue() + fleft1Distance = sensors['front left 1'].getValue() + fleft1Range = sensors['front left 1'].getMaxValue() + r = rightDistance / rightRange + rl = rleftDistance / rleftRange + l = leftDistance / leftRange + fl2 = fleft2Distance / fleft2Range + fl0 = fleft0Distance / fleft0Range + fl1 = fleft1Distance / fleft1Range + fr0 = fright0Distance / fright0Range + fr1 = fright1Distance / fright1Range + fr2 = fright2Distance / fright2Range + fr = frontDistance / frontRange + speed = maxSpeed * frontDistance / frontRange + driver.setCruisingSpeed(speed) + # print(rl,'|',l,'|',fl2) + # brake if we need to reduce the speed + speedDiff = driver.getCurrentSpeed() - speed + if speedDiff > 0: + driver.setBrakeIntensity(min(speedDiff / speed, 1)) + else: + driver.setBrakeIntensity(0) + + if ((l > 0.6) and (fl2 > 0.6)): + if (r > 0.5): + angle1 = 0.02 * ( + -1 + (1 - fl2) + (1 - fl0) + (1 - fl1) - (1 - fr) * 4 - (1 - fr1) - (1 - fr0) - (1 - fr2) - ( + 1 - r)) + driver.setSteeringAngle(angle1) + else: + angle1 = 0.03 * (-1 + (1 - fl2) + (1 - fl0) + (1 - fl1) - (1 - fr) * 4 - (1 - fr1) - (1 - fr0) * 5 - ( + 1 - fr2) - (1 - r)) + driver.setSteeringAngle(angle1) + else: + if ((l > 0.2) or (fl2 > 0.4)): + angle1 = 0.025 * ( + (1 - l) + (1 - fl2) + (1 - fl0) + (1 - fl1) + (1 - fr) * 4 - (1 - fr2) * 4 - (1 - fr1) * 4 - ( + 1 - fr0) * 4 - (1 - r) * 2 - rl * 0.25) + driver.setSteeringAngle(angle1) + elif ((l < 0.2) or (fl2 < 0.4)): + angle = 0.025 * ( + (1 - l) + (1 - fl2) + (1 - fl1) + (1 - fl0) - (1 - fr2) - (1 - fr1) - (1 - fr0) + (1 - fr) - ( + 1 - r) + (1 - rl)) + if (angle < 0.0): + driver.setSteeringAngle(0.01) + else: + driver.setSteeringAngle(angle) \ No newline at end of file diff --git "a/robs/lb2/\320\241\320\274\320\270\321\200\320\275\320\276\320\262\320\224\320\276\321\200\320\274\320\270\320\264\320\276\320\275\321\202\320\276\320\262\320\237\320\265\321\202\321\200\320\276\320\262\320\240\320\276\320\267\320\275\320\276/SmirnovRoznoDormidontovPetrov_Robots_laba_2.docx" "b/robs/lb2/\320\241\320\274\320\270\321\200\320\275\320\276\320\262\320\224\320\276\321\200\320\274\320\270\320\264\320\276\320\275\321\202\320\276\320\262\320\237\320\265\321\202\321\200\320\276\320\262\320\240\320\276\320\267\320\275\320\276/SmirnovRoznoDormidontovPetrov_Robots_laba_2.docx" new file mode 100644 index 00000000..bc5affe5 Binary files /dev/null and "b/robs/lb2/\320\241\320\274\320\270\321\200\320\275\320\276\320\262\320\224\320\276\321\200\320\274\320\270\320\264\320\276\320\275\321\202\320\276\320\262\320\237\320\265\321\202\321\200\320\276\320\262\320\240\320\276\320\267\320\275\320\276/SmirnovRoznoDormidontovPetrov_Robots_laba_2.docx" differ diff --git "a/robs/lb2/\320\241\320\274\320\270\321\200\320\275\320\276\320\262\320\224\320\276\321\200\320\274\320\270\320\264\320\276\320\275\321\202\320\276\320\262\320\237\320\265\321\202\321\200\320\276\320\262\320\240\320\276\320\267\320\275\320\276/roblb2_a98laXmQ.mp4" "b/robs/lb2/\320\241\320\274\320\270\321\200\320\275\320\276\320\262\320\224\320\276\321\200\320\274\320\270\320\264\320\276\320\275\321\202\320\276\320\262\320\237\320\265\321\202\321\200\320\276\320\262\320\240\320\276\320\267\320\275\320\276/roblb2_a98laXmQ.mp4" new file mode 100644 index 00000000..1d072774 Binary files /dev/null and "b/robs/lb2/\320\241\320\274\320\270\321\200\320\275\320\276\320\262\320\224\320\276\321\200\320\274\320\270\320\264\320\276\320\275\321\202\320\276\320\262\320\237\320\265\321\202\321\200\320\276\320\262\320\240\320\276\320\267\320\275\320\276/roblb2_a98laXmQ.mp4" differ diff --git a/robs/lb3/Rozno/RoznoRob3.ipynb b/robs/lb3/Rozno/RoznoRob3.ipynb new file mode 100644 index 00000000..1fcf9755 --- /dev/null +++ b/robs/lb3/Rozno/RoznoRob3.ipynb @@ -0,0 +1,430 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "RoznoRob3.ipynb", + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "code", + "metadata": { + "id": "u_DIdz6Oxgw3" + }, + "source": [ + "# Подключение модулей\n", + "from keras.models import Sequential, Model\n", + "from keras.layers import Lambda, Input\n", + "from keras.backend import tf as ktf\n", + "from keras.layers.core import Activation, Flatten, Dense, Dropout\n", + "from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D\n", + "from keras.optimizers import SGD, Adam\n", + "from tensorflow.python.keras.preprocessing.image import ImageDataGenerator\n", + "from keras.applications.vgg16 import VGG16, preprocess_input\n", + "from keras.datasets import fashion_mnist \n", + "from keras.utils import np_utils\n", + "from keras.preprocessing.image import ImageDataGenerator\n", + "import cv2, numpy as np\n", + "import keras\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ], + "execution_count": 66, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Hy7JDoSNytEi" + }, + "source": [ + "#загрузили данные\n", + "(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()\n" + ], + "execution_count": 56, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "4RSN2E_Ey2Rx" + }, + "source": [ + "# Размер изображений\n", + "img_width, img_height = 28, 28\n", + "# Размер мини-выборки\n", + "batch_size = 100\n", + "# Кол-во изображений для обучения\n", + "nb_train_samples = 60000\n", + "# Кол-во изображений для теста\n", + "nb_test_samples = 10000" + ], + "execution_count": 57, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "5Wz-nqlDziN3" + }, + "source": [ + "# Нормализируем значения из 0-255 к 0.0-1.0\n", + "x_train = x_train.astype('float32')\n", + "x_test = x_test.astype('float32')\n", + "x_train = x_train / 255.0\n", + "x_test = x_test / 255.0\n", + "x_train = np.stack((x_train,)*3, axis=-1)\n", + "x_test = np.stack((x_test,)*3, axis=-1)\n", + "\n", + "# one hot encode outputs\n", + "y_train = np_utils.to_categorical(y_train)\n", + "y_test = np_utils.to_categorical(y_test)\n", + "num_classes = y_test.shape[1]" + ], + "execution_count": 58, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0MFicwJ9znK_", + "outputId": "1743f4de-26e8-41b7-b73f-75e3db010e66" + }, + "source": [ + "# Создание экземпляра модели сети VGG16\n", + "vgg16_net = VGG16(weights='imagenet', include_top=False, input_shape=(128, 128, 3))\n", + "# weights - веса предварительно обученной сети\n", + "# include_top = false означает, что мы загружаем только сверточную часть сети, без квалификационной\n", + "# input_shape - размер тензора\n", + "\n", + "# Сверточную часть сети обучать не надо\n", + "vgg16_net.trainable = True\n", + "trainable = False\n", + "for layer in vgg16_net.layers:\n", + " if layer.name == 'block1_conv1':\n", + " trainable = True\n", + " layer.trainable = trainable\n", + "\n", + "vgg16_net.summary()" + ], + "execution_count": 59, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Model: \"vgg16\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_6 (InputLayer) [(None, 128, 128, 3)] 0 \n", + "_________________________________________________________________\n", + "block1_conv1 (Conv2D) (None, 128, 128, 64) 1792 \n", + "_________________________________________________________________\n", + "block1_conv2 (Conv2D) (None, 128, 128, 64) 36928 \n", + "_________________________________________________________________\n", + "block1_pool (MaxPooling2D) (None, 64, 64, 64) 0 \n", + "_________________________________________________________________\n", + "block2_conv1 (Conv2D) (None, 64, 64, 128) 73856 \n", + "_________________________________________________________________\n", + "block2_conv2 (Conv2D) (None, 64, 64, 128) 147584 \n", + "_________________________________________________________________\n", + "block2_pool (MaxPooling2D) (None, 32, 32, 128) 0 \n", + "_________________________________________________________________\n", + "block3_conv1 (Conv2D) (None, 32, 32, 256) 295168 \n", + "_________________________________________________________________\n", + "block3_conv2 (Conv2D) (None, 32, 32, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_conv3 (Conv2D) (None, 32, 32, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_pool (MaxPooling2D) (None, 16, 16, 256) 0 \n", + "_________________________________________________________________\n", + "block4_conv1 (Conv2D) (None, 16, 16, 512) 1180160 \n", + "_________________________________________________________________\n", + "block4_conv2 (Conv2D) (None, 16, 16, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_conv3 (Conv2D) (None, 16, 16, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_pool (MaxPooling2D) (None, 8, 8, 512) 0 \n", + "_________________________________________________________________\n", + "block5_conv1 (Conv2D) (None, 8, 8, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv2 (Conv2D) (None, 8, 8, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv3 (Conv2D) (None, 8, 8, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_pool (MaxPooling2D) (None, 4, 4, 512) 0 \n", + "=================================================================\n", + "Total params: 14,714,688\n", + "Trainable params: 14,714,688\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "5Dw_vRxz_EHT", + "outputId": "b0596a3d-946e-4e62-b116-ec28cec11d95" + }, + "source": [ + "# 3 channel images of arbitrary shape\n", + "inp = Input(shape=(None, None, 3))\n", + "out = Lambda(lambda image: ktf.image.resize(image, (128, 128)))(inp)\n", + "\n", + "inputLayer = Model(inputs=inp, outputs=out, name=\"resizer\")\n", + "inputLayer.summary()" + ], + "execution_count": 60, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Model: \"resizer\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_7 (InputLayer) [(None, None, None, 3)] 0 \n", + "_________________________________________________________________\n", + "lambda_1 (Lambda) (None, 128, 128, 3) 0 \n", + "=================================================================\n", + "Total params: 0\n", + "Trainable params: 0\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "omgVbeoiC_g0", + "outputId": "a092ddf7-65ad-4958-f80c-4d945f7cefd7" + }, + "source": [ + "# Создание модели составной сети\n", + "model = Sequential()\n", + "# Добавляем слой для преобразования размера изображения\n", + "model.add(inputLayer)\n", + "# Добавляем сверточные слои\n", + "model.add(vgg16_net)\n", + "# Преобразуем двумерный массив MobileNet в одномерный\n", + "model.add(Flatten())\n", + "# Полносвязный слой\n", + "model.add(Dense(256, activation='relu'))\n", + "# Слой регуляризации (для предотвращения переобучения)\n", + "model.add(Dropout(0.5))\n", + "# Кол-во классов\n", + "model.add(Dense(num_classes, activation='softmax'))\n", + "model.summary()" + ], + "execution_count": 61, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Model: \"sequential_4\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "resizer (Functional) (None, 128, 128, 3) 0 \n", + "_________________________________________________________________\n", + "vgg16 (Functional) (None, 4, 4, 512) 14714688 \n", + "_________________________________________________________________\n", + "flatten_3 (Flatten) (None, 8192) 0 \n", + "_________________________________________________________________\n", + "dense_6 (Dense) (None, 256) 2097408 \n", + "_________________________________________________________________\n", + "dropout_3 (Dropout) (None, 256) 0 \n", + "_________________________________________________________________\n", + "dense_7 (Dense) (None, 10) 2570 \n", + "=================================================================\n", + "Total params: 16,814,666\n", + "Trainable params: 16,814,666\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OCHc9CF_DDWs", + "outputId": "b7ef57f5-9022-4da1-a019-449c5eed11e9" + }, + "source": [ + "# Компилируем составную сеть\n", + "epochs = 5\n", + "model.compile(loss='categorical_crossentropy',\n", + " optimizer=Adam(lr=1e-5), \n", + " metrics=['accuracy'])" + ], + "execution_count": 62, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:375: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.\n", + " \"The `lr` argument is deprecated, use `learning_rate` instead.\")\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "TkjNgUeANzTX", + "outputId": "e5a27696-39da-4d71-fb14-40cd7c32fb10" + }, + "source": [ + "history = model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs = epochs, batch_size=300)\n" + ], + "execution_count": 75, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Epoch 1/5\n", + "200/200 [==============================] - 272s 1s/step - loss: 0.2872 - accuracy: 0.8989 - val_loss: 0.2265 - val_accuracy: 0.9187\n", + "Epoch 2/5\n", + "200/200 [==============================] - 258s 1s/step - loss: 0.2039 - accuracy: 0.9280 - val_loss: 0.1997 - val_accuracy: 0.9293\n", + "Epoch 3/5\n", + "200/200 [==============================] - 260s 1s/step - loss: 0.1754 - accuracy: 0.9376 - val_loss: 0.1863 - val_accuracy: 0.9317\n", + "Epoch 4/5\n", + "200/200 [==============================] - 260s 1s/step - loss: 0.1569 - accuracy: 0.9450 - val_loss: 0.1804 - val_accuracy: 0.9354\n", + "Epoch 5/5\n", + "200/200 [==============================] - 260s 1s/step - loss: 0.1479 - accuracy: 0.9473 - val_loss: 0.1817 - val_accuracy: 0.9343\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 278 + }, + "id": "OvO7uBEuQMna", + "outputId": "c1c37994-7f02-48ac-c366-6019bd52a934" + }, + "source": [ + "plt.plot(history.history['accuracy'], label='Аккуратность на обучающем наборе')\n", + "plt.plot(history.history['val_accuracy'], label='Аккуратность на проверочном наборе')\n", + "plt.xlabel('Эпоха обучения')\n", + "plt.ylabel('Аккуратность')\n", + "plt.legend()\n", + "plt.show()" + ], + "execution_count": 78, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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7oqgoYe+ja4UGRnJwIEDiYyM5LnnnnN1OHXOihUreP/99/nss89o2bKlq8Opdm6//Xbuvfde3njjDdzda1ZVZ21BXICdR1P515p9jOnVlsFd/F0dTrXw3H+3cdu/f63Un+f+u+28+01LS2PdunW8//77LFy4sGj6mjVrGDlyJAA//fQT/fr1IyUlpdzpkyZNYsmSJUXrjx8/nm+++YYPP/yQUaNGMWTIEDp37lwqAd1000306dOHHj16MG/ePADmzJlDWFgYgYGB+Pv7ExYWxj333MPBgwcJDg4uWnfRokVMmTIFgIMHDzJ06FBCQ0MZNmwYhw8fBuDYsWOMHj2anj170rNnT9avX8+jjz5KWFgYrVq1om3btoSFhfHMM8+Uel3lKbvMq6++ysyZMwF477336Nu3Lz179mTs2LFkZGSctX5SUhI33XQToaGh9O/fn5iYGADmzZtHZmYmw4YNo1evXqxevRqAK664gs2bNxetP3DgQLZs2cKUKVNYtGjRWTFt2LCBAQMG0KtXLy677DJ27dp11jLz588nKCiI4OBg7r//fvLy8gDo0KEDJ0+eBGDkyJGsWbPmrNeYn5/Po48+St++fQkNDeXf//530fZFhGXLlgFw+vRpvLy8itYrqWTsAMHBwRw8eBCw//+wfft2Dh06xKxZswgLC+Ouu+4iOzsbgJUrV9KrVy9CQkJKTe/QoQOPPfYYISEhREREsHfvXgBOnDjB2LFj6du3L3379uWXX36x92euVJogKii/wPDE4lh8vOrz9Mjurg6nzvvmm2+45ppr6NKlC82aNWPjxo2l5sfGxvLggw+yZMkSfH19y51+99138+GHHwKQkpLC+vXruf766wHrwLV48WJiYmL48ssviY6OBqyD1caNG4mOjuaNN97g1KlTPPzww2zevJlZs2Zx2223sXnzZv7zn/+c8zXMmDGDyZMnExMTw/jx43nggQcAeOCBBxg8eDBbtmzhjz/+oEePHsyePZvNmzczbdq0Uvu6WGPGjCEqKootW7bQrVs33n///bOWefbZZ+nVqxcxMTG8+OKLTJo0CbAOXIGBgWzdupXIyEgmT55MVlZWqfd09+7dZGVl0bNnT9zc3DDGnLX9rl27snbtWjZt2sSsWbN46qmnSs3fv38/jzzyCCtXriQ2NpajR48Wbd8R77//Pr6+vkRFRREVFcV7773HgQMHAOjduzcfffQRAJ999hk9e/Z0eLuF7P0/nDhxggMHDvDFF18QGxtLXl4e77zzDllZWUyZMoXPP/+81PRCvr6+xMbGMn36dB566CEAHnzwQR5++GGioqJYvHgx99xzT4VjrCjtG6mgj349yOa4ZOaOC6NpIw9Xh1NtPHuDa2pPRUZG8uCDDwIwbtw4IiMj6dOnDwCJiYlce+21/OUvf6F169ZF69ibPnjwYO677z5OnDjB4sWLGTt2LPXqWR+P4cOH06yZNabHmDFjWLduHeHh4bzxxht8/fXXAMTFxbFnz56i5ezZt28fYWFhgJWEBg8eDMCvv/7KV199BcDEiRN57LHHAFi1alXRQcvd3b1UgrNn7dq1hIWFISLMmDGDu+66q9xlwDqw/+lPfwJg69atPP300yQnJ5OWlsaIESPOWnfdunUsXrwYgKFDh3Lq1ClSU1MxxjBhwgTAOsi3b9+e3bt3c8stt/D8888ze/Zs5s+fX9RiCggIYNOmTdxyyy2ltp+SksLkyZPZs2cPIkJubm6puK+66ioGDx5MQEAAAJMmTarQgfLHH38kJiamqAWQkpLCnj178PDwoHXr1mRnZ5OUlMTSpUu58cYbycnJsbudRx99lBdeeAGw/qaF7P0/GGPo168fXbpY5yknT57M22+/zZVXXknHjh3Pml6YDG6//fai3w8//DBgdeVt3769aH+pqamkpaXRuLHz7r3SBFEB8aczmP3DLoYE+XNjzzauDqfOS0pKYtWqVcTGxiIi5OfnIyLMnj0bgJ07d7Jw4UIee+wxJkyYgL+//zmnT5o0iU8++YSFCxfywQcfFO2n7OWBIsKaNWtYsWIFv/76Kw0bNmTIkCHnvcb8kksuKepyWbRoEd9++22lvRcAgwYN4ttvv+XkyZN07dqVcePG0bBhQ7vLgNX9kpaWBlhdJ0uWLKFnz558+OGHRV00jvDxsT/WesOGDRk+fDjffPMNX3zxRVHr7r777mP8+PGEhoaSkZFB167WmCl/+9vfuPLKK/n66685ePAgQ4YMKRX3X/7yF9544w2H4yrLGMObb755VvIrfK133HEHjz/+OEFBQXh4eJSbIGbPns3NN98MUNRtWN7/Q3nvzfmU/J8rfFxQUMBvv/2Gp2fV1XnTLiYHGWN4eslWAF64KViv/68GFi1axMSJEzl06BAHDx4kLi6Ojh07snbtWsD6lnvjjTfy1FNPFbUyzjV9ypQpvP766wB0717cfbh8+XKSkpLIzMxkyZIlXH755aSkpODn50fDhg3ZuXMnv/322wW/jssuu6zo/Mmnn37KoEGDABg2bFhRt0N+fj4pKSkObc/b25t69eqRn5/vcAxnzpyhdevW5Obm8umnn9pdZtCgQUXz1qxZQ/PmzfHx8aFfv35F03fv3s3hw4cJCgoC4J577uGBBx6gb9+++Pn5AdCqVStWrlxJTExMqe63lJQU2rZtC2C366h3795s3LiRhIQEjDF88sknpZLI+YwYMYJ33nmnqGWye/du0tPTi+bfcMMNbNq0yW7L63zK+38ICgpi9+7dRecRPv74YwYPHkxQUBAHDx48a3qhzz//vOj3gAEDALj66qt58803i5YpeX7HWTRBOGjplkTW7DrBoyOCCPBreP4VlNNFRkYyevToUtPGjh1LZGRkqWmTJk3i1KlTfP/99+ec3rJlS7p168add95ZarmIiAjGjh1LaGgoY8eOJTw8nGuuuYa8vDy6devGE088Qf/+/S/4dbz55pt88MEHhIaG8vHHHzN37lwA5s6dy+rVqwkJCaFPnz6luhfsWb9+PQMHDqR///48/PDDeHt7OxzD888/T79+/bj88suLvtGXNXPmTDZu3EhoaChPPPEECxYsAKy+8fT0dIKDgxk3bhwLFiygQYMGAPTp0wcfH5+z3lN7HnvsMZ588kl69epVdPK5JF9fX95++22uvfZaQkNDadWqFZMnTy6aP3LkSAYOHMj69euZMWMGAwcO5O2332b+/Pls2rSJe+65h+7du9O7d2+Cg4O59957S+3Hw8OD6Ojooi64iijv/6FRo0a89957jB49mpCQENzd3Zk2bRqenp588MEH3HLLLYSEhODm5sa0adOKtnf69GlCQ0OZO3cuc+bMAawurOjoaEJDQ+nevTvvvvtuheOsKLF3sqgmCg8PN4UnDytbUnoOV732E4FNG7L4/y7DvY4U4zufHTt20K1bN1eHUWkyMjIICQnhjz/+KOrv//DDD4mOjuatt95ycXQ1U2JiIkOGDGHnzp24ubnm++jMmTMZMmRIhVobrtShQweio6Np3rx5pW/b3mdWRDYaY8LtLa8tCAe88N12UjNz+cfYUE0OtdSKFSvo1q0bM2bMOO/JYOWYjz76iH79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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 278 + }, + "id": "1F1AKUQQQOQy", + "outputId": "4cef687b-96c0-4181-fb9b-d8b6afda8c4c" + }, + "source": [ + "plt.plot(history.history['loss'], label='Ошибка на обучающем наборе')\n", + "plt.plot(history.history['val_loss'], label='Ошибка на проверочном наборе')\n", + "plt.xlabel('Эпоха обучения')\n", + "plt.ylabel('Ошибка')\n", + "plt.legend()\n", + "plt.show()" + ], + "execution_count": 77, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEGCAYAAAB/+QKOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dd3hUZfr/8fedDmm0EEqAhF4SaggoVUBFFFCUxQ6issKXVde1uyoiKIKruz9114ptXcWCCCoK0osgAULoPUDoNRBCSXl+f5yTYRImZAKZTMr9uq65mHnmlHuOznxynnPOc8QYg1JKKZWfj7cLUEopVTppQCillHJJA0IppZRLGhBKKaVc0oBQSinlkp+3CyguNWrUMNHR0d4uQymlypSVK1ceMcZEuHqv3AREdHQ0iYmJ3i5DKaXKFBHZVdB72sWklFLKJQ0IpZRSLmlAKKWUcqncHINQFU9mZiapqamcPXvW26UoVeoFBQURFRWFv7+/2/NoQKgyKzU1ldDQUKKjoxERb5ejVKlljOHo0aOkpqYSExPj9nzaxaTKrLNnz1K9enUNB6UKISJUr169yHvbGhCqTNNwUMo9l/NdqfABceZ8NhNmbmLPsQxvl6KUUqVKhQ+I4xnn+fz3FJ79fi16bwxVFKmpqQwcOJAmTZrQqFEjHnnkEc6fP18sy87OzmbixIlcffXVtG/fng8++KBYluspH374Id26dSM+Pp4xY8Z4u5xSZffu3dxzzz0kJCQQGxvLkSNHvF2S2yr8Qeo6VSrx1A3NeeGH9Xy3ai+3dYjydkmqDDDGMGjQIEaOHMkPP/xAdnY2I0aM4LnnnmPSpElXvPwxY8bg4+PDnDlzqFSpUjFU7DkfffQRy5Yt48cffyQ8PNzb5ZQqZ8+e5Y477mD8+PH06NGjzHWJVvg9CIC7OzUgvkFVXv5xA4dPnfN2OaoMmDt3LkFBQdx3330A+Pr68uabbzJ58mQyMjL45JNPGD16NACJiYn07NkTgKysLGrUqAHA/PnzuemmmwA4duwYVapU4fXXXwfgiy++YNGiRSQkJNC7d292794NwLBhw/j2228BGDlypOOv9RkzZtCpUyfatWtHnz59OHjw4EU1O9cEMHr0aD755BMAxo4dS8eOHYmNjWXEiBEu96ZTUlLo1asXrVu3zlPT+++/z549e+jatSudO3cmOTmZnJwcmjRpwuHDhwHIycmhcePGHD58mJ49ezqGxXGuqaDP4DzN+PHjadq0KbGxsbz00kuO2kJCQhzPY2NjSUlJuegznj59muHDh5OQkEC7du344YcfHMsXETZt2gTAxo0bERHHfM6ca3deb3p6Or1796Z9+/bExcU5lj137lzOnDnD6NGjiYuL46mnnnLM++WXXxIXF0dsbGye9pCQEP7617/SqlUrevfu7diG27dvp2/fvnTo0IFu3bo56vWkCr8HAeDjI0y4tTX9/rWIMTPW886d7b1dkiqil2asZ8O+k8W6zJZ1wnixfyuX761fv54OHTrkaQsLC6N+/fps27atyOt69dVXqV+/vuP1zp07efHFFxk6dCiTJ0/m4YcfZtq0aY73x44dS05OjiMgunbtyrJlyxARPvzwQyZOnMg//vEPt9c/evRoXnjhBQDuuecefvzxR/r3759nmr/85S8MHTr0opoOHTpEv379ePHFF5k7dy733nsvSUlJ3H333XzxxRc8+uij/Pbbb7Rp04aIiAh8fHxcBlBhn2HBggV89NFHrF69mqCgIHr27EmXLl3o06ePW59x/Pjx9OrVi8mTJ3PixAkSEhIc8yYkJDB58mQmTpzI5MmT6dSpk9vbDqxrDL7//nvCwsI4cuQInTt3ZsCAARw+fJi9e/eybt06qlatynXXXce0adNISEjgqaeeYuXKlXnab775Zk6fPk18fDxvvvkmY8eO5aWXXuLtt99mxIgRvPvuuzRp0oTly5czatQo5s6dW6Q6i0oDwta4Zgh/6dWYf8zews1tD3Jty0hvl6QqiL1797Js2TJuueUWR5uPjw933nknYP1gP/nkk473PvnkE2bPns2ePXscbampqQwZMoT9+/dz/vz5As91nzJlCosXL3asNz4+HoB58+YxceJEMjIyOHbsGK1atbooIH7//XemTp16UU3GGO655x4AevXqxdGjRzl58iTDhw9n4MCBPProo0yePNmxtxUVFcXq1avp2LFjnuVf6jNMmTKFadOmMXjwYEc31u23387ChQvdDohZs2Yxffp0x17a2bNnHXtBHTt2ZPXq1Zw9e5akpCTHdnHlrrvucnT7nTlzxrENnn32WRYuXIiPjw979+7l4MGDGGO4/vrriYiIcMy7cOFCRISePXte1H7zzTfj4+PD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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ojcVtaqwVYY5", + "outputId": "ce83e3c7-1266-4f39-d80e-629af9986b85" + }, + "source": [ + "# Final evaluation of the model\n", + "scores = model.evaluate(x_test, y_test, verbose=0)\n", + "print(\"Accuracy: %.2f%%\" % (scores[1]*100))\n" + ], + "execution_count": 79, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Accuracy: 93.43%\n" + ], + "name": "stdout" + } + ] + } + ] +} \ No newline at end of file diff --git a/robs/lb3/Rozno/Rozno_Robots_laba_3.docx b/robs/lb3/Rozno/Rozno_Robots_laba_3.docx new file mode 100644 index 00000000..aeece3a0 Binary files /dev/null and b/robs/lb3/Rozno/Rozno_Robots_laba_3.docx differ