読者です 読者をやめる 読者になる 読者になる

福岡は今日も雨

情報系大学生のブログ。主に技術,音楽について。

画像をopenCVで顔部分を切り抜いたりしながら,pickle形式で保存するまで

顔から髪型をおすすめするDeepLearning器を作りたい,んで今日はデータの前処理やらラベル張りやらをやった。
1000枚以上ラベル張りが必要なデータがあって死にそうだったが,なんとかおしまい,データ前処理部分でopenCVで顔を切り抜いたり,
pickleで保存するまでをやったりした. openCVが全然できないので全然アレなコードですが,メモ用に書き残しておく

# 顔を切り抜くコード
def cut_out_face():
	directories = os.listdir('2_8_images')
	for directory in directories:
		if directory.find('.DS_Store') > -1:
			continue

		img_ary = os.listdir('2_8_images/' + directory)
		for image in img_ary:
			if image.find('.DS_Store') > -1:
				continue

			img = cv2.imread('2_8_images/' + directory + '/' + image, cv2.IMREAD_COLOR)
			gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
			face = faceCascade.detectMultiScale(gray, 1.1, 3)
			if len(face) > 0:
				for rect in face:
					x = rect[0]
					y = rect[1]
					width = rect[2]
					height = rect[3]
					dst = img[y:y+height, x:x+width]
					fixed_dst = cv2.resize(dst, (32,32))

					if not os.path.exists('hair_pickle/' + directory):
						os.mkdir('hair_pickle/' + directory)

					np_path = 'hair_pickle/' + directory + '/' + image
					cv2.imwrite(cv_path, fixed_dst)

パスとかは無視してください。必要なのはimg = cv2.imread(~~)からの部分で,ここからはじまります
rectで顔の部分を切り抜いてる感じですね,今回はalexnetの構造を一から作るのが面倒だったので32*32でresizeしていますが,
必要に応じて縦×横を変更してください

def img2pickle():
	directories = os.listdir('hair_pickle')
	for directory in directories:
		if directory.find('.DS_Store') > -1:
			continue

		img_ary = os.listdir('hair_pickle/' + directory)
		for image in img_ary:
			if image.find('.DS_Store') > -1:
				continue

			np_img = np.asarray(Image.open('hair_pickle/' + directory + '/' +image).convert('RGB'), dtype=np.uint8)

			if image.find('jpg') > -1:
				new_name = image.replace('.jpg', '')
			elif image.find('png') > -1:
				new_name = image.replace('.png', '')
			elif image.find('jpeg') > -1:
				new_name = image.replace('.jpeg', '')
			else:
				new_name = image

			if not os.path.exists('hair_pickles/' + directory):
				os.mkdir('hair_pickles/' + directory)

			np_path = 'hair_pickles/' + directory + '/' + new_name
			np.save(np_path, np_img)

jpg,pngやらを取り除くうまい方法考えるより力技にしてしまった..., convert('RGB')としておくと,(3*32*32)のものがもらえます
なにもしなかったら(32*32*3)になっちゃうので,alexnetに合わせて先に(3*32*32)にしておきました。正規化とかは全くしていないので,
GCNやらLCNやら255で割ったりしてください. 明日は実際に学習させながら,SSDHモデルを作っていこうと思います