Computer Vision

Python, Computer Vision, AI, Transhumanism 関連

ChatGPTの力を借りてパズルを解いてみる

あなたはロボットではありませんか?で、たまに見るからに単純なパズルを見かける事があるが、あれって意味あるのかなと思う。

 

まあいままでなら、それを解くプログラムを書くような人は滅多にいなかったかもしれないが、Chat-GPT後の世界では、それも簡単に作れてしまうのかもしれない。

 

例えばこんな感じ。

 

まずは、200px × 200px の画像を縦と横に4分割。

これにより50pxで分割された画像が16個できた。

 

分割画像

ファイル名をなぜか縦方向につけてしまっているが、これは右方向にしても良いと思う。つづいて、隣り合う画像を推測するためのアルゴリズムを作る。

 

まあ隣り合う画像はピクセル単位で見れば、まあまあ似てるんじゃないかと思うし、人間がそれを行うとするなら、近接しそうな部分に着目して、つなぎあわせるわけなので、そんな感じのアルゴリズムを考えつつ、CHAT-GPTにプログラムの実装を手伝ってもらうとしよう。

 

import cv2
import numpy as np

numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,16]

for num in numbers: 
    img = cv2.imread('image_'+str(num)+'.png',0)
    #下部の類似をはかる
    img1 = img[49:50, 0:50]
    #右側の類似をはかる
    img2 = img[0:50, 49:50]
    img2=img2.flatten()
    others = [i for i in numbers if i != num]
    e={}
    d={}
    for x in others:
        imgb = cv2.imread('image_'+str(x)+'.png',0)
        #上部
        imgn = imgb[0:1, 0:50]
        #左部
        imgo = imgb[0:50, 0:1]
        imgo=imgo.flatten()
        d[x] = np.corrcoef(img1,imgn)[0,1]
        e[x] = np.corrcoef(img2,imgo)[0,1]

    d_list = sorted(d.items(), key = lambda sd : sd[1])
    e_list = sorted(e.items(), key = lambda se : se[1])
    print('#no.'+str(num))
    l,m=d_list[-1]
    print("under:"+str(l)+","+str(m))
    l,m=e_list[-1]
    print("right:"+str(l)+","+str(m))

 

私が、CHAT-GPTにお願いしたのは、1から16の配列からひとつずつ値を取り出し、それ以外の数値を配列に入れてもらうところ。

隣り合う画像を比較するのに、corrcoefという相関係数を使ったのだが、これは簡単に言えば数列の類似性を数値化してくれるものである。

その辺のアイデアや実装は、引き続きプログラマーが考える部分になるのかもしれない。

 

で、肝心の結果はこんな感じ。各番号の、下と右を予想している。

#no.1

under:2,0.7685052319741218

right:5,0.989207792314838

#no.2

under:3,0.6333374572621592

right:6,0.998690706867028

#no.3

under:10,0.3726621759299401

right:7,0.9094745593930978

#no.4

under:6,0.8064182721450904

right:8,0.5543870423410759

#no.5

under:6,0.9210849170659833

right:9,0.9864468569755007

#no.6

under:7,0.3182877780591007

right:10,0.9969304112283207

#no.7

under:8,0.7962901311236685

right:11,0.9363548917948018

#no.8

under:1,0.2814161033907845

right:12,0.7581779188301637

#no.9

under:10,0.9053394960334207

right:13,0.9899564700597434

#no.10

under:11,0.4728194225402103

right:14,0.9890637000629602

#no.11

under:12,0.8352856066476022

right:10,0.5707718391196519

#no.12

under:2,0.4626492644652501

right:16,0.8255589979079792

#no.13

under:14,0.9402215618448856

right:9,0.7400994386318248

#no.14

under:2,0.6847762922386988

right:2,0.31493261546174606

#no.16

under:13,0.22993911377342055

right:3,0.39504428749740844

色分けは、数値が0.5以下のものは相関が低いので、ノーカウント黄色(セーフ)のイメージ、青は正解、赤はハズレという判定とみなした。

 

全体的な正答率としては、いまひとつではあるものの左か下どちらか当たっているものは多いので、アルゴリズムとしてはまあまあかなと思う。

ChatGPTの最初のイメージは、ちょっと面白いが平気で嘘をつく冴えないやつというイメージだったが、夏休みから帰ってきたら、急に賢くなりたちまちクラスの人気者に。

 

といったところだろうか。

ともかく、ChatGPTは、文章生成や、質問に対する対話的回答だけでなく、プログラミングの作成で大きく影響しそうな感じではある。