2016-07-27 4 views
0

Я использую код от this github, после this учебник. Есть несколько изменений, которые я сделал, потому что я тренирую CNN по своим данным. Но, возможно, есть проблема с изменениями, которые я выполнил в файле 'create_lmdb.py'. разница между двумя базами данных:Ошибка с файлом create_lmdb.py

первая: я тренирую свою сеть с 32x32 изображений. second: моя база данных включает только оттенки серого изображений. но - я тоже тренирую свою сеть для двоичной классификации.

После изменений, это мой файл:

import os 
import glob 
import random 
import numpy as np 

import cv2 

import caffe 
from caffe.proto import caffe_pb2 
import lmdb 

#Size of images 
IMAGE_WIDTH = 32 
IMAGE_HEIGHT = 32 

def transform_img(img, img_width=IMAGE_WIDTH, img_height=IMAGE_HEIGHT): 

    #Histogram Equalization 
    img = cv2.equalizeHist(img) 
    #img[:, :, 1] = cv2.equalizeHist(img[:, :, 1]) not a RGB 
    #img[:, :, 2] = cv2.equalizeHist(img[:, :, 2]) 

    #Image Resizing 
    img = cv2.resize(img, (img_width, img_height), interpolation = cv2.INTER_CUBIC) # make sure all the images are at the same size 

    return img 


def make_datum(img, label): 
    #image is numpy.ndarray format. BGR instead of RGB 
    return caffe_pb2.Datum(
     channels=1, #not an RGB image 
     width=IMAGE_WIDTH, 
     height=IMAGE_HEIGHT, 
     label=label, 
     data=img.tostring()) 

train_lmdb = '/home/roishik/Desktop/Thesis/Code/cafe_cnn/first/input/train_lmdb' 
validation_lmdb = '/home/roishik/Desktop/Thesis/Code/cafe_cnn/first/input/validation_lmdb' 

os.system('rm -rf ' + train_lmdb) 
os.system('rm -rf ' + validation_lmdb) 


train_data = [img for img in glob.glob("../input/train/*png")] 
test_data = [img for img in glob.glob("../input/test1/*png")] 

#Shuffle train_data 
random.shuffle(train_data) 

print 'Creating train_lmdb' 

in_db = lmdb.open(train_lmdb, map_size=int(1e12)) 
with in_db.begin(write=True) as in_txn: 
    for in_idx, img_path in enumerate(train_data): 
     if in_idx % 6 == 0: 
      continue 
     img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) 
     img = transform_img(img, img_width=IMAGE_WIDTH, img_height=IMAGE_HEIGHT) 
     if 'cat' in img_path: 
      label = 0 
     else: 
      label = 1 
     datum = make_datum(img, label) 
     in_txn.put('{:0>5d}'.format(in_idx), datum.SerializeToString()) 
     print '{:0>5d}'.format(in_idx) + ':' + img_path 
in_db.close() 


print '\nCreating validation_lmdb' 

in_db = lmdb.open(validation_lmdb, map_size=int(1e12)) 
with in_db.begin(write=True) as in_txn: 
    for in_idx, img_path in enumerate(train_data): 
     if in_idx % 6 != 0: 
      continue 
     img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) 
     img = transform_img(img, img_width=IMAGE_WIDTH, img_height=IMAGE_HEIGHT) 

     prec=int(img_path[(img_path.index('prec_')+5):(img_path.index('prec_')+8)]) 

     if prec>50: 
      label = 1 
     else: 
      label = 0 

     datum = make_datum(img, label) 
     in_txn.put('{:0>5d}'.format(in_idx), datum.SerializeToString()) 
     print '{:0>5d}'.format(in_idx) + ':' + img_path 
in_db.close() 

print '\nFinished processing all images' 

Но я думаю, что по результатам обучения: выходной .mdb файл поврежден (может быть пустым или что-то - даже его вес 47MB).

Может ли кто-нибудь увидеть что-то не так с этим файлом? или, альтернативно, дать мне ссылку на хороший учебник о создании файлов lmdb?

Настоятельно ценю вашу помощь! Thanks

ответ

0

Хорошо, я решил! Посмотрев глубже в код, который я заметил, что я обновил только метки набора данных проверки (и пропустил подготовки данных): P его можно увидеть в этой части кода:

img = transform_img(img, img_width=IMAGE_WIDTH, img_height=IMAGE_HEIGHT) 
     if 'cat' in img_path: 
      label = 0 
     else: 
      label = 1 

что принадлежит оригинальный учебник.

Заключение: Если вы не можете получить доступ к своему файлу lmdb, mabey это потому, что функция, которая его создает, сломана.

0

Если вы хотите создать набор данных для изображения 'lmdb' для обучения сетевой классификации, не потеть! У Caffe уже есть инструмент для этой цели!
Вы ищете инструмент $CAFFE_ROOT/build/tools/convert_imageset, и вы можете найти довольно подробный (если можно так сказать;) учебник here.

+0

Большое спасибо. Я начал с создания нового файла, а затем нашел свою ошибку: P – roishik