創建圖演算法
⑴ 教你用AI創造無價,讓你少走彎路
Ai生成圖像前後一看,這簡直比PS厲害十倍吧!
Ai生成圖像的邏輯到底是什麼呢?
就是透過機器 「學習演算法」 來學習特定圖像的統計規律,並在此基礎上生成新的圖像。
演算法主要有兩種
GAN(生成對抗網路)
VAE(變分自編碼器)
這些演算法的核心思想是透過對大量圖像的學習,學習它們的隱含分布,進而生成新的圖像。
GAN透過生成器和判別器的對抗學習,來生成與真實圖像相似的圖像;
VAE透過學習對潛在變數的編碼和解碼,來生成具有多樣性的圖像。
總體而言,生成圖像的邏輯是透過學習和推斷來生成具有特定特徵和多樣性的圖像
基本邏輯:
上傳照片 → 生成idname → 替換
·需要先邀請InsightFaceSwap bot到自己的伺服器(聊天室),邀請通過谷歌搜索,自動連接至Discord
·邀請成功後會在窗口右側看見它(機器人)
·對話框輸入「/」調出InsightFaceSwap bot插件,點擊「/savied「彈出圖片上傳窗口
·添加想要替換的圖片,圖中以Lisa為例,起一個id名字
·找到或上傳已生成的Ai繪畫圖片,點擊"APP"選項,點擊「INSwaper」
·融合成功!
盡量選取高清且噪點少的圖片進行上傳
如果idname創建失敗,先檢查是否名字被佔用,如果被佔用,重新輸入一個新名字。
idname創建失敗有可能是網路原因,如果沒有上面問題,請多嘗試幾次
⑵ 快速繪制流程圖方法
流程圖,以特定的圖形符號加上說明,表示演算法的圖,稱為流程圖或框圖,使用圖形表示演算法的思路是一種極好的方法,因為千言萬語不如一張圖。
1、首先打開電腦上安裝好的迅捷流程圖軟體。
2、流程圖軟體打開之後,在軟體界面中點擊「文件」菜單下的「新建」按鈕。
3、點擊「新建」按鈕之後,就會出現一個小窗口,在這窗口中看到很多流程圖的模板,選擇一個模板 點擊一下就能使用了。
4、當流程圖模板創建好之後,選中一個圖形雙擊兩下就能輸入文字,文字輸入好之後,選中文字,在軟體右側有一個「文本」工具,使用這個文本工具就能設置文字的樣式了。
5、文字輸入好之後,接下來就是修改圖形的顏色,使用流程圖軟體右上角的「樣式」工具,就能修改圖形的顏色了。
6、最後,流程圖繪制好之後,點擊「文件」菜單下的「另存為」或者「保存」按鈕就能將繪制好的流程圖保存在電腦上了。
⑶ C++編寫程序 關於【圖的遍歷】
裡面多了查找路徑功能。
#define t true
#define f false
#include<iostream.h>
struct node//定義一個結構作為節點類型
{
int data;
bool sign;//標志位,用來標示是否遍歷過
node *next;
};
node* creategraph()//建立鄰接表,完成無向圖的輸入
{
int l,m,n;
bool g;
cout<<"請輸入節點數: ";
cin>>n;
node *adjacencylist=new node[n+1];//動態分配節點數組內存
adjacencylist[0].data=n;//0地址存放的為節點數
adjacencylist[0].next=NULL;
for(int i=1;i<=n;i++)//給各頂點域賦初值
{
adjacencylist[i].data=0;
adjacencylist[i].next=NULL;
adjacencylist[i].sign=f;//表示未遍歷
}
cout<<"請依次輸入各條邊的始點和尾點:(以0表示結束)"<<endl;
cin>>l;
if(l!=0)//判斷輸入邊是否結束
g=t;
while(g==t)
{
cin>>m;
if((l>0)&&(l<=n)&&(m>0)&&(m<=n))//判斷輸入頂點是否正確
{
node *p,*q,*top;
p=(node *)new(node);//分配邊的一個頂點內存
p->data=m;
p->next=NULL;
if(adjacencylist[l].next==NULL)//為每個節點創建鄰接鏈表
adjacencylist[l].next=p;
else
{
top=adjacencylist[l].next;
while(top->next!=NULL)
top=top->next;
top->next=p;
}
adjacencylist[l].data++;//統計鄰接點的個數
q=(node *)new(node);//分配邊的另一個頂點內存
q->data=l;
q->next=NULL;
if(adjacencylist[m].next==NULL)//構建鄰接表
adjacencylist[m].next=q;
else
{
top=adjacencylist[m].next;
while(top->next!=NULL)
top=top->next;
top->next=q;
}
adjacencylist[m].data++;//統計鄰接點的個數
}
else
cout<<"邊"<<l<<"--"<<m<<"輸入錯誤!"<<endl;//錯誤輸入標識
cin>>l;
if(l==0)//邊的輸入結束
g=f;
}
return adjacencylist;//返回鄰接表
};
void DepthFirstSearch(node *list)//深度優先搜索
{
int m,n=list[0].data,k,*a=new int[n];//設置一個數組用於存放節點
node *p;
cout<<"採用深度優先搜索:"<<endl;
cout<<"請輸入搜索起始節點:";
cin>>k;
for(int i=0;i<n;i++)
{
a[i]=k;
list[k].sign=t;
if(i==n-1)
break;
m=0;
while(list[k].sign==t)
{
p=list[k].next;
while(p!=NULL)//找出list[k]鏈表中的未遍歷節點
{
k=p->data;
p=p->next;
if(list[k].sign==f)
break;
}
m++;
if(list[k].sign!=f)//判斷是否是p=NULL跳出while循環的
{
if(i<m)//無節點可回溯
{
cout<<"該圖為非連通圖!"<<endl;
break;
}
else
k=a[i-m]; //回溯
}
}
}
for(i=1;i<=n;i++)//恢復原鄰接表
list[i].sign=f;
cout<<"深度優先搜索遍歷順序為:";
for(i=0;i<n;i++)//輸出遍歷結果
cout<<a[i]<<" ";
cout<<endl;
delete a;//釋放動態數組內存
};
void BreadthFirstSearth(node *list)//廣度優先搜索
{
int m,r,k,n=list[0].data,*a=new int[n+1];//設置數組存放節點
node *p;
cout<<"採用廣度優先搜索:"<<endl;
cout<<"請輸入搜索起始節點:";
cin>>k;
a[0]=n;
a[1]=k;
list[k].sign=t;//標識遍歷的第一個節點
m=0;
r=1;
while(m!=r)
{
m++;
p=list[a[m]].next;
while(p!=NULL)
{
k=p->data;
if(list[k].sign==f)
{
r++;
a[r]=k;//遍歷到的節點存入數組
list[k].sign=t;//標識已經遍歷過的節點
}
p=p->next;
}
}
for(int i=1;i<=n;i++)//恢復原鄰接表
list[i].sign=f;
cout<<"廣度優先搜索遍歷順序為: ";
for(i=1;i<=n;i++)//輸出遍歷
cout<<a[i]<<" ";
cout<<endl;
delete a;//釋放動態數組內存
};
void PathSearth(node *list)//路徑搜索
{
int *a,c,d,m,k,n=list[0].data;
cout<<"請輸入起始點:";
cin>>k;
cout<<"請輸入尾節點:";
cin>>c;
cout<<"請輸入要找的路徑長度:";
cin>>d;
d=d+1;
if(d>n)
cout<<"不存在這樣的簡單路徑!"<<endl;
else
{
a=new int[d];//動態分配數組內存存放路徑上的節點
for(int i=0;i<d;i++)
a[i]=0;
a[0]=k;
node *p;
int x;
list[a[0]].sign=t;
i=1;
while(a[d-1]!=c)
{
while(i<d)
{
x=1;
p=list[a[i-1]].next;
while(p!=NULL)
{
m=p->data;
if(i==d-1&&m==a[0]&&a[0]==c)//路徑存在且為迴路
{
cout<<"該路徑為一條迴路!"<<endl;
a[i]=m;
i++;
break;
}
if(list[m].sign==f)
{
if(a[i]!=0)
{
if(x==0)//是否為已經判斷過的錯誤路徑
{
a[i]=m;
list[a[i]].sign=t;//標識走過節點
i++;
break;
}
if(a[i]==m)//設置錯誤路徑標識
x=0;
}
else
{
a[i]=m;
list[a[i]].sign=t;//標識走過節點
i++;
break;
}
}
p=p->next;
}
if(p==NULL)
{
a[i]=0;
i--;//由此節點往下的路徑不存在,回溯
list[a[i]].sign=f; //還原標識符
}
if(i==0)//無法回溯,路徑不存在,跳出循環
{
cout<<"不存在這樣的簡單路徑!"<<endl;
break;
}
}
if(i==0)//無法回溯,路徑不存在,跳出循環
break;
if(a[d-1]!=c)//路徑不是所要找的
{
i--; //回溯
if(i>=0)
list[a[i]].sign=f;//還原標識符
}
}
if(a[d-1]==c)//判斷路徑是否找到並輸出
{
cout<<"從節點"<<k<<"到節點"<<c<<"的一條路徑為:";
for(i=0;i<d-1;i++)//輸出路徑
cout<<a[i]<<"--> ";
cout<<a[d-1]<<endl;
}
delete a;
}
for(int i=1;i<=n;i++)//恢復原鄰接表
list[i].sign=f;
};
void AdjacencyListDelete(node *list)//釋放鄰接表的空間
{
node *p,*q;
int n=list[0].data;
for(int i=1;i<=n;i++)
{
p=list[i].next;
while(p!=NULL)
{
q=p->next;
delete p;//釋放鏈表節點空間
p=q;
}
}
delete list;//釋放鄰接表空間
};
void main()
{
node *list;
list=creategraph();//以鄰接表的形式建立一個無向圖
char a,b;
cout<<"請選擇遍歷方法:(d:深度優先搜索;b:廣度優先搜索)";
for(int i=1;i<2;i++)
{
cin>>a;
switch(a)
{
case 'd':
case 'D': DepthFirstSearch(list);
cout<<"是否採用廣度優先搜索重新遍歷?(y:是;n:否)";
cin>>b;
if((b=='y')||(b=='Y'))
BreadthFirstSearth(list);
break;
case 'b':
case 'B': BreadthFirstSearth(list);
cout<<"是否採用深度優先搜索重新遍歷?(y:是;n:否)";
cin>>b;
if((b=='y')||(b=='Y'))
DepthFirstSearch(list);
break;
default: cout<<"輸入錯誤!請重新輸入!"<<endl;
i--;
}
}
while(1)
{
cout<<"是否搜索路徑?(y:是;n:否)";
cin>>a;
if((a=='y')||(a=='Y'))
PathSearth(list);
else if((a=='n')||(a=='N'))
break;
else
cout<<"輸入錯誤!"<<endl;
}
AdjacencyListDelete(list);//釋放鄰接表空間
}