自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(141)
  • 收藏
  • 关注

原创 PaddleDetection目标检测实战课程目录

零基础掌握目标检测实战流程,从制作数据集到全流程的训练评估,再到最终的部署,不需要自备GPU,四五个小时的内容即可掌握目标检测实操技术。

2022-08-21 20:09:59 845

原创 08目标检测数据集半自动化标注

目标检测数据集半自动化标注

2022-07-11 22:14:21 547

原创 目标检测实战教程07-windows端cpp部署PaddleDetection目标检测模型

在windows端使用cpp完成paddledetection目标检测模型的部署

2022-06-19 22:48:14 796

原创 目标检测实战教程06-AIstudio后台任务

使用aistudio可以实现后台任务,提交到服务器后即可,无需本地等待。

2022-06-10 12:31:22 349

原创 目标检测实战教程05-目标检测训练小技巧

使用paddlex划分数据集第一节课我们讲了如何将编号标注完成后的数据集放置在不同文件夹后,导出COCO格式的训练集与测试集标注文件。这里我们介绍另一种方法:只需要提供数据集的路径,路径文件夹中包含对应的图像文件夹和标注文件夹即可,再指明训练集测试集验证集划分比例,就会将标注数据集按比例划分为训练集与测试集。!pip install paddlex!paddlex --split_dataset --format VOC --dataset_dir /home/aistudio/data --val

2022-05-30 20:08:46 416

原创 目标检测实战教程04-目标检测实战全流程

01下载套件!git clone https://gitee.com/paddlepaddle/PaddleDetection.git -b release/2.402安装依赖环境%cd PaddleDetection/!pip install -r requirements.txt%cd ..03解压数据集!unzip -oq /home/aistudio/data/data121670/Big.zip -d /home/aistudio/data04修改配置文件修改训练参数05

2022-05-24 08:47:09 371

原创 mysql的C语言api函数

这节主要是介绍MySQL的api函数,使用这些api函数可以完成C语言操作MySQL数据库。初始化连接环境//参数 mysql为null//返回值:用于连接MySQL服务器MYSQL* mysql_init(MYSQL* mysql);连接MySQL服务器//返回值与第一个参数类型相同MYSQL* mysql_real_connect( MYSQL* mysql, // mysql_init函数的返回值 const char* host, // mysql服务器的ip地址

2022-05-21 09:21:49 107

原创 目标检测实战教程03-PaddleDetection配置文件详细介绍

paddledetection配置文件详细介绍数据集配置文件# 数据评估类型metric: COCO# 类别信息,不包含背景类num_classes: 1# 训练集TrainDataset: !COCODataSet # 数据图像路径 image_dir: /home/aistudio/data/JPEGImages # 标注文件位置 anno_path: /home/aistudio/data/bigtrain.json dataset_dir:

2022-05-16 22:53:22 1327

原创 目标检测实战教程02-没有GPU,如何训练自己的目标检测算法

没有GPU,如何训练自己的目标检测算法很多初学者想要尝试学习深度学习的时候苦于没有相应的GPU资源,而使用CPU训练任务效率又太低,所以本节内容教大家如何使用在线的免费GPU学习平台,在Ai studio上完成目标检测训练任务。项目地址:fork以后注意修改数据集配置文件内容https://aistudio.baidu.com/aistudio/projectdetail/3795143下载目标检测套件由于github的访问速度较慢,所以选择下载gitee上的套件代码。在命令的最后加上要下载

2022-05-11 22:22:55 657

原创 目标检测实战教程01-使用labelimg标注目标检测数据集|voc转COCO数据集

目标检测实战教程01-使用labelimg标注目标检测数据集|voc转COCO数据集对图像进行编号将收集到的图像进行编号方便统一管理,编号代码如下import ospath = "E:\\image1"filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)count=0for file in filelist: print(file)for file in filelist: #遍历所有文件 Olddir=os.path.join(p

2022-03-26 21:17:45 5899

原创 单调栈C++实现-查找数组中某个数左右两边离他最近小于他的数

单调栈给出一个数组,求助每个位置上的数,左边比他小的和右边比他小的数,常规的方法时间复杂度是O(N^2),利用单调栈结构可以用O(N)解决上述问题。单调栈实现(无重复数)设置一个栈,栈底到栈顶从小到大,按照顺序将数据压入栈中,如某个数压入时不满足此时的大小顺序要求,就需要将栈中的数弹出,此时记录这个数的左右情况,右边比这个数小的是当前准备压入的这个数,左边比他小的这个数是栈中当前数压着的那个。当数组压完以后,栈中有剩余,则依次弹出,右边比当前数小的不存在,左边比当前数小的是栈中他压着的那个代码实现

2022-02-01 19:07:50 821

原创 滑动窗口动态获取窗口最大值与最小值

滑动窗口滑动窗口是一种想象出来的数据结构,窗口有左边界L和右边界R。在数组或者字符串或者一个序列上,记为S,窗口就是S[L…R]这一部分,L往右滑动意味着有样本滑出窗口,R往右划动意味着有样本滑入窗口,L和R都只能往右滑动。窗口定义R边界向右移动,数组中的数从窗口右侧进入窗口L边界向右移动,数组中的数从窗口左侧出窗口左边界不能到右边界的右侧如何找到动态窗口中的最大值准备一个双端队列,数据可以从头部进头部出,也可以从尾部进尾部出。R++时,将数据从双端队列的尾部插入,此时队列为空,可以

2022-01-26 01:02:46 396

原创 图论算法-最小生成树-Kruskal和prim算法

最小生成树概念:在无向图中求一棵树T,使得这个树拥有图G中所有顶点,且所有边都是来自图G中的边,并且满足整颗树的边权之和最小,这棵树就是图G的最小生成树。特征:最小生成树是树,因此边的数量等于顶点数减1,并且树内一定不会有环图G生成的最小生成树,最小生成树可能不唯一,但是边权之和必然唯一由于是无向图,所以根据给出的结点开始生成最小生成树即可。Kruskal算法步骤以边的角度出发,将所有边按权值大小排序,先将边从小到大加入到集合中,看添加边后有没有形成环,若形成环,则不要这条边。判断是

2022-01-17 20:46:37 52

原创 图论算法-dijkstra算法

dijkstra算法思想:用于解决单源最短路问题,即给定有向图G和起点from,通过算法得到from到其他每个顶点的最短距离。步骤:设置集合selectedNode存放已被访问过的点,每次从未被访问的的结点集合distancemap中找到一个距离起点from最近的点minnode。令minnode为中介点,优化起点与其他所有能从u到达的所有点的最短距离。将minnode加入到已访问结点selectednode中。这样执行n次(图中结点数)以后,直到集合selectednode已包含所有顶点。

2022-01-17 20:45:06 329

原创 图论算法-拓扑排序C++实现

拓扑排序思想将有向无环图的所有顶点排成一个线性序列,使得对图G中的任意两个顶点u、v,若存在u->v,则u一定在v的前面,这个序列又被称为拓扑序列。步骤定义一个队列q,将所有入度为0的结点加入到队列q中取队首结点,输出,然后删去所有从他出发的边,并令这些边到达顶点的入度-1,如果某个顶点的入度为0,则将其加入队列。不断执行2操作,直到队列为空。如果队列为空时,入过队的结点数目恰好为N,说明拓扑排序成功,图G为有向无环图;否则拓扑排序失败,图G中有环。或者根据返回的排序结果判断,若结果数组

2022-01-17 20:41:52 495

原创 图模板、BFS、DFS的C++实现

图图的存储方式有两种:邻接矩阵和邻接表。邻接矩阵用二维数组来表示顶点之间是否存在边,边的权重为多少。对于无向图来说,邻接矩阵是一个对称矩阵。缺点是邻接矩阵虽然比较好写但是需要开辟一个二维数组,如果顶点数量太多,容易超过题目的内存限制。邻接表把同一个顶点的所有出边都放在一个列表中,那么N个顶点就会有N个列表,这N个列表就是图G的邻接表,记为Adj[N]每个结点会存放一条边的信息(括号外的数字是边的终点编号,括号内的数字是边权。对于初学者来说,使用变长数组vector来表示邻接表更为简便。​

2022-01-15 00:02:48 297

原创 并查集C++实现

并查集是什么是一种含有合并和查找功能的数据结构,用于处理一些不交集的合并和查询问题。主要含有两个功能:判断任意两个元素是否属于同一个集合;按照要求合并不同集合。并查集的基本操作查找:给出一个元素,查找元素属于哪个集合。步骤:不断向上查找,直到找到他的根节点,之后根据根节点是否相同判断两个元素是否属于同一个集合。查询操作完成后,并查集结构还会进行路径压缩操作,就是将查询节点到根节点之间的所有节点都指向根节点,可以有效限制因不断合并造成部分区域不匀称,使其保持较低的树高。合并:将两个子集合并成同一个

2022-01-12 22:07:32 308

原创 动态规划04数字转变为字符串结果数

规定1和A对应、2和B对应、3和C对应…26和Z对应那么一个数字字符串比如"111”就可以转化为:“AAA”、“KA"和"AK”给定一个只有数字字符组成的字符串str,返回有多少种转化结果暴力递归构建尝试函数,str为数字字符串,index为当前进行到哪个位置,返回值为当前转换结果数主函数中如何调用process(str,index)分析basecase当index==str的长度时,到达字符串的尾部,返回数字1,表示找到一种转换结果分析普通情况当index遇到的字符为0,因为没有以0开

2021-10-22 22:38:32 93

原创 动态规划03背包问题

题目给定两个长度都为N的数组weights和values,weights[i]和values[i]分别代表 i号物品的重量和价值给定一个正数bag,表示一个载重bag的袋子,装的物品不能超过这个重量返回能装下的最大价值暴力递归首先建立尝试函数process,参数为w数组、v数组、当前进行到的序号index、背包剩余的容量rest,返回值为包中物品的总价值那么主函数中调用的就是process(w,v,0,bag)首先分析basecase:当index==N时,所有物品都以选完,返回0当res

2021-10-22 22:37:20 76

原创 动态规划02左右取牌返回最大点数

题目给定一个整型数组arr,代表数值不同的纸牌排成一条线玩家A和玩家B依次拿走每张纸牌规定玩家A先拿,玩家B后拿但是每个玩家每次只能拿走最左或最右的纸牌玩家A和玩家B都绝顶聪明请返回最后获胜者的分数暴力递归首先设置一个尝试函数processf,参数为arr数组,L表示左边界,R表示右边界,返回值为int表示取到数的和。先来看basecase:当只有一张牌的时候,即L==R的时候,拿一张牌,拿到的就是最后这张牌。普通情况拿左边的牌,获得值为arr[L],但是对方接下来要拿牌 拿的就是[

2021-10-22 22:35:52 258

原创 现代C++02:手动实现智能指针

自己动手实现智能指针上一讲实现的类class shape_wrapper{public: explicit shape_wrapper(shape* ptr=nullptr):ptr_(ptr){} ~shape_wrapper(){delete ptr_;} shape* get() const {return ptr_;}private: shape* ptr_;};该对象析构的时候,会对超出作用域的对象进行释放。但是存在缺点:这个类只适用于shape

2021-09-29 17:17:26 108

原创 现代C++01堆、栈、RAII:C++里该如何管理资源?

堆、栈、RAII:C++里该如何管理资源?基本概念堆英文名heap,指的是动态内存分配的区域,并不是数据结构中的堆。这里的内存创建完成后需要手动释放,否则就会造成内存泄漏。自由存储区free store特指使用new和delete来释放和分配的区域,一般而言,这是堆的子集,因为new和delete底层调用了malloc和free,而malloc和free操作的区域是堆区域,所以free store也是堆栈英文名stack,指的是函数调用过程中产生的本地变量和调用数据的区域。这个栈与数据结构中的

2021-09-27 10:47:53 77

原创 c++11新特性之独占指针unique_ptr

独占智能指针unique_ptr独占智能指针不允许其他智能指针共享内部的指针,可以通过它的构造函数初始化一个独占智能指针对象,但是不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr。unique_ptr不允许复制,但可以通过函数返回其他的unique_ptr,还可以通过move来转义给其他的unique_ptr,这样原始的所有权就被转移了,这个原始指针还是被独占的。unique_ptr<int> func() { return unique_ptr<int&g

2021-09-26 20:24:46 405

原创 c++11新特性之智能指针shared_ptr

shared_ptr的初始化通过构造函数初始化#include<iostream>#include<memory>using namespace std;int main() { //使用智能指针管理一块int类型的堆内存 shared_ptr<int> ptr1(new int(520)); cout << "ptr1的引用计数为:" << ptr1.use_count() << endl; //使用智能指针管理

2021-09-26 18:51:55 210

原创 动态规划01机器人走K步到达aim的方法数

题目:假设有排成一行的N个位置记为1~N,N一定大于或等于2开始时机器人在其中的M位置上(M一定是1~N中的一个)如果机器人来到1位置,那么下一步只能往右来到2位置;如果机器人来到N位置,那么下一步只能往左来到N-1位置;如果机器人来到中间位置,那么下一步可以往左走或者往右走;规定机器人必须走K步,最终能来到P位置(P也是1~N中的一个)的方法有多少种给定四个参数 N、M、K、P,返回方法数参数分析:N表示一共7个数start表示机器人的起始位置在2aim表示机器人的目标位置在4k

2021-09-17 17:49:00 305

原创 设计模式之单例模式

写一个单例模式单例模式:顾名思义就是这个类只能创建一个对象。让用户调用你的方法,创建对象,而不是通过类名的方法来创建对象。class Singleton {public: ~Singleton() { cout << "Singleton() destruct" << endl; } Singleton* CreateObject() { return new Singleton(); }private: Singleton() { cout <

2021-09-13 18:51:31 48

原创 TCP POSIX API网络协议栈实现原理

有哪些底层api接口服务器端socketbindlistenacceptrecvsendclose客户端connectepollepoll_createepoll_ctlepoll_waitTCP的三个过程建立连接tcp和udp的connect函数的作用tcp的connect 只有在服务器的状态是listen时,才能发送udp的connect只是验证一下这条路径是否通畅,不会建立连接三次握手发送在哪个函数客户端:accept函数服务器:listen和a

2021-09-09 20:30:35 154

原创 LeetCode82 删除链表重复节点2

哑结点+非递归class Solution {public: ListNode* deleteDuplicates(ListNode* head) { ListNode dummyhead(-101, head); ListNode* cur = &dummyhead; while (cur->next != NULL && cur->next->next != NULL) { if (cur->next->val == cur-

2021-08-13 13:04:43 36

原创 LeetCode83 删除链表重复节点

创建两个节点保存前驱和当前节点,不断比较中向后移动,若相等前驱直接连到后继上,就完成了删除操作。若不相等,则同时后移。class Solution {public: ListNode* deleteDuplicates(ListNode* head) { ListNode dummyhead(999, head); ListNode* cur = head; ListNode* curPre = &dummyhead; while (cur != NULL) { if (

2021-08-13 13:03:55 35

原创 LeetCode148 排序链表

方法一 选择排序 时间复杂度O(N^2)空间复杂度O(1) 超时。。。class Solution {public: ListNode* sortList(ListNode* head) { ListNode* tail = NULL; ListNode* cur = head; ListNode* smallPre = NULL; ListNode* small = NULL; while (cur != NULL) { small = cur; smallPre =

2021-08-13 13:02:59 21

原创 LeetCode143重排链表

方法一找到中间后,右半区压入栈中,然后将两部分合并class Solution {public: void reorderList(ListNode* head) { ListNode* fast = head; ListNode* slow = head; ListNode* mid; stack<ListNode*> st; while (fast->next != NULL &&amp

2021-08-13 13:02:15 29

原创 LeetCode19 删除倒数k个节点

class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* slow=head; ListNode* fast=head; // if(head->next==NULL){ // if(n==1){ // return NULL; // } // } // if(head->nex

2021-08-13 13:01:27 20

原创 程序员面试指南 删除链表中间节点c++

牛客上 题目给出的要比书上的简单,牛客上求的是删除第k个节点,所以只需要找到第k-1个即可。先写牛客上的内容list_node * remove_kth_node(list_node * head, int K){ //////在下面完成代码 list_node* cur=head; list_node* pre=head; if(K==1){ return head->next; } while(--K){ p

2021-08-13 12:49:50 52

原创 代码面试指南 打印有序链表公共部分c++

打印两个链表的公共部分,因为题目中给出的链表是有序的,所以只需要逐个比较即可void sol(list_node * a_head, list_node * b_head){ //////在下面完成代码 while(a_head!=NULL &&b_head!=NULL){ if(a_head->val<b_head->val){ a_head=a_head->next; }else if(a

2021-08-13 12:48:42 27

原创 LeetCode2 两数相加

class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* head = NULL; ListNode* tail = NULL; int carry = 0; while (l1 || l2) { int n1 = l1 ? l1->val : 0; int n2 = l2 ? l2->val : 0; int sum = n1 + n2+c

2021-08-13 12:46:49 26

原创 剑指offer22倒数k个节点

方法一 弹栈 笔试做法class Solution {public: ListNode* getKthFromEnd(ListNode* head, int k) { stack<ListNode*>st; ListNode* result=NULL; while(head){ st.push(head); head=head->next; } whi

2021-08-13 12:46:13 35

原创 LeetCode141142环形链表

##方法一 使用set 笔试做法class Solution {public: ListNode* detectCycle(ListNode* head) { set<ListNode*>st; while (head) { if (st.find(head) == st.end()) { st.insert(head); head = head->next; } else { return head; } } retu

2021-08-13 12:45:21 26

原创 几种reactor模型

reactor模型组成:非阻塞的I/O+I/O多路复用特征:基于事件循环,以事件驱动或事件回调的方式实现业务逻辑表述:将连接的I/O处理转化为事件处理单reactor使用1个epoll和1个线程代表:redis 内存数据库 操作redis当中的数据结构redis6.0多线程 处理数据的解压缩 数据压缩放在多线程中处理resp协议 数据解压缩会损耗cpu 影响其他网络处理单reactor+任务队列+线程池解决网络连接和业务处理之间的相互影响,做任务队列来解耦,用线程池来消费一个线

2021-08-10 21:18:00 146

原创 多线程阻塞I/O模型和I/O多路复用

多线程阻塞I/O模型每一个线程处理一个fd连接。优点是:处理及时缺点是:线程利用率低,主要消耗在数据准备阶段的阻塞I/O多路复用用一个线程来检测多个io事件io复用不仅用来检测readwritebuffer,还可以检测连接状态握手挥手半关闭,keepalive检测的是状态多路复用作用在数据准备阶段,其他IO函数只需要作用在数据拷贝阶段由于使用边缘触发时,io函数只能是非阻塞的...

2021-08-10 20:50:59 114

原创 epoll编程细节

网络编程需要关注的问题连接建立(接受客户端的连接,服务器去连接第三方服务mysql redis)连接断开消息到达(从readbuffer中取数据)消息发送完毕(将数据发到writebuffer中)连接建立来自客户端的连接产生的fd,设置为读事件进行监测。连接上游服务时,采用一个非阻塞的I/O,第一次调用connect时返回值为-1,错误号是EINPROGRESS,说明当前连接正在继续。然后将事件注册为写事件,添加到epoll中进行管理。(服务器与上游服务建立连接三次握手的过程,第二步上游

2021-08-10 19:26:39 180

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除