Физтех.Статистика
Информация не актуальна. Сайт переехал на miptstats.github.io
Скачать ipynb
Введение в анализ данных¶
Применение различных нейросетевых моделей¶
В этом ноутбуке представлены примеры решения различных задач с помощью нейронных сетей. Посмотрев этот ноутбук вы не научитесь решать данные задачи. Главная цель — познакомить вас с различными областями примения нейронных сетей и показать как инетересен мир, а научитесь уже на 3 курсе :)
import numpy as np
import requests
import torch
import cv2
import matplotlib.pyplot as plt
from PIL import Image
1. Определение объектов на изображении*¶
Для решения задачи определения объектов будем пользоваться библиотекой Detectron2. Она удобна тем, что нужно приложить совсем немного услилий, чтобы получить детекцию самых распространнеых объектов.
* В действительности мы будем рещать задачу Intance Segmentation и Panoptic Segmentation, они включает в себя задачу детекции (когда мы выеделям объект в рамочку), а также сегментацию выделенных объектов — когда помечаются все приксели объекта.
!pip install 'git+https://github.com/facebookresearch/detectron2.git'
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog
Отобразим изображение, с которым будем работать.
# ссылка на изображение
url = 'https://planeta.romanticcollection.ru/wp-content/uploads/sites/3/nggallery/romantika-starogo-arbata/gallery-348.jpg'
# скачиваем изображение
response = requests.get(url, stream=True).raw
# переводим изображение в numpy-массив
input_image_np = np.asarray(bytearray(response.read()), dtype="uint8")
# переводим изображение в формат open-cv
input_image_cv2 = cv2.imdecode(input_image_np, cv2.IMREAD_COLOR)
# отображаем изображние с помощью PIL.Image
Image.fromarray(input_image_cv2[:, :, ::-1])
Соберем конфигурацию модели и зададим саму модель.
# Собираем конфигурацию
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
# Инициализируем модель
predictor = DefaultPredictor(cfg)
Посмотрим, как выглядит модель.
predictor.model
Сделаем предсказание.
outputs = predictor(input_image_cv2)
Посмотрим, что получилось.
visualizer = Visualizer(
input_image_cv2[:, :, ::-1],
MetadataCatalog.get(cfg.DATASETS.TRAIN[0]),
scale=1.2
)
visualizer = visualizer.draw_instance_predictions(outputs["instances"].to("cpu"))
Image.fromarray(visualizer.get_image())
Применим похожую модель, но теперь она должна будет разметить еще и фон.
Так же как и раньше зададим конфигурацию модели и зададим саму модель.
# Собираем конфигурацию
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-PanopticSegmentation/panoptic_fpn_R_101_3x.yaml"))
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-PanopticSegmentation/panoptic_fpn_R_101_3x.yaml")
predictor = DefaultPredictor(cfg)
Сделаем предсказание.
outputs = predictor(input_image_cv2)
visualizer = Visualizer(
input_image_cv2[:, :, ::-1],
MetadataCatalog.get(cfg.DATASETS.TRAIN[0]),
scale=1.2
)
panoptic_seg, segments_info = outputs["panoptic_seg"]
visualizer = visualizer.draw_panoptic_seg_predictions(panoptic_seg.to("cpu"), segments_info)
Image.fromarray(visualizer.get_image())
2. Детекция точек лица¶
Детекция точек лица заключается в том, чтобы найти на фотографии ключевые точки, которые обозначают разные части рта, носа, глаз и т.д. Это нужна, например для того, чтобы переносить мимику актеров на персонажей фильма или игры.
!pip install face_alignment
import face_alignment
Скачааем изображение.
url = "https://pln-pskov.ru/pictures/200110074647.jpg"
face_image = Image.open(requests.get(url, stream=True).raw)
face_image
Применим модель.
# Инициализируем модель
fa = face_alignment.FaceAlignment(face_alignment.LandmarksType._2D, flip_input=False)
# Делаем предсказания
preds = fa.get_landmarks(np.array(face_image))
Отобразим результат примения модели.
plt.figure(figsize=(25, 25))
plt.axis("off")
plt.imshow(face_image)
for face_keypoints in preds:
plt.scatter(face_keypoints[:, 0], face_keypoints[:, 1], color="red")
3. Генерация текста¶
Будем использовать самую популярную библиотеку для применения нейронных моделей к текстам — transformers.
!pip install transformers
from transformers import AutoTokenizer, AutoModelForCausalLM
from transformers import logging
Будем работать с моделью, которая способна генерировать диалог на русском языке.
tokenizer = AutoTokenizer.from_pretrained("Grossmend/rudialogpt3_medium_based_on_gpt2")
model = AutoModelForCausalLM.from_pretrained("Grossmend/rudialogpt3_medium_based_on_gpt2")
Попробуем поговорить с моделью.
def get_length_param(text: str) -> str:
tokens_count = len(tokenizer.encode(text))
if tokens_count <= 15:
len_param = '1'
elif tokens_count <= 50:
len_param = '2'
elif tokens_count <= 256:
len_param = '3'
else:
len_param = '-'
return len_param
for step in range(5):
input_user = input("===> User: ")
# Кодируем текст, добавляем парметры и возращаем тензор
new_user_input_ids = tokenizer.encode(f"|0|{get_length_param(input_user)}|" + input_user + tokenizer.eos_token + "|1|1|", return_tensors="pt")
# Полученный тензор дорбавляем в историю чата
bot_input_ids = torch.cat([chat_history_ids, new_user_input_ids], dim=-1) if step > 0 else new_user_input_ids
# Генерируем ответ
chat_history_ids = model.generate(
bot_input_ids,
num_return_sequences=1,
max_length=512,
no_repeat_ngram_size=3,
do_sample=True,
top_k=50,
top_p=0.9,
temperature=0.6,
mask_token_id=tokenizer.mask_token_id,
eos_token_id=tokenizer.eos_token_id,
unk_token_id=tokenizer.unk_token_id,
pad_token_id=tokenizer.pad_token_id,
device='cpu',
)
# Выводим результат генерации
print(f"===> RuDialoGPT: {tokenizer.decode(chat_history_ids[:, bot_input_ids.shape[-1]:][0], skip_special_tokens=True)}")