Compare commits
1 Commits
for_patch
...
customize_
| Author | SHA1 | Date | |
|---|---|---|---|
| 58466ce87b |
6
.idea/Dlib_face_recognition_from_camera.iml
generated
@ -1,14 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/data" isTestSource="false" />
|
||||
</content>
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
<component name="TestRunnerService">
|
||||
<option name="projectConfiguration" value="pytest" />
|
||||
<option name="projectConfiguration" value="py.test" />
|
||||
<option name="PROJECT_TEST_RUNNER" value="py.test" />
|
||||
</component>
|
||||
</module>
|
||||
278
.idea/workspace.xml
generated
@ -1,9 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="e58b655a-3a9b-4001-b4da-39e07ab46629" name="Default Changelist" comment="">
|
||||
<list default="true" id="39c25e36-24e3-48b8-a41f-0d53e408e855" name="Default" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/README.rst" beforeDir="false" afterPath="$PROJECT_DIR$/README.rst" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/face_reco_from_camera.py" beforeDir="false" afterPath="$PROJECT_DIR$/face_reco_from_camera.py" afterDir="false" />
|
||||
</list>
|
||||
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
@ -11,47 +12,16 @@
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="FUSProjectUsageTrigger">
|
||||
<session id="2127136746">
|
||||
<usages-collector id="statistics.lifecycle.project">
|
||||
<counts>
|
||||
<entry key="project.closed" value="1" />
|
||||
<entry key="project.open.time.4" value="1" />
|
||||
<entry key="project.open.time.5" value="1" />
|
||||
<entry key="project.opened" value="2" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
<usages-collector id="statistics.file.extensions.open">
|
||||
<counts>
|
||||
<entry key="png" value="1" />
|
||||
<entry key="txt" value="1" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
<usages-collector id="statistics.file.types.open">
|
||||
<counts>
|
||||
<entry key="Image" value="1" />
|
||||
<entry key="PLAIN_TEXT" value="1" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
<usages-collector id="statistics.file.extensions.edit">
|
||||
<counts>
|
||||
<entry key="rst" value="2" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
<usages-collector id="statistics.file.types.edit">
|
||||
<counts>
|
||||
<entry key="ReST" value="2" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
</session>
|
||||
</component>
|
||||
<component name="FileEditorManager">
|
||||
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/get_faces_from_camera.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="67">
|
||||
<caret line="12" column="34" selection-start-line="12" selection-start-column="34" selection-end-line="12" selection-end-column="34" />
|
||||
<state relative-caret-position="176">
|
||||
<caret line="172" selection-start-line="172" selection-end-line="172" />
|
||||
<folding>
|
||||
<element signature="e#277#310#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
@ -59,42 +29,30 @@
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/get_features_into_CSV.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="83">
|
||||
<caret line="16" lean-forward="true" selection-start-line="16" selection-end-line="16" />
|
||||
<folding>
|
||||
<element signature="e#491#501#0" expanded="true" />
|
||||
</folding>
|
||||
<state relative-caret-position="270">
|
||||
<caret line="56" column="24" selection-start-line="56" selection-start-column="24" selection-end-line="56" selection-end-column="24" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/face_reco_from_camera.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="127">
|
||||
<caret line="89" column="22" lean-forward="true" selection-start-line="89" selection-start-column="22" selection-end-line="89" selection-end-column="22" />
|
||||
<folding>
|
||||
<element signature="e#230#264#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/requirements.txt">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="76">
|
||||
<caret line="4" column="16" lean-forward="true" selection-start-line="4" selection-start-column="16" selection-end-line="4" selection-end-column="16" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/introduction/face_reco_two_people_in_database.png">
|
||||
<provider selected="true" editor-type-id="images" />
|
||||
<entry file="file://$PROJECT_DIR$/data/features_all.csv">
|
||||
<provider selected="true" editor-type-id="csv-text-editor" />
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/face_reco_from_camera.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="195">
|
||||
<caret line="96" selection-start-line="96" selection-end-line="96" />
|
||||
<folding>
|
||||
<element signature="e#201#234#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/README.rst">
|
||||
<provider selected="true" editor-type-id="restructured-text-editor" />
|
||||
</entry>
|
||||
@ -102,7 +60,7 @@
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/how_to_use_camera.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="513">
|
||||
<state relative-caret-position="15">
|
||||
<caret line="27" column="13" selection-start-line="27" selection-start-column="13" selection-end-line="27" selection-end-column="13" />
|
||||
</state>
|
||||
</provider>
|
||||
@ -110,21 +68,71 @@
|
||||
</file>
|
||||
</leaf>
|
||||
</component>
|
||||
<component name="FileTemplateManagerImpl">
|
||||
<option name="RECENT_TEMPLATES">
|
||||
<list>
|
||||
<option value="Python Script" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="FindInProjectRecents">
|
||||
<findStrings>
|
||||
<find>rects</find>
|
||||
<find>i</find>
|
||||
<find>dets</find>
|
||||
<find>cnt_p</find>
|
||||
<find>im_rd</find>
|
||||
<find>predictor</find>
|
||||
<find>:</find>
|
||||
<find>,</find>
|
||||
<find>pre_clear</find>
|
||||
<find>np</find>
|
||||
<find>path_make_dir</find>
|
||||
<find>path_csvs_from_photos</find>
|
||||
<find>path_faces_rd</find>
|
||||
<find>path_csv</find>
|
||||
<find>path_csv_from_photos_rd</find>
|
||||
<find>feature_mean</find>
|
||||
<find>dir_pics</find>
|
||||
<find>current_face_dir</find>
|
||||
<find>person_cnt</find>
|
||||
<find>cnt_ss</find>
|
||||
</findStrings>
|
||||
<replaceStrings>
|
||||
<replace>feature_num</replace>
|
||||
<replace>faces</replace>
|
||||
<replace>cnt_ss</replace>
|
||||
<replace>,</replace>
|
||||
<replace>img_rd</replace>
|
||||
<replace>:</replace>
|
||||
<replace>pre_work</replace>
|
||||
<replace>path_csvs_from_photos</replace>
|
||||
<replace>path_photos_from_camera</replace>
|
||||
<replace>path_csv_from_photos</replace>
|
||||
<replace>feature_mean_list</replace>
|
||||
<replace>photos_list</replace>
|
||||
</replaceStrings>
|
||||
</component>
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
</component>
|
||||
<component name="IdeDocumentHistory">
|
||||
<option name="CHANGED_PATHS">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/requirements.txt" />
|
||||
<option value="$PROJECT_DIR$/use_camera.py" />
|
||||
<option value="$PROJECT_DIR$/how_to_use_camera.py" />
|
||||
<option value="$PROJECT_DIR$/get_features_into_CSV.py" />
|
||||
<option value="$PROJECT_DIR$/test.py" />
|
||||
<option value="$PROJECT_DIR$/get_faces_from_camera.py" />
|
||||
<option value="$PROJECT_DIR$/README.rst" />
|
||||
<option value="$PROJECT_DIR$/face_reco_from_camera.py" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectFrameBounds">
|
||||
<option name="x" value="740" />
|
||||
<option name="y" value="86" />
|
||||
<option name="width" value="1194" />
|
||||
<option name="x" value="438" />
|
||||
<option name="y" value="28" />
|
||||
<option name="width" value="1717" />
|
||||
<option name="height" value="987" />
|
||||
</component>
|
||||
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
|
||||
@ -145,11 +153,6 @@
|
||||
<item name="Dlib_face_recognition_from_camera" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="data" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="Dlib_face_recognition_from_camera" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="Dlib_face_recognition_from_camera" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="introduction" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
</expand>
|
||||
<select />
|
||||
</subPane>
|
||||
@ -157,6 +160,17 @@
|
||||
<pane id="Scope" />
|
||||
</panes>
|
||||
</component>
|
||||
<component name="PropertiesComponent">
|
||||
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
|
||||
<property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" />
|
||||
</component>
|
||||
<component name="PyConsoleOptionsProvider">
|
||||
<option name="myPythonConsoleState">
|
||||
<console-settings is-module-sdk="true">
|
||||
<option name="myUseModuleSdk" value="true" />
|
||||
</console-settings>
|
||||
</option>
|
||||
</component>
|
||||
<component name="RunDashboard">
|
||||
<option name="ruleStates">
|
||||
<list>
|
||||
@ -233,16 +247,62 @@
|
||||
<option name="INPUT_FILE" value="" />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="how_to_use_camera" type="PythonConfigurationType" factoryName="Python" temporary="true">
|
||||
<module name="Dlib_face_recognition_from_camera" />
|
||||
<option name="INTERPRETER_OPTIONS" value="" />
|
||||
<option name="PARENT_ENVS" value="true" />
|
||||
<envs>
|
||||
<env name="PYTHONUNBUFFERED" value="1" />
|
||||
</envs>
|
||||
<option name="SDK_HOME" value="" />
|
||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||
<option name="IS_MODULE_SDK" value="true" />
|
||||
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/how_to_use_camera.py" />
|
||||
<option name="PARAMETERS" value="" />
|
||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||
<option name="EMULATE_TERMINAL" value="false" />
|
||||
<option name="MODULE_MODE" value="false" />
|
||||
<option name="REDIRECT_INPUT" value="false" />
|
||||
<option name="INPUT_FILE" value="" />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="test" type="PythonConfigurationType" factoryName="Python" temporary="true">
|
||||
<module name="Dlib_face_recognition_from_camera" />
|
||||
<option name="INTERPRETER_OPTIONS" value="" />
|
||||
<option name="PARENT_ENVS" value="true" />
|
||||
<envs>
|
||||
<env name="PYTHONUNBUFFERED" value="1" />
|
||||
</envs>
|
||||
<option name="SDK_HOME" value="" />
|
||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||
<option name="IS_MODULE_SDK" value="true" />
|
||||
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test.py" />
|
||||
<option name="PARAMETERS" value="" />
|
||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||
<option name="EMULATE_TERMINAL" value="false" />
|
||||
<option name="MODULE_MODE" value="false" />
|
||||
<option name="REDIRECT_INPUT" value="false" />
|
||||
<option name="INPUT_FILE" value="" />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<list>
|
||||
<item itemvalue="Python.face_reco_from_camera" />
|
||||
<item itemvalue="Python.get_faces_from_camera" />
|
||||
<item itemvalue="Python.get_features_into_CSV" />
|
||||
<item itemvalue="Python.face_reco_from_camera" />
|
||||
<item itemvalue="Python.how_to_use_camera" />
|
||||
<item itemvalue="Python.test" />
|
||||
</list>
|
||||
<recent_temporary>
|
||||
<list>
|
||||
<item itemvalue="Python.face_reco_from_camera" />
|
||||
<item itemvalue="Python.get_features_into_CSV" />
|
||||
<item itemvalue="Python.get_faces_from_camera" />
|
||||
<item itemvalue="Python.test" />
|
||||
<item itemvalue="Python.how_to_use_camera" />
|
||||
</list>
|
||||
</recent_temporary>
|
||||
</component>
|
||||
@ -251,7 +311,7 @@
|
||||
</component>
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
<changelist id="e58b655a-3a9b-4001-b4da-39e07ab46629" name="Default Changelist" comment="" />
|
||||
<changelist id="39c25e36-24e3-48b8-a41f-0d53e408e855" name="Default" comment="" />
|
||||
<created>1538622047029</created>
|
||||
<option name="number" value="Default" />
|
||||
<option name="presentableId" value="Default" />
|
||||
@ -260,21 +320,21 @@
|
||||
<servers />
|
||||
</component>
|
||||
<component name="ToolWindowManager">
|
||||
<frame x="842" y="68" width="1194" height="987" extended-state="0" />
|
||||
<frame x="0" y="27" width="1920" height="988" extended-state="6" />
|
||||
<editor active="true" />
|
||||
<layout>
|
||||
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.28200692" />
|
||||
<window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.13502109" />
|
||||
<window_info id="Structure" order="1" weight="0.25" />
|
||||
<window_info id="Favorites" order="2" side_tool="true" />
|
||||
<window_info anchor="bottom" id="Message" order="0" />
|
||||
<window_info anchor="bottom" id="Find" order="1" />
|
||||
<window_info anchor="bottom" id="Run" order="2" visible="true" weight="0.4976526" />
|
||||
<window_info active="true" anchor="bottom" id="Run" order="2" visible="true" weight="0.035252646" />
|
||||
<window_info anchor="bottom" id="Debug" order="3" weight="0.39952996" />
|
||||
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
|
||||
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
|
||||
<window_info anchor="bottom" id="TODO" order="6" />
|
||||
<window_info anchor="bottom" id="Version Control" order="7" weight="0.32983682" />
|
||||
<window_info anchor="bottom" id="Terminal" order="8" weight="0.39976552" />
|
||||
<window_info anchor="bottom" id="Version Control" order="7" />
|
||||
<window_info anchor="bottom" id="Terminal" order="8" weight="0.4620462" />
|
||||
<window_info anchor="bottom" id="Event Log" order="9" side_tool="true" />
|
||||
<window_info anchor="bottom" id="Python Console" order="10" />
|
||||
<window_info anchor="right" id="Commander" order="0" weight="0.4" />
|
||||
@ -282,9 +342,6 @@
|
||||
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
|
||||
</layout>
|
||||
</component>
|
||||
<component name="VcsContentAnnotationSettings">
|
||||
<option name="myLimit" value="2678400000" />
|
||||
</component>
|
||||
<component name="XDebuggerManager">
|
||||
<breakpoint-manager>
|
||||
<default-breakpoints>
|
||||
@ -303,55 +360,52 @@
|
||||
<entry file="file://$PROJECT_DIR$/data/data_csvs_from_camera/person_1.csv" />
|
||||
<entry file="file://$PROJECT_DIR$/data/data_csvs_from_camera/person_2.csv" />
|
||||
<entry file="file://$PROJECT_DIR$/data/data_faces_from_camera/person_6/img_face_1.jpg" />
|
||||
<entry file="file://$PROJECT_DIR$/test.py" />
|
||||
<entry file="file://$PROJECT_DIR$/data/features_all.csv" />
|
||||
<entry file="file://$PROJECT_DIR$/introduction/face_reco_single_person_custmize_name.png" />
|
||||
<entry file="file://$PROJECT_DIR$/test.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="30">
|
||||
<caret line="2" column="28" selection-start-line="2" selection-start-column="6" selection-end-line="2" selection-end-column="28" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/README.rst">
|
||||
<provider selected="true" editor-type-id="restructured-text-editor" />
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/how_to_use_camera.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="513">
|
||||
<state relative-caret-position="15">
|
||||
<caret line="27" column="13" selection-start-line="27" selection-start-column="13" selection-end-line="27" selection-end-column="13" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/data/features_all.csv">
|
||||
<provider selected="true" editor-type-id="csv-text-editor" />
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/get_features_into_CSV.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="83">
|
||||
<caret line="16" lean-forward="true" selection-start-line="16" selection-end-line="16" />
|
||||
<folding>
|
||||
<element signature="e#491#501#0" expanded="true" />
|
||||
</folding>
|
||||
<state relative-caret-position="270">
|
||||
<caret line="56" column="24" selection-start-line="56" selection-start-column="24" selection-end-line="56" selection-end-column="24" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/get_faces_from_camera.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="67">
|
||||
<caret line="12" column="34" selection-start-line="12" selection-start-column="34" selection-end-line="12" selection-end-column="34" />
|
||||
<state relative-caret-position="176">
|
||||
<caret line="172" selection-start-line="172" selection-end-line="172" />
|
||||
<folding>
|
||||
<element signature="e#277#310#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/face_reco_from_camera.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="127">
|
||||
<caret line="89" column="22" lean-forward="true" selection-start-line="89" selection-start-column="22" selection-end-line="89" selection-end-column="22" />
|
||||
<state relative-caret-position="195">
|
||||
<caret line="96" selection-start-line="96" selection-end-line="96" />
|
||||
<folding>
|
||||
<element signature="e#230#264#0" expanded="true" />
|
||||
<element signature="e#201#234#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/requirements.txt">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="76">
|
||||
<caret line="4" column="16" lean-forward="true" selection-start-line="4" selection-start-column="16" selection-end-line="4" selection-end-column="16" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/introduction/face_reco_two_people_in_database.png">
|
||||
<provider selected="true" editor-type-id="images" />
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/README.rst">
|
||||
<provider selected="true" editor-type-id="restructured-text-editor" />
|
||||
</entry>
|
||||
</component>
|
||||
</project>
|
||||
41
README.rst
@ -14,12 +14,6 @@ Detect and recognize single/multi-faces from camera;
|
||||
.. image:: introduction/get_face_from_camera.png
|
||||
:align: center
|
||||
|
||||
请不要离摄像头过近,人脸超出摄像头范围时会有 "OUT OF RANGE" 提醒 /
|
||||
Please do not too close to the camera, or you can't save faces with "OUT OF RANGE" warning;
|
||||
|
||||
.. image:: introduction/get_face_from_camera_out_of_range.png
|
||||
:align: center
|
||||
|
||||
#. 提取特征建立人脸数据库 / Generate database from images captured
|
||||
#. 利用摄像头进行人脸识别 / Face recognizer
|
||||
|
||||
@ -29,53 +23,33 @@ Detect and recognize single/multi-faces from camera;
|
||||
:align: center
|
||||
|
||||
当多张人脸 / When multi-faces:
|
||||
|
||||
一张已录入人脸 + 未录入 unknown 人脸:
|
||||
|
||||
|
||||
.. image:: introduction/face_reco_two_people.png
|
||||
:align: center
|
||||
|
||||
同时识别多张已录入人脸:
|
||||
|
||||
.. image:: introduction/face_reco_two_people_in_database.png
|
||||
:align: center
|
||||
|
||||
** 关于精度 / About accuracy:
|
||||
|
||||
* When using a distance threshold of ``0.6``, the dlib model obtains an accuracy of ``99.38%`` on the standard LFW face recognition benchmark.
|
||||
|
||||
Overview
|
||||
********
|
||||
|
||||
此项目中人脸识别的实现流程 / The design of this repo:
|
||||
|
||||
.. image:: introduction/overview.png
|
||||
:align: center
|
||||
|
||||
Steps
|
||||
*****
|
||||
|
||||
#. 下载源码 / Download from website or via GitHub Desktop in windows, or clone repo in Ubuntu
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
git clone https://github.com/coneypo/Dlib_face_recognition_from_camera
|
||||
|
||||
#. 进行 face register / 人脸信息采集录入
|
||||
|
||||
.. code-block:: bash
|
||||
.. code-block:: python
|
||||
|
||||
python3 get_face_from_camera.py
|
||||
|
||||
#. 提取所有录入人脸数据存入 features_all.csv
|
||||
|
||||
.. code-block:: bash
|
||||
.. code-block:: python
|
||||
|
||||
python3 get_features_into_CSV.py
|
||||
|
||||
#. 调用摄像头进行实时人脸识别
|
||||
|
||||
.. code-block:: bash
|
||||
.. code-block:: python
|
||||
|
||||
python3 face_reco_from_camera.py
|
||||
|
||||
@ -109,11 +83,6 @@ Python 源码介绍如下:
|
||||
|
||||
* 将捕获到的人脸数据和之前存的人脸数据进行对比计算欧式距离, 由此判断是否是同一个人;
|
||||
|
||||
修改显示的人名 / If you want customize the names shown, please refer to this patch and modify the code: https://github.com/coneypo/Dlib_face_recognition_from_camera/commit/58466ce87bf3a42ac5ef855b791bf8c658d408df?diff=unified
|
||||
|
||||
|
||||
.. image:: introduction/face_reco_single_person_customize_name.png
|
||||
:align: center
|
||||
|
||||
More
|
||||
****
|
||||
@ -137,4 +106,4 @@ For more details, please refer to my blog (in chinese) or mail to me /
|
||||
|
||||
仅限于交流学习, 商业合作勿扰;
|
||||
|
||||
Thanks for your support.
|
||||
Thanks for your support.
|
||||
|
||||
@ -1,12 +1,11 @@
|
||||
# 摄像头实时人脸识别
|
||||
# Real-time face recognition
|
||||
|
||||
# Author: coneypo
|
||||
# Blog: http://www.cnblogs.com/AdaminXie
|
||||
# GitHub: https://github.com/coneypo/Dlib_face_recognition_from_camera
|
||||
|
||||
# Created at 2018-05-11
|
||||
# Updated at 2019-03-23
|
||||
# Updated at 2019-02-26
|
||||
|
||||
import dlib # 人脸处理的库 Dlib
|
||||
import numpy as np # 数据处理的库 numpy
|
||||
@ -15,12 +14,10 @@ import pandas as pd # 数据处理的库 Pandas
|
||||
|
||||
# 人脸识别模型,提取128D的特征矢量
|
||||
# face recognition model, the object maps human faces into 128D vectors
|
||||
# Refer this tutorial: http://dlib.net/python/index.html#dlib.face_recognition_model_v1
|
||||
facerec = dlib.face_recognition_model_v1("data/data_dlib/dlib_face_recognition_resnet_model_v1.dat")
|
||||
|
||||
|
||||
# 计算两个128D向量间的欧式距离
|
||||
# compute the e-distance between two 128D features
|
||||
def return_euclidean_distance(feature_1, feature_2):
|
||||
feature_1 = np.array(feature_1)
|
||||
feature_2 = np.array(feature_2)
|
||||
@ -37,12 +34,14 @@ def return_euclidean_distance(feature_1, feature_2):
|
||||
path_features_known_csv = "data/features_all.csv"
|
||||
csv_rd = pd.read_csv(path_features_known_csv, header=None)
|
||||
|
||||
# 存储的特征人脸个数
|
||||
# print(csv_rd.shape[0])
|
||||
|
||||
# 用来存放所有录入人脸特征的数组
|
||||
# the array to save the features of faces in the database
|
||||
features_known_arr = []
|
||||
|
||||
# 读取已知人脸数据
|
||||
# print known faces
|
||||
# known faces
|
||||
for i in range(csv_rd.shape[0]):
|
||||
features_someone_arr = []
|
||||
for j in range(0, len(csv_rd.ix[i, :])):
|
||||
@ -51,21 +50,31 @@ for i in range(csv_rd.shape[0]):
|
||||
print("Faces in Database:", len(features_known_arr))
|
||||
|
||||
# Dlib 检测器和预测器
|
||||
# The detector and predictor will be used
|
||||
detector = dlib.get_frontal_face_detector()
|
||||
predictor = dlib.shape_predictor('data/data_dlib/shape_predictor_68_face_landmarks.dat')
|
||||
|
||||
# 创建 cv2 摄像头对象
|
||||
# cv2.VideoCapture(0) to use the default camera of PC,
|
||||
# and you can use local video name by use cv2.VideoCapture(filename)
|
||||
cap = cv2.VideoCapture(0)
|
||||
|
||||
# cap.set(propId, value)
|
||||
# 设置视频参数,propId 设置的视频参数,value 设置的参数值
|
||||
cap.set(3, 480)
|
||||
|
||||
|
||||
# 返回一张图像多张人脸的 128D 特征
|
||||
def get_128d_features(img_gray):
|
||||
faces = detector(img_gray, 1)
|
||||
if len(faces) != 0:
|
||||
face_des = []
|
||||
for i in range(len(faces)):
|
||||
shape = predictor(img_gray, faces[i])
|
||||
face_des.append(facerec.compute_face_descriptor(img_gray, shape))
|
||||
else:
|
||||
face_des = []
|
||||
return face_des
|
||||
|
||||
|
||||
# cap.isOpened() 返回 true/false 检查初始化是否成功
|
||||
# when the camera is open
|
||||
while cap.isOpened():
|
||||
|
||||
flag, img_rd = cap.read()
|
||||
@ -77,42 +86,36 @@ while cap.isOpened():
|
||||
# 人脸数 faces
|
||||
faces = detector(img_gray, 0)
|
||||
|
||||
# 待会要写的字体 font to write later
|
||||
# 待会要写的字体
|
||||
font = cv2.FONT_HERSHEY_COMPLEX
|
||||
|
||||
# 存储当前摄像头中捕获到的所有人脸的坐标/名字
|
||||
# the list to save the positions and names of current faces captured
|
||||
pos_namelist = []
|
||||
name_namelist = []
|
||||
|
||||
# 按下 q 键退出
|
||||
# press 'q' to exit
|
||||
if kk == ord('q'):
|
||||
break
|
||||
else:
|
||||
# 检测到人脸 when face detected
|
||||
# 检测到人脸
|
||||
if len(faces) != 0:
|
||||
# 获取当前捕获到的图像的所有人脸的特征,存储到 features_cap_arr
|
||||
# get the features captured and save into features_cap_arr
|
||||
features_cap_arr = []
|
||||
for i in range(len(faces)):
|
||||
shape = predictor(img_rd, faces[i])
|
||||
features_cap_arr.append(facerec.compute_face_descriptor(img_rd, shape))
|
||||
|
||||
# 遍历捕获到的图像中所有的人脸
|
||||
# traversal all the faces in the database
|
||||
for k in range(len(faces)):
|
||||
# 让人名跟随在矩形框的下方
|
||||
# 确定人名的位置坐标
|
||||
# 先默认所有人不认识,是 unknown
|
||||
# set the default names of faces with "unknown"
|
||||
name_namelist.append("unknown")
|
||||
|
||||
# 每个捕获人脸的名字坐标 the positions of faces captured
|
||||
# 每个捕获人脸的名字坐标
|
||||
pos_namelist.append(tuple([faces[k].left(), int(faces[k].bottom() + (faces[k].bottom() - faces[k].top())/4)]))
|
||||
|
||||
# 对于某张人脸,遍历所有存储的人脸特征
|
||||
# for every faces detected, compare the faces in the database
|
||||
for i in range(len(features_known_arr)):
|
||||
print("with person_", str(i+1), "the ", end='')
|
||||
# 将某张人脸与存储的所有人脸数据进行比对
|
||||
@ -123,34 +126,32 @@ while cap.isOpened():
|
||||
# 可以在这里改称 Jack, Tom and others
|
||||
# Here you can modify the names shown on the camera
|
||||
if i == 0:
|
||||
name_namelist[k] = "Person 1"
|
||||
name_namelist[k] = "Jack"
|
||||
elif i == 1:
|
||||
name_namelist[k] = "Person 2"
|
||||
name_namelist[k] = "Tom"
|
||||
elif i == 2:
|
||||
name_namelist[k] = "Person 3"
|
||||
name_namelist[k] = "Tony"
|
||||
|
||||
# 矩形框
|
||||
# draw rectangle
|
||||
for kk, d in enumerate(faces):
|
||||
# 绘制矩形框
|
||||
cv2.rectangle(img_rd, tuple([d.left(), d.top()]), tuple([d.right(), d.bottom()]), (0, 255, 255), 2)
|
||||
|
||||
# 在人脸框下面写人脸名字
|
||||
# write names under rectangle
|
||||
for i in range(len(faces)):
|
||||
cv2.putText(img_rd, name_namelist[i], pos_namelist[i], font, 0.8, (0, 255, 255), 1, cv2.LINE_AA)
|
||||
|
||||
print("Faces in camera now:", name_namelist, "\n")
|
||||
print("Name list now:", name_namelist, "\n")
|
||||
|
||||
cv2.putText(img_rd, "Press 'q': Quit", (20, 450), font, 0.8, (84, 255, 159), 1, cv2.LINE_AA)
|
||||
cv2.putText(img_rd, "Face Recognition", (20, 40), font, 1, (0, 0, 0), 1, cv2.LINE_AA)
|
||||
cv2.putText(img_rd, "Faces: " + str(len(faces)), (20, 100), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
|
||||
|
||||
# 窗口显示 show with opencv
|
||||
# 窗口显示
|
||||
cv2.imshow("camera", img_rd)
|
||||
|
||||
# 释放摄像头 release camera
|
||||
# 释放摄像头
|
||||
cap.release()
|
||||
|
||||
# 删除建立的窗口 delete all the windows
|
||||
cv2.destroyAllWindows()
|
||||
# 删除建立的窗口
|
||||
cv2.destroyAllWindows()
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
# Mail: coneypo@foxmail.com
|
||||
|
||||
# Created at 2018-05-11
|
||||
# Updated at 2019-03-23
|
||||
# Updated at 2019-02-21
|
||||
|
||||
import dlib # 人脸处理的库 Dlib
|
||||
import numpy as np # 数据处理的库 Numpy
|
||||
@ -16,34 +16,33 @@ import cv2 # 图像处理的库 OpenCv
|
||||
import os # 读写文件
|
||||
import shutil # 读写文件
|
||||
|
||||
# Dlib 正向人脸检测器 / frontal face detector
|
||||
# Dlib 正向人脸检测器
|
||||
detector = dlib.get_frontal_face_detector()
|
||||
|
||||
# Dlib 68 点特征预测器 / 68 points features predictor
|
||||
# Dlib 68 点特征预测器
|
||||
predictor = dlib.shape_predictor('data/data_dlib/shape_predictor_68_face_landmarks.dat')
|
||||
|
||||
# OpenCv 调用摄像头 use camera
|
||||
# OpenCv 调用摄像头
|
||||
cap = cv2.VideoCapture(0)
|
||||
|
||||
# 设置视频参数 set camera
|
||||
# 设置视频参数
|
||||
cap.set(3, 480)
|
||||
|
||||
# 人脸截图的计数器 the counter for screen shoot
|
||||
# 人脸截图的计数器
|
||||
cnt_ss = 0
|
||||
|
||||
# 存储人脸的文件夹 the folder to save faces
|
||||
current_face_dir = ""
|
||||
# 存储人脸的文件夹
|
||||
current_face_dir = 0
|
||||
|
||||
# 保存 photos/csv 的路径 the directory to save photos/csv
|
||||
# 保存 photos/csv 的路径
|
||||
path_photos_from_camera = "data/data_faces_from_camera/"
|
||||
path_csv_from_photos = "data/data_csvs_from_camera/"
|
||||
|
||||
|
||||
# 新建保存人脸图像文件和数据CSV文件夹
|
||||
# mkdir for saving photos and csv
|
||||
def pre_work_mkdir():
|
||||
|
||||
# 新建文件夹 / make folders to save faces images and csv
|
||||
# 新建文件夹
|
||||
if os.path.isdir(path_photos_from_camera):
|
||||
pass
|
||||
else:
|
||||
@ -59,8 +58,7 @@ pre_work_mkdir()
|
||||
|
||||
##### optional/可选, 默认关闭 #####
|
||||
# 删除之前存的人脸数据文件夹
|
||||
# delete the old data of faces
|
||||
def pre_work_del_old_face_folders():
|
||||
def pre_work_deldir():
|
||||
# 删除之前存的人脸数据文件夹
|
||||
# 删除 "/data_faces_from_camera/person_x/"...
|
||||
folders_rd = os.listdir(path_photos_from_camera)
|
||||
@ -73,13 +71,12 @@ def pre_work_del_old_face_folders():
|
||||
|
||||
# 这里在每次程序录入之前, 删掉之前存的人脸数据
|
||||
# 如果这里打开,每次进行人脸录入的时候都会删掉之前的人脸图像文件夹
|
||||
# pre_work_del_old_face_folders()
|
||||
# pre_work_deldir()
|
||||
##################################
|
||||
|
||||
|
||||
# 如果有之前录入的人脸
|
||||
# 在之前 person_x 的序号按照 person_x+1 开始录入
|
||||
# if old face exists, start from person_x+1
|
||||
if os.listdir("data/data_faces_from_camera/"):
|
||||
# 获取已录入的最后一个人脸序号
|
||||
person_list = os.listdir("data/data_faces_from_camera/")
|
||||
@ -88,16 +85,12 @@ if os.listdir("data/data_faces_from_camera/"):
|
||||
person_cnt = person_num_latest
|
||||
|
||||
# 如果第一次存储或者没有之前录入的人脸, 按照 person_1 开始录入
|
||||
# start from person_1
|
||||
else:
|
||||
person_cnt = 0
|
||||
|
||||
# 之后用来控制是否保存图像的 flag / the flag to control if save
|
||||
# 之后用来控制是否保存图像的 flag
|
||||
save_flag = 1
|
||||
|
||||
# 之后用来检查是否先按 'n' 再按 's' / the flag to check if press 'n' before 's'
|
||||
press_n_flag = 0
|
||||
|
||||
while cap.isOpened():
|
||||
# 480 height * 640 width
|
||||
flag, img_rd = cap.read()
|
||||
@ -108,39 +101,37 @@ while cap.isOpened():
|
||||
# 人脸数 faces
|
||||
faces = detector(img_gray, 0)
|
||||
|
||||
# 待会要写的字体 / font to write
|
||||
# 待会要写的字体
|
||||
font = cv2.FONT_HERSHEY_COMPLEX
|
||||
|
||||
# 按下 'n' 新建存储人脸的文件夹 / press 'n' to create the folders for saving faces
|
||||
# 按下 'n' 新建存储人脸的文件夹
|
||||
if kk == ord('n'):
|
||||
person_cnt += 1
|
||||
current_face_dir = path_photos_from_camera + "person_" + str(person_cnt)
|
||||
os.makedirs(current_face_dir)
|
||||
print('\n')
|
||||
print("新建的人脸文件夹 / Create folders: ", current_face_dir)
|
||||
print("新建的人脸文件夹: ", current_face_dir)
|
||||
|
||||
cnt_ss = 0 # 将人脸计数器清零 / clear the cnt of faces
|
||||
press_n_flag = 1 # 已经按下 'n' / have pressed 'n'
|
||||
# 将人脸计数器清零
|
||||
cnt_ss = 0
|
||||
|
||||
# 检测到人脸 / if face detected
|
||||
# 检测到人脸
|
||||
if len(faces) != 0:
|
||||
# 矩形框
|
||||
# show the rectangle box
|
||||
for k, d in enumerate(faces):
|
||||
# 计算矩形大小
|
||||
# we need to compute the width and height of the box
|
||||
# (x,y), (宽度width, 高度height)
|
||||
pos_start = tuple([d.left(), d.top()])
|
||||
pos_end = tuple([d.right(), d.bottom()])
|
||||
|
||||
# 计算矩形框大小 / compute the size of rectangle box
|
||||
# 计算矩形框大小
|
||||
height = (d.bottom() - d.top())
|
||||
width = (d.right() - d.left())
|
||||
|
||||
hh = int(height/2)
|
||||
ww = int(width/2)
|
||||
|
||||
# 设置颜色 / the color of rectangle of faces detected
|
||||
# 设置颜色 / The color of rectangle of faces detected
|
||||
color_rectangle = (255, 255, 255)
|
||||
if (d.right()+ww) > 640 or (d.bottom()+hh > 480) or (d.left()-ww < 0) or (d.top()-hh < 0):
|
||||
cv2.putText(img_rd, "OUT OF RANGE", (20, 300), font, 0.8, (0, 0, 255), 1, cv2.LINE_AA)
|
||||
@ -155,43 +146,41 @@ while cap.isOpened():
|
||||
tuple([d.right() + ww, d.bottom() + hh]),
|
||||
color_rectangle, 2)
|
||||
|
||||
# 根据人脸大小生成空的图像 / create blank image according to the size of face detected
|
||||
# 根据人脸大小生成空的图像
|
||||
im_blank = np.zeros((int(height*2), width*2, 3), np.uint8)
|
||||
|
||||
save_flag = 1;
|
||||
|
||||
if save_flag:
|
||||
# 按下 's' 保存摄像头中的人脸到本地 / press 's' to save faces into local images
|
||||
# 按下 's' 保存摄像头中的人脸到本地
|
||||
if kk == ord('s'):
|
||||
# 检查有没有先按'n'新建文件夹 / check if you have pressed 'n'
|
||||
if press_n_flag:
|
||||
if os.path.isdir(current_face_dir):
|
||||
cnt_ss += 1
|
||||
for ii in range(height*2):
|
||||
for jj in range(width*2):
|
||||
im_blank[ii][jj] = img_rd[d.top()-hh + ii][d.left()-ww + jj]
|
||||
cv2.imwrite(current_face_dir + "/img_face_" + str(cnt_ss) + ".jpg", im_blank)
|
||||
print("写入本地 / Save into:", str(current_face_dir) + "/img_face_" + str(cnt_ss) + ".jpg")
|
||||
print("写入本地:", str(current_face_dir) + "/img_face_" + str(cnt_ss) + ".jpg")
|
||||
else:
|
||||
print("请在按 'S' 之前先按 'N' 来建文件夹 / Please press 'N' before 'S'")
|
||||
|
||||
# 显示人脸数 / show the numbers of faces detected
|
||||
# 显示人脸数
|
||||
cv2.putText(img_rd, "Faces: " + str(len(faces)), (20, 100), font, 0.8, (0, 255, 0), 1, cv2.LINE_AA)
|
||||
|
||||
# 添加说明 / add some statements
|
||||
# 添加说明
|
||||
cv2.putText(img_rd, "Face Register", (20, 40), font, 1, (0, 0, 0), 1, cv2.LINE_AA)
|
||||
cv2.putText(img_rd, "N: New face folder", (20, 350), font, 0.8, (0, 0, 0), 1, cv2.LINE_AA)
|
||||
cv2.putText(img_rd, "S: Save current face", (20, 400), font, 0.8, (0, 0, 0), 1, cv2.LINE_AA)
|
||||
cv2.putText(img_rd, "Q: Quit", (20, 450), font, 0.8, (0, 0, 0), 1, cv2.LINE_AA)
|
||||
|
||||
# 按下 'q' 键退出 / press 'q' to exit
|
||||
# 按下 'q' 键退出
|
||||
if kk == ord('q'):
|
||||
break
|
||||
|
||||
# 如果需要摄像头窗口大小可调 / uncomment this line if you want the camera window is resizeable
|
||||
# cv2.namedWindow("camera", 0)
|
||||
|
||||
# 窗口显示
|
||||
# cv2.namedWindow("camera", 0) # 如果需要摄像头窗口大小可调
|
||||
cv2.imshow("camera", img_rd)
|
||||
|
||||
# 释放摄像头 / release camera
|
||||
# 释放摄像头
|
||||
cap.release()
|
||||
|
||||
# 删除建立的窗口
|
||||
cv2.destroyAllWindows()
|
||||
|
||||
@ -45,7 +45,7 @@ def return_128d_features(path_img):
|
||||
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
|
||||
faces = detector(img_gray, 1)
|
||||
|
||||
print("%-40s %-20s" % ("检测到人脸的图像 / image with faces detected:", path_img), '\n')
|
||||
print("检测到人脸的图像:", path_img, "\n")
|
||||
|
||||
# 因为有可能截下来的人脸再去检测,检测不出来人脸了
|
||||
# 所以要确保是 检测到人脸的人脸图像 拿去算特征
|
||||
@ -71,7 +71,7 @@ def write_into_csv(path_faces_personX, path_csv_from_photos):
|
||||
if photos_list:
|
||||
for i in range(len(photos_list)):
|
||||
# 调用return_128d_features()得到128d特征
|
||||
print("%-40s %-20s" % ("正在读的人脸图像 / image to read:", path_faces_personX + "/" + photos_list[i]))
|
||||
print("正在读的人脸图像:", path_faces_personX + "/" + photos_list[i])
|
||||
features_128d = return_128d_features(path_faces_personX + "/" + photos_list[i])
|
||||
# print(features_128d)
|
||||
# 遇到没有检测出人脸的图片跳过
|
||||
@ -80,7 +80,7 @@ def write_into_csv(path_faces_personX, path_csv_from_photos):
|
||||
else:
|
||||
writer.writerow(features_128d)
|
||||
else:
|
||||
print("文件夹内图像文件为空 / Warning: Empty photos in " + path_faces_personX + '/', '\n')
|
||||
print("Warning: Empty photos in "+path_faces_personX+'/')
|
||||
writer.writerow("")
|
||||
|
||||
|
||||
@ -134,4 +134,4 @@ with open(path_csv_from_photos_feature_all, "w", newline="") as csvfile:
|
||||
for i in range(len(csv_rd)):
|
||||
feature_mean_list = compute_the_mean(path_csv_from_photos + csv_rd[i])
|
||||
print(path_csv_from_photos + csv_rd[i])
|
||||
writer.writerow(feature_mean_list)
|
||||
writer.writerow(feature_mean_list)
|
||||
BIN
introduction/face_reco_from_camera_two_faces.png
Normal file
|
After Width: | Height: | Size: 853 KiB |
|
Before Width: | Height: | Size: 428 KiB After Width: | Height: | Size: 357 KiB |
|
Before Width: | Height: | Size: 457 KiB |
|
Before Width: | Height: | Size: 499 KiB After Width: | Height: | Size: 397 KiB |
|
Before Width: | Height: | Size: 425 KiB |
|
Before Width: | Height: | Size: 416 KiB After Width: | Height: | Size: 396 KiB |
|
Before Width: | Height: | Size: 433 KiB |
|
Before Width: | Height: | Size: 445 KiB |
@ -1,5 +0,0 @@
|
||||
dlib==19.17.0
|
||||
numpy==1.15.1
|
||||
opencv-python==4.0.0.21
|
||||
pandas==0.23.4
|
||||
scikit-image==0.14.0
|
||||