fromkeras.datasetsimportmnistfromkeras.layersimportInput,Dense,Reshape,Flatten,Dropoutfromkeras.layersimportBatchNormalization,Activation,ZeroPadding2Dfromkeras.layers.advanced_activationsimportLeakyReLUfromkeras.layers.convolutionalimportUpSampling2D,Conv2Dfromkeras.modelsimportSequential,Modelfromkeras.optimizersimportAdamimportmatplotlib.pyplotaspltimportsysimportnumpyasnpclassGAN():def__init__(self):self.img_rows=28self.img_cols=28self.channels=1self.img_shape=(self.img_rows,self.img_cols,self.channels)optimizer=Adam(0.0002,0.5)# Build and compile the discriminatorself.discriminator=self.build_discriminator()self.discriminator.compile(loss='binary_crossentropy',optimizer=optimizer,metrics=['accuracy'])# Build and compile the generatorself.generator=self.build_generator()self.generator.compile(loss='binary_crossentropy',optimizer=optimizer)# The generator takes noise as input and generated imgsz=Input(shape=(100,))img=self.generator(z)# For the combined model we will only train the generatorself.discriminator.trainable=False# The valid takes generated images as input and determines validityvalid=self.discriminator(img)# The combined model (stacked generator and discriminator) takes# noise as input => generates images => determines validityself.combined=Model(z,valid)self.combined.compile(loss='binary_crossentropy',optimizer=optimizer)defbuild_generator(self):noise_shape=(100,)model=Sequential()model.add(Dense(256,input_shape=noise_shape))model.add(LeakyReLU(alpha=0.2))model.add(BatchNormalization(momentum=0.8))model.add(Dense(512))model.add(LeakyReLU(alpha=0.2))model.add(BatchNormalization(momentum=0.8))model.add(Dense(1024))model.add(LeakyReLU(alpha=0.2))model.add(BatchNormalization(momentum=0.8))model.add(Dense(np.prod(self.img_shape),activation='tanh'))model.add(Reshape(self.img_shape))model.summary()noise=Input(shape=noise_shape)img=model(noise)returnModel(noise,img)defbuild_discriminator(self):img_shape=(self.img_rows,self.img_cols,self.channels)model=Sequential()model.add(Flatten(input_shape=img_shape))model.add(Dense(512))model.add(LeakyReLU(alpha=0.2))model.add(Dense(256))model.add(LeakyReLU(alpha=0.2))model.add(Dense(1,activation='sigmoid'))model.summary()img=Input(shape=img_shape)validity=model(img)returnModel(img,validity)deftrain(self,epochs,batch_size=128,save_interval=50):# Load the dataset(X_train,_),(_,_)=mnist.load_data()# Rescale -1 to 1X_train=(X_train.astype(np.float32)-127.5)/127.5X_train=np.expand_dims(X_train,axis=3)half_batch=int(batch_size/2)forepochinrange(epochs):# ---------------------# Train Discriminator# ---------------------# Select a random half batch of imagesidx=np.random.randint(0,X_train.shape[0],half_batch)imgs=X_train[idx]noise=np.random.normal(0,1,(half_batch,100))# Generate a half batch of new imagesgen_imgs=self.generator.predict(noise)# Train the discriminatord_loss_real=self.discriminator.train_on_batch(imgs,np.ones((half_batch,1)))d_loss_fake=self.discriminator.train_on_batch(gen_imgs,np.zeros((half_batch,1)))d_loss=0.5*np.add(d_loss_real,d_loss_fake)# ---------------------# Train Generator# ---------------------noise=np.random.normal(0,1,(batch_size,100))# The generator wants the discriminator to label the generated samples# as valid (ones)valid_y=np.array([1]*batch_size)# Train the generatorg_loss=self.combined.train_on_batch(noise,valid_y)# Plot the progressprint("%d [D loss: %f, acc.: %.2f%%] [G loss: %f]"%(epoch,d_loss[0],100*d_loss[1],g_loss))# If at save interval => save generated image samplesifepoch%save_interval==0:self.save_imgs(epoch)defsave_imgs(self,epoch):r,c=5,5noise=np.random.normal(0,1,(r*c,100))gen_imgs=self.generator.predict(noise)# Rescale images 0 - 1gen_imgs=0.5*gen_imgs+0.5fig,axs=plt.subplots(r,c)cnt=0foriinrange(r):forjinrange(c):axs[i,j].imshow(gen_imgs[cnt,:,:,0],cmap='gray')axs[i,j].axis('off')cnt+=1fig.savefig("./mnist_%d.png"%epoch)plt.close()if__name__=='__main__':gan=GAN()gan.train(epochs=30000,batch_size=32,save_interval=200)
importrequestsimportargparsefromrequestsimportexceptionsimportcv2importosfromfake_useragentimportUserAgentimporttimeap=argparse.ArgumentParser()ap.add_argument("-q","--query",required=True,help="search query")ap.add_argument("-o","--output",required=True,help="path to output directory of images")args=vars(ap.parse_args())user_agent=UserAgent()EXCEPTIONS=set([IOError,FileNotFoundError,exceptions.RequestException,exceptions.HTTPError,exceptions.ConnectionError,exceptions.Timeout])GROUP_SIZE=30MAX_RESULTS=600URL="http://image.so.com/zj"ch=args['query']params={'ch':ch,'listtype':'new','temp':1}total=0forsninrange(0,MAX_RESULTS,GROUP_SIZE):headers={'User-Agent':user_agent.random}params['sn']=snsearch_result=requests.get(URL,headers=headers,params=params)results=search_result.json()forlinresults['list']:try:print("Downloading: {}".format(l['qhimg_thumb_url']))r=requests.get(l['qhimg_thumb_url'],headers=headers,timeout=30)ext=l['qhimg_thumb_url'][l['qhimg_thumb_url'].rfind("."):]path=os.path.sep.join([args['output'],"{}{}".format(str(total).zfill(8),ext)])withopen(path,'wb')asfile_obj:file_obj.write(r.content)time.sleep(1)exceptExceptionase:iftype(e)inEXCEPTIONS:print("Skipping: {}".format(l['qhimg_thumb_url']))continueimage=cv2.imread(path)ifimageisNone:print('Deleting: {}'.format(path))os.remove(path)continuetotal+=1