遗传算法图像拟合

遗传算法拟合火狐浏览器图标

13000多代效果大概如下

遗传算法图像拟合_第1张图片
遗传算法图像拟合_第2张图片

GA过程

遗传算法部分参数设定如下:种群大小M=20;最大代数G=30000。

1.染色体编码方式

采用实数编码的方式,基因序列 { g 0 , g 2 , . . . , g 255 } \{g_0,g_2,...,g_{255}\} {g0,g2,...,g255}作为染色体,其中 g i 为 张 量 ( i = 0 , 1 , 2 , . . . , 255 ) 。 g_i为张量(i=0,1,2,...,255)。 gi(i=0,1,2,...,255)

解释如下:
每个基因代表一个三角形,每个三角形有10个特征值 ( x 1 , x 2 , . . . , x 10 ) (x_1,x_2,...,x_{10}) (x1,x2,...,x10) 其中 ( x 1 , x 2 , x 3 , x 4 , x 5 , x 6 ) (x_1,x_2,x_3,x_4,x_5,x_6) (x1,x2,x3,x4,x5,x6)表示平面上三个顶点坐标即(ax,ay),(bx,by),(cx,cy), ( x 7 , x 8 , x 9 . x 10 ) (x_7,x_8,x_9.x_{10}) (x7,x8,x9.x10)表示(color.r,color.g,color.b,color.a),即在由三个顶点围成的三角形区域内的色彩及透明度。颜色空间为RGBA四个通道,同时每个通道的大小设定为256×256,因此一个基因是一个256×256×4的张量。染色体上有256个这样的基因。由这256个256×256×4个张量融合形成一个图像。

2.初始种群

先随机产生40个个体,然后选择20个优良个体进入迭代,直到迭代次数到达上限G或者前后两代最优个体适应度之差与原适应度的比值 δ f f < 0.0001 \frac{δf}{f}<0.0001 fδf<0.0001就停止迭代,认为找到可行解。

3.目标函数

目标函数为原图与拟合的图像的像素差的平方和,即原图与拟合图像对应的RBG通道上数值之差的平方和,适应度函数就取为目标函数,这个值越小表示适应度越高。
m i n f ( π 0 , π 2 , . . . , π 255 ) = ∑ k = 0 2 ∑ i = 0 255 ∑ j = 0 255 ( t i j k − T i j k ) 2 {minf(π_0,π_2,...,π_{255})}=\sum_{k=0}^2\sum_{i=0}^{255}\sum_{j=0}^{255}(t_{ij}^k-T_{ij}^k)^2 minf(π0,π2,...,π255)=k=02i=0255j=0255(tijkTijk)2
其中 t i j k 表 示 拟 合 的 图 像 第 k 个 通 道 上 第 i 行 j 列 的 数 值 T i j k 表 示 原 图 第 k 个 通 道 上 第 i 行 j 列 的 数 值 t_{ij}^k表示拟合的图像第k个通道上第i行j列的数值\\T_{ij}^k表示原图第k个通道上第i行j列的数值 tijkkijTijkkij

4.选择策略

采用两种选择策略

(1)确定性选择:

在父代和子代种群中排序选择适应度值最低的前20位。

(2)锦标赛选择:

每次从新生成的子代和父代种群中随机选择两个个体,比较他们的适应度值,由于适应度是个体图像RGB通道与目标图像对应的RGB通道之差的平方和,因此这个值越小代表适应性越好,从而在比较中,选择适应度小的那个,筛选入新种群,重复20次,有放回选择20个个体。

5.交叉策略

采用四种交叉策略
同时交叉率参考自适应交叉率公式
P c = { k 1 f m a x − f f m a x − f a v g , f ≥ f a v g k 2 , f < f a v g Pc=\begin{cases} k_{1}\frac{f_{max}-f}{f_{max}-f_{avg}},f\geq f_{avg}\\ k_{2},fPc={k1fmaxfavgfmaxf,ffavgk2,f<favg
fmax为种群的最大适应度;favg表示种群的平均适应度;f表示交叉的个体中适应度较大的个体;k1,k2均为自适应控制参数。
但此公式适应度均为越大越好,与本次实验的适应度的性质恰好相反,因此,需要将适应度取倒数,修改后为下列式子:
P c = { k 1 f − f m i n f a v g − f m i n f a v g f , f ≤ f a v g k 2 , f > f a v g Pc=\begin{cases} k_{1}\frac{f-f_{min}}{f_{avg}-f_{min}}\frac{f_{avg}}{f},f\leq f_{avg}\\ k_{2},f>f_{avg} \end{cases} Pc={k1favgfminffminffavg,ffavgk2,f>favg
fmin为种群的最小适应度;favg表示种群的平均适应度;f表示交叉的个体中适应度较小的个体;k1,k2均为自适应控制参数。
k1 = k2 = 1.0

(1)单点交叉

首先在(0,255)中随机生成点位point,同时生成一个0-1的随机数r,根据交叉率Pc与r比较来判断是否选择交叉,若Pc>r,则交叉,将parent1,parent2中位于0-point1的三角序列分别遗传给child2,child1,剩下的部分也分别遗传给child1,child2

(2)两点交叉

与单点交叉类似,首先在(0,255)中随机生成两个点位point1,point2,并确保point1r1 and Pc>r2则交叉,反之则不交叉。
若交叉,则将parent1,parent2中位于point1和point2的之间基因分别遗传给child2,child1,然后再将parent1,parent2中剩下的位于[0,point1-1,],[point2+1,255]之间的基因分别遗传给child1,child2。

(3)均匀交叉

遍历父代中的所有三角形,同时每次生成0-1随机数r,与0.5比较,大于0.5则parent1中的三角形遗传给child1,parent2中的三角形遗传给child2,反之,则parent1中的三角形遗传给child2,parent2中的三角形遗传给child1。如此循环,直到父代个体中所有的三角形均被遍历到。

(4)不交叉

交叉操作使得收敛曲线在前期(大概是1000代之前)收敛速度较快,而在1000代之后收敛速度低于不交叉的过程,这与交叉操作增加了多样性,解空间覆盖面大但同时增加了收敛代数的特性吻合。因此选择不交叉有利于减少迭代次数得到全局最优解。

6.变异策略

采用两种变异策略

(1)选择最优个体变异:

变异率Pm设置为经验值:0.01
首先在种群中根据适应度值排序,选择适应度值最低(适应度最好)的个体,将其变异10代,每一次遍历该个体中所有基因,根据变异率Pm与生成的0-1之间的随机数比较,判断是否对该基因进行变异,对基因变异实际上是对该基因表示的三角形的特征(ax,ay,bx,by,cx,cy,color.r,color.g,color.b,color.a)进行变异,对每一个特征生成随机数判断是否变异,变异即在原值的基础上加上一个可正可负的随机波动值。

(2)种群群体变异

变异率参考自适应变异率,公式为:
P m = { k 3 f m a x − f f m a x − f a v g , f ≥ f a v g k 4 , f < f a v g Pm=\begin{cases} k_{3}\frac{f_{max}-f}{f_{max}-f_{avg}},f\geq f_{avg}\\ k_{4},fPm={k3fmaxfavgfmaxf,ffavgk4,f<favg
与自适应交叉率类似,也需要进行修改
P m = { k 3 f − f m i n f a v g − f m i n f a v g f , f ≤ f a v g k 4 , f > f a v g Pm=\begin{cases} k_{3}\frac{f-f_{min}}{f_{avg}-f_{min}}\frac{f_{avg}}{f},f\leq f_{avg}\\ k_{4},f>f_{avg} \end{cases} Pm={k3favgfminffminffavg,ffavgk4,f>favg
fmin为种群的最小适应度;favg表示种群的平均适应度;f表示变异个体的适应度;k3,k4均为自适应控制参数。
k3 = k4 = 0.5
遍历种群个体,计算该个体变异率Pm,遍历个体的所有基因,根据变异率Pm与生成的0-1之间的随机数r比较,判断该基因是否变异。

源代码参考:
Github
如果对您有用的话希望能star一下,谢谢!

你可能感兴趣的:(python,图像处理)