前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >StringBuffer 详解[通俗易懂]

StringBuffer 详解[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-07-31 07:11:26
发布于 2022-07-31 07:11:26
54500
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

StringBuffer 简介

StringBuffer 是一个线程安全的可变的字符序列。它继承于AbstractStringBuilder,实现了CharSequence接口。 StringBuilder 也是继承于AbstractStringBuilder的子类;但是,StringBuilder和StringBuffer不同,前者是非线程安全的,后者是线程安全的。

StringBuffer 和 CharSequence之间的关系图如下:

StringBuffer

StringBuffer源码(基于jdk1.7.40)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package java.lang;

public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{

    static final long serialVersionUID = 3388685877147921107L;

    public StringBuffer() {
        super(16);
    }

    public StringBuffer(int capacity) {
        super(capacity);
    }

    public StringBuffer(String str) {
        super(str.length() + 16);
        append(str);
    }

    public StringBuffer(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }

    public synchronized int length() {
        return count;
    }

    public synchronized int capacity() {
        return value.length;
    }


    public synchronized void ensureCapacity(int minimumCapacity) {
        if (minimumCapacity > value.length) {
            expandCapacity(minimumCapacity);
        }
    }

    public synchronized void trimToSize() {
        super.trimToSize();
    }

    public synchronized void setLength(int newLength) {
        super.setLength(newLength);
    }

    public synchronized char charAt(int index) {
        if ((index < 0) || (index >= count))
            throw new StringIndexOutOfBoundsException(index);
        return value[index];
    }

    public synchronized int codePointAt(int index) {
        return super.codePointAt(index);
    }

    public synchronized int codePointBefore(int index) {
        return super.codePointBefore(index);
    }

    public synchronized int codePointCount(int beginIndex, int endIndex) {
        return super.codePointCount(beginIndex, endIndex);
    }

    public synchronized int offsetByCodePoints(int index, int codePointOffset) {
        return super.offsetByCodePoints(index, codePointOffset);
    }

    public synchronized void getChars(int srcBegin, int srcEnd, char[] dst,
                                      int dstBegin)
    {
        super.getChars(srcBegin, srcEnd, dst, dstBegin);
    }

    public synchronized void setCharAt(int index, char ch) {
        if ((index < 0) || (index >= count))
            throw new StringIndexOutOfBoundsException(index);
        value[index] = ch;
    }

    public synchronized StringBuffer append(Object obj) {
        super.append(String.valueOf(obj));
        return this;
    }

    public synchronized StringBuffer append(String str) {
        super.append(str);
        return this;
    }

    public synchronized StringBuffer append(StringBuffer sb) {
        super.append(sb);
        return this;
    }

    public StringBuffer append(CharSequence s) {
        // Note, synchronization achieved via other invocations
        if (s == null)
            s = "null";
        if (s instanceof String)
            return this.append((String)s);
        if (s instanceof StringBuffer)
            return this.append((StringBuffer)s);
        return this.append(s, 0, s.length());
    }

    public synchronized StringBuffer append(CharSequence s, int start, int end)
    {
        super.append(s, start, end);
        return this;
    }

    public synchronized StringBuffer append(char[] str) {
        super.append(str);
        return this;
    }

    public synchronized StringBuffer append(char[] str, int offset, int len) {
        super.append(str, offset, len);
        return this;
    }

    public synchronized StringBuffer append(boolean b) {
        super.append(b);
        return this;
    }

    public synchronized StringBuffer append(char c) {
        super.append(c);
        return this;
    }

    public synchronized StringBuffer append(int i) {
        super.append(i);
        return this;
    }

    public synchronized StringBuffer appendCodePoint(int codePoint) {
        super.appendCodePoint(codePoint);
        return this;
    }

    public synchronized StringBuffer append(long lng) {
        super.append(lng);
        return this;
    }

    public synchronized StringBuffer append(float f) {
        super.append(f);
        return this;
    }

    public synchronized StringBuffer append(double d) {
        super.append(d);
        return this;
    }

    public synchronized StringBuffer delete(int start, int end) {
        super.delete(start, end);
        return this;
    }

    public synchronized StringBuffer deleteCharAt(int index) {
        super.deleteCharAt(index);
        return this;
    }

    public synchronized StringBuffer replace(int start, int end, String str) {
        super.replace(start, end, str);
        return this;
    }

    public synchronized String substring(int start) {
        return substring(start, count);
    }

    public synchronized CharSequence subSequence(int start, int end) {
        return super.substring(start, end);
    }

    public synchronized String substring(int start, int end) {
        return super.substring(start, end);
    }

    public synchronized StringBuffer insert(int index, char[] str, int offset,
                                            int len)
    {
        super.insert(index, str, offset, len);
        return this;
    }

    public synchronized StringBuffer insert(int offset, Object obj) {
        super.insert(offset, String.valueOf(obj));
        return this;
    }

    public synchronized StringBuffer insert(int offset, String str) {
        super.insert(offset, str);
        return this;
    }

    public synchronized StringBuffer insert(int offset, char[] str) {
        super.insert(offset, str);
        return this;
    }

    public StringBuffer insert(int dstOffset, CharSequence s) {
        // Note, synchronization achieved via other invocations
        if (s == null)
            s = "null";
        if (s instanceof String)
            return this.insert(dstOffset, (String)s);
        return this.insert(dstOffset, s, 0, s.length());
    }

    public synchronized StringBuffer insert(int dstOffset, CharSequence s,
                                            int start, int end)
    {
        super.insert(dstOffset, s, start, end);
        return this;
    }

    public StringBuffer insert(int offset, boolean b) {
        return insert(offset, String.valueOf(b));
    }

    public synchronized StringBuffer insert(int offset, char c) {
        super.insert(offset, c);
        return this;
    }

    public StringBuffer insert(int offset, int i) {
        return insert(offset, String.valueOf(i));
    }

    public StringBuffer insert(int offset, long l) {
        return insert(offset, String.valueOf(l));
    }

    public StringBuffer insert(int offset, float f) {
        return insert(offset, String.valueOf(f));
    }

    public StringBuffer insert(int offset, double d) {
        return insert(offset, String.valueOf(d));
    }

    public int indexOf(String str) {
        return indexOf(str, 0);
    }

    public synchronized int indexOf(String str, int fromIndex) {
        return String.indexOf(value, 0, count,
                              str.toCharArray(), 0, str.length(), fromIndex);
    }

    public int lastIndexOf(String str) {
        // Note, synchronization achieved via other invocations
        return lastIndexOf(str, count);
    }

    public synchronized int lastIndexOf(String str, int fromIndex) {
        return String.lastIndexOf(value, 0, count,
                              str.toCharArray(), 0, str.length(), fromIndex);
    }

    public synchronized StringBuffer reverse() {
        super.reverse();
        return this;
    }

    public synchronized String toString() {
        return new String(value, 0, count);
    }

    private static final java.io.ObjectStreamField[] serialPersistentFields =
    {
        new java.io.ObjectStreamField("value", char[].class),
        new java.io.ObjectStreamField("count", Integer.TYPE),
        new java.io.ObjectStreamField("shared", Boolean.TYPE),
    };

    private synchronized void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException {
        java.io.ObjectOutputStream.PutField fields = s.putFields();
        fields.put("value", value);
        fields.put("count", count);
        fields.put("shared", false);
        s.writeFields();
    }

    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        java.io.ObjectInputStream.GetField fields = s.readFields();
        value = (char[])fields.get("value", null);
        count = fields.get("count", 0);
    }
}

StringBuffer 示例

源码如下(StringBufferTest.java):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * StringBuffer 演示程序
 *
 * @author skywang
 */
import java.util.HashMap;

public class StringBufferTest {

    public static void main(String[] args) {
        testInsertAPIs() ;
        testAppendAPIs() ;
        testReplaceAPIs() ;
        testDeleteAPIs() ;
        testIndexAPIs() ;
        testOtherAPIs() ;
    }

    /**
     * StringBuffer 的其它API示例
     */
    private static void testOtherAPIs() {

        System.out.println("-------------------------------- testOtherAPIs --------------------------------");

        StringBuffer sbuilder = new StringBuffer("0123456789");

        int cap = sbuilder.capacity();
        System.out.printf("cap=%d\n", cap);

        char c = sbuilder.charAt(6);
        System.out.printf("c=%c\n", c);

        char[] carr = new char[4];
        sbuilder.getChars(3, 7, carr, 0);
        for (int i=0; i<carr.length; i++)
            System.out.printf("carr[%d]=%c ", i, carr[i]);
        System.out.println();

        System.out.println();
    }

    /**
     * StringBuffer 中index相关API演示
     */
    private static void testIndexAPIs() {
        System.out.println("-------------------------------- testIndexAPIs --------------------------------");

        StringBuffer sbuilder = new StringBuffer("abcAbcABCabCaBcAbCaBCabc");
        System.out.printf("sbuilder=%s\n", sbuilder);

        // 1. 从前往后,找出"bc"第一次出现的位置
        System.out.printf("%-30s = %d\n", "sbuilder.indexOf(\"bc\")", sbuilder.indexOf("bc"));

        // 2. 从位置5开始,从前往后,找出"bc"第一次出现的位置
        System.out.printf("%-30s = %d\n", "sbuilder.indexOf(\"bc\", 5)", sbuilder.indexOf("bc", 5));

        // 3. 从后往前,找出"bc"第一次出现的位置
        System.out.printf("%-30s = %d\n", "sbuilder.lastIndexOf(\"bc\")", sbuilder.lastIndexOf("bc"));

        // 4. 从位置4开始,从后往前,找出"bc"第一次出现的位置
        System.out.printf("%-30s = %d\n", "sbuilder.lastIndexOf(\"bc\", 4)", sbuilder.lastIndexOf("bc", 4));

        System.out.println();
    }

    /**
     * StringBuffer 的replace()示例
     */
    private static void testReplaceAPIs() {

        System.out.println("-------------------------------- testReplaceAPIs ------------------------------");

        StringBuffer sbuilder;

        sbuilder = new StringBuffer("0123456789");
        sbuilder.replace(0, 3, "ABCDE");
        System.out.printf("sbuilder=%s\n", sbuilder);

        sbuilder = new StringBuffer("0123456789");
        sbuilder.reverse();
        System.out.printf("sbuilder=%s\n", sbuilder);

        sbuilder = new StringBuffer("0123456789");
        sbuilder.setCharAt(0, 'M');
        System.out.printf("sbuilder=%s\n", sbuilder);

        System.out.println();
    }

    /**
     * StringBuffer 的delete()示例
     */
    private static void testDeleteAPIs() {

        System.out.println("-------------------------------- testDeleteAPIs -------------------------------");

        StringBuffer sbuilder = new StringBuffer("0123456789");
        
        // 删除位置0的字符,剩余字符是“123456789”。
        sbuilder.deleteCharAt(0);
        // 删除位置3(包括)到位置6(不包括)之间的字符,剩余字符是“123789”。
        sbuilder.delete(3,6);

        // 获取sb中从位置1开始的字符串
        String str1 = sbuilder.substring(1);
        // 获取sb中从位置3(包括)到位置5(不包括)之间的字符串
        String str2 = sbuilder.substring(3, 5);
        // 获取sb中从位置3(包括)到位置5(不包括)之间的字符串,获取的对象是CharSequence对象,此处转型为String
        String str3 = (String)sbuilder.subSequence(3, 5);

        System.out.printf("sbuilder=%s\nstr1=%s\nstr2=%s\nstr3=%s\n", 
                sbuilder, str1, str2, str3);

        System.out.println();
    }

    /**
     * StringBuffer 的insert()示例
     */
    private static void testInsertAPIs() {

        System.out.println("-------------------------------- testInsertAPIs -------------------------------");

        StringBuffer sbuilder = new StringBuffer();

        // 在位置0处插入字符数组
        sbuilder.insert(0, new char[]{'a','b','c','d','e'});
        // 在位置0处插入字符数组。0表示字符数组起始位置,3表示长度
        sbuilder.insert(0, new char[]{'A','B','C','D','E'}, 0, 3);
        // 在位置0处插入float
        sbuilder.insert(0, 1.414f);
        // 在位置0处插入double
        sbuilder.insert(0, 3.14159d);
        // 在位置0处插入boolean
        sbuilder.insert(0, true);
        // 在位置0处插入char
        sbuilder.insert(0, '\n');
        // 在位置0处插入int
        sbuilder.insert(0, 100);
        // 在位置0处插入long
        sbuilder.insert(0, 12345L);
        // 在位置0处插入StringBuilder对象
        sbuilder.insert(0, new StringBuffer("StringBuilder"));
        // 在位置0处插入StringBuilder对象。6表示被在位置0处插入对象的起始位置(包括),13是结束位置(不包括)
        sbuilder.insert(0, new StringBuffer("STRINGBUILDER"), 6, 13);
        // 在位置0处插入StringBuffer对象。
        sbuilder.insert(0, new StringBuffer("StringBuffer"));
        // 在位置0处插入StringBuffer对象。6表示被在位置0处插入对象的起始位置(包括),12是结束位置(不包括)
        sbuilder.insert(0, new StringBuffer("STRINGBUFFER"), 6, 12);
        // 在位置0处插入String对象。
        sbuilder.insert(0, "String");
        // 在位置0处插入String对象。1表示被在位置0处插入对象的起始位置(包括),6是结束位置(不包括)
        sbuilder.insert(0, "0123456789", 1, 6);
        sbuilder.insert(0, '\n');

        // 在位置0处插入Object对象。此处以HashMap为例
        HashMap map = new HashMap();
        map.put("1", "one");
        map.put("2", "two");
        map.put("3", "three");
        sbuilder.insert(0, map);

        System.out.printf("%s\n\n", sbuilder);
    }

    /**
     * StringBuffer 的append()示例
     */
    private static void testAppendAPIs() {

        System.out.println("-------------------------------- testAppendAPIs -------------------------------");

        StringBuffer sbuilder = new StringBuffer();

        // 追加字符数组
        sbuilder.append(new char[]{'a','b','c','d','e'});
        // 追加字符数组。0表示字符数组起始位置,3表示长度
        sbuilder.append(new char[]{'A','B','C','D','E'}, 0, 3);
        // 追加float
        sbuilder.append(1.414f);
        // 追加double
        sbuilder.append(3.14159d);
        // 追加boolean
        sbuilder.append(true);
        // 追加char
        sbuilder.append('\n');
        // 追加int
        sbuilder.append(100);
        // 追加long
        sbuilder.append(12345L);
        // 追加StringBuilder对象
        sbuilder.append(new StringBuffer("StringBuilder"));
        // 追加StringBuilder对象。6表示被追加对象的起始位置(包括),13是结束位置(不包括)
        sbuilder.append(new StringBuffer("STRINGBUILDER"), 6, 13);
        // 追加StringBuffer对象。
        sbuilder.append(new StringBuffer("StringBuffer"));
        // 追加StringBuffer对象。6表示被追加对象的起始位置(包括),12是结束位置(不包括)
        sbuilder.append(new StringBuffer("STRINGBUFFER"), 6, 12);
        // 追加String对象。
        sbuilder.append("String");
        // 追加String对象。1表示被追加对象的起始位置(包括),6是结束位置(不包括)
        sbuilder.append("0123456789", 1, 6);
        sbuilder.append('\n');

        // 追加Object对象。此处以HashMap为例
        HashMap map = new HashMap();
        map.put("1", "one");
        map.put("2", "two");
        map.put("3", "three");
        sbuilder.append(map);
        sbuilder.append('\n');

        // 追加unicode编码
        sbuilder.appendCodePoint(0x5b57);    // 0x5b57是“字”的unicode编码
        sbuilder.appendCodePoint(0x7b26);    // 0x7b26是“符”的unicode编码
        sbuilder.appendCodePoint(0x7f16);    // 0x7f16是“编”的unicode编码
        sbuilder.appendCodePoint(0x7801);    // 0x7801是“码”的unicode编码

        System.out.printf("%s\n\n", sbuilder);
    }
}

运行结果 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-------------------------------- testInsertAPIs -------------------------------
{3=three, 2=two, 1=one}
12345StringBUFFERStringBufferBUILDERStringBuilder12345100
true3.141591.414ABCabcde

-------------------------------- testAppendAPIs -------------------------------
abcdeABC1.4143.14159true
10012345StringBuilderBUILDERStringBufferBUFFERString12345
{3=three, 2=two, 1=one}
字符编码

-------------------------------- testReplaceAPIs ------------------------------
sbuilder=ABCDE3456789
sbuilder=9876543210
sbuilder=M123456789

-------------------------------- testDeleteAPIs -------------------------------
sbuilder=123789
str1=23789
str2=78
str3=78

-------------------------------- testIndexAPIs --------------------------------
sbuilder=abcAbcABCabCaBcAbCaBCabc
sbuilder.indexOf("bc")         = 1
sbuilder.indexOf("bc", 5)      = 22
sbuilder.lastIndexOf("bc")     = 22
sbuilder.lastIndexOf("bc", 4)  = 4

-------------------------------- testOtherAPIs --------------------------------
cap=26
c=6
carr[0]=3 carr[1]=4 carr[2]=5 carr[3]=6

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128140.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
揭秘Deepfake换脸视频背后的技术细节
今天聊GAN。这要从一个新闻说起,2020年圣诞流出一段诡异的视频,英国那位超长待机的老婆婆先是在视频里来了一段放飞自我的演讲,把以前绝对不适合在正式场合讲的话统统一吐为快,然后干脆彻底放飞自我,直接跳上桌子上来了一段TikTok热舞,场面一度十分混乱。
IT阅读排行榜
2021/02/05
1.3K0
揭秘Deepfake换脸视频背后的技术细节
深度解密换脸应用 Deepfake
Deepfake 就是前一阵很火的换脸 App,从技术的角度而言,这是深度图像生成模型的一次非常成功的应用,这两年虽然涌现出了很多图像生成模型方面的论文,但大都是能算是 Demo,没有多少的实用价值,除非在特定领域(比如医学上),哪怕是英伟达的神作:渐进生成高清人脸 PGGAN(https://arxiv.org/abs/1710.10196 ) 好像也是学术意义大于实用价值。其实人们一直都在追求更通用的生成技术,我想 Deepfake 算是一例,就让我们由此出发,看看能否从中获取些灵感。 一、基本框架
AI研习社
2018/03/28
3.8K0
深度解密换脸应用 Deepfake
AI换脸终结者问世!美国防部推首款AI侦测工具,“反换脸”精度99%!
【新智元导读】美国防部研发出了全球首款“反AI变脸刑侦检测工具”,专用于检测AI变脸/换脸造假技术。如今,以GAN为代表的AI换脸术盛行,相应的人脸检测识别技术也不得不提升,这仅仅是一场漫长而又精彩的AI军备竞赛的开始。
新智元
2018/08/16
4.4K0
AI换脸终结者问世!美国防部推首款AI侦测工具,“反换脸”精度99%!
秒杀Deepfake!微软北大提出AI换脸工具FaceShifter和假脸检测工具Face X-Ray
最先进的AI和机器学习算法不仅可以生成栩栩如生的位置和物体的图像,还擅长将人脸头像从一个人换成另一个人的。另一方面,研究人员也在不断开发能够检测deepfake假图像的识别工具。这场在机器学习图像识别领域的“矛与盾”之争愈演愈烈。
新智元
2020/02/13
2.5K0
悬赏1000万美元,打假AI换脸!Facebook发起Deepfakes检测挑战赛
Facebook宣布了一项名为Deepfake Detection Challenge(DFDC)的挑战赛,壕掷1000万美元,悬赏能够最好地检测出利用Deepfake技术制造的假视频。
新智元
2019/09/10
9720
悬赏1000万美元,打假AI换脸!Facebook发起Deepfakes检测挑战赛
解密Deepfake(深度换脸)-基于自编码器的(Pytorch代码)换脸技术
还记得在2018月3月份火爆reddit的deepfake吗?将视频中的头换成另一个人的头像,虽然可能有些粗糙和模糊,但是在分辨率不要求很高的情况下可以达到以假乱真的效果。
老潘
2019/01/23
4.3K0
古有照妖镜,今有换脸识别机,微软 CVPR 2020力作,让伪造人脸无处遁形
前些日子,Deepfake技术现身印度选举,被候选人用在了竞选拉票的宣传材料上。虽然此候选人以惨败而收场,但这意味着Deepfake点燃的AI换脸之火有逐渐升温的迹象。
AI科技评论
2020/02/26
1.7K0
打击换脸技术滥用,谷歌发布大型数据集对抗deepfake
deepfake 出现以来引发了大量争议,也带来了诸多伦理和社会问题。最近,Facebook、微软等巨头已开始着手打击 deepfake 滥用,斥资 1000 多万美元举办 deepfake 检测挑战赛。谷歌也不甘落后,近日,这家科技巨头宣布开源大型 deepfake 视频数据集,以支持社区对 deepfake 检测的研究。
机器之心
2019/10/12
6040
打击换脸技术滥用,谷歌发布大型数据集对抗deepfake
搭建深度学习模型实现“换脸检测” Deepfake Detection
Deepfakes 是一种合成视频,通过深度学习技术将原视频中的人脸进行替换,然后输出新的视频。
deephub
2020/05/09
2K1
搭建深度学习模型实现“换脸检测” Deepfake Detection
Nat. Biotechnol. | 蛋白质结构和序列的生成模型
今天为大家介绍的是来自Jennifer Listgarten团队的一篇概述论文。像ChatGPT和DALL-E2这样的模型可以根据文本提示生成文本和图像。尽管它们处理的数据类型和目标不同,但生成模型在蛋白质工程方面同样具有巨大的潜力。
DrugAI
2024/03/18
2750
Nat. Biotechnol. | 蛋白质结构和序列的生成模型
担心自己照片被Deepfake利用?试试波士顿大学这项新研究
近日,来自波士顿大学的研究者在一篇论文中介绍了 deepfake 新研究,看论文标题与效果,似乎只要输入我们的图片,deepfake 换脸模型就不能再拿我们的图片作为素材制作小视频。
机器之心
2020/03/25
4280
一个模型击溃12种AI造假,各种GAN与Deepfake都阵亡 | 伯克利Adobe新研究
连英伟达本月刚上线的StyleGAN2也被攻破了。即使是人眼都分辨看不出来假脸图片,还是可以被AI正确鉴别。
OpenCV学堂
2020/03/10
7700
一个模型击溃12种AI造假,各种GAN与Deepfake都阵亡 | 伯克利Adobe新研究
苹果华人研究员实现无代码深度学习!全自动AI训练平台,只需上传数据集
2021年,低代码和无代码的概念都被炒得热火朝天,各路产品就像下饺子一样蜂拥而至。
新智元
2021/08/25
8490
想用GAN和Deepfake瞒天过海,没那么容易:这是Adobe和加州伯克利的新研究
近来,诸如生成对抗网络(GAN)的深度图像生成技术快速发展,引发了公众的广泛关注和兴趣,但这也使人们担心,我们会逐渐走入一个无法分辨图像真实与否的世界。
机器之心
2020/03/12
5410
想用GAN和Deepfake瞒天过海,没那么容易:这是Adobe和加州伯克利的新研究
DeepFake系列之Easy to Spot
今天给大家介绍的是一篇由Adobe团队做的一份工作,他们通过一些简单的数据增强方法来增强检测模型对不同GAN数据集的鲁棒性
BBuf
2020/06/09
5430
“一网打尽”Deepfake等换脸图像,微软提出升级版鉴别技术Face X-Ray​
虽然研究者们为检测换脸图片提出了多种AI鉴别算法,但随着换脸算法的不断改造升级,鉴别算法很难跟上换脸算法的变化。
AI科技大本营
2020/03/10
2.9K0
“一网打尽”Deepfake等换脸图像,微软提出升级版鉴别技术Face X-Ray​
从FBNetv1到FBNetV3:一文看懂Facebook在NAS领域的轻量级网络探索
FBNet系列是完全基于NAS方法的轻量级网络系列,分析当前搜索方法的缺点,逐步增加创新性改进,FBNet结合了DNAS和资源约束,FBNetV2加入了channel和输入分辨率的搜索,FBNetV3则是使用准确率预测来进行快速的网络结构搜索
Amusi
2020/09/23
2K0
从FBNetv1到FBNetV3:一文看懂Facebook在NAS领域的轻量级网络探索
DeepFake系列之FakeSpotter
今天给大家解读的是最近一篇关于Deepfake检测的论文,出自阿里巴巴,小米AI lab联合出品的FakeSpotter,由于以往的Deepfake检测网络鲁棒性并不高,这篇文章探讨一个更简单的方式,增强网络的鲁棒性。
BBuf
2020/06/11
5970
教程 | 如何使用DeepFake实现视频换脸
机器之心发布 作者:冯沁原 不久之前,AV 视频换脸明星的 DeepFake 火了。这篇文章将一步步教你如何实现换脸。 如果你是第一次听说 DeepFake,一定要点击上面的视频,亲自感受一下尼古拉
机器之心
2018/06/08
10K1
【AI初识境】深度学习中常用的损失函数有哪些?
这是专栏《AI初识境》的第11篇文章。所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法。
用户1508658
2019/07/27
9220
推荐阅读
相关推荐
揭秘Deepfake换脸视频背后的技术细节
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档