From 6360db8133f9dfd1e3863949abff25ebad76f629 Mon Sep 17 00:00:00 2001 From: light <1870499383@qq.com> Date: Sun, 25 Feb 2018 01:24:12 +0800 Subject: [PATCH] dlib note --- dlib/install.md | 36 ++++ dlib/note/dlib系列笔记0:开发环境.md | 110 ++++++++++ dlib/note/dlib系列笔记1:项目简介.md | 60 ++++++ dlib/note/dlib系列笔记2:获取数据.md | 12 ++ dlib/note/dlib系列笔记3:人脸检测.md | 192 ++++++++++++++++++ dlib/note/dlib系列笔记4:人脸校正.md | 0 dlib/note/dlib系列笔记5:人脸特征提取.md | 0 dlib/note/dlib系列笔记6:人脸聚类.md | 0 dlib/note/dlib系列笔记7:人脸识别.md | 1 + .../dlib系列笔记8:实时人脸识别和人脸追踪.md | 1 + docker/docker.md | 5 - mongodb/install.md | 8 + opencv/compile.md | 19 ++ opencv/install.md | 119 +++++++++++ opencv/make_a_video.md | 55 +++++ 15 files changed, 613 insertions(+), 5 deletions(-) create mode 100644 dlib/install.md create mode 100644 dlib/note/dlib系列笔记0:开发环境.md create mode 100644 dlib/note/dlib系列笔记1:项目简介.md create mode 100644 dlib/note/dlib系列笔记2:获取数据.md create mode 100644 dlib/note/dlib系列笔记3:人脸检测.md create mode 100644 dlib/note/dlib系列笔记4:人脸校正.md create mode 100644 dlib/note/dlib系列笔记5:人脸特征提取.md create mode 100644 dlib/note/dlib系列笔记6:人脸聚类.md create mode 100644 dlib/note/dlib系列笔记7:人脸识别.md create mode 100644 dlib/note/dlib系列笔记8:实时人脸识别和人脸追踪.md create mode 100644 mongodb/install.md create mode 100644 opencv/compile.md create mode 100644 opencv/install.md create mode 100644 opencv/make_a_video.md diff --git a/dlib/install.md b/dlib/install.md new file mode 100644 index 0000000..0d13a2b --- /dev/null +++ b/dlib/install.md @@ -0,0 +1,36 @@ +# dlib安装 + +## 安装编译源码 +``` bash +git clone https://github.com/davisking/dlib.git + +cd dlib +mkdir build +cd build +cmake .. -DDLIB_USE_CUDA=0 -DUSE_AVX_INSTRUCTIONS=1 +cmake --build . --config Release + +# 安装python包 +cd .. +python3 setup.py install --yes USE_AVX_INSTRUCTIONS --no DLIB_USE_CUDA +``` + +## 编译程序 + +- use g++ + +``` bash +g++ -std=c++11 -O3 -I.. dlib_package_root/dlib/dlib/all/source.cpp -lpthread -lX11 example_program_name.cpp +``` + +- use cmake + +> nano CMakeLists.txt + +``` bash +cmake_minimum_required(VERSION 2.8) +project(test) +add_subdirectory(/home/....../dlib/dlib dlib_build) +add_executable(main main.cpp) +target_link_libraries(face_detector dlib::dlib) +``` \ No newline at end of file diff --git a/dlib/note/dlib系列笔记0:开发环境.md b/dlib/note/dlib系列笔记0:开发环境.md new file mode 100644 index 0000000..eaf222a --- /dev/null +++ b/dlib/note/dlib系列笔记0:开发环境.md @@ -0,0 +1,110 @@ +# dlib系列笔记0:开发环境 + +> ubuntu 16.04 python3.5 opencv3.4.0 + +## opencv3.4.0 安装编译 + +``` bash +unzip opencv-3.4.0.zip +cd opencv + +sudo apt install cmake +sudo apt install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev + +mkdir my_build +cd my_build + +## cmake 中会下载安装一个大文件,网速会很慢 +cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. + +sudo make +sudo make install + +sudo gedit /etc/ld.so.conf.d/opencv.conf + +# add this +" +/usr/local/lib +" + +sudo ldconfig + +sudo gedit /etc/bash.bashrc + +# add this +" +PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig +export PKG_CONFIG_PATH +" + +source /etc/bash.bashrc +sudo updatedb + +# test + +cd opencv***/smaples/cpp/example_cmake +cmake . +make +./opencv_example + +# and you will see yourself +# compete + +``` + + +## dlib 安装编译 + +``` bash +git clone https://github.com/davisking/dlib.git + +cd dlib +mkdir build +cd build +cmake .. -DDLIB_USE_CUDA=0 -DUSE_AVX_INSTRUCTIONS=1 +cmake --build . --config Release + +# 安装python包 +cd .. +python3 setup.py install --yes USE_AVX_INSTRUCTIONS --no DLIB_USE_CUDA +``` + +## 编译opencv程序 + + - use g++ +``` bash +g++ main.cpp `pkg-config opencv --cflags --libs` +``` + + +- use cmake + +> nano CMakeLists.txt + +``` bash +cmake_minimum_required(VERSION 2.8) +project(test) +find_package(OpenCV REQUIRED) +add_executable(main main.cpp) +target_link_libraries(main ${OpenCV_LIBS}) +``` + +## 编译 dlib 程序 + +- use g++ + +``` bash +g++ -std=c++11 -O3 -I.. dlib_package_root/dlib/dlib/all/source.cpp -lpthread -lX11 example_program_name.cpp +``` + +- use cmake + +> nano CMakeLists.txt + +``` bash +cmake_minimum_required(VERSION 2.8) +project(test) +add_subdirectory(/home/....../dlib/dlib dlib_build) +add_executable(main main.cpp) +target_link_libraries(face_detector dlib::dlib) +``` diff --git a/dlib/note/dlib系列笔记1:项目简介.md b/dlib/note/dlib系列笔记1:项目简介.md new file mode 100644 index 0000000..6fcb3ae --- /dev/null +++ b/dlib/note/dlib系列笔记1:项目简介.md @@ -0,0 +1,60 @@ +# dlib系列笔记1:项目简介 + +## 要完成的目标或功能 + +- 人脸检测 +- 人脸特征提取 +- 人脸识别 +- 用摄像头实时完成以上三种功能 +- 用python、cpp完成以上三种功能 +- 移植到树莓派上 + +## 项目文件结构 + +> 项目地址: https://github.com/lightjiang/FaceRecognize.git + +``` bash +. +├── cpp_src # cpp 源码 +│ ├── CMakeLists.txt +│ ├── face_detector.cpp +│ ├── mybase.hpp +│ └── video_tracker.cpp +├── data # 图片数据 +│ ├── auto_download_img +│ ├── crowd +│ ├── frontal +│ ├── profile +│ └── star +├── model # 模型 下载链接见 http://dlib.net/files/ +│ ├── dlib_face_recognition_resnet_model_v1.dat +│ ├── mmod_human_face_detector.dat +│ ├── shape_predictor_5_face_landmarks.dat +│ └── shape_predictor_68_face_landmarks.dat +├── results # 存储人脸识别数据结果 +│ ├── known # 人脸图片 +│ │ ├── fee26871-0f30-11e8-93de-a0c589189417.jpg +| | ..... +│ │ └── fef129db-0da9-11e8-93de-a0c589189417.jpg +│ ├── known_faces # 存人脸数据,如名称,来源,图片保存路径 +│ ├── known_vectors # 存人脸特征 +│ └── vedio +├── script +│ ├── download_baidu_img.py +│ ├── download_star_img.py +│ ├── __init__.py +│ ├── reform_star_data.py +│ └── rename_img_in_dir.py +├── base.py +├── face_alignment.py +├── face_clustering.py +├── face_detector.py +├── face_features.py +├── face_recognition.py +├── face_recognize_in_vedio.py +├── settings.py +├── uming.ttc +├── utils.py +├── README.md +└── vedio_base.py +``` diff --git a/dlib/note/dlib系列笔记2:获取数据.md b/dlib/note/dlib系列笔记2:获取数据.md new file mode 100644 index 0000000..df40270 --- /dev/null +++ b/dlib/note/dlib系列笔记2:获取数据.md @@ -0,0 +1,12 @@ +# dlib系列笔记2:获取数据 + +源码参考 +``` bash +├── script +│ ├── download_baidu_img.py +│ ├── download_star_img.py +``` + +分别用两个脚本获取百度相关主题词图片和明星图库图片 + +注:检查文件保存路径等,先少量获取数据测试在完整运行 \ No newline at end of file diff --git a/dlib/note/dlib系列笔记3:人脸检测.md b/dlib/note/dlib系列笔记3:人脸检测.md new file mode 100644 index 0000000..371f773 --- /dev/null +++ b/dlib/note/dlib系列笔记3:人脸检测.md @@ -0,0 +1,192 @@ +# dlib系列笔记3:人脸检测 + +## 效果图 + +![img1](https://raw.githubusercontent.com/lightjiang/FaceRecognize/master/results/others/1.png) + +## 源码 + +截取重要类的实现片段 +具体源码参考 https://github.com/lightjiang/FaceRecognize.git + +- base.py + +``` python +class Base(object): + base_path = BASEPATH + + def __init__(self): + self.img = None + self.img_path = '' + + def load_img(self, path, relative=True, flags=cv2.IMREAD_COLOR): + # 自动从web加载图片 + if path.startswith('http'): + path = self.download_web_img(path) + + img_path = path + if relative: + path = os.path.join(self.base_path, path) + if os.path.exists(path): + res = cv2.imread(path, flags=flags) + # 转换图片通道, opencv默认bgr格式,dlib需要rgb格式 + self.img = cv2.cvtColor(res, cv2.COLOR_BGR2RGB) + self.img_path = img_path + return self.img + else: + raise FileNotFoundError(path) + + def download_web_img(self, url): + path = 'data/auto_download_img/%s.jpg' % uuid.uuid1() + # 复制的百度图片链接有时会下载异常 + request.urlretrieve(url, path) + print('download complete') + return path + + def save_img(self, img, path, relative=True): + if relative: + path = os.path.join(self.base_path, path) + cv2.imwrite(path, cv2.cvtColor(img, cv2.COLOR_RGB2BGR)) + + def add_marks(self, pos, color=None): + # 在self.img 上添加标记 + if isinstance(pos, tuple): + pos = [pos] + elif isinstance(pos, list): + pos = pos + else: + raise AttributeError + + if not color: + color = (0, 255, 0) + for p in pos: + cv2.circle(self.img, p, 2, color, 1) + + def add_faces(self, faces, show_score=True, color=None, add_text=None): + # 在self.img 上添加脸部识别框 + if isinstance(faces, dict): + faces = [faces] + elif isinstance(faces, list): + faces = faces + else: + raise AttributeError + for face in faces: + rect = face['position'] + if not color: + color = (255, 0, 0) + cv2.rectangle(self.img, (rect.left(), rect.top()), (rect.right(), rect.bottom()), color, 3) + if show_score and 'score' in face: + score = face['score'] + width = rect.right() - rect.left() + cv2.putText(self.img, str(round(score, 3)), (rect.left() + 10, rect.bottom() - 10), cv2.FONT_HERSHEY_SIMPLEX, width/120, + (255, 255, 255), 1) + if add_text: + width = rect.right() - rect.left() + cv2.putText(self.img, str(add_text), (rect.left() + 10, rect.bottom() - 10), + cv2.FONT_HERSHEY_SIMPLEX, width / 120, + (255, 255, 255), 1) +``` + + + +- face_detector.py + +``` python +class FaceDetector(Base): + """ + based on HOG + """ + def __init__(self): + self.face_detector = dlib.get_frontal_face_detector() + super().__init__() + + def detect_face(self, log_status=True): + if self.img is None: + raise AttributeError('please load img before detect') + t = time.time() + dets, scores, idx = self.face_detector.run(self.img, 1, -1) + res = [] + for index, face in enumerate(dets): + temp = { + 'id': str(uuid.uuid1()), + 'position': face, + 'score': scores[index], + 'src': self.img_path + } + if scores[index] > 0: + res.append(temp) + if log_status: + print("Detecting faces takes: {}s\nNumber of faces detected: {}".format(time.time() - t, len(res))) + return res + + def detect_faces_from_imgs(self, imgs: list): + t = time.time() + res = [] + for img_path in imgs: + self.load_img(img_path) + res += self.detect_face(log_status=False) + self.img = None + print("Detecting faces takes: {}s\nNumber of faces detected: {}".format(time.time() - t, len(res))) + return res +``` + +- cpp_src/face_detector.cpp + +``` cpp +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mybase.hpp" + +using namespace dlib; +using namespace std; + +// ---------------------------------------------------------------------------------------- + + +int main(int argc, char **argv) +{ + try + { + if (argc == 1) + { + cout << "Give some image files as arguments to this program." << endl; + return 0; + } + + frontal_face_detector detector = get_frontal_face_detector(); + + // Loop over all the images provided on the command line. + for (int i = 1; i < argc; ++i) + { + cout << "processing image " << argv[i] << endl; + cv::Mat image; + image = cv::imread(argv[i], cv::IMREAD_COLOR); + dlib::cv_image img(image); + std::vector dets = detector(img); + cout << "Number of faces detected: " << dets.size() << dets[0].left() < nano CMakeLists.txt + +``` bash +cmake_minimum_required(VERSION 2.8) +project(test) +find_package(OpenCV REQUIRED) +add_executable(main main.cpp) +target_link_libraries(main ${OpenCV_LIBS}) +``` \ No newline at end of file diff --git a/opencv/install.md b/opencv/install.md new file mode 100644 index 0000000..4a9b924 --- /dev/null +++ b/opencv/install.md @@ -0,0 +1,119 @@ +# opencv 环境部署指南 + +> http://blog.csdn.net/cocoaqin/article/details/78163171 + +> http://blog.csdn.net/eds95/article/details/78870194 + + +## ubuntu + +``` bash +unzip opencv-3.4.0.zip +cd opencv + +sudo apt install cmake +sudo apt install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev + +mkdir my_build +cd my_build + +## cmake 中会下载安装一个大文件,网速会很慢 +cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. + +sudo make +sudo make install + +sudo gedit /etc/ld.so.conf.d/opencv.conf + +# add this +" +/usr/local/lib +" + +sudo ldconfig + +sudo gedit /etc/bash.bashrc + +# add this +" +PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig +export PKG_CONFIG_PATH +" + +source /etc/bash.bashrc +sudo updatedb + +# test + +cd opencv***/smaples/cpp/example_cmake +cmake . +make +./opencv_example + +# and you will see yourself +# compete + +``` + + +## raspberry + +``` bash +sudo apt update +sudo apt upgrade + +sudo rpi-update +sudo reboot + +# 图像io库 +sudo apt install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev + +# 视频处理库 +sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev +sudo apt install libxvidcore-dev libx264-dev + +# 安装gtk, 用于opencv gui显示 +sudo apt install libgtk2.0-dev + + +sudo apt install libatlas-base-dev gfortran + + +# 安装python 环境 +sudo apt-get install python2.7-dev python3-dev +sudo apt-get install build-essential libssl-dev libevent-dev libjpeg-dev libxml2-dev libxslt-dev + +unzip .... + +cd opencv +mkdir build +cd build +# warning change your path +cmake -D CMAKE_BUILD_TYPE=RELEASE \ + -D CMAKE_INSTALL_PREFIX=/usr/local \ + -D OPENCV_EXTRA_MODULES_PATH=/program/opencv_contrib-3.3.0/modules \ + -D ENABLE_NEON=ON \ + -D ENABLE_VFPV3=ON \ + -D BUILD_TESTS=OFF \ + -D INSTALL_PYTHON_EXAMPLES=OFF \ + -D BUILD_EXAMPLES=OFF .. + +# 修改swap空间大小 +vi /etc/dphys-swapfile +# 找到CONF_SWAPSIZE=100改为1024 +# set size to absolute value, leaving empty (default) then uses computed value +# you most likely don't want this, unless you have an special disk situation +CONF_SWAPSIZE=1024 + +sudo /etc/init.d/dphys-swapfile stop +sudo /etc/init.d/dphys-swapfile start + +make -j4 +sudo make install +sudo ldconfig + + +xhost + +export DISPLAY=:0.0 + +``` \ No newline at end of file diff --git a/opencv/make_a_video.md b/opencv/make_a_video.md new file mode 100644 index 0000000..f6f88a4 --- /dev/null +++ b/opencv/make_a_video.md @@ -0,0 +1,55 @@ +# 利用opencv录制视频 + +``` cpp +#include +#include +#include +#include +#include + +using namespace cv; +using namespace std; + +int main( ) +{ + VideoCapture capture(0);//如果是笔记本,0打开的是自带的摄像头,1 打开外接的相机 + Mat img; + VideoWriter vw; //新建一个多媒体文件 + namedWindow( "cam" ); + + int fps = capture.get(CAP_PROP_FPS ); //获取摄像头的帧率 + cout << capture.get( CAP_PROP_FRAME_WIDTH )<