【CV实战】年轻人的第一个深度学习图像分割项目应该是什么样的(Pytorch框架)?...

史上最详细唇语识别数据集综述 唇语识别数据集综述 阅读详情

我们上次给新手们介绍了第一个合适入门的深度学习CV项目,可阅读【CV实战】年轻人的第一个深度学习CV项目应该是什么样的?(支持13大深度学习开源框架),本次我们再给大家介绍一个新的任务,图像分割,包括数据的处理,模型的训练与测试。

作者&编辑 | 言有三

本文资源与图像分割结果展示

本文篇幅:4800字

背景要求:会使用Python和Pytorch深度学习开源框架

附带资料:开源代码一份,支持Pytorch

数据一份:文末有获取方法

1 项目背景

图像处理中,研究者往往只对图像中的某些区域感兴趣,在此基础上才有可能对目标进行后续的处理与分析。图像分割技术就是把图像中属于目标区域的感兴趣区域进行半自动或者自动地提取分离出来,属于计算机视觉领域中最基础的任务之一。

为了让新手们能够一次性体验一个图像分割任务的完整流程,本次我们选择带领大家完成一个嘴唇图像分割任务,包括数据集的处理,模型的训练和测试,同时也将这次的实验与上一期内容结合起来。

2 数据处理

2.1 数据获取

我们上次已经介绍过,如果没有开源的数据集,我们首先要学会使用爬虫爬取图像,然后对获得的图片数据进行整理,包括重命名,格式统一,如果不清楚整个流程,可以参考我们上一次【CV实战】年轻人的第一个深度学习CV项目应该是什么样的?(支持13大深度学习开源框架),获取后整理的图像如下:

2.2 数据标注

接下来,我们需要对数据进行标注。图像分割任务要求对每一个像素进行预测,所以需要像素级别的标注结果,当然我们实际标注的时候往往是通过画轮廓形成闭合区域,开源的标注工具有很多,我们可以使用LabelMe等工具进行标注,当然你也可以使用其他工具进行标注,这里我们就不再展开讲了,因为本文面向的读者已经不是纯新手了。

标注完之后的样本和结果如下:

需要注意的是,标注的结果并不是我们用于训练的标签,因为图像分割本身是对每一个图像像素进行分类,在当前的开源框架中,每一个像素的类别也是从0,1,2,3这样的顺序依次增加。

所以在这里,我们一定需要注意训练时候的标签处理,这个大家根据自己的实际情况进行调整。

3 数据读取

得到了数据之后,接下来咱们使用Pytorch框架来进行模型的训练,首先需要实现的就是数据读取。Pytorch本身并没有图像分割任务的数据接口,所以我们需要自己定义,读取图像和掩膜,做一些简单的数据增强操作,我们定义一个类为SegDataset如下。

class SegDataset(Dataset):

    def __init__(self,filetxt,imagesize,cropsize,transform=None):

        lines = open(filetxt,'r').readlines()

        self.samples = []

        self.imagesize = imagesize

        self.cropsize = cropsize

        self.transform  = transform

        if self.transform is None:

            transform = transforms.Compose([

                   transforms.ToTensor(),

                   transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))

                   ]) 

        for line in lines:

            line = line.strip()

            imagepath,labelpath = line.split(' ')

            self.samples.append((imagepath,labelpath))

    def __getitem__(self,index):##获取数据

        imagepath,labelpath = self.samples[index]

        image = cv2.imread(imagepath)

        label = cv2.imread(labelpath,0) ##读成1通道

       

        ## 添加基本的数据增强,对图片和标签保持一致

        ## 添加固定尺度的随机裁剪,使用最近邻缩放(不产生新的灰度值)+裁剪

        image = cv2.resize(image,(self.imagesize,self.imagesize),interpolation=cv2.INTER_NEAREST)

        label = cv2.resize(label,(self.imagesize,self.imagesize),interpolation=cv2.INTER_NEAREST)

        offsetx = np.random.randint(self.imagesize-self.cropsize)

        offsety = np.random.randint(self.imagesize-self.cropsize)

        image = image[offsety:offsety+self.cropsize,offsetx:offsetx+self.cropsize]

        label = label[offsety:offsety+self.cropsize,offsetx:offsetx+self.cropsize]

       

        return self.transform(image),label ##只对image做预处理操作

    def __len__(self): ##统计数据集大小

        return len(self.samples)

上述的SegDataset类实现了图像分割任务数据的读取,有以下几个需要说明的地方:

(1) 输入的filetxt是我们预先准备好的文件,其中每一行按照[图片 标签]的对应格式存储着数据。

(2) 我们这里自己添加了一个随机裁剪的数据增强操作,对于裁剪类操作,标签图也需要在同样的裁剪参数下进行变换,对于颜色类操作则不需要。更多常见的数据增强操作可以查看下文:

【技术综述】深度学习中的数据增强方法都有哪些?

接下来我们就可以来测试一下数据集的读取,分别使用简单的方法和Dataloader接口。

## 简单方法,根据index来读取某一条数据

filetxt = "data/train.txt"

imagesize = 256

cropsize = 224

mydataset = SegDataset(filetxt,imagesize,cropsize)

print(mydataset.__length__())

image,label = mydataset.__getitem__(0) 

## 使用DataLoader来遍历,相关接口我们上期已经讲过,不再赘述

from torch.utils.data import DataLoader

batchsize = 64

train_dataset = SegDataset(train_data_path,imagesize,cropsize,data_transform)

train_dataloader = DataLoader(train_dataset, batch_size=batchsize, shuffle=True)

确认数据读取没有问题后,我们就可以开始来准备模型以及训练了。

 

4 模型训练

得到了数据之后,接下来咱们使用Pytorch框架来进行模型的训练,包括模型定义、结果保存与分析。

4.1 模型定义

接下来我们定义分割模型,首先是若干卷积层,然后是若干反卷积层。

import torch

from torch import nn

class simpleNet5(nn.Module):

    def __init__(self):

        super(simpleNet5, self).__init__()

        self.conv1 = nn.Sequential(

            nn.Conv2d(3, 32, kernel_size=3, stride=2, padding=1),

            nn.BatchNorm2d(32),

            nn.ReLU(True),

        )

        self.conv2 = nn.Sequential(

            nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1),

            nn.BatchNorm2d(64),

            nn.ReLU(True),

        )

        self.conv3 = nn.Sequential(

            nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1),

            nn.BatchNorm2d(128),

            nn.ReLU(True),

        )

        self.conv4 = nn.Sequential(

            nn.Conv2d(128, 256, kernel_size=3, stride=2, padding=1),

            nn.BatchNorm2d(256),

            nn.ReLU(True),

        )

        self.conv5 = nn.Sequential(

            nn.Conv2d(256, 512, kernel_size=3, stride=2, padding=1),

            nn.BatchNorm2d(512),

            nn.ReLU(True),

        )

        self.deconv1 = nn.Sequential(

            nn.ConvTranspose2d(in_channels=512, out_channels=256, kernel_size=3,

                               stride=2, padding=1, output_padding=1),

            nn.BatchNorm2d(256),

            nn.ReLU(True)

        )

        self.deconv2 = nn.Sequential(

            nn.ConvTranspose2d(256, 128, 3, 2, 1, 1),

            nn.BatchNorm2d(128),

            nn.ReLU(True)

        )

        self.deconv3 = nn.Sequential(

            nn.ConvTranspose2d(128, 64, 3, 2, 1, 1),

            nn.BatchNorm2d(64),

            nn.ReLU(True)

        )

        self.deconv4 = nn.Sequential(

            nn.ConvTranspose2d(64, 32, 3, 2, 1, 1),

            nn.BatchNorm2d(32),

            nn.ReLU(True)

        )

        self.deconv5 = nn.Sequential(

            nn.ConvTranspose2d(32, 16, 3, 2, 1, 1),

            nn.BatchNorm2d(16),

            nn.ReLU(True)

        )

        self.classifier = nn.Conv2d(16, 3, kernel_size=1)

    def forward(self, x):       

        out = self.conv1(x)     

        out = self.conv2(out)     

        out = self.conv3(out)   

        out = self.conv4(out)

        out = self.conv5(out)   

        out = self.deconv1(out) 

        out = self.deconv2(out)

        out = self.deconv3(out)

        out = self.deconv4(out)

        out = self.deconv5(out)

        out = self.classifier(out)

        return out

if __name__ == '__main__':

    img = torch.randn(2, 3, 224, 224)

    net = simpleNet5()

    sample = net(img)

    print(sample.shape)

在这里我们需要知道的是转置卷积的API为nn.ConvTranspose2d(in_channels,out_channels,kernel_size,stride=1, padding=0, output_padding=0,groups=1, bias=True, dilation=1),其中各个参数大家可以去查API说明。

卷积的具体配置如下:

反卷积层的具体配置如下:

4.2 训练

数据集接口准备好之后我们进行训练,完整代码如下。

import torch

import torch.nn as nn

import torch.optim as optim

from torch.optim import lr_scheduler

from torch.autograd import Variable

import torchvision

from torchvision import datasets, models, transforms

import time

import os

from net import simpleNet5

from dataset import SegDataset

from tensorboardX import SummaryWriter

from torch.utils.data import DataLoader

import numpy as np

writer = SummaryWriter() #可视化

batchsize = 64

epochs = 200

imagesize = 256 #缩放图片大小

cropsize = 224 #训练图片大小

train_data_path = 'data/train.txt' #训练数据集

val_data_path = 'data/val.txt' #验证数据集

# 数据预处理

data_transform = transforms.Compose([

            transforms.ToTensor(),

            transforms.Normalize([0.5,0.5,0.5], [0.5,0.5,0.5])])

# 图像分割数据集

train_dataset = SegDataset(train_data_path,imagesize,cropsize,data_transform)

train_dataloader = DataLoader(train_dataset, batch_size=batchsize, shuffle=True)

val_dataset = SegDataset(val_data_path,imagesize,cropsize,data_transform)

val_dataloader = DataLoader(val_dataset, batch_size=val_dataset.__len__(), shuffle=True)

image_datasets = {}

image_datasets['train'] = train_dataset

image_datasets['val'] = val_dataset

dataloaders = {}

dataloaders['train'] = train_dataloader

dataloaders['val'] = val_dataloader

# 定义网络,优化目标,优化方法

device = torch.device('cpu')

net = simpleNet5().to(device)

criterion = nn.CrossEntropyLoss() #使用softmax loss损失,输入label是图片

optimizer = optim.SGD(net.parameters(), lr=1e-1, momentum=0.9)

scheduler = lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.1) #每50个epoch,学习率衰减

if not os.path.exists('checkpoints'):

    os.mkdir('checkpoints')

for epoch in range(1, epochs+1):

    print('Epoch {}/{}'.format(epoch, epochs - 1))

    for phase in ['train', 'val']:

        if phase == 'train':

            scheduler.step()

            net.train(True)  # Set model to training mode

        else:

            net.train(False)  # Set model to evaluate mode

        running_loss = 0.0

        running_accs = 0.0

        n = 0

        for data in dataloaders[phase]:

            imgs, labels = data

            img, label = imgs.to(device).float(), labels.to(device).float()

            output = net(img)

            loss = criterion(output, label.long()) #得到损失

            output_mask = output.cpu().data.numpy().copy()

            output_mask = np.argmax(output_mask, axis=1)

            y_mask = label.cpu().data.numpy().copy()

            acc = (output_mask == y_mask) #计算精度

            acc = acc.mean()

            optimizer.zero_grad()

            if phase == 'train':

            # 梯度置0,反向传播,参数更新

                loss.backward()

                optimizer.step()

            running_loss += loss.data.item()

            running_accs += acc

            n += 1

        epoch_loss = running_loss / n

        epoch_acc = running_accs / n

        if phase == 'train':

            writer.add_scalar('data/trainloss', epoch_loss, epoch)

            writer.add_scalar('data/trainacc', epoch_acc, epoch)

            print('train epoch_{} loss='+str(epoch_loss).format(epoch))

            print('train epoch_{} acc='+str(epoch_acc).format(epoch))

        else:

            writer.add_scalar('data/valloss', epoch_loss, epoch)

            writer.add_scalar('data/valacc', epoch_acc, epoch)

            print('val epoch_{} loss='+str(epoch_loss).format(epoch))

            print('val epoch_{} acc='+str(epoch_acc).format(epoch))

    if epoch % 10 == 0:

        torch.save(net, 'checkpoints/model_epoch_{}.pth'.format(epoch))

        print('checkpoints/model_epoch_{}.pth saved!'.format(epoch))

writer.export_scalars_to_json("./all_scalars.json")

writer.close()

在上面代码中,我们使用了带动量项的SGD作为优化方法,配置学习率为0.1,使用了CrossEntropy损失作为优化目标,相关代码如下:

criterion = nn.CrossEntropyLoss() #使用softmax loss损失,输入label是图片

optimizer = optim.SGD(net.parameters(), lr=1e-1, momentum=0.9)

scheduler = lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.1) #每50个epoch,学习率衰减

另外我们使用了tensorboardX工具来进行可视化,工具使用我们之前已经介绍过了,大家可以去查看之前图像分类的内容,训练的结果如下:

5 模型测试

上面已经训练好了模型,我们接下来的目标,就是要用它来做推理,真正把模型用起来,下面我们载入一个图片,用模型进行测试。

import torch

import torch.nn as nn

import torch.optim as optim

from torch.optim import lr_scheduler

from torch.autograd import Variable

import torchvision

from torchvision import datasets, models, transforms

import time

import os

import cv2

import sys

import torch.nn.functional as F

import numpy as np

data_transforms =  transforms.Compose([

            transforms.ToTensor(),

            transforms.Normalize([0.5,0.5,0.5], [0.5,0.5,0.5])])

modelpath = sys.argv[1] #模型目录

net = torch.load(modelpath,map_location='cpu')

net.eval() #设置为推理模式,不会更新模型的k,b参数

imagepaths = os.listdir(sys.argv[2]) #测试图片目录

torch.no_grad() #停止autograd模块的工作,加速和节省显存

for imagepath in imagepaths:

    image = cv2.imread(os.path.join(sys.argv[2],imagepath)) #读取图像

    image = cv2.resize(image,(224,224),interpolation=cv2.INTER_NEAREST)

    imgblob = data_transforms(image).unsqueeze(0) #填充维度,从3维到4维

    predict = F.softmax(net(imgblob)).cpu().data.numpy().copy() #获得原始网络输出,多通道

    predict = np.argmax(predict, axis=1) #得到单通道label

    result = np.squeeze(predict) #降低维度,从4维到3维

    print(np.max(result)) 

    result = (result*127).astype(np.uint8) #灰度拉伸,方便可视化

    resultimage = image.copy()

    for y in range(0,result.shape[0]): 

        for x in range(0,result.shape[1]):

            if result[y][x] == 127:

                resultimage[y][x] = (0,0,255) 

            elif result[y][x] == 254:

                resultimage[y][x] = (0,255,255) 

    combineresult = np.concatenate([image,resultimage],axis=1)

    cv2.imwrite(os.path.join(sys.argv[3],imagepath),combineresult) #写入新的目录

从上面的代码可知,使用torch.load函数载入模型,然后读取图像,进行与训练相同的预处理操作,就可以得到网络输出,再进行一些维度变换和softmax操作就得到最终的结果。

下面展示了一些分割结果。

从图中我们可以看到,总体的分割结果还是不错的,不过本次的任务还有许多可以提升的空间,包括但不限于:(1) 做更多的数据增强。(2) 改进模型。这些就留给读者去进行实验。

然后就可以自己输入图片得到推理结果,index就是预测的类别。

 6 资源获取和拓展学习

本文的完整代码,可以在我们的开源项目中获取,项目地址如下。

https://github.com/longpeng2008/yousan.ai

由于数据集较大,如果想要获得数据集,请到有三AI知识星球中下载,当然你也完全可以将其替换成自己的数据集:

有三AI知识星球链接与介绍如下:

【杂谈】有三AI知识星球指导手册出炉!和公众号相比又有哪些内容?

如果想要学习更多图像分割的内容,请关注下面的视频课程。

【视频课】图像分割最新内容来了(言有三新录制6大理论部分+1个案例实践讲解)

总结

本次我们完成了一个图像分割任务项目的全部流程,如果小伙伴还记得上一次的表情分类任务,那么就可以接着在上一次任务的基础上将其做成分割任务,得到本文开头的gif展示结果。

转载文章请后台联系

侵权必究

往期文章

python基于深度学习的唇语识别系统的设计与实现 针对web端操作下的唇语识别,本文主要是使用了两大主流深度学习算法部署到Flask框架的集成思想,对如下内容进行了研究应用:(1)Yolov5算法对人脸进行唇部定位,采用预测的坐标对数据集进行处理,整理得到图像内容仅包含有效信息的数据集;(2)设计3DResnet和GRU复合网络,利用2D的残差模块组成深度网进行提取特征,最后利用GRU将每个帧数映射到特征维度中,形成批次和时序的高维度信息,再进行全连接层和softmax层; 阅读详情

相关推荐

keras实现嘴唇图像autoencoder

本文分享了我在silent speech 项目过程中实现的基于嘴唇图像数据集的autoencoder自编码器。输入输出都是64∗6464*6464∗64的嘴唇灰度图。自编码器由编码解码两个部分构成,同时实现了利用checkpoint在每个epoch运算时,自动保存测试集loss更小的模型。 数据集共包含84679张图片,其中前68728张图片作为训练集,后15951张图片作为测试集。 import tensorflow as tf from tensorflow.keras import layers f

Cy_coding的博客 629

【亲测免费】 推荐开源项目:Face Segmentation - 精准的人脸分割技术

推荐开源项目:Face Segmentation - 精准的人脸分割技术 项目介绍 Face Segmentation 是一个轻量级的开源项目,旨在实现对图像中人物面部、头发和背景的语义分割。通过此项目,您可以获取到高精度的面部特征提取,让您的应用在处理人像图片时展现出专业级别的效果。该项目基于 MobileNetV2 模型,并提供简单的训练和测试脚本,使得开发者能快速上手并进行自己的实验。 项目...

gitblog_00099的博客 1259

CV学习路线图:从‘看热闹’到真正能落地

真正学好CV,不是在信息流里盲目囤积前沿论文和炫酷大模型,而是按图索骥,从像素地基、CNN骨架到工程部署步步为营。AI的终局不是调参刷榜,而是用扎实的工程能力去解决真实世界的问题。

maqh_csdn的博客 397

Face_Segmentation 项目常见问题解决方案

Face_Segmentation 是一个基于深度学习的面部分割项目。该项目使用 Caffe 框架和全卷积神经网络(FCN)进行面部分割,尤其在极端困难条件下表现优异。项目提供了 C++ 和 Python 两种接口,主要编程语言包括 C++ 和 Python。 ## 二、新手常见问题及解决步骤 ### 问题一:项目依赖库安装问题 **问题描述:** 新手在尝试编译和运行项目时,可能会遇到依赖

gitblog_00788的博客 367

(Python)裁剪人脸图片获得人脸的嘴唇区域

代码可以正确运行,代码注释也已经添加 项目需要,我们需要对人脸图片进行处理,获得图片的嘴唇区域 这里我们利用 Opencv + Dlib 算法来提取嘴唇区域。 因为Dlib 算法可以得到面部的 68 个关键点,所以这里我们可以从中得到嘴唇区域并对其进行适当地扩大。从图中可以看出我们需要获得的是 48-67 点的范围 结果如图: import sys import numpy as np import cv2 import os import dlib # 这里采用 Opencv 和 Dlib 算法提取

南淮北安的博客 3664

Keras深度学习实战(12)——面部特征点检测

面部关键点的定位通常是许多面部分析方法和算法中的关键步骤。在本节中,我们介绍了如何通过训练卷积神经网络来检测面部的关键点,首先通过预训练模型提取特征,然后利用微调模型预测图像中人物的面部关键点。............

盼小辉丶的博客 1万+

【视频课】深度学习必备基础,如何使用好数据?

前言数据是深度学习系统的输入,对深度学习的发展起着至关重要的作用,但是又容易被很多人忽视,尤其是缺少实战的学习人员。最近百度在港交所二次上市,参与敲锣的除了高管,还有百度在山西数据标注基地...

hacker_long的专栏 487

face_segmentation:使用CNN和CRF进行人脸分割

使用CNN和CRF进行人脸分割 我们尝试不同的方法来完成人脸分割: 。 型号和更多详细信息,请访问Aaron Jackson的。 我们将CRF添加为后处理。 CRF由实现。 。 原始。 根据地标生成凸包。 在使用所有三种方法之前,我们先检测界标并裁剪图像。 代替在A CNN Cascade for Landmark Guided Semantic Part Segmentation标检测网络,我们使用来检测在大型姿态图像上效果很好的地标。 我们还尝试了其他方法来裁剪图像。 代号 face_segment_part.py:用于地标制导语义部分分割的CNN级联。 face_segment_yuval.py:关于面部分割,面部交换和面部感知。 face_segment_contour.py:检测到地标并获得凸包。 依存关系 请为face_segment_yuval.py下载 (最低版

现在才开始学人工智能晚吗?该说不说..

需要复现AlexNet、ResNet等经典模型,完成“基于GAN的图像生成”、“3D场景下的智能垃圾分类”等项目。有33岁的前端开发者成功转型NLP工程师,也有31岁医学背景博士转入AI医疗算法岗,月薪30K+,还有29岁的人事主管转型AI产品经理。据测算,中国AI人才缺口超120万,算法工程师、大模型开发、计算机视觉等岗位平均薪资达24.2K-31.2K,且需求年增速超过50%。人工智能深度开发核心课程——深入CNN、RNN原理,复现AlexNet、ResNet等模型,掌握目标检测、图像分割等核心技术。

xafarsight的博客 908

arcgis根据矢量范围统计栅格数据众数、最大值、均值、中位数、最小值、少数等

像元统计数据 根据多个栅格数据计算每个像元的统计数据。 可用的统计数据有:众数、最大值、均值、中位数、最小值、少数、范围、标准差、总和及变异度。 https://desktop.arcgis.com/zh-cn/arcmap/10.3/tools/spatial-analyst-toolbox/an-overview-of-the-local-tools.htm ...

GIS哼哈哈的博客 6万+

保姆级教程:在LKD3588开发板上为RK3588添加SC2210摄像头驱动(含完整DTS配置)

本文提供了一份详细的教程,指导如何在LKD3588开发板上为RK3588处理器添加SC2210摄像头驱动,包括完整的DTS配置和内核编译步骤。教程涵盖了环境准备、驱动文件添加、DTS配置详解、内核编译与烧录、驱动测试以及常见问题排查,帮助开发者快速实现SC2210传感器在RK3588平台上的集成与优化。

weixin_42641741的博客 480

毕业设计:基于深度学习的人脸五官分割算法 人工智能

毕业设计:基于深度学习的人脸五官分割算法 通过训练深度学习模型,该算法能够准确地提取人脸图像中的五官,为人脸相关应用提供重要的分析和处理基础。本研究为计算机毕业设计提供了一个创新的方向,结合了深度学习和计算机视觉技术,为毕业生提供了一个有意义的研究课题。对于计算机专业、软件工程专业、人工智能专业、大数据专业的毕业生而言,提供了一个具有挑战性和创新性的研究课题。无论您对深度学习技术保持浓厚兴趣,还是希望探索机器学习、算法或人工智能的领域的同学,能为您提供灵感和指导。

毕设帮助,疑难解答,欢迎打扰! 2589

GoPro官方API实战:从蓝牙配对到Wi-Fi流媒体,构建跨平台控制应用

本文详细解析了GoPro官方API的开发实践,涵盖蓝牙配对、Wi-Fi流媒体控制等关键技术。通过实战案例,指导开发者如何构建跨平台控制应用,解决设备发现、指令解析、视频流传输等核心问题,并分享Android平台迁移经验与常见问题排查方法。

weixin_30727835的博客 397

音视频开发之旅(77)- 训练可泛化AI数字人的中文数据集汇总

1、CMLR2、LRW-10003、其他数据集4、视频收集与处理与训练5、资料Wav2Lip实现的是视频人物根据输入音频生成与语音同步的人物唇形,使得生成的视频人物口型与输入语音同步。不仅可以基于静态图像来输出与目标语音匹配的唇形同步视频,还可以直接将动态的视频进行唇形转换,输出与目标语音匹配的视频。但是预训练模型采用的是LRS2数据集,对于中文唇音同步效果不够真实,开放的或者可申请比较大的中文数据集有CMLR和LRW-1000等。也可以自己收集数据集进行清洗处理,但时间会很长,成本比较高。

yabin的专栏 3088

采用超级电容设计的UPS不间断电源,用于掉电数据保存,可续航10-60秒

关键词:树莓派 CM4 UPS 不间断电源 掉电保存 超级电容 SuperCap 充电 升压 续航 10F 法拉电容 Mcuzone 野芯科技 概述:我们经常会遇到系统意外掉电的情况,对于一些可靠性要求很高的工业现场设备或者运行过程中有重要数据需要保存的平台就需要UPS电源了。常规的UPS采用后备锂电池设计,具备无缝切换、续航时间长、稳定可靠等特点,但同时也有价格过高、体积过大的缺点。对于不少仅需在检测到系统掉电后对数据进行保存即可的应用而言,这些标准的UPS电源就不太合适,为此我...

6606

《低功耗方法学》翻译——前言

前言

记录所学,分享知识,结识挚友 1209

【亲测免费】 开源项目 `face_segmentation` 使用教程

`face_segmentation` 是一个用于人脸分割的开源项目,由 Yuval Nirkin 开发。该项目使用全卷积神经网络(FCN)来分割人脸的可见部分,排除颈部、耳朵、头发、长胡须以及任何可能遮挡脸部的物体。项目的主要特点包括: - 使用 FCN-8s-VGG 架构进行人脸分割。 - 提供了训练和推理脚本。 - 支持在极端条件下进行人脸分割。 ## 2、项目快速启动 ### 安装依

gitblog_01178的博客 992

【数据集】中国大气污染物数据集CHAP(1km空间分辨率)-韦晶团队

中国大气污染物数据集CHAP(1km空间分辨率)-韦晶团队

WW、forever的博客 2600

《SegFace: Face Segmentation of Long-Tail Classes》论文分享(侵删)

author={Kartik Narayan and Vibashan VS and Vishal M. Patel}原文链接:[2412.08647] SegFace: Face Segmentation of Long-Tail Classes摘要 人脸解析是指将人脸语义分割为眼睛、鼻子、头发等关键面部区域。它是各种高级应用程序的先决条件,包括人脸编辑、人脸交换和面部化妆,这些应用程序通常需要对眼镜、帽子、耳环和项链等类别进行分割遮罩。这些不常出现的类称为长尾类,而长尾类被称为头类的频繁出

DTGshaodow的博客 1229

地平线旭日X5开发板--搭建ROS1环境开发

由于RDK X5是基于Ubuntu22.04 进行版本释放,而ROS1只兼容到了20.04,为了更很好的做以前ROS1相关代码方案的快速迁移,提供了使用docker 的ros环境,进而使用ros1的方案。

bingdund的博客 1019

silero-vad 训练自己的数据

silero-vad 训练自己的数据

jacke121的专栏 816

【AAAI 2025】人脸分割最新工作——SegFace一键推理接口分享

话不多说,直接看演示。今天分享了的是AAAI 2025一篇名为SegFace论文的面部解析(人脸语义分割)模型的推理接口。把模型和数据预处理部分从代码仓库里面剥离出来了。需要自取。

XavierJ的博客 2812

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

人脸分割项目使用教程

``` face_segmentation/ ├── bin/ │ ├── face_seg_batch │ ├── face_seg_image │ └── ... ├── data/ │ ├── images/ │ ├── face_seg_fcn8s.caffemodel │ ├── face_seg_fcn8s_deploy.prototxt │ └── ...

gitblog_00686的博客 411

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

用python画嘴_如何使用python检测嘴唇区域部分(附代码)

在人工智能的时代,对人脸检测是一种非常常见的技术,本实验在人脸检测的基础上,对嘴唇进行检测,并且能实现对不同大小的输入尺寸的人脸图像能分割统一大小的嘴唇区域,对后面的模型训练具有非常重要的价值1 下载模型linux下使用wget命令下载:wget -c -t 20 http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2# 解压...

weixin_39687990的博客 1234

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JoyGen—说话人脸视频编辑与生成

近年来,尽管说话人脸视频生成技术取得了显著进展,但在音频驱动的唇部动作生成中,精确的音频与嘴型同步以及高质量的视觉效果仍然是亟待解决的关键问题。为此,论文提出了一种新颖的两阶段框架——JoyGen,用于生成高质量的说话人脸视频。该框架包括音频驱动的唇部动作生成和视觉外观合成两个主要步骤。在第一阶段,JoyGen 利用3D重建模型和音频驱动的动作生成模型,分别预测基于3D可变形模型(3DMM)的身份系数和表情系数。

u011150735的博客 611

深度学习的分割方法

UNet。

qq_54809548的博客 2128
上一篇: 【CV夏季划】2021年有三AI-CV夏季划出炉,冲刺秋招,从CV基础到模型优化彻底掌握...
下一篇: 【视频课】深度学习必备基础,如何使用好数据?
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值