SmallObjectAllocator实作

深入Android系统(二)Bionic库 Bionic库是Android的基础库之一,也是连接Android和Linux的桥梁。Bionic库中包含了很多基本系统功能接口,这些功能大部分来自 Linux,但是和标准的 Linux 之间有很多细微差别。同时Bionic库中增加了一些新的模块(像log、linker),服务于Android的上层代码。 导读 为甚有导读呢,因为Bionic库这部分学起来太枯燥了,在实际开发过程中几乎没主动使用过,不过并不代表它不存在哈,这哥们无处不在。。。 通过Bionic库的学习呢,至少可以: 了解Andro. 阅读详情

#ifndef _ALLOC_H_
#define _ALLOC_H_
#pragma once

#include <new>
#include "Assert.h"

#ifndef NULL
#define NULL 0
#endif

namespace KOK
{
    class __CSimpleAlloc
    {
    public:
        static void* Allocate(size_t n)
        {
            if(n != 0) return ::operator new(n);
        }

        static void Deallocate(void* p)
        {
            if(p != NULL) return ::operator delete(p);
        }

        static void Deallocate(void* p, size_t n)
        {
            if(p != NULL) return ::operator delete(p);
        }
    };

    class __CSmallObjectAlloc
    {
    private:
        struct CChunk
        {
            unsigned char* pData;//the real chunk address
            unsigned char availableBlockIndex; //first available block index
            unsigned char availableBlockCount; //the maximun block count is 255
            CChunk* pNext;

            CChunk(unsigned char blockCount, size_t blockSize)
            {
                availableBlockCount = blockCount;
                availableBlockIndex = 0;
                pNext = NULL;
                unsigned char* pDataTemp = pData = (unsigned char*)malloc(blockCount * blockSize);
                unsigned char i = 0;
                while(i ^ blockCount) //initial next available index, act as a signal list
                {
                    *pDataTemp = (++i);
                    pDataTemp += blockSize;
                }
            }

            ~CChunk()
            {
                free(pData);
            }

            inline bool IsAvailable()
            {
                return availableBlockCount != 0;
            }

            //locate the block specified by pointer p
            inline unsigned char GetBlockIndex(unsigned char* p, unsigned blockSize)
            {
                KOK_ASSERT((p != NULL) && (p >= pData) && ((p - pData) % blockSize == 0));

                return (p - pData)/blockSize;

            }

            //alloc, make blocks link each other like a signal list
            unsigned char* GetBlock(unsigned blockSize)
            {
                KOK_ASSERT(availableBlockCount != 0);
                availableBlockCount--;
                unsigned char pTemp = availableBlockIndex;
                if(availableBlockCount)
                {
                    availableBlockIndex = *(pData + blockSize * availableBlockIndex);
                }

                return pData + blockSize * pTemp;
            }

            //dealloc, add free block to the front of slist
            void PutBlock(unsigned char* p, unsigned blockSize)
            {
                KOK_ASSERT((p != NULL) && (p >= pData) && ((p - pData) % blockSize == 0) );
                availableBlockCount++;
                *p = availableBlockIndex;
                availableBlockIndex = GetBlockIndex(p, blockSize);

            }

        };

        struct CFixAlloc
        {
            unsigned char blockCount; //block count, 255 is max.
            size_t blockSize; //block size, in gerneral it doesnt exceed 128k
            unsigned availableChunkCount; //available chunk count, which is uesed to justify if fix allocator leaves one available chunk at least.
            CChunk* pFirst;//chunk list
            CChunk* pCurFreePrev;
            CChunk* pCurFree;//free cache
            CChunk* pCurAlloc;//alloc cache
            CFixAlloc* pNext;

        private:
            inline CChunk* NewChunk()
            {
                return new CChunk(blockCount, blockSize);
            }

            //locate the chunk specified by pointer p
            inline bool IsInChunk(unsigned char* p, CChunk* pChunk)
            {
                KOK_ASSERT(p != NULL);
                return p >= pChunk->pData && p <= pChunk->pData + blockCount * blockSize;
            }

            void PutBlockAux(unsigned char* p, CChunk*& pChunk, CChunk*& pChunkPrev)
            {
                pChunk->PutBlock(p, blockSize);

                if(pChunk->availableBlockCount == 1) //in the condition of put a block from full used chunk, note while blockCount == 1
                    availableChunkCount++;

                if(pChunk->availableBlockCount == blockCount) //all the blocks are free
                {
                    if(availableChunkCount > 1) //leave one available chunk at least(exclude itself)
                    {
                        if(pChunk == pChunkPrev) //in the condition of first chunk would be freed
                            pFirst = pChunk->pNext;
                        else
                            pChunkPrev->pNext = pChunk->pNext; //remove all-blocks free chunk from slist
                        free(pChunk); //free the chunk
                        if(pChunk == pCurAlloc) //update cache accordingly
                            pCurAlloc = NULL;
                        pChunk = NULL;
                        availableChunkCount--;
                    }
                }

            }

        public:
            CFixAlloc(unsigned blockSize, unsigned char blockCount = 255)
            {
                this->blockSize = blockSize;
                this->blockCount = blockCount;
                availableChunkCount = 0;
                this->pNext = NULL;
                this->pFirst = this->pCurAlloc = this->pCurFree = this->pCurFreePrev = NULL;
            }

            ~CFixAlloc()
            {
                CChunk* pTemp = NULL;
                while(pFirst != NULL)
                {
                    pTemp = pFirst;
                    pFirst = pFirst->pNext;
                    delete pTemp;
                }
            }
            void PutBlock(unsigned char* p)
            {
                KOK_ASSERT(p != NULL);
                if(pCurFree != NULL &&  IsInChunk(p, pCurFree)) //case 1: cache hits
                {
                    PutBlockAux(p, pCurFree, pCurFreePrev);
                }
                else //case 2: search the approciate chunk from head of link
                {
                    CChunk* pTargetChunk = pFirst;
                    CChunk* pTargetChunkPrev = pFirst;
                    while(pTargetChunk != NULL)
                    {
                        if(IsInChunk(p, pTargetChunk))
                        {
                            PutBlockAux(p, pTargetChunk, pTargetChunkPrev);
                            break;
                        }
                        else
                        {
                            pTargetChunkPrev = pTargetChunk;
                            pTargetChunk= pTargetChunk->pNext;
                        }
                    }
                    pCurFree = pTargetChunk; //update free cache
                    pCurFreePrev = pTargetChunkPrev;
                }
            }

            //alloc
            unsigned char* GetBlock()
            {
                unsigned char* pReturn;
                CChunk* pAvailableChunk = pFirst;
                if(pCurAlloc != NULL && pCurAlloc->IsAvailable()) //case 1: cache hits
                {
                    pReturn = pCurAlloc->GetBlock(blockSize);
                    if(!pCurAlloc->IsAvailable())
                        availableChunkCount--;
                }
                else //case 2: find the first available chunk from head of link
                {
                    while(pAvailableChunk != NULL)
                    {
                        if(pAvailableChunk->IsAvailable())
                        {
                            pReturn = pAvailableChunk->GetBlock(blockSize);

                            if(!pAvailableChunk->IsAvailable())
                                availableChunkCount--;
                            break;
                        }
                        else
                        {
                            pAvailableChunk = pAvailableChunk->pNext;
                        }
                    }
                    if(pAvailableChunk == NULL) //case 3: if all the chunks are used, alloc a new chunk
                    {
                        pAvailableChunk = NewChunk();
                        pAvailableChunk->pNext = pFirst; //add a new chunk to the front of slist
                        pFirst = pAvailableChunk;
                        pReturn = pAvailableChunk->GetBlock(blockSize);
                        if(pAvailableChunk->IsAvailable())// in condition of blockcount == 1
                            availableChunkCount++;
                    }
                    pCurAlloc = pAvailableChunk;//update cache
                }
                return pReturn;
            }

        };

    private:
        CFixAlloc* m_pFirst_; //fix allocator link
        CFixAlloc* m_pCurAlloc_; //cache
        CFixAlloc* m_pCurFree_; //cache
        size_t m_nAlign_;
        size_t m_blockCount_; //number of blocks per chunk

    protected:
        inline bool IsInFixAlloc(size_t n, CFixAlloc* pAlloc)
        {
            return n == pAlloc->blockSize;
        }

    public:
        __CSmallObjectAlloc(size_t nAlign = sizeof(char*), size_t nBlockCount = 255)
        {
            m_pFirst_ = m_pCurAlloc_ = m_pCurFree_ = NULL;
            m_nAlign_ = nAlign;
            m_blockCount_ = nBlockCount;
        }

        ~__CSmallObjectAlloc()
        {
            CFixAlloc* pTemp = NULL;
            while(m_pFirst_ != NULL)
            {
                pTemp = m_pFirst_;
                m_pFirst_ = m_pFirst_->pNext;
                delete pTemp;
            }
        }

        void* Allocate(size_t n)
        {
            n = (n + m_nAlign_ - 1) & ~(m_nAlign_ - 1); // align

            if(n > 128) //big object allocator
                return ::operator new(n);
            else //small object allocator
            {
                if(m_pCurAlloc_ != NULL && IsInFixAlloc(n, m_pCurAlloc_))
                {
                    return m_pCurAlloc_->GetBlock();
                }
                else
                {
                    CFixAlloc* pTargetFixAlloc = m_pFirst_;
                    while(pTargetFixAlloc != NULL)
                    {
                        if(IsInFixAlloc(n, pTargetFixAlloc))
                        {
                            m_pCurAlloc_ = pTargetFixAlloc;//update cache
                            return pTargetFixAlloc->GetBlock();
                        }
                        else
                            pTargetFixAlloc = pTargetFixAlloc->pNext;
                    }
                    if(pTargetFixAlloc == NULL)
                    {
                        pTargetFixAlloc = new CFixAlloc(n,m_blockCount_);
                        pTargetFixAlloc->pNext = m_pFirst_;
                        m_pFirst_ = m_pCurAlloc_ = pTargetFixAlloc; //update cache
                        return pTargetFixAlloc->GetBlock();
                    }
                }
            }
        }
        void Deallocate(void* p, size_t n)
        {
            KOK_ASSERT(p != NULL);
            n = (n + m_nAlign_ - 1) & ~(m_nAlign_ - 1);//align

            if(n > 128)
            {
                ::operator delete(p);
                return;
            }

            if(m_pCurFree_ != NULL && IsInFixAlloc(n, m_pCurFree_))
            {
                m_pCurFree_->PutBlock((unsigned char*)p);
            }
            else
            {
                CFixAlloc* pTargetFixAlloc = m_pFirst_;
                while(pTargetFixAlloc != NULL)
                {
                    if(IsInFixAlloc(n, pTargetFixAlloc))
                    {
                        m_pCurFree_ = pTargetFixAlloc; //update cache
                        pTargetFixAlloc->PutBlock((unsigned char*)p);
                        break;
                    }
                    else
                        pTargetFixAlloc = pTargetFixAlloc->pNext;
                }

                KOK_ASSERT(pTargetFixAlloc != NULL);
            }
            return;
        }
    };

    class CSmallObjectAlloc
    {
    private:
        CSmallObjectAlloc();
        CSmallObjectAlloc(const CSmallObjectAlloc&);
        CSmallObjectAlloc& operator=(const CSmallObjectAlloc&);

    private:
        static __CSmallObjectAlloc objectAllocator;

    public:
        static void* Allocate(size_t n)
        {
            return objectAllocator.Allocate(n);
        }

        static void Deallocate(void* p, size_t n)
        {
            objectAllocator.Deallocate(p, n);
        }

    };

    __CSmallObjectAlloc CSmallObjectAlloc::objectAllocator;

    template <class T, class Value>
    inline void Construct(T* p, Value& value)
    {
        new(p) T(value);
    }

    template <class T, class Value>
    inline void Construct(T* p)
    {
        new(p) T();
    }

    template <class T>
    inline void Destroy(T* p)
    {
        p->~T();
    }

    #define _USE_CUSTOM_ALLOC_
    #ifndef _USE_CUSTOM_ALLOC_
    typedef __CSimpleAlloc alloc;
    #else
    typedef CSmallObjectAlloc alloc;
    #endif

    template <class T, class Alloc = alloc>
    class CAllocAdapter
    {
    public:
        static T* Allocate(size_t n)
        {
            return n == 0 ? 0 : (T*)Alloc::Allocate(n * sizeof(T));
        }

        static T* Allocate(void)
        {
            return (T*)Alloc::Allocate(sizeof(T));
        }

        static void Deallocate(T* p)
        {
            Alloc::Deallocate(p, sizeof(T));
        }

        static void Deallocate(T* p, size_t n)
        {
            Alloc::Deallocate(p, n);
        }

    };
}
#endif

小目标检测中的数据扩展(Augmentation for small object detection) Abstract 这些年来目标检测领域经历了令人印象深刻的进展。除了这些改进,在小目标检测与大目标检测领域还是有不小的差距。我们在MS COCO上分析了当前SOTA的模型Mask-RCNN。研究成果展示GT目标与预测的anchors的重叠远远小于期望的IoU阈值。我们猜测这可能是由两个情况导致的:1、只有少部分样本包含小目标;2、及时在包含小目标的样本中,小目标的数目也不够。我们因此提出过... 阅读详情

相关推荐

基于Codex平台与AI Agent技能开发,实现抖音爆款视频分析与脚本自动生成

大家好,我是专注于AI应用开发的技术博主。最近在探索如何利用AI工具自动化内容创作时,我发现了一个非常有趣的组合:通过Codex平台创建自定义的Skill(技能),来批量分析抖音平台的爆款视频,并基于分析结果自动生成新的带货视频脚本。这听起来像是内容团队的“黑科技”,但实现起来其实有清晰的路径可循。本文将为你完整拆解这个实战项目,从环境搭建、Skill编写、数据抓取到视频脚本生成,手把手教你打造自己的“AI内容助理”。无论你是想了解AI Agent的开发,还是对短视频自动化创作感兴趣,都能从本文中获得可直接

weixin_34110749的博客 644

Modern C++ Design 笔记 第四章 Small-Object Allocation

在频繁的new/delete的时候容易衍生memory fragment, 我想设计这个Allocator的初衷就在这里。初看到这个题目的时候不由的让人联想到的东西是std::allocator.  所以我们就从MS的STL中看看std::allocator的实现。templateclass _Ty> inline    _Ty _FARQ *_Allocate(_SIZT _Coun

斯巴达的勇士已经是雅典的臣民了。。。 2552

单总线CPU设计(变长指令周期3级时序)(HUST)(头歌实验)

利用比较器等功能模块将32位MIPS 指令字译码生成LW、SW、BEQ、SLT、ADDI、OtherInstr信号也就是利用比较器将指令字转换为译码信号,OP与不同信号对应(查询MIPS手册得知) 16 进制 :23 是 2进制: 00100011 ,把获得的OP,Func,和常数比对,相同输出1.按照题目要求填写表格,使用logisim的组合逻辑电路分析功能,当然也可以直接再logisim中写真值表。单总线采用变长指令周期,不同指令周期数不同,节拍数可变化。写的excel表格最终生成电路(当然 需要先把

xuxuaifeifei的博客 1万+

chrome/chromium 上的内存管理模块-allocator介绍

本文介绍chromium在不同平台上 malloc/new 是如何封装调用的。 从代码中很容易发现,chromium的基础代码并不是仅仅使用“malloc”来分配内存 例如:         renderer(Blink)大部分都是用chromium单独设计的PartitionAlloc和BlinkGC(Oilpan)         像javascript引擎V8这样比较独立的子系统使用自己的...

鸿儒客栈 4532

手把手教你用UNet实现轨道缺陷检测(附RSDDs数据集下载与完整代码)

本文详细介绍了如何使用UNet模型实现轨道缺陷检测,包括RSDDs数据集的下载与处理、UNet架构的改进与优化、训练策略设计以及模型部署的全流程。通过实战案例,展示了如何利用深度学习技术提升工业质检效率,特别适合从事工业缺陷检测和图像处理的开发者参考。

dapp9builder的博客 749

SCCM部署教程:(3)SCCM安装

这两则摘要介绍了WSUS和SCCM的安装步骤: WSUS安装:通过服务器管理器添加"Windows服务器更新服务"角色,选择SQL数据库并指定安装路径,验证数据库连接后完成安装。 SCCM安装:先运行预检工具Prereqchk.exe,选择主站点安装类型,配置语言、站点代码和名称,设置SQL数据库连接参数(保留默认端口4022),选择通信方法和系统角色(管理点和分发点),最后完成约1小时的安装过程。 两则安装指南都强调要确保数据库配置与前期准备一致,并提供了关键配置选项的说明。

小V锅的专栏 915

虚拟机内存管理之内存分配器

本文意在通过深入剖析常用的内存分配器的关键实现,以理解虚拟机动态内存管理的设计哲学,并为实现虚拟机高效的内存管理提供指引。

YZcoder的博客 2591

PotPlayer终极画质调校:深入MadVR渲染器设置,让你的显示器发挥100%潜力

本文深入探讨了如何通过MadVR渲染器优化PotPlayer的画质设置,充分发挥高端显卡和显示器的潜力。从色彩空间匹配、色深优化到HDR元数据处理,提供了一套完整的配置指南,帮助用户实现影院级视觉体验。特别适合拥有NVIDIA RTX或AMD RX系列显卡的用户进行精细调校。

weixin_42530458的博客 601

Small Object Detection via Coarse-to-fine Proposal Generation and Imitation Learning

在每一个阶段,之前的区域建议作为输入,在特征图上进行进一步的回归和优化,使得每个阶段的区域建议越来越精确。锚点:是一些预定义的边界框,它们在图像的不同位置和不同尺度上进行采样,以捕捉可能的目标,完善锚点的过程是对这些预定义的锚点进行调整和优化,使它们更准确地匹配图像中实际目标的大小和位置。在被认为具有视觉真实性的达吾提的引导下,解析还原尺寸受限实例的特征。1.我们建立了一个名为CRPN的从粗到细的建议生成通道,用于执行从锚点到建议的程序,其中基于区域的锚点挖掘策略和级联回归技术为小实例提供了高质量的建议。

w_gun的博客 1763

解锁SPWM电压利用率:三次谐波注入幅值的黄金分割点

本文深入探讨了SPWM电压利用率的提升方法,重点介绍了三次谐波注入技术及其黄金分割点(1/6比例)。通过数学推导和工程实践,揭示了如何通过特定幅值的三次谐波注入将电压利用率从86.6%提升至115%,与SVPWM相当。文章还提供了实验室调试流程和DSP实现代码,帮助工程师优化逆变器设计。

weixin_30729609的博客 916

SCCM实战指南:从零搭建企业级Windows自动化部署平台

本文提供了一份详细的SCCM实战指南,手把手教你从零搭建企业级Windows自动化部署平台。内容涵盖环境规划、AD架构扩展、SQL Server配置、SCCM主站点安装,以及最终实现操作系统镜像的自动化部署,旨在帮助IT管理员彻底告别手动装机,实现高效、规范的Windows设备批量管理。

weixin_29251337的博客 638

侯捷老师 C++内存管理-第四讲 学习笔记

侯捷老师 C++内存管理-第四讲 Loki :: allocator

weixin_56042518的博客 488

199、医疗内窥镜影像:微型镜头与高色彩保真度的ISP定制化方案

医疗内窥镜影像系统开发面临三大光学挑战:衍射极限导致分辨率下降,微型镜头色差严重,镀膜不足引发红外漏光。团队通过定制化ISP方案解决问题:采用分区色差补偿、红外泄露补偿技术,开发12区域分段颜色校正矩阵,并设计自适应伽马曲线。关键经验包括锁定白平衡避免术中偏色,优化FPGA流水线确保30fps流畅度,强调光学标定优先于算法优化。最终方案使DeltaE降至3以下,满足医生对组织颜色细微差异的识别需求,尤其解决了血管与脂肪边界辨识难题。

zzfmlxs的博客 265

小对象的分配技术(4/4)

4.SmallObject小对象分配策略在SmallObjAllocator层已经柳暗花明,可以猜测SmallObject是个顶级包装,使得使用更方便,确实是这样的,“SmallObject的定义 非常简单,只不过情节有点复杂”。class SmallObject...{public:    static    void*    operator new(std::size_t    

win2ks 999

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

第四章(小型对象分配技术:smart-object allocation)

分配原理 block:最小单位,外部指定,一般每个block从4~64byte不等。我们称为blocksize chunk:包含多个block。个数我们称为blocknum。每个chunk大小为blocknum*blocksize。一般为固定,大小我们称为page fixedAllocator:包含多个chunk。里面的chunk的block大小都是固定的。即每个fixedAllocator

920

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

一个支持线程安全的模板方式实现的内存分配器

<br />    这是我将云风书中的内存分配器用模板方式实现的,锁是windows的,换成Linux的很容易。可以单独使用CSmallObject_Allocator作为内存分配器,也可以让你的类CA继承SSmall_Alloc,这样“new CA”就会调用该内存分配器来分配内存,很方便。<br /> <br />inline size_t _min(size_t a, size_t b)<br />{<br /> return a<b?a:b;<br />}<br />template< bool bT

sigh667的专栏 675

小目标检测small object detection

整理了两个github上两个罗列近期small object detection相关工作的链接。 第一个链接:https://github.com/kuanhungchen/awesome-tiny-object-detection 这个链接的title是tiny object,估计只有我这个小聪明能找到,这个链接比较推荐,罗列的工作都是一些较好的会议和期刊上的工作。 第二个链接:https://github.com/ispc-lab/SmallObjectDetectionList 这个链接的

carlous0的专栏 2262

loki库之内存池SmallObj

[原创]loki库之内存池SmallObj http://www.cnblogs.com/UnGeek/p/4537114.html loki库之内存池SmallObj 介绍 loki库的内存池实现主要在文件smallobj中,顾名思义它的优势主要在小对象的分配与释放上,loki库是基于策略的方法实现的,简单的说就是把某个类通过模板参数传递给主类,比如某

zdy0_2004的专栏 1812

深度学习笔记 Augmentation for small object detection(翻译)

一. abstract 二. Introduction 三. Related Work 三. Identifying issues with detecting small objects 四. Identifying issues with detecting small objects 五. Experimental Setup 六. Result and Analysis 六. Conclusion References 一. abstract   这些年来,目标检测取得了令人瞩目的成就。尽管改进很大

weixin_44836143的博客 819

基于前面内存分配器的STL内存分配器

<br />    使用起来很简单,像这样:<br />typedef std::list< int, std::SR_allocator<int> >   IntList;<br />typedef std::set< INT, std::less<INT>, std::SR_allocator<INT> > IntAttrRefreshArray;<br />typedef std::map< int, CItemBoxRef*, std::less<int>, std::SR_allocator< s

sigh667的专栏 685

用未公开的MFC类加强动态内存分配

 用未公开的MFC类加强动态内存分配           下面是示例程序使用及未使用这个未公开MFC类的对比情况截图,是不是有点心动了呢,接着往下看。            简介         如果你经常浏览MFC的源代码,说不定就会有意想不到的惊喜发现,这不,很快就发现了一个,它是一个小工具类的集合,允许为特定类的对象定义怎样为其动态分配内存,这个类就是CF

谢启东的专栏 2431

小型对象内存分配

c++语法中动态分配和指针/引用的使用非常普遍,然而缺省的自由存储区分配器(比如::operator new和::operator delete)只适用于大对象对分配,对小对象分配并不有效,甚至非常低劣,多次分配小对象后容易产生碎片。  小型对象分配器小型对象分配器分为4层结构。如图所示,下层提供功能供上层使用。+-------------------+|    SmallOb

AngelTempt的专栏 992

【文献阅读】Perceptual Generative Adversarial Networks for Small Object Detection –CVPR-2017

Perceptual Generative Adversarial Networks for Small Object Detection 2017CVPR 新鲜出炉的paper,这是针对small object detection的一篇文章,采用PGAN来提升small object detection任务的performance。 最近也没做object detecti...

weixin_34185364的博客 765

小目标检测--A closer look: Small object detection in Faster R-CNN

A closer look: Small object detection in Faster R-CNN Improving Small Object Proposals for Company Logo Detection这里主要分析 Faster R-CNN 对小目标检测的性能分析及改进。 主要是 多尺度 RPN 和多尺度分类网络 数据中目标尺寸分布 3.1 Region Proposa

AI小作坊 的博客 6112

SOD-MTGAN: Small Object Detection via Multi-Task Generative Adversarial Network

SOD-MTGAN: Small Object Detection via Multi-Task Generative Adversarial Network 基于多任务GAN的细小物体检测 摘要 物体检测是计算机视觉中的一个基本而重要的问题。虽然在大规模检测基准(例如COCO数据集)中对大/中型物体取得了令人印象深刻的结果,但小物体的性能远远不能令人满意。原因是小物体缺乏足够详细的外观信息...

木盏 7151
上一篇: assert实作
下一篇: url ssl
daeees
博客等级 码龄19年 6粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值