我好像发明了一种理论,叫宝藏理论
先记录一下
#from gensim.models import Word2Vec as wv
#import pandas as pd
#
#pd.read_csv('F:\\BaiduNetdiskDownload\\new_data\\train_set.csv')
#
from PIL import Image
import numpy as np
img = Image.open('F:\\BaiduNetdiskDownload\\new_data\\eye.jpg').convert('L')
img = np.mat(img)
img.flags.writeable = True
h = img.shape[0]
w = img.shape[1]
import matplotlib.pyplot as plt
#randpara = randavg*0.8+randvar*0.2
plt.imshow(Image.fromarray(img))
#做起点 左上
humans=list()
for i in range(0,h,5):
for j in range(0,w,5):
humans.append([i,j])
newhumans=list()
resultavg = list()
resulthuman = list()
i=0
while(1):
idx=0
if i>55:
break
print('next')
while idx<len(humans):
#print("========humans=====")
#print(humans)
#print("--------humans-----")
x=humans[idx][0]
y=humans[idx][1]
a = img[x:x+5,y:y+5]
curpara = a.mean()
if x+6<h:
as1 = img[x+1:x+6,y:y+5]
as1para=as1.mean()
else:
as1para=10000
if x-1>=0:
ax1 = img[x-1:x+4,y:y+5]
ax1para=ax1.mean()
else:
ax1para=10000
if y-1>0:
az1 = img[x:x+5,y-1:y+4]
az1para=az1.mean()
else:
az1para=10000
if y+6<w:
ay1 = img[x:x+5,y+1:y+6]
ay1para=ay1.mean()
else:
ay1para=10000
#自己上下左右
paras = [curpara,as1para,ax1para,az1para,ay1para]
parasmat = np.mat(paras)
if np.argmin(parasmat)==0:
for i in range(x,x+5):
for j in range(y,y+5):
#print(i,j)
img[i,j]=255
resultavg.append(curpara)
resulthuman.append([x,y])
humans.pop(idx)
continue
if np.argmin(parasmat)==1:
x=x+1
if np.argmin(parasmat)==2:
x=x-1
if np.argmin(parasmat)==3:
y=y-1
if np.argmin(parasmat)==4:
y=y+1
humans[idx][0] = x
humans[idx][1] = y
idx+=1
i+=1
plt.imshow(Image.fromarray(img))
#plt.scatter(y,x,color='r',linewidth='1')
print()
imghh = Image.open('F:\\BaiduNetdiskDownload\\new_data\\eye.jpg').convert('L')
plt.imshow(imghh)
plt.scatter(resulthuman[np.argmin(np.mat(resultavg))][1],resulthuman[np.argmin(np.mat(resultavg))][0],color='b')
#np.argmin(sum(img))
#avg = np.mean(img)
#var = np.std(img, ddof = 1)
#img = np.multiply(img,1+img/avg)
#
#avg = np.mean(img)
#var = np.std(img, ddof = 1)
#para = avg*0.8+var*0.2
#print(avg)
#print(var)
#
#tx=0
#ty=0
#tavg=0
#tvar=0
#
#import matplotlib.pyplot as plt
#for i in range(100):
# x = np.random.randint(h)
# y = np.random.randint(w)
# randmat = img[x-10:x+10,y-10:y+10]
# randavg = np.mean(randmat)
# randvar = np.std(randmat, ddof = 1)
# randpara = randavg*0.8+randvar*0.2
# if para > randpara:
# var = randvar
# avg = randavg
# para = randpara
# tx = x
# ty = y
# plt.scatter(y,x,color='r')
#
#plt.scatter(ty,tx,color='b')
#plt.imshow(Image.fromarray(255-img))
#
#heicount = 0
#for i in range(h):
# for j in range(w):
# if img[i,j]<60:
# img[i,j]=0
# heicount+=1
# else:
# img[i,j]=255
#binimg = Image.fromarray(img)
#m=500000
#x=0
#y=0
#s=0
#import math
#import matplotlib.pyplot as plt
#import matplotlib.patches as p
#r = int(math.sqrt(heicount/3.14))
#print(r)
#for i in range(h):
# for j in range(w):
# if img[i,j]==0:
# print([i,j])
# qi=i
# qj=j
#
# xl=0
# xr=0
# yl=0
# yr=0
#
#
# s = sum(sum(img[i-r:i+r+1,j-r:j+r+1]))
# print(s)
# if s<m:
# m=s
# x=i
# y=j
#
#ax = plt.axes()
#plt.scatter(y,x)
#ax.add_patch(p.Rectangle((y,x),r,r))
#plt.imshow(binimg)
#aaaaaaas = sum(sum(img[517-r:517+r+1,500-r:500+r+1]))
#fffffffffffffs=img[517-r:517+r+1,500-r:500+r+1]
#qqqqqqqqqqqqqqqqqqqqqs=img[x-r:x+r+1,y-r:y+r+1]
#
#ccccccccccccccccccccccc=sum(sum(qqqqqqqqqqqqqqqqqqqqqs))-sum(sum(fffffffffffffs))
#t=0
宝藏理论:
一群挖宝人,随机降落在地图上,大家不知道有多少宝藏,不知道有什么宝藏,也不知道什么宝藏最珍贵。
于是大家疯狂的挖,一旦挖到宝藏,立刻抢占并立刻开采与消费,转换成金钱,并建立围墙组织别人进入,甚至会架设极强,消灭附近的挖宝人。
随着宝藏不断被挖掘,直到地图上所有宝藏都被挖完了。
全地图统计,拥有金钱最多的人,所挖的宝藏就是全地图最值钱的宝藏。
在此理论下,作出的代码跑图像效果为:蓝点为瞳孔所在区域位置
碰到一张不好的,因为挖宝函数设置对头发起了更强的效果
对挖宝算法做了一定更新,新增跳步功能,当挖到宝藏的人越来越多,还没挖到的人,运动速度就会加快,一次跨的步数越来越长
#from gensim.models import Word2Vec as wv
#import pandas as pd
#
#pd.read_csv('F:\\BaiduNetdiskDownload\\new_data\\train_set.csv')
#
from PIL import Image
import numpy as np
path='dasdasd.jpg'
img = Image.open(path).convert('L')
img = np.mat(img)
img.flags.writeable = True
h = img.shape[0]
w = img.shape[1]
plt.imshow(Image.fromarray(img))
import matplotlib.pyplot as plt
import time
#randpara = randavg*0.8+randvar*0.2
#做起点 左上
humans=list()
lr=0.02
cover =int( w*lr )
for i in range(cover,h-cover,cover):
for j in range(cover,w-cover,cover):
humans.append([i,j])
humansnum=len(humans)
newhumans=list()
resultavg = list()
resulthuman = list()
i=0
step=1
starttime = time.clock()
while(1):
idx=0
if len(humans)<int(0.3*humansnum):
break
#print('next')
while idx<len(humans):
#print("========humans=====")
#print(humans)
#print("--------humans-----"+str(len(humans)))
x=humans[idx][0]
y=humans[idx][1]
a = img[x:x+cover,y:y+cover]
curpara = a.mean()
if x+step+cover<h:
asstep = img[x+step:x+step+cover,y:y+cover]
assteppara=asstep.sum()
else:
assteppara=10000
if x-step>=0:
axstep = img[x-step:x-step+cover,y:y+cover]
axsteppara=axstep.sum()
else:
axsteppara=10000
if y-step>0:
azstep = img[x:x+cover,y-step:y-step+cover]
azsteppara=azstep.sum()
else:
azsteppara=10000
if y+step+cover<w:
aystep = img[x:x+cover,y+step:y+step+cover]
aysteppara=aystep.sum()
else:
aysteppara=10000
#自己上下左右
paras = [curpara,assteppara,axsteppara,azsteppara,aysteppara]
parasmat = np.mat(paras)
if np.argmin(parasmat)==0:
for i in range(x,x+cover):
for j in range(y,y+cover):
#print(i,j)
img[i,j]=255
resultavg.append(curpara)
resulthuman.append([x,y])
humans.pop(idx)
if len(humans)==0:
break
step = int((1/lr)/(len(humans)/humansnum))
#print(step)
continue
if np.argmin(parasmat)==1:
x=x+step
if np.argmin(parasmat)==2:
x=x-step
if np.argmin(parasmat)==3:
y=y-step
if np.argmin(parasmat)==4:
y=y+step
humans[idx][0] = x
humans[idx][1] = y
idx+=1
i+=1
#plt.imshow(Image.fromarray(img))
#plt.scatter(y,x,color='r',linewidth='step')
print('运算时间:')
print(time.clock()-starttime)
imghh = Image.open(path)
plt.imshow(imghh)
plt.scatter(resulthuman[np.argmin(np.mat(resultavg))][1],resulthuman[np.argmin(np.mat(resultavg))][0],color='b',linewidth='8')
改进:
在某些情况下,容易出现困在局部最优的结果,针对这种情况,推出了一个改进,名为:刺激
在之前,有些淘金者搜不到金矿,或者只局限了自己已经收到的金矿,就不在运动了。
这时候领导人,会喊一个口号,大家加油继续挖,钻石就再前方。所以每个几次,就有一批人会被刺激继续往前挖,我们来看看结果
第一张图为没有刺激效果,lr = 0.05下第二张图为有刺激效果,lr = 0.05。
可以看到运算时间增加,但是精度大幅度提高了一些
加了 刺激 功能以后,可以看到还是有一些偏差,哦对了,忘记说了,之前我们的小蓝点都是瞳孔区域的左上角,而不是真正的瞳孔区域,所以会有一些视觉偏差。接下来,我做了真正的瞳孔区域,并且在步长step做了一定的随机化工作。
依然放出 加了刺激 且 lr=0.05的效果图
在放一个 lr=0.06 加刺激的效果图
预算速度提高且准确率不变
换一张图试试 0.06 刺激
有点意思阿
最后,如果想看起来效果更好,对坐标周围做一个 连通域分割即可,比较简单 和我的主要目的无关,这里就不做了。