Каким образом можно обучить ИИ распознавать лицо?
Дело в том, что мне нужен вариант без готовых библиотек по типу TensorFlow, Keras и подобные, только вспомогательные по типу numpy, pandas. Я ищу много информации по поводу обучения ИИ, но практически в каждом вариант есть уже готовая модель. Я не прошу вас написать мне код, я прошу, чтобы вы подсказали мне методы или алгоритмы по каким я бы смог обучить ИИ этому, и по возможности статьи для этого. Благодарю.
UPD:Кратко о моем проекте - мне нужен этот ИИ для проекта о распозновании эмоции на лице человека. По этому мне сначало нужен ИИ для распознавания лица, чтобы второй ИИ распознавания эмоций работал только с фотографией лица
Ответы (2 шт):
Нельзя написать систему распознавания лица "без готовых библиотек" не разобравшись предварительно
- как вообще обучаются нейросети и более глубоко - а как работают методы машинного обучения. Ну, на пару семестров тут хвати чего изучать. Впрочем, можно взять любую книгу по машинному обучению - и подробно штудировать.
- как на изображении выделяется некий объект (не лицо, а именно объект). А для этого освоить кучу специальных методов обработки изображений, их особенности, сильные и слабые стороны. Еще как минимум семестр.
- как написать те процедуры, которые находятся "под капотом" у TF и реализовать их самостоятельно, причем так, чтобы они не падали при первой же ошибки. Ну,зная какой коллектив работал над TF и даже поделив это число на 10 (поскольку будете реализовывать только часть этого пакета) все равно энтузиазма должно существенно поубавиться, ибо эта задача на пару лет. Сомнительный "пэт-проект", если честно.
- Но допустим, вы все это осилите. А теперь внимание вопрос. Чтобы обучить нейросеть распознаванию лиц надо ей скормить пару десятков тысяч (!) изображений, причем размеченных заранее. Вы уже решили, где вы этот датасет возьмете? И как будете тестировать свои результаты?
Я это к чему виду. Надеяться самостоятельно реализовать распознавание лиц, но без вспомогательных средств - причем неважно, будет это TF, OpenCV,PyTorch etc. - можно только, если абсолютно ничего не понимаешь ни в распознавании, ни в нейросетях, ни в программировании. Подсказки тут не помогут - только последовательное и серьезное изучение темы. Увы. Стоит-ли тратить свой самый главный ресурс - время на заведомо нереализуемую задачу? Решение принимайте сами.
Тебе нужно иметь Датасет с изображениями, а также аннотацию (label.txt) вот код для обучения модели. import os import torch from torch.utils.data import Dataset, DataLoader import torchvision.transforms as transforms from PIL import Image
class FaceDataset(Dataset):
def __init__(self, label_file, img_dir, transforms=None):
self.img_dir = img_dir
self.transforms = transforms
self.data = []
with open(label_file, "r") as f:
lines = f.readlines()
current_file = None
boxes = []
for line in lines:
line = line.strip()
if line.startswith("#"):
if current_file and boxes:
self.data.append((current_file, boxes))
current_file = line[2:]
boxes = []
else:
bbox = list(map(int, line.split()))
boxes.append(bbox)
if current_file and boxes:
self.data.append((current_file, boxes))
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
file_name, boxes = self.data[idx]
img_path = os.path.join(self.img_dir, file_name)
image = Image.open(img_path).convert("RGB")
boxes = torch.tensor(boxes, dtype=torch.float32)
labels = torch.ones((len(boxes),), dtype=torch.int64)
target = {"boxes": boxes, "labels": labels}
if self.transforms:
image = self.transforms(image)
return image, target
import torchvision
from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
from torchvision.models.detection.backbone_utils import resnet_fpn_backbone
def get_custom_model(num_classes):
backbone = resnet_fpn_backbone('resnet50', pretrained=False)
model = torchvision.models.detection.FasterRCNN(backbone, num_classes=num_classes)
return model
import torch.optim as optim
num_classes = 2
num_epochs = 20
batch_size = 4
lr = 0.005
dataset = FaceDataset("label.txt", "path")
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True, collate_fn=lambda x: tuple(zip(*x)))
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = get_custom_model(num_classes).to(device)
optimizer = optim.Adam(model.parameters(), lr=lr)
def train_one_epoch(model, dataloader, optimizer):
model.train()
epoch_loss = 0
for images, targets in dataloader:
images = [img.to(device) for img in images]
targets = [{k: v.to(device) for k, v in t.items()} for t in targets]
optimizer.zero_grad()
loss_dict = model(images, targets)
loss = sum(loss for loss in loss_dict.values())
loss.backward()
optimizer.step()
epoch_loss += loss.item()
return epoch_loss / len(dataloader)
for epoch in range(num_epochs):
loss = train_one_epoch(model, dataloader, optimizer)
print(f"Epoch {epoch+1}/{num_epochs}, Loss: {loss}")
torch.save(model.state_dict(), "face_detector.pth")