宝藏理论

版权声明:我是南七小僧,微信: to_my_love ,寻找人工智能相关工作,欢迎交流思想碰撞。 https://blog.csdn.net/qq_25439417/article/details/82023889

我好像发明了一种理论,叫宝藏理论

先记录一下

#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 刺激

有点意思阿

最后,如果想看起来效果更好,对坐标周围做一个 连通域分割即可,比较简单 和我的主要目的无关,这里就不做了。

猜你喜欢

转载自blog.csdn.net/qq_25439417/article/details/82023889