简单的批处理方式,包含了windows系统下的bat文件,Linux系统下的sh文件以及最牛逼的Python脚本。在进行AI相关的研究时,不可避免的需要去进行处理数据集。有些数据集是现成的,有些数据集却是需要自己去定制的。以下是自己在学习的过程中总结出来的比较常见的几种方式去处理数据。因为做的是CV,所以设计的处理方式多是处理图片。
一、windows下的bat
1、统计每个文件夹的名称以及相应文件夹下的文件数量并导出为记事本txt文件。使用时需要将此bat放至需要统计的所有文件夹的同级目录下,双击执行即可。正常使用过程中主要起到统计的作用,以及保存的txt文件可以用excel打开,便于数据的处理。
@echo off
set n=%cd%
:aaa
if not "%n:\=%"=="%n%"set n=%n:*\=%& goto aaa
echo 文件夹名;文件数>"%n%.txt"
for /f "delims=" %%a in ('dir /ad/b') do (
for/f %%s in ('dir /b /s /a-d "%%a" ^| find /v /c ""') do echo%%a;%%s>>"%n%.txt")
echo 完成...
pause
2、从N个文件夹中(N个文件夹下的文件命名一样)抽取某一命名的文件,保存到指定的路径下。这个过程主要是从一些整理好的数据集中去抽取自己所需的数据进行定制。(例如webface,megaface等)。记得修改路径。
@echo off
if exist renlian (rd /s /q renlian)
md renlian
dir /s /b 002.jpg > renlian.tmp
setlocal enabledelayedexpansion
set n=1
for /f "eol=| delims=|" %%i in(renlian.tmp) do (
xcopy "%%i" "D:\*\*-*\*-*\*\!n!.jpg"
set /a n=!n!+1
)
pause
二、Linux下的sh
1、将同级文件夹下的所有图片按照顺序累加重命名。sh文件与图片放至同级目录下。这段是为了将之前抽取好的数据统一进行重命名。
i=100001;
forimg in `ls *.jpg`;
do mv $img `printf %.6d $i`.jpg;
i=`expr $i + 1`;
done
2、这段是在上一步重命名结束之后,对分类好的train和val数据进行生成train.txt和val.txt的过程。在为下一步生成lmdb(caffe处理的数据格式)做准备。修改trainDATA和valDATA的路径(这两个就是存放train和val的位置)MY是生成好的train.txt和val.txt保存的位置。
#!/usr/bin/env sh
trainDATA=/home/*/project/Downs
valDATA=/home/*/project/Downs
MY=/home/*/project/Downs
echo "Create train.txt..."
rm -rf $MY/train.txt
find $trainDATA/train -name 100*.jpg | cut-d '/' -f6-7 | sed "s/$/ 0/">>$MY/train.txt
find $trainDATA/train -name 200*.jpg | cut-d '/' -f6-7 | sed "s/$/ 1/">>$MY/train.txt
echo "Create test.txt..."
rm -rf $MY/val.txt
find $valDATA/val -name 100*.jpg | cut -d'/' -f6-7 | sed "s/$/ 0/">>$MY/val.txt
find $valDATA/val -name 200*.jpg | cut -d'/' -f6-7 | sed "s/$/ 1/">>$MY/val.txt
echo "All done"
3、这段是在上一步中生成的train.txt和val.txt文件与train和val文件夹中的图片进行生成lmdb的步骤。MY是需要保存lmdb文件的位置,TRAIN_DATA_ROOT是train文件夹的路径,VAL_DATA_ROOT是val文件夹的路径。同时resize重新调整了图片的大小,是一步简单的图片预处理的操作。(常见的有2828,3232,224224,227227)
#!/usr/bin/env sh
MY=/home/*/project/Downs/
TRAIN_DATA_ROOT=/home/*/project/Downs/
VAL_DATA_ROOT=/home/*/project/Downs/
echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
/home/*/caffe/build/tools/convert_imageset\
--shuffle \
--resize_height=227 \
--resize_width=227 \
$TRAIN_DATA_ROOT \
$MY/train.txt \
$MY/img_train_lmdb
echo "Create test lmdb.."
rm -rf $MY/img_val_lmdb
/home/*/caffe/build/tools/convert_imageset\
--shuffle \
--resize_height=227 \
--resize_width=227 \
$VAL_DATA_ROOT \
$MY/val.txt \
$MY/img_val_lmdb
echo "All Done.."
4、这个步骤就是利用生成好的img_train_lmdb文件生成均值文件mean.binaryproto。EXAMPLE是img_train_lmdb的存放路径,DATA是生成后的mean.binaryproto存放路径,TOOLS是CAFFE的tools文件夹路径。
#!/usr/bin/env sh
EXAMPLE=/home/*/project/Downs
DATA=/home/*/project/Downs
TOOLS=/home/*/caffe/build/tools
$TOOLS/compute_image_mean$EXAMPLE/img_train_lmdb $DATA/mean.binaryproto
echo "Done."
5、赘述:训练网络时候的命令,封装成train.sh文件方便训练网络。
/home/*/caffe/build/tools/caffe train-solver /home/*/project/Downs/solver4.prototxt
三、life is short的Python
1、这个Python脚本需要安装caffe和numpy。Caffe的骨头是难啃的,装过的同学大家都知道,caffe安装教程另外抽空再写。修改两个路径,即可运行,将均值文件转换为numpy格式的均值文件。(有点顺口溜的感觉,hiahiahiahiahiahiahiahiahia)
import caffe
import numpy as np
prototxt = '/home/* /mean.binaryproto'
npy = '/home/*/ mean.npy'
blob = caffe.proto.caffe_pb2.BlobProto()
data = open(prototxt, 'rb' ).read()
blob.ParseFromString(data)
array =np.array(caffe.io.blobproto_to_array(blob))
mean_npy = array[0]
np.save(npy ,mean_npy)
2、下面这个有些东西的。需要安装face_recognition和PIL。face_recognition是GITHUB上面star颇高的人脸检测的项目,包含了人脸检测、人脸关键点标记等功能。安装过程有些小波澜,也跟caffe一样,抽空整理。下面的脚本基于官方演示代码修改,实现的就是批量完成某文件夹下所有图片的人脸框定位后重新生成新图片的过程。Range函数是可以优化的,评论区的大佬们可给出建议。
import os
from PIL import Image
import face_recognition
Image_Path="/home/*/project/Downs/images/"
Image_Path1="/home/*/project/Downs/images1/"
Image_List=os.listdir(Image_Path)
for i in range(0,4279,1):
#Load the jpg file into a numpy array
image = face_recognition.load_image_file("/home/*/project/Downs/images/"+Image_List[i])
#Find all the faces in the image using the default HOG-based model.
#This method is fairly accurate, but not as accurate as the CNN model and notGPU accelerated.
#See also: find_faces_in_picture_cnn.py
face_locations = face_recognition.face_locations(image)
print("I found {} face(s) in this photograph.".format(len(face_locations)))
for face_location in face_locations:
# Print the location of each face in this image
top, right, bottom, left = face_location
print("A face is located at pixel location Top: {}, Left: {}, Bottom:{}, Right: {}".format(top, left, bottom, right))
# You can access the actual face itself like this:
face_image = image[top:bottom, left:right]
pil_image = Image.fromarray(face_image)
#pil_image.show()
pil_image.save("/home/*/project/Downs/images1/"+Image_List[i])