├── .gitattributes ├── AndroidPart ├── Carteller-Android │ ├── .gitignore │ ├── BottomNavigationModule │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ └── ca │ │ │ │ └── gcastle │ │ │ │ └── bottomnavigation │ │ │ │ ├── behaviour │ │ │ │ ├── BottomNavigationBehavior.java │ │ │ │ └── VerticalScrollingBehavior.java │ │ │ │ ├── listeners │ │ │ │ └── OnChildClickedListener.java │ │ │ │ └── view │ │ │ │ ├── BottomNavigationTabView.java │ │ │ │ ├── BottomNavigationUtils.java │ │ │ │ └── BottomNavigationView.java │ │ │ └── res │ │ │ ├── drawable │ │ │ └── shape_circle_red500_fill_white_outline.xml │ │ │ ├── layout │ │ │ └── view_bottomnavigation_tab.xml │ │ │ └── values │ │ │ ├── attr_bottom_navigation_tab.xml │ │ │ └── colours.xml │ ├── LICENSE │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── release │ │ │ ├── app-release.apk │ │ │ └── output.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── shashank │ │ │ │ └── platform │ │ │ │ └── loginui │ │ │ │ └── ExampleInstrumentedTest.java │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ │ ├── com │ │ │ │ │ └── shashank │ │ │ │ │ │ └── platform │ │ │ │ │ │ └── loginui │ │ │ │ │ │ ├── CarInfo.java │ │ │ │ │ │ ├── LoginActivity.java │ │ │ │ │ │ ├── OnSwipeTouchListener.java │ │ │ │ │ │ ├── RecognizeFragmenAdapter.java │ │ │ │ │ │ ├── RecognizeFragment.java │ │ │ │ │ │ ├── RegisterActivity.java │ │ │ │ │ │ ├── SelectionActivity.java │ │ │ │ │ │ └── UserinfoFragment.java │ │ │ │ └── handler │ │ │ │ │ └── HttpHandler.java │ │ │ └── res │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── add_image.png │ │ │ │ ├── buttonshapewhitebg.xml │ │ │ │ ├── good_morning_img.png │ │ │ │ ├── good_night_img.png │ │ │ │ ├── ic_email_white_24dp.xml │ │ │ │ ├── ic_help_black_24dp.png │ │ │ │ ├── ic_help_white_24dp.png │ │ │ │ ├── ic_home_black_24dp.png │ │ │ │ ├── ic_home_white_24dp.png │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_lock_white_24dp.xml │ │ │ │ ├── ic_search_black_24dp.png │ │ │ │ ├── ic_search_white_24dp.png │ │ │ │ ├── icon.png │ │ │ │ └── logo.png │ │ │ │ ├── font │ │ │ │ ├── calibri.ttf │ │ │ │ └── gotham.ttf │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── activity_register.xml │ │ │ │ ├── activity_selection.xml │ │ │ │ ├── fragment_recognize.xml │ │ │ │ └── fragment_userinfo.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_help_black_24dp.png │ │ │ │ ├── ic_help_white_24dp.png │ │ │ │ ├── ic_home_black_24dp.png │ │ │ │ ├── ic_home_white_24dp.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ ├── ic_search_black_24dp.png │ │ │ │ └── ic_search_white_24dp.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_help_black_24dp.png │ │ │ │ ├── ic_help_white_24dp.png │ │ │ │ ├── ic_home_black_24dp.png │ │ │ │ ├── ic_home_white_24dp.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ ├── ic_search_black_24dp.png │ │ │ │ └── ic_search_white_24dp.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_help_black_24dp.png │ │ │ │ ├── ic_help_white_24dp.png │ │ │ │ ├── ic_home_black_24dp.png │ │ │ │ ├── ic_home_white_24dp.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ ├── ic_search_black_24dp.png │ │ │ │ └── ic_search_white_24dp.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_help_black_24dp.png │ │ │ │ ├── ic_help_white_24dp.png │ │ │ │ ├── ic_home_black_24dp.png │ │ │ │ ├── ic_home_white_24dp.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ ├── ic_search_black_24dp.png │ │ │ │ └── ic_search_white_24dp.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_help_black_24dp.png │ │ │ │ ├── ic_help_white_24dp.png │ │ │ │ ├── ic_home_black_24dp.png │ │ │ │ ├── ic_home_white_24dp.png │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ ├── ic_search_black_24dp.png │ │ │ │ └── ic_search_white_24dp.png │ │ │ │ └── values │ │ │ │ ├── array.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── shashank │ │ │ └── platform │ │ │ └── loginui │ │ │ └── ExampleUnitTest.java │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ └── settings.gradle └── release │ ├── app-release.apk │ └── output.json ├── CarInfoTeller └── CarInfoTeller │ ├── .idea │ ├── CarInfoTeller.iml │ ├── dictionaries │ │ └── Robb.xml │ ├── misc.xml │ ├── modules.xml │ └── workspace.xml │ ├── __pycache__ │ └── config.cpython-37.pyc │ ├── base │ ├── __init__.py │ ├── base_data_loader.py │ ├── base_model.py │ └── base_trainer.py │ ├── config.py │ ├── data_processing │ ├── __pycache__ │ │ ├── auto_augment.cpython-37.pyc │ │ └── car_dataset.cpython-37.pyc │ ├── auto_augment.py │ ├── car_dataset.py │ ├── datasets │ │ └── cars_metas │ │ │ ├── cars_meta.mat │ │ │ ├── cars_test_annos.mat │ │ │ └── cars_train_annos.mat │ └── extract_cars.py │ ├── demo.py │ ├── models │ ├── __init__.py │ └── efficentnet.py │ ├── train.py │ └── utils │ ├── __init__.py │ ├── __pycache__ │ ├── __init__.cpython-37.pyc │ └── car_info_util.cpython-37.pyc │ └── car_info_util.py ├── CarTeller ├── .idea │ ├── CarTeller.iml │ ├── dictionaries │ │ └── Robb.xml │ ├── encodings.xml │ ├── misc.xml │ ├── modules.xml │ └── workspace.xml ├── CarAttributeTeller │ ├── __init__.py │ └── car_attribute_main.py ├── CarBoardTeller │ ├── __init__.py │ ├── car_board_main.py │ └── config.js ├── CarInfoTeller │ ├── __init__.py │ ├── base │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ ├── base_data_loader.cpython-37.pyc │ │ │ ├── base_model.cpython-37.pyc │ │ │ └── base_trainer.cpython-37.pyc │ │ ├── base_data_loader.py │ │ ├── base_model.py │ │ └── base_trainer.py │ ├── car_info_main.py │ ├── cars_meta.mat │ ├── cars_translated.txt │ ├── logger │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ ├── logger.cpython-37.pyc │ │ │ └── visualization.cpython-37.pyc │ │ ├── logger.py │ │ ├── logger_config.json │ │ └── visualization.py │ ├── model │ │ ├── adabound.py │ │ ├── inception.py │ │ ├── loss.py │ │ ├── metric.py │ │ ├── model.py │ │ ├── resnet.py │ │ ├── squeezenet.py │ │ └── wide_resnet.py │ ├── test_config.json │ ├── train.py │ ├── train2.py │ └── utils │ │ ├── __init__.py │ │ ├── __pycache__ │ │ ├── __init__.cpython-37.pyc │ │ └── util.cpython-37.pyc │ │ └── util.py ├── CarTypeTellerMore │ ├── __init__.py │ ├── car_type_more_main.py │ └── labels_map.txt ├── CarTypeTellerOne │ ├── __init__.py │ └── car_type_one_main.py ├── DriverBehavior │ ├── __init__.py │ └── behavior_main.py ├── app │ ├── __init__.py │ ├── database.py │ ├── models.py │ └── views.py ├── car_teller.py ├── config.py ├── manage.py └── parse_config.py ├── CarTypeTellerOne ├── .idea │ ├── CarTypeTeller.iml │ ├── misc.xml │ ├── modules.xml │ └── workspace.xml └── CarTypeTeller │ ├── .idea │ ├── CarTypeTeller.iml │ ├── misc.xml │ ├── modules.xml │ └── workspace.xml │ └── models │ ├── CarTypeTeller.py │ └── __init__.py ├── README.md └── html ├── 123.html ├── API.html ├── CarAttribute.html ├── CarBoard.html ├── CarInfo.html ├── CarNumber.html ├── CarType.html ├── DriverBehavior.html ├── LICENSE.txt ├── browserconfig.xml ├── doc ├── TOC.md ├── css.md ├── extend.md ├── faq.md ├── html.md ├── js.md ├── misc.md └── usage.md ├── favicon.ico ├── history.html ├── humans.txt ├── icon.png ├── img ├── .gitignore ├── app.jpg ├── behavior.jpeg ├── behavior2.png ├── car1.jpg ├── car2.jpg ├── car3.jpg ├── car4.jpg ├── car5.jpg ├── car6.jpg ├── car7.jpg ├── carAttribute_main.jpg ├── carBoard.jpg ├── carBoard_main.jpg ├── carCount.png ├── carInfo.jpg ├── carInfo_main.jpg ├── carTeller_main.jpg ├── carTeller_temp.jpg ├── carTypeApp.jpg ├── carType_main.jpg ├── driverBehavior.jpg ├── intro.png ├── login2.jpg ├── login_body_bg.jpg ├── phoneDect.png ├── roll_board1.jpg ├── roll_board2.jpg ├── roll_board3.jpg └── timg.jpg ├── jpg ├── 12019-07-12107_04_23.jpg ├── 12019-07-12107_07_14.jpg ├── 12019-07-12107_08_26.jpg ├── 12019-07-12107_09_01.jpg └── 12019-07-12107_09_22.jpg ├── js └── vendor │ ├── jquery-3.4.1.min.js │ └── modernizr-3.7.1.min.js ├── layui ├── css │ ├── layui.css │ ├── layui.mobile.css │ └── modules │ │ ├── code.css │ │ ├── laydate │ │ └── default │ │ │ └── laydate.css │ │ └── layer │ │ └── default │ │ ├── icon-ext.png │ │ ├── icon.png │ │ ├── layer.css │ │ ├── loading-0.gif │ │ ├── loading-1.gif │ │ └── loading-2.gif ├── font │ ├── iconfont.eot │ ├── iconfont.svg │ ├── iconfont.ttf │ ├── iconfont.woff │ └── iconfont.woff2 ├── images │ └── face │ │ ├── 0.gif │ │ ├── 1.gif │ │ ├── 10.gif │ │ ├── 11.gif │ │ ├── 12.gif │ │ ├── 13.gif │ │ ├── 14.gif │ │ ├── 15.gif │ │ ├── 16.gif │ │ ├── 17.gif │ │ ├── 18.gif │ │ ├── 19.gif │ │ ├── 2.gif │ │ ├── 20.gif │ │ ├── 21.gif │ │ ├── 22.gif │ │ ├── 23.gif │ │ ├── 24.gif │ │ ├── 25.gif │ │ ├── 26.gif │ │ ├── 27.gif │ │ ├── 28.gif │ │ ├── 29.gif │ │ ├── 3.gif │ │ ├── 30.gif │ │ ├── 31.gif │ │ ├── 32.gif │ │ ├── 33.gif │ │ ├── 34.gif │ │ ├── 35.gif │ │ ├── 36.gif │ │ ├── 37.gif │ │ ├── 38.gif │ │ ├── 39.gif │ │ ├── 4.gif │ │ ├── 40.gif │ │ ├── 41.gif │ │ ├── 42.gif │ │ ├── 43.gif │ │ ├── 44.gif │ │ ├── 45.gif │ │ ├── 46.gif │ │ ├── 47.gif │ │ ├── 48.gif │ │ ├── 49.gif │ │ ├── 5.gif │ │ ├── 50.gif │ │ ├── 51.gif │ │ ├── 52.gif │ │ ├── 53.gif │ │ ├── 54.gif │ │ ├── 55.gif │ │ ├── 56.gif │ │ ├── 57.gif │ │ ├── 58.gif │ │ ├── 59.gif │ │ ├── 6.gif │ │ ├── 60.gif │ │ ├── 61.gif │ │ ├── 62.gif │ │ ├── 63.gif │ │ ├── 64.gif │ │ ├── 65.gif │ │ ├── 66.gif │ │ ├── 67.gif │ │ ├── 68.gif │ │ ├── 69.gif │ │ ├── 7.gif │ │ ├── 70.gif │ │ ├── 71.gif │ │ ├── 8.gif │ │ └── 9.gif ├── lay │ └── modules │ │ ├── carousel.js │ │ ├── code.js │ │ ├── colorpicker.js │ │ ├── element.js │ │ ├── flow.js │ │ ├── form.js │ │ ├── jquery.js │ │ ├── laydate.js │ │ ├── layedit.js │ │ ├── layer.js │ │ ├── laypage.js │ │ ├── laytpl.js │ │ ├── mobile.js │ │ ├── rate.js │ │ ├── slider.js │ │ ├── table.js │ │ ├── transfer.js │ │ ├── tree.js │ │ ├── upload.js │ │ └── util.js ├── layui.all.js └── layui.js ├── layui_exts └── sliderVerify │ └── sliderVerify.js ├── login.html ├── per_info.html ├── robots.txt ├── site.webmanifest ├── tile-wide.png └── tile.png /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/libraries 5 | /.idea/modules.xml 6 | /.idea/workspace.xml 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/BottomNavigationModule/.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/BottomNavigationModule/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | ext { 4 | PUBLISH_GROUP_ID = "ca.gcastle" 5 | PUBLISH_ARTIFACT_ID = "BottomNavigation" 6 | PUBLISH_VERSION = "1.0.1" 7 | } 8 | 9 | android { 10 | compileSdkVersion 28 11 | 12 | defaultConfig { 13 | minSdkVersion 21 14 | targetSdkVersion 28 15 | versionCode 2 16 | versionName "1.0" 17 | } 18 | buildTypes { 19 | release { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 22 | } 23 | } 24 | } 25 | 26 | dependencies { 27 | implementation fileTree(dir: 'libs', include: ['*.jar']) 28 | 29 | implementation 'com.android.support:appcompat-v7:28.0.0' 30 | implementation 'com.android.support:design:28.0.0' 31 | } 32 | 33 | apply from: 'https://raw.githubusercontent.com/blundell/release-android-library/master/android-release-aar.gradle' -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/BottomNavigationModule/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\opt\android-sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/BottomNavigationModule/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/BottomNavigationModule/src/main/java/ca/gcastle/bottomnavigation/listeners/OnChildClickedListener.java: -------------------------------------------------------------------------------- 1 | package ca.gcastle.bottomnavigation.listeners; 2 | 3 | /** 4 | * Listener that is called on a BottomNavigationTabView is clicked. 5 | * 6 | * Created by adammcneilly on 4/28/16. 7 | */ 8 | public interface OnChildClickedListener { 9 | void onChildClicked(int child); 10 | } 11 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/BottomNavigationModule/src/main/java/ca/gcastle/bottomnavigation/view/BottomNavigationUtils.java: -------------------------------------------------------------------------------- 1 | package ca.gcastle.bottomnavigation.view; 2 | 3 | import android.content.Context; 4 | import android.util.TypedValue; 5 | 6 | /** 7 | * Created by graeme.castle on 21/04/2016. 8 | */ 9 | public class BottomNavigationUtils { 10 | public static int getPixelsFromDP(Context context, int dp) { 11 | return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/BottomNavigationModule/src/main/res/drawable/shape_circle_red500_fill_white_outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/BottomNavigationModule/src/main/res/layout/view_bottomnavigation_tab.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 11 | 12 | 19 | 20 | 31 | 32 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/BottomNavigationModule/src/main/res/values/attr_bottom_navigation_tab.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/BottomNavigationModule/src/main/res/values/colours.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #F44336 4 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | defaultConfig { 6 | applicationId "com.shashank.platform.loginui" 7 | minSdkVersion 21 8 | targetSdkVersion 28 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(dir: 'libs', include: ['*.jar']) 23 | implementation 'com.android.support:appcompat-v7:28.0.0' 24 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 25 | implementation 'com.android.support:design:28.0.0' 26 | testImplementation 'junit:junit:4.12' 27 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 28 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 29 | implementation 'com.squareup.okhttp3:okhttp:3.11.0' 30 | implementation project(path: ':BottomNavigationModule') 31 | implementation 'com.google.code.gson:gson:2.8.4' 32 | 33 | } 34 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/release/app-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/release/app-release.apk -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/release/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/androidTest/java/com/shashank/platform/loginui/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.shashank.platform.loginui; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.shashank.platform.loginui", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 15 | 16 | 21 | 26 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/java/com/shashank/platform/loginui/OnSwipeTouchListener.java: -------------------------------------------------------------------------------- 1 | package com.shashank.platform.loginui; 2 | 3 | import android.content.Context; 4 | import android.view.GestureDetector; 5 | import android.view.GestureDetector.SimpleOnGestureListener; 6 | import android.view.MotionEvent; 7 | import android.view.View; 8 | import android.view.View.OnTouchListener; 9 | 10 | public class OnSwipeTouchListener implements OnTouchListener { 11 | 12 | private final GestureDetector gestureDetector; 13 | 14 | public OnSwipeTouchListener (Context ctx){ 15 | gestureDetector = new GestureDetector(ctx, new GestureListener()); 16 | } 17 | 18 | @Override 19 | public boolean onTouch(View v, MotionEvent event) { 20 | return gestureDetector.onTouchEvent(event); 21 | } 22 | 23 | private final class GestureListener extends SimpleOnGestureListener { 24 | 25 | private static final int SWIPE_THRESHOLD = 100; 26 | private static final int SWIPE_VELOCITY_THRESHOLD = 100; 27 | 28 | @Override 29 | public boolean onDown(MotionEvent e) { 30 | return true; 31 | } 32 | 33 | @Override 34 | public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 35 | boolean result = false; 36 | try { 37 | float diffY = e2.getY() - e1.getY(); 38 | float diffX = e2.getX() - e1.getX(); 39 | if (Math.abs(diffX) > Math.abs(diffY)) { 40 | if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 41 | if (diffX > 0) { 42 | onSwipeRight(); 43 | } else { 44 | onSwipeLeft(); 45 | } 46 | result = true; 47 | } 48 | } 49 | else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { 50 | if (diffY > 0) { 51 | onSwipeBottom(); 52 | } else { 53 | onSwipeTop(); 54 | } 55 | result = true; 56 | } 57 | } catch (Exception exception) { 58 | exception.printStackTrace(); 59 | } 60 | return result; 61 | } 62 | } 63 | 64 | public void onSwipeRight() { 65 | } 66 | 67 | public void onSwipeLeft() { 68 | } 69 | 70 | public void onSwipeTop() { 71 | } 72 | 73 | public void onSwipeBottom() { 74 | } 75 | } -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/java/com/shashank/platform/loginui/RecognizeFragmenAdapter.java: -------------------------------------------------------------------------------- 1 | package com.shashank.platform.loginui; 2 | 3 | import android.support.v4.app.Fragment; 4 | import android.support.v4.app.FragmentManager; 5 | import android.support.v4.app.FragmentStatePagerAdapter; 6 | 7 | public class RecognizeFragmenAdapter extends FragmentStatePagerAdapter { 8 | private String[] titles; 9 | public RecognizeFragmenAdapter(FragmentManager manager, String[]titles) { 10 | super(manager); 11 | this.titles = titles; 12 | } 13 | 14 | @Override 15 | public Fragment getItem(int i) { 16 | if(i == 0) { 17 | return RecognizeFragment.newInstance(titles[i], i); 18 | }else{ 19 | return UserinfoFragment.newInstance(titles[i],i); 20 | } 21 | } 22 | 23 | @Override 24 | public int getCount() { 25 | return titles.length; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/java/com/shashank/platform/loginui/SelectionActivity.java: -------------------------------------------------------------------------------- 1 | package com.shashank.platform.loginui; 2 | 3 | import android.content.Intent; 4 | import android.support.design.widget.TabLayout; 5 | import android.support.v4.app.Fragment; 6 | import android.support.v4.app.FragmentActivity; 7 | import android.support.v4.app.FragmentManager; 8 | import android.support.v4.app.FragmentPagerAdapter; 9 | import android.support.v4.app.FragmentTransaction; 10 | import android.support.v4.view.ViewPager; 11 | import android.support.v7.app.AppCompatActivity; 12 | import android.os.Bundle; 13 | import android.support.v7.widget.Toolbar; 14 | import android.view.View; 15 | import android.view.Window; 16 | import android.view.WindowManager; 17 | import android.widget.Button; 18 | import android.widget.TableLayout; 19 | 20 | import java.util.ArrayList; 21 | import java.util.List; 22 | 23 | import ca.gcastle.bottomnavigation.listeners.OnChildClickedListener; 24 | import ca.gcastle.bottomnavigation.view.BottomNavigationView; 25 | 26 | public class SelectionActivity extends AppCompatActivity { 27 | 28 | private BottomNavigationView bottomNavigationView; 29 | private ViewPager viewPager; 30 | 31 | private boolean clickTransition; 32 | public String session; 33 | public static String username; 34 | List titles; 35 | List fragments; 36 | Button uinfoBtn, recoBtn; 37 | 38 | Fragment recoF=null; 39 | Fragment uinfoF=null; 40 | 41 | FragmentTransaction ftr; 42 | 43 | @Override 44 | protected void onCreate(Bundle savedInstanceState) { 45 | super.onCreate(savedInstanceState); 46 | requestWindowFeature(Window.FEATURE_NO_TITLE); 47 | getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 48 | //获取验证码,也可获取用户名和密码,做个个人信息界面,不过不重要 49 | setContentView(R.layout.activity_selection); 50 | 51 | 52 | //对字段数据进行初始化 53 | Intent it = getIntent(); 54 | session = it.getStringExtra("session"); 55 | username = it.getStringExtra("username"); 56 | titles = new ArrayList(); 57 | titles.add("车辆识别"); 58 | titles.add("个人信息"); 59 | fragments = new ArrayList(); 60 | 61 | fragments.add(new RecognizeFragment()); 62 | fragments.add(new UserinfoFragment()); 63 | 64 | //绑定组件 65 | setupBottomNavigationView(); 66 | setupViewPager(); 67 | 68 | } 69 | 70 | public void setupBottomNavigationView() { 71 | bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation); 72 | //点击Tab时 73 | bottomNavigationView.setOnChildClickedListener(new OnChildClickedListener() { 74 | @Override 75 | public void onChildClicked(int child) { 76 | clickTransition = true; 77 | viewPager.setCurrentItem(child); 78 | clickTransition = false; 79 | } 80 | }); 81 | 82 | } 83 | 84 | public void setupViewPager() { 85 | String[] fragmentTitles = new String[] { 86 | "车辆识别", 87 | "个人信息" 88 | }; 89 | 90 | RecognizeFragmenAdapter adapter = new RecognizeFragmenAdapter(getSupportFragmentManager(), fragmentTitles); 91 | viewPager = (ViewPager) findViewById(R.id.viewPager); 92 | viewPager.setAdapter(adapter); 93 | } 94 | 95 | 96 | //隐藏fragment 97 | private void hideTransaction(FragmentTransaction ftr) { 98 | 99 | if (recoF != null) { 100 | ftr.hide(recoF);//隐藏该fragment 101 | } 102 | if (uinfoF != null) { 103 | ftr.hide(uinfoF); 104 | } 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/java/com/shashank/platform/loginui/UserinfoFragment.java: -------------------------------------------------------------------------------- 1 | package com.shashank.platform.loginui; 2 | 3 | import android.content.Context; 4 | import android.net.Uri; 5 | import android.os.Bundle; 6 | import android.support.v4.app.Fragment; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | 11 | 12 | 13 | public class UserinfoFragment extends Fragment { 14 | public static final String ARG_TITLE = "titleArg"; 15 | public static final String ARG_INDEX = "indexArg"; 16 | 17 | public static UserinfoFragment newInstance(String title, int index){ 18 | UserinfoFragment ra= new UserinfoFragment(); 19 | Bundle args = new Bundle(); 20 | args.putString(ARG_TITLE,title); 21 | args.putInt(ARG_INDEX, index); 22 | ra.setArguments(args); 23 | return ra; 24 | } 25 | 26 | @Override 27 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 28 | Bundle savedInstanceState) { 29 | // Inflate the layout for this fragment 30 | return inflater.inflate(R.layout.fragment_userinfo, container, false); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/java/handler/HttpHandler.java: -------------------------------------------------------------------------------- 1 | package handler; 2 | 3 | import android.content.Context; 4 | import android.os.Looper; 5 | import android.util.Log; 6 | import android.webkit.ConsoleMessage; 7 | 8 | import com.shashank.platform.loginui.LoginActivity; 9 | import com.shashank.platform.loginui.RegisterActivity; 10 | 11 | import org.json.JSONObject; 12 | 13 | import java.io.Console; 14 | import java.io.IOException; 15 | 16 | import okhttp3.Call; 17 | import okhttp3.Callback; 18 | import okhttp3.FormBody; 19 | import okhttp3.OkHttpClient; 20 | import okhttp3.Request; 21 | import okhttp3.Response; 22 | 23 | public class HttpHandler { 24 | final static String URL = "http://apdo.ltd:8000"; 25 | 26 | } -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/add_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/drawable/add_image.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/buttonshapewhitebg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/good_morning_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/drawable/good_morning_img.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/good_night_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/drawable/good_night_img.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_email_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_help_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_help_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_help_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_help_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_home_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_home_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_home_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_lock_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_search_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_search_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/drawable/ic_search_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/drawable/icon.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/drawable/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/drawable/logo.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/font/calibri.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/font/calibri.ttf -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/font/gotham.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/font/gotham.ttf -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/layout/activity_selection.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 13 | 18 | 19 | 25 | 26 | 27 | 28 | 35 | 36 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/layout/fragment_recognize.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 14 | 15 | 25 | 26 | 36 | 37 | 45 | 46 | 52 | 53 | 60 | 61 | 71 | 75 | 76 | 77 | 78 | 86 | 87 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/layout/fragment_userinfo.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 18 | 19 | 23 | 24 | 25 | 26 | 27 | 31 | 32 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_help_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_help_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_help_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_help_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_home_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_home_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_home_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_search_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_search_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-hdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_help_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_help_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_help_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_help_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_home_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_home_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_home_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_search_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_search_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-mdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_help_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_help_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_help_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_help_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_home_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_home_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_home_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_search_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_search_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xhdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_help_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_help_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_help_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_help_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_home_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_home_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_home_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_search_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_search_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxhdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_help_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_help_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_help_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_help_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_home_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_home_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_home_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_search_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_search_black_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/app/src/main/res/mipmap-xxxhdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/values/array.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 车牌识别 5 | 车型识别 6 | 多车检测 7 | 属性识别 8 | 违规检测 9 | 10 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | #96ffffff 7 | 8 | #3F51B5 9 | #303F9F 10 | #FF4081 11 | #FFFFFF 12 | 13 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 车必识 3 | 4 | 5 | Hello blank fragment 6 | 7 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 19 | 20 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/app/src/test/java/com/shashank/platform/loginui/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.shashank.platform.loginui; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | 5 | repositories { 6 | google() 7 | jcenter() 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:3.4.2' 11 | 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | allprojects { 19 | repositories { 20 | google() 21 | jcenter() 22 | } 23 | } 24 | 25 | task clean(type: Delete) { 26 | delete rootProject.buildDir 27 | } 28 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/Carteller-Android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Jul 10 10:50:27 CST 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip 7 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /AndroidPart/Carteller-Android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':BottomNavigationModule' 2 | -------------------------------------------------------------------------------- /AndroidPart/release/app-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/AndroidPart/release/app-release.apk -------------------------------------------------------------------------------- /AndroidPart/release/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/.idea/CarInfoTeller.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/.idea/dictionaries/Robb.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | datasets 5 | 6 | 7 | -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/__pycache__/config.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarInfoTeller/CarInfoTeller/__pycache__/config.cpython-37.pyc -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/base/__init__.py: -------------------------------------------------------------------------------- 1 | from .base_data_loader import * 2 | from .base_model import * 3 | from .base_trainer import * 4 | -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/base/base_data_loader.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from torch.utils.data import DataLoader 3 | from torch.utils.data.sampler import SubsetRandomSampler 4 | 5 | 6 | class BaseDataLoader(DataLoader): 7 | """ 8 | Base class for all data loaders 9 | """ 10 | def __init__(self, dataset, batch_size, shuffle, validation_split, num_workers): 11 | self.validation_split = validation_split 12 | self.shuffle = shuffle 13 | 14 | self.batch_idx = 0 15 | self.n_samples = len(dataset) 16 | 17 | self.sampler, self.valid_sampler = self._split_sampler(self.validation_split) 18 | 19 | self.init_kwargs = { 20 | 'dataset': dataset, 21 | 'batch_size': batch_size, 22 | 'shuffle': self.shuffle, 23 | 'num_workers': num_workers 24 | } 25 | super(BaseDataLoader, self).__init__(sampler=self.sampler, **self.init_kwargs) 26 | 27 | def _split_sampler(self, split): 28 | if split == 0.0: 29 | return None, None 30 | 31 | idx_full = np.arange(self.n_samples) 32 | 33 | np.random.seed(3) 34 | np.random.shuffle(idx_full) 35 | 36 | if isinstance(split, int): 37 | assert split > 0 38 | assert split < self.n_samples, "validation set size is configured to be larger than entire dataset." 39 | len_valid = split 40 | else: 41 | len_valid = int(self.n_samples * split) 42 | 43 | valid_idx = idx_full[0:len_valid] 44 | train_idx = np.delete(idx_full, np.arange(0, len_valid)) 45 | 46 | train_sampler = SubsetRandomSampler(train_idx) 47 | valid_sampler = SubsetRandomSampler(valid_idx) 48 | 49 | # turn off shuffle option which is mutually exclusive with sampler 50 | self.shuffle = False 51 | self.n_samples = len(train_idx) 52 | 53 | return train_sampler, valid_sampler 54 | 55 | def split_validation(self): 56 | if self.valid_sampler is None: 57 | return None 58 | else: 59 | self.init_kwargs['dataset'].mode = 'val' 60 | return DataLoader(sampler=self.valid_sampler, **self.init_kwargs) 61 | -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/base/base_model.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import numpy as np 3 | from abc import abstractmethod 4 | 5 | 6 | class BaseModel(nn.Module): 7 | """ 8 | Base class for all models 9 | """ 10 | 11 | @abstractmethod 12 | def forward(self, *input): 13 | """ 14 | Forward pass logic 15 | 16 | :return: Model output 17 | """ 18 | raise NotImplementedError 19 | 20 | def __str__(self): 21 | """ 22 | Model prints with number of trainable parameters 23 | """ 24 | model_parameters = filter(lambda p: p.requires_grad, self.parameters()) 25 | params = sum([np.prod(p.size()) for p in model_parameters]) 26 | return super(BaseModel, self).__str__() + '\nTrainable parameters: {}'.format(params) 27 | -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/config.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from scipy import io as mat_io 3 | 4 | car_mat_file = "./data_processing/datasets/cars_metas/cars_meta" 5 | labels_meta = mat_io.loadmat(car_mat_file) 6 | class_names = [name[0] for name in labels_meta['class_names'][0]] 7 | 8 | use_gpu_all = torch.cuda.is_available() 9 | 10 | 11 | class ConfigTrain: 12 | best_acc1 = 0 13 | model_name = 'efficientnet-b4' 14 | batch_size = 2 15 | epochs = 90 16 | start_epoch = 0 17 | num_wokers = 4 18 | lr = 0.1 19 | weight_decay = 1e-4 20 | momentum = 0.9 21 | use_gpu = use_gpu_all 22 | print_freq = 100 23 | resume_file = "./checkpoints/model_best.pth.tar" 24 | data_dir = './data_processing/datasets/' 25 | num_classes = len(class_names) 26 | 27 | 28 | opt_train = ConfigTrain() 29 | -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/data_processing/__pycache__/auto_augment.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarInfoTeller/CarInfoTeller/data_processing/__pycache__/auto_augment.cpython-37.pyc -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/data_processing/__pycache__/car_dataset.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarInfoTeller/CarInfoTeller/data_processing/__pycache__/car_dataset.cpython-37.pyc -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/data_processing/car_dataset.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import torch 3 | from scipy import io as mat_io 4 | from skimage import io 5 | from torch.utils.data import Dataset 6 | from torchvision import transforms 7 | from PIL import Image 8 | 9 | 10 | class CarsDataset(Dataset): 11 | """ 12 | Cars Dataset 13 | """ 14 | def __init__(self, mode, data_dir, image_size): 15 | 16 | self.data_dir = data_dir 17 | self.img_names = [] 18 | self.target = [] 19 | 20 | self.mode = mode 21 | if mode == "test": 22 | metas = data_dir + "cars_metas/cars_test_annos" 23 | else: 24 | metas = data_dir + "cars_metas/cars_train_annos" 25 | 26 | labels_meta = mat_io.loadmat(metas) 27 | for img_ in labels_meta['annotations'][0]: 28 | if mode == "test": 29 | self.img_names.append(img_[4][0]) 30 | else: 31 | self.img_names.append(img_[5][0]) 32 | self.target.append(img_[4][0][0]) 33 | if self.mode == "train": 34 | self.train_transform = transforms.Compose([ 35 | transforms.RandomResizedCrop(224), 36 | transforms.RandomHorizontalFlip(), 37 | transforms.ToTensor(), 38 | transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), 39 | ]) 40 | else: 41 | self.val_or_test_transform = transforms.Compose([ 42 | transforms.Resize(image_size, interpolation=Image.BICUBIC), 43 | transforms.CenterCrop(image_size), 44 | transforms.ToTensor(), 45 | transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), 46 | ]) 47 | 48 | if self.mode == "train": 49 | self.img_names = self.img_names[:int(0.8 * len(self.img_names))] 50 | self.target = self.target[:int(0.8 * len(self.target))] 51 | elif self.mode == "val": 52 | self.img_names = self.img_names[int(0.8 * len(self.img_names)):] 53 | self.target = self.target[int(0.8 * len(self.target)):] 54 | 55 | def __getitem__(self, index): 56 | if self.mode == "test": 57 | img_path = self.data_dir + "testing/extracted/" + self.img_names[index] 58 | else: 59 | img_path = self.data_dir + "training/extracted/" + self.img_names[index] 60 | image = Image.open(img_path) 61 | image = image.convert('RGB') 62 | if self.mode == 'train': 63 | return self.train_transform(image), torch.tensor(self.target[index]-1, dtype=torch.long) 64 | elif self.mode == 'val': 65 | return self.val_or_test_transform(image), torch.tensor(self.target[index] - 1, dtype=torch.long) 66 | elif self.mode == 'test': 67 | return self.val_or_test_transform(image), torch.tensor(-1, dtype=torch.long) 68 | 69 | def __len__(self): 70 | return len(self.img_names) 71 | 72 | 73 | -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/data_processing/datasets/cars_metas/cars_meta.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarInfoTeller/CarInfoTeller/data_processing/datasets/cars_metas/cars_meta.mat -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/data_processing/datasets/cars_metas/cars_test_annos.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarInfoTeller/CarInfoTeller/data_processing/datasets/cars_metas/cars_test_annos.mat -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/data_processing/datasets/cars_metas/cars_train_annos.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarInfoTeller/CarInfoTeller/data_processing/datasets/cars_metas/cars_train_annos.mat -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/data_processing/extract_cars.py: -------------------------------------------------------------------------------- 1 | """ 2 | - Script to extract cars from image 3 | """ 4 | from scipy import io as mat_io 5 | from skimage import io as img_io 6 | import argparse 7 | import logging 8 | 9 | _logger = logging.getLogger(__name__) 10 | _logger.setLevel(0) 11 | 12 | 13 | if __name__ == '__main__': 14 | args = argparse.ArgumentParser(description='Extract Cars') 15 | 16 | args.add_argument('-m', '--meta', default='datasets/cars_metas/cars_test_annos', type=str, 17 | help='cars train meta (default: test)') 18 | args.add_argument('-i', '--input', default='datasets/testing/original/', type=str, 19 | help='input folder') 20 | args.add_argument('-o', '--output', default='datasets/testing/extracted/', type=str, 21 | help='output folder') 22 | parsed = args.parse_args() 23 | metas = parsed.meta 24 | original_folder = parsed.input 25 | extracted_folder = parsed.output 26 | 27 | labels_meta = mat_io.loadmat(metas) 28 | 29 | for img_ in labels_meta['annotations'][0]: 30 | x_min = img_[0][0][0] 31 | y_min = img_[1][0][0] 32 | 33 | x_max = img_[2][0][0] 34 | y_max = img_[3][0][0] 35 | 36 | if len(img_) == 6: 37 | img_name = img_[5][0] 38 | elif len(img_) == 5: 39 | img_name = img_[4][0] 40 | try: 41 | img_in = img_io.imread(original_folder + img_name) 42 | except Exception: 43 | print("Error while reading!") 44 | else: 45 | # print(img_in.shape) 46 | cars_extracted = img_in[y_min:y_max, x_min:x_max] 47 | _logger.info(x_min, y_min, x_max, y_max, cars_extracted.shape, img_in.shape, img_name) 48 | 49 | img_io.imsave(extracted_folder + img_name, cars_extracted) 50 | 51 | -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/demo.py: -------------------------------------------------------------------------------- 1 | """ 2 | Evaluate on ImageNet. Note that at the moment, training is not implemented (I am working on it). 3 | that being said, evaluation is working. 4 | """ 5 | 6 | import argparse 7 | import os 8 | import random 9 | import shutil 10 | import time 11 | import warnings 12 | from PIL import Image 13 | 14 | import torch 15 | import torch.nn as nn 16 | import torch.nn.parallel 17 | import torch.backends.cudnn as cudnn 18 | import torch.optim 19 | import torch.utils.data 20 | import torch.utils.data.distributed 21 | import torchvision.transforms as transforms 22 | from efficientnet_pytorch import EfficientNet 23 | from scipy import io as mat_io 24 | 25 | 26 | car_mat_file = "./data_processing/datasets/cars_metas/cars_meta" 27 | labels_meta = mat_io.loadmat(car_mat_file) 28 | labels_map = [name[0] for name in labels_meta['class_names'][0]] 29 | use_gpu = torch.cuda.is_available() 30 | print(use_gpu) 31 | resume_file = "./checkpoints/model_best.pth.tar" 32 | num_classes = len(labels_map) 33 | 34 | model_name = 'efficientnet-b4' 35 | batch_size = 2 36 | num_wokers = 4 37 | lr = 0.1 38 | weight_decay = 1e-4 39 | momentum = 0.9 40 | 41 | 42 | def tell(img): 43 | 44 | # 创建网络模型 45 | model = EfficientNet.from_pretrained(model_name, num_classes=num_classes) 46 | if use_gpu: 47 | model.cuda() 48 | 49 | # 损失函数和优化器 50 | criterion = nn.CrossEntropyLoss().cuda() 51 | optimizer = torch.optim.SGD(model.parameters(), lr, 52 | momentum=momentum, 53 | weight_decay=weight_decay) 54 | 55 | # 是加载已有的模型 56 | print("=> loading checkpoint '{}'".format(resume_file)) 57 | checkpoint = torch.load(resume_file) 58 | model.load_state_dict(checkpoint['state_dict']) 59 | print("=> loaded checkpoint '{}' (epoch {})".format(resume_file, checkpoint['epoch'])) 60 | 61 | cudnn.benchmark = True 62 | 63 | image_size = EfficientNet.get_image_size(model_name) 64 | tfms = transforms.Compose([ 65 | transforms.Resize(image_size, interpolation=Image.BICUBIC), 66 | transforms.CenterCrop(image_size), 67 | transforms.ToTensor(), 68 | transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), 69 | ]) 70 | img = tfms(img).unsqueeze(0) 71 | 72 | # 训练得到结果 73 | 74 | # switch to train mode 75 | model.train() 76 | with torch.no_grad(): 77 | logits = model(img.cuda()) 78 | preds = torch.topk(logits, k=5)[1].squeeze(0).tolist() 79 | print('-----') 80 | for idx in preds: 81 | label = labels_map[idx] 82 | prob = torch.softmax(logits, dim=1)[0, idx].item() 83 | print('{:<75} ({:.2f}%)'.format(label, prob * 100)) 84 | 85 | 86 | if __name__ == '__main__': 87 | img = Image.open("./data_processing/datasets/training/extracted/00001.jpg") 88 | tell(img) 89 | -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarInfoTeller/CarInfoTeller/models/__init__.py -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/models/efficentnet.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | import torch 3 | from torchvision import transforms 4 | from efficientnet_pytorch import EfficientNet 5 | 6 | -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarInfoTeller/CarInfoTeller/utils/__init__.py -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/utils/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarInfoTeller/CarInfoTeller/utils/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/utils/__pycache__/car_info_util.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarInfoTeller/CarInfoTeller/utils/__pycache__/car_info_util.cpython-37.pyc -------------------------------------------------------------------------------- /CarInfoTeller/CarInfoTeller/utils/car_info_util.py: -------------------------------------------------------------------------------- 1 | from scipy import io as mat_io 2 | 3 | car_mat_file = "../data_processing/datasets/cars_metas/cars_meta" 4 | labels_meta = mat_io.loadmat(car_mat_file) 5 | class_names = [name[0] for name in labels_meta['class_names'][0]] 6 | # print("**************************************************") 7 | # 8 | # car_mat_file2 = "../data_processing/datasets/cars_metas/cars_train_annos" 9 | # labels_meta2 = mat_io.loadmat(car_mat_file2) 10 | # print(labels_meta2["annotations"][0]) -------------------------------------------------------------------------------- /CarTeller/.idea/CarTeller.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /CarTeller/.idea/dictionaries/Robb.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | texting 5 | 6 | 7 | -------------------------------------------------------------------------------- /CarTeller/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /CarTeller/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /CarTeller/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CarTeller/CarAttributeTeller/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarAttributeTeller/__init__.py -------------------------------------------------------------------------------- /CarTeller/CarBoardTeller/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarBoardTeller/__init__.py -------------------------------------------------------------------------------- /CarTeller/CarBoardTeller/config.js: -------------------------------------------------------------------------------- 1 | { 2 | "config":[ 3 | { 4 | "open":1, 5 | "blur":3, 6 | "morphologyr":4, 7 | "morphologyc":19, 8 | "col_num_limit":10, 9 | "row_num_limit":21 10 | }, 11 | { 12 | "open":0, 13 | "blur":3, 14 | "morphologyr":5, 15 | "morphologyc":12, 16 | "col_num_limit":10, 17 | "row_num_limit":18 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarInfoTeller/__init__.py -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/base/__init__.py: -------------------------------------------------------------------------------- 1 | from .base_data_loader import * 2 | from .base_model import * 3 | from .base_trainer import * 4 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/base/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarInfoTeller/base/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/base/__pycache__/base_data_loader.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarInfoTeller/base/__pycache__/base_data_loader.cpython-37.pyc -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/base/__pycache__/base_model.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarInfoTeller/base/__pycache__/base_model.cpython-37.pyc -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/base/__pycache__/base_trainer.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarInfoTeller/base/__pycache__/base_trainer.cpython-37.pyc -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/base/base_data_loader.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from torch.utils.data import DataLoader 3 | from torch.utils.data.sampler import SubsetRandomSampler 4 | 5 | 6 | class BaseDataLoader(DataLoader): 7 | """ 8 | Base class for all data loaders 9 | """ 10 | def __init__(self, dataset, batch_size, shuffle, validation_split, num_workers): 11 | self.validation_split = validation_split 12 | self.shuffle = shuffle 13 | 14 | self.batch_idx = 0 15 | self.n_samples = len(dataset) 16 | 17 | self.sampler, self.valid_sampler = self._split_sampler(self.validation_split) 18 | 19 | self.init_kwargs = { 20 | 'dataset': dataset, 21 | 'batch_size': batch_size, 22 | 'shuffle': self.shuffle, 23 | 'num_workers': num_workers 24 | } 25 | super(BaseDataLoader, self).__init__(sampler=self.sampler, **self.init_kwargs) 26 | 27 | def _split_sampler(self, split): 28 | if split == 0.0: 29 | return None, None 30 | 31 | idx_full = np.arange(self.n_samples) 32 | 33 | np.random.seed(3) 34 | np.random.shuffle(idx_full) 35 | 36 | if isinstance(split, int): 37 | assert split > 0 38 | assert split < self.n_samples, "validation set size is configured to be larger than entire dataset." 39 | len_valid = split 40 | else: 41 | len_valid = int(self.n_samples * split) 42 | 43 | valid_idx = idx_full[0:len_valid] 44 | train_idx = np.delete(idx_full, np.arange(0, len_valid)) 45 | 46 | train_sampler = SubsetRandomSampler(train_idx) 47 | valid_sampler = SubsetRandomSampler(valid_idx) 48 | 49 | # turn off shuffle option which is mutually exclusive with sampler 50 | self.shuffle = False 51 | self.n_samples = len(train_idx) 52 | 53 | return train_sampler, valid_sampler 54 | 55 | def split_validation(self): 56 | if self.valid_sampler is None: 57 | return None 58 | else: 59 | self.init_kwargs['dataset'].mode = 'val' 60 | return DataLoader(sampler=self.valid_sampler, **self.init_kwargs) 61 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/base/base_model.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import numpy as np 3 | from abc import abstractmethod 4 | 5 | 6 | class BaseModel(nn.Module): 7 | """ 8 | Base class for all models 9 | """ 10 | 11 | @abstractmethod 12 | def forward(self, *input): 13 | """ 14 | Forward pass logic 15 | 16 | :return: Model output 17 | """ 18 | raise NotImplementedError 19 | 20 | def __str__(self): 21 | """ 22 | Model prints with number of trainable parameters 23 | """ 24 | model_parameters = filter(lambda p: p.requires_grad, self.parameters()) 25 | params = sum([np.prod(p.size()) for p in model_parameters]) 26 | return super(BaseModel, self).__str__() + '\nTrainable parameters: {}'.format(params) 27 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/car_info_main.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import torch 3 | import CarInfoTeller.model.model as module_arch 4 | from parse_config import ConfigParser 5 | from torchvision import transforms 6 | from skimage import io 7 | import scipy.io as mat_io 8 | import cv2 9 | import os 10 | import sys 11 | import gc 12 | 13 | def get_labels(): 14 | car_mat_file = "./cars_meta" 15 | labels_meta = mat_io.loadmat(car_mat_file) 16 | labels_map = [name[0] for name in labels_meta['class_names'][0]] 17 | names = [line[:-1] for line in open('./cars_translated.txt', 'r', encoding='UTF-8')] 18 | return labels_map, names 19 | 20 | 21 | def predict(config, resume, image): 22 | """ 23 | 汽车车型识别 24 | :param config: **** 25 | :param resume: **** 26 | :param image: cv2格式 27 | :return:车型信息, 对应概率,一共返回有5个可能车型 28 | """ 29 | 30 | # build model architecture 31 | model = config.initialize('arch', module_arch) 32 | print(resume) 33 | checkpoint = torch.load(resume,map_location='cpu') 34 | state_dict = checkpoint['state_dict'] 35 | if config['n_gpu'] > 1: 36 | model = torch.nn.DataParallel(model) 37 | model.load_state_dict(state_dict) 38 | 39 | # prepare model for testing 40 | device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') 41 | model = model.to(device) 42 | model.eval() 43 | 44 | # 图片处理 45 | image = cv2.resize(image, (299, 299), interpolation=cv2.INTER_CUBIC) 46 | transform = transforms.Compose([ 47 | transforms.ToTensor(), 48 | transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) 49 | ]) 50 | image = transform(image).unsqueeze(0) 51 | 52 | with torch.no_grad(): 53 | image = image.to(device) 54 | output = model(image) 55 | preds = torch.topk(output, k=5)[1].squeeze(0).tolist() 56 | labels_map, names = get_labels() 57 | infos = [labels_map[idx] + "(" + names[idx] + ")" for idx in preds] 58 | pros = [torch.softmax(output, dim=1)[0, idx].item() for idx in preds] 59 | del model 60 | gc.collect() 61 | return infos, pros 62 | 63 | 64 | def car_info_tell(img): 65 | """ 66 | 汽车车型识别 67 | :param img: cv2格式 68 | :return: 69 | """ 70 | parser = argparse.ArgumentParser(description='Cars Test') 71 | 72 | parser.add_argument( '--phase', default='test', type=str, 73 | help='phase (default: None)') 74 | parser.add_argument( '--config', default='./test_config.json', type=str, 75 | help='config file path (default: None)') 76 | parser.add_argument( '--model', default='./model_best.pth', 77 | type=str, 78 | help='path to model (default: None)') 79 | parser.add_argument('--device', default=None, type=str, 80 | help='indices of GPUs to enable (default: all)') 81 | 82 | print(sys.argv[1:]) 83 | args,unknown = parser.parse_known_args(["test","./test_config.json","./model_best.path"]) 84 | config = ConfigParser(parser) 85 | infos, pros = predict(config, args.model, img) 86 | return infos, pros # 车型信息, 对应概率,一共返回有5个可能车型 87 | 88 | 89 | if __name__ == '__main__': 90 | 91 | image = io.imread("./test.jpg") 92 | infos, pros = car_info_tell(image) 93 | for item in zip(infos, pros): 94 | print(item) 95 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/cars_meta.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarInfoTeller/cars_meta.mat -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/cars_translated.txt: -------------------------------------------------------------------------------- 1 | 美国通用 悍马 SUV 2000 2 | 讴歌 RL Sedan 2012 3 | 讴歌 TL Sedan 2012 4 | 讴歌 TL Type-S 2008 5 | 讴歌 TSX轿车2012 6 | 讴歌 Integra Type R 2001 7 | 讴歌 ZDX两厢车2012 8 | 阿斯顿马丁V8 Vantage敞篷车2012 9 | 阿斯顿马丁V8 Vantage Coupe 2012 10 | 阿斯顿马丁Virage敞篷车2012 11 | 阿斯顿马丁Virage Coupe 2012 12 | 奥迪RS 4敞篷车2008 13 | 奥迪A5 Coupe 2012 14 | 奥迪TTS Coupe 2012 15 | 奥迪R8 Coupe 2012 16 | 奥迪V8轿车1994 17 | 奥迪100轿车1994年 18 | 1994年奥迪100旅行车 19 | 奥迪TT两厢车2011 20 | 奥迪S6轿车2011 21 | 奥迪S5敞篷车2012 22 | 奥迪S5 Coupe 2012 23 | 奥迪S4 Sedan 2012 24 | 奥迪S4 Sedan 2007 25 | 奥迪TT RS Coupe 2012 26 | 宝马 ActiveHybrid 5 Sedan 2012 27 | 宝马1系敞篷车2012 28 | 宝马1系双门轿跑车2012 29 | 宝马3系轿车2012 30 | 2012年宝马3系列旅行车 31 | 宝马6系敞篷车2007 32 | 宝马 X5 SUV 2007 33 | 宝马 X6 SUV 2012 34 | 宝马 M3 Coupe 2012 35 | 宝马 M5轿车2010 36 | 宝马 M6敞篷车2010 37 | 宝马X3 SUV 2012 38 | 宝马 Z4敞篷车2012 39 | 宾利欧陆 Supersports Conv 敞篷车2012 40 | 宾利红章 Sedan 2009 41 | 宾利慕尚 Sedan 2011 42 | 宾利欧陆GT Coupe 2012 43 | 宾利欧陆GT Coupe 2007 44 | 宾利欧陆Flying Spur Sedan 2007 45 | 布加迪威龙16.4敞篷车2009 46 | 布加迪威龙16.4 Coupe 2009 47 | 别克君威GS 2012 48 | 别克雷尼尔SUV 2007 49 | 别克Verano轿车2012年 50 | 别克Enclave SUV 2012 51 | 凯迪拉克CTS-V轿车2012 52 | 凯迪拉克SRX SUV 2012 53 | 凯迪拉克Escalade EXT Crew Cab 2007 54 | 雪佛兰Silverado 1500 Hybrid Crew Cab 2012 55 | 雪佛兰Corvette敞篷车2012 56 | 雪佛兰Corvette ZR1 2012 57 | 雪佛兰Corvette Ron Fellows Edition Z06 2007 58 | 雪佛兰Traverse SUV 2012 59 | 雪佛兰Camaro敞篷车2012 60 | 雪佛兰HHR SS 2010 61 | 雪佛兰Impala Sedan 2007 62 | 雪佛兰Tahoe混合动力SUV 2012 63 | 雪佛兰Sonic Sedan 2012 64 | 雪佛兰Express Cargo Van 2007 65 | 雪佛兰Avalanche Crew Cab 2012 66 | 雪佛兰Cobalt SS 2010 67 | 雪佛兰Malibu混合轿车2010 68 | 雪佛兰TrailBlazer SS 2009 69 | 雪佛兰Silverado 2500HD普通驾驶室2012 70 | 雪佛兰Silverado 1500 Classic Extended Cab 2007 71 | 雪佛兰Express Van 2007 72 | 雪佛兰蒙特卡洛Coupe 2007 73 | 雪佛兰Malibu Sedan 2007 74 | 雪佛兰Silverado 1500 Extended Cab 2012 75 | 雪佛兰Silverado 1500 Regular Cab 2012 76 | 克莱斯勒Aspen SU​​V 2009 77 | 克莱斯勒Sebring敞篷车2010 78 | 克莱斯勒镇和国家小型货车2012 79 | 克莱斯勒300 SRT-8 2010 80 | 克莱斯勒Crossfire敞篷车2008 81 | 克莱斯勒PT Cruiser敞篷车2008 82 | 大宇努比拉旅行车2002 83 | 道奇Caliber Wagon 2012 84 | 道奇Caliber Wagon 2007 85 | 道奇Caravan Minivan 1997 86 | 道奇Ram Pickup 3500 Crew Cab 2010 87 | 道奇Ram Pickup 3500 Quad Cab 2009 88 | 道奇Sprinter Cargo Van 2009 89 | 道奇之旅SUV 2012 90 | 道奇 Dakota Crew Cab 2010 91 | 道奇 Dakota Club Cab 2007 92 | 道奇Magnum Wagon 2008 93 | 道奇挑战者SRT8 2011 94 | 道奇Durango SUV 2012 95 | 道奇Durango SUV 2007 96 | 道奇充电器轿车2012年 97 | 道奇Charger SRT-8 2009 98 | Eagle Talon两厢车1998 99 | FIAT 500 Abarth 2012 100 | FIAT 500 Convertible 2012 101 | 法拉利FF Coupe 2012 102 | 法拉利California Convertible 2012 103 | 法拉利458 Italia Convertible 2012 104 | 法拉利458 Italia Coupe 2012 105 | 菲斯克 卡玛 Sedan 2012 106 | 福特F-450 Super Duty Crew Cab 2012 107 | 福特野马敞篷车2007 108 | 福特Freestar小型货车2007 109 | 福特Expedition EL SUV 2009 110 | 福特Edge SUV 2012 111 | 福特Ranger SuperCab 2011 112 | 福特GT Coupe 2006 113 | 福特F-150普通驾驶室2012 114 | 福特F-150普通驾驶室2007 115 | 福特福克斯轿车2007 116 | 福特E系列旅行车2012 117 | 福特嘉年华轿车2012 118 | 商务之星 Terrain SUV 2012 119 | 商务之星 Savana Van 2012 120 | 商务之星 Yukon Hybrid SUV 2012 121 | 商务之星 Acadia SUV 2012 122 | 商务之星 Canyon Extended Cab 2012 123 | Geo Metro Convertible 1993 124 | 悍马 H3T Crew Cab 2010 125 | 悍马 H2 SUT Crew Cab 2009 126 | 本田奥德赛小型货车2012 127 | 本田奥德赛小型货车2007 128 | 本田雅阁Coupe 2012 129 | 本田雅阁轿车2012 130 | 现代Veloster两厢车2012 131 | 现代圣达菲SUV 2012 132 | 现代途胜SUV 2012 133 | 现代韦拉克鲁斯SUV 2012 134 | 现代索纳塔混合动力轿车2012 135 | 现代伊兰特轿车2007 136 | 现代雅绅特轿车2012 137 | 现代创世纪轿车2012 138 | 现代索纳塔轿车2012 139 | 现代伊兰特旅行两厢车2012 140 | 现代Azera Sedan 2012 141 | 英菲尼迪G Coupe IPL 2012 142 | 英菲尼迪QX56 SUV 2011 143 | 五十铃Ascender SUV 2008 144 | 捷豹XK XKR 2012 145 | 吉普爱国者SUV 2012 146 | 吉普牧马人SUV 2012 147 | 吉普自由SUV 2012 148 | 吉普大切诺基SUV 2012 149 | 吉普指南针SUV 2012 150 | 兰博基尼Reventon Coupe 2008 151 | 兰博基尼Aventador Coupe 2012 152 | 兰博基尼Gallardo LP 570-4 Superleggera 2012 153 | 兰博基尼暗黑破坏神Coupe 2001 154 | 路虎揽胜SUV 2012 155 | 路虎LR2 SUV 2012 156 | 林肯镇汽车轿车2011年 157 | MINI Cooper Roadster敞篷车2012 158 | 迈巴赫Landaulet敞篷车2012 159 | 马自达Tribute SUV 2011 160 | 迈凯轮MP4-12C Coupe 2012 161 | 梅赛德斯 - 奔驰300级敞篷车1993 162 | 梅赛德斯 - 奔驰C级轿车2012 163 | 梅赛德斯 - 奔驰SL级轿跑车2009 164 | 梅赛德斯 - 奔驰E级轿车2012 165 | 梅赛德斯 - 奔驰S级轿车2012 166 | 梅赛德斯 - 奔驰Sprinter Van 2012 167 | 三菱Lancer轿车2012 168 | 日产Leaf两厢车2012 169 | 日产NV乘用车2012 170 | 日产Juke两厢车2012 171 | 日产240SX Coupe 1998 172 | 普利茅斯霓虹灯Coupe 1999 173 | 保时捷Panamera Sedan 2012 174 | Ram C / V Cargo Van Minivan 2012 175 | 劳斯莱斯Phantom Drophead Coupe敞篷车2012 176 | 罗尔斯·罗伊斯幽灵轿车2012年 177 | 劳斯莱斯幻影轿车2012年 178 | 赛恩 xD两厢车2012 179 | 世爵 C8敞篷车2009 180 | 世爵 C8 Coupe 2009 181 | 铃木Aerio Sedan 2007 182 | 铃木Kizashi轿车2012年 183 | 铃木SX4两厢车2012 184 | 铃木SX4轿车2012 185 | 特斯拉Model S Sedan 2012 186 | 丰田红杉SUV 2012 187 | 丰田凯美瑞轿车2012 188 | 丰田卡罗拉轿车2012年 189 | 丰田4Runner SUV 2012 190 | 大众高尔夫两厢车2012 191 | 大众高尔夫两厢车1991 192 | 大众甲壳虫两厢车2012 193 | 沃尔沃C30两厢车2012 194 | 沃尔沃240 Sedan 1993 195 | 沃尔沃XC90 SUV 2007 196 | 精灵轿车 敞篷车2012 -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/logger/__init__.py: -------------------------------------------------------------------------------- 1 | from .logger import * 2 | from .visualization import * -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/logger/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarInfoTeller/logger/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/logger/__pycache__/logger.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarInfoTeller/logger/__pycache__/logger.cpython-37.pyc -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/logger/__pycache__/visualization.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarInfoTeller/logger/__pycache__/visualization.cpython-37.pyc -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/logger/logger.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import logging.config 3 | from pathlib import Path 4 | from CarInfoTeller.utils import read_json 5 | 6 | 7 | def setup_logging(save_dir, log_config='logger/logger_config.json', default_level=logging.INFO): 8 | """ 9 | Setup logging configuration 10 | """ 11 | log_config = Path(log_config) 12 | if log_config.is_file(): 13 | config = read_json(log_config) 14 | # modify logging paths based on run config 15 | for _, handler in config['handlers'].items(): 16 | if 'filename' in handler: 17 | handler['filename'] = str(save_dir / handler['filename']) 18 | 19 | logging.config.dictConfig(config) 20 | else: 21 | print("Warning: logging configuration file is not found in {}.".format(log_config)) 22 | logging.basicConfig(level=default_level) 23 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/logger/logger_config.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "version": 1, 4 | "disable_existing_loggers": false, 5 | "formatters": { 6 | "simple": {"format": "%(message)s"}, 7 | "datetime": {"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"} 8 | }, 9 | "handlers": { 10 | "console": { 11 | "class": "logging.StreamHandler", 12 | "level": "DEBUG", 13 | "formatter": "simple", 14 | "stream": "ext://sys.stdout" 15 | }, 16 | "info_file_handler": { 17 | "class": "logging.handlers.RotatingFileHandler", 18 | "level": "INFO", 19 | "formatter": "datetime", 20 | "filename": "info.log", 21 | "maxBytes": 10485760, 22 | "backupCount": 20, "encoding": "utf8" 23 | } 24 | }, 25 | "root": { 26 | "level": "INFO", 27 | "handlers": [ 28 | "console", 29 | "info_file_handler" 30 | ] 31 | } 32 | } -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/logger/visualization.py: -------------------------------------------------------------------------------- 1 | import importlib 2 | from CarInfoTeller.utils import Timer 3 | 4 | 5 | class WriterTensorboardX(): 6 | def __init__(self, log_dir, logger, enable): 7 | self.writer = None 8 | if enable: 9 | log_dir = str(log_dir) 10 | try: 11 | self.writer = importlib.import_module('tensorboardX').SummaryWriter(log_dir) 12 | except ImportError: 13 | message = "Warning: TensorboardX visualization is configured to use, but currently not installed on " \ 14 | "this machine. Please install the package by 'pip install tensorboardx' command or turn " \ 15 | "off the option in the 'train_config.json' file." 16 | logger.warning(message) 17 | self.step = 0 18 | self.mode = '' 19 | 20 | self.tb_writer_ftns = [ 21 | 'add_scalar', 'add_scalars', 'add_image', 'add_images', 'add_audio', 22 | 'add_text', 'add_histogram', 'add_pr_curve', 'add_embedding' 23 | ] 24 | self.tag_mode_exceptions = ['add_histogram', 'add_embedding'] 25 | self.timer = Timer() 26 | 27 | def set_step(self, step, mode='train'): 28 | self.mode = mode 29 | self.step = step 30 | if step == 0: 31 | self.timer.reset() 32 | else: 33 | duration = self.timer.check() 34 | self.add_scalar('steps_per_sec', 1 / duration) 35 | 36 | def __getattr__(self, name): 37 | """ 38 | If visualization is configured to use: 39 | return add_data() methods of tensorboard with additional information (step, tag) added. 40 | Otherwise: 41 | return a blank function handle that does nothing 42 | """ 43 | if name in self.tb_writer_ftns: 44 | add_data = getattr(self.writer, name, None) 45 | 46 | def wrapper(tag, data, *args, **kwargs): 47 | if add_data is not None: 48 | # add mode(train/valid) tag 49 | if name not in self.tag_mode_exceptions: 50 | tag = '{}/{}'.format(tag, self.mode) 51 | add_data(tag, data, self.step, *args, **kwargs) 52 | return wrapper 53 | else: 54 | # default action for returning methods defined in this class, set_step() for instance. 55 | try: 56 | attr = object.__getattr__(name) 57 | except AttributeError: 58 | raise AttributeError("type object 'WriterTensorboardX' has no attribute '{}'".format(name)) 59 | return attr 60 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/model/inception.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | from torchvision.models import inception_v3 3 | from CarInfoTeller.base import BaseModel 4 | 5 | 6 | class InceptionV3(BaseModel): 7 | 8 | def __init__(self, num_classes=196, use_pretrained=True): 9 | super(BaseModel, self).__init__() 10 | self.model = inception_v3(pretrained=use_pretrained) 11 | 12 | n_inputs = self.model.fc.in_features 13 | classifier = nn.Sequential(nn.Linear(n_inputs, num_classes)) 14 | self.model.fc = classifier 15 | 16 | def forward(self, x): 17 | return self.model(x) 18 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/model/loss.py: -------------------------------------------------------------------------------- 1 | import torch.nn.functional as F 2 | 3 | 4 | def cross_entropy_loss(output, target): 5 | return F.cross_entropy(output, target) 6 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/model/metric.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from sklearn.metrics import f1_score 3 | 4 | 5 | def accuracy(output, target): 6 | with torch.no_grad(): 7 | pred = torch.argmax(output, dim=1) 8 | assert pred.shape[0] == len(target) 9 | correct = 0 10 | correct += torch.sum(pred == target).item() 11 | return correct / len(target) 12 | 13 | 14 | def top_k_accuracy(output, target, k=5): 15 | with torch.no_grad(): 16 | pred = torch.topk(output, k, dim=1)[1] 17 | assert pred.shape[0] == len(target) 18 | correct = 0 19 | for i in range(k): 20 | correct += torch.sum(pred[:, i] == target).item() 21 | return correct / len(target) 22 | 23 | 24 | def f1(output, target): 25 | pred = torch.argmax(output, dim=1) 26 | return f1_score(target.cpu(), pred.cpu(), average='micro') 27 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/model/model.py: -------------------------------------------------------------------------------- 1 | from .resnet import * 2 | 3 | 4 | __all__ = ['ResNet18', 'ResNet34', 'ResNet50', 'ResNet101', 'ResNet152'] 5 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/model/resnet.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | from torchvision.models import resnet34, resnet18, resnet50 , resnet101, resnet152 3 | from CarInfoTeller.base import BaseModel 4 | 5 | 6 | class ResNet152(BaseModel): 7 | 8 | def __init__(self, num_classes=196, use_pretrained=True): 9 | super(BaseModel, self).__init__() 10 | self.model = resnet152(pretrained=use_pretrained) 11 | 12 | # replace last layer with total cars classes 13 | n_inputs = self.model.fc.in_features 14 | classifier = nn.Sequential(nn.Linear(n_inputs, num_classes)) 15 | self.model.fc = classifier 16 | 17 | def forward(self, x): 18 | 19 | return self.model(x) 20 | 21 | 22 | class ResNet101(BaseModel): 23 | 24 | def __init__(self, num_classes=196, use_pretrained=True): 25 | super(BaseModel, self).__init__() 26 | self.model = resnet101(pretrained=use_pretrained) 27 | 28 | # replace last layer with total cars classes 29 | n_inputs = self.model.fc.in_features 30 | classifier = nn.Sequential(nn.Linear(n_inputs, num_classes)) 31 | self.model.fc = classifier 32 | 33 | def forward(self, x): 34 | 35 | return self.model(x) 36 | 37 | 38 | class ResNet50(BaseModel): 39 | 40 | def __init__(self, num_classes=196, use_pretrained=True): 41 | super(BaseModel, self).__init__() 42 | self.model = resnet50(pretrained=use_pretrained) 43 | 44 | # replace last layer with total cars classes 45 | n_inputs = self.model.fc.in_features 46 | classifier = nn.Sequential(nn.Linear(n_inputs, num_classes)) 47 | self.model.fc = classifier 48 | 49 | def forward(self, x): 50 | 51 | return self.model(x) 52 | 53 | 54 | class ResNet34(BaseModel): 55 | 56 | def __init__(self, num_classes=196, use_pretrained=True): 57 | super(BaseModel, self).__init__() 58 | self.model = resnet34(pretrained=use_pretrained) 59 | 60 | # replace last layer with total cars classes 61 | n_inputs = self.model.fc.in_features 62 | classifier = nn.Sequential(nn.Linear(n_inputs, num_classes)) 63 | self.model.fc = classifier 64 | 65 | def forward(self, x): 66 | 67 | return self.model(x) 68 | 69 | 70 | class ResNet18(BaseModel): 71 | 72 | def __init__(self, num_classes=196, use_pretrained=True): 73 | super(BaseModel, self).__init__() 74 | self.model = resnet18(pretrained=use_pretrained) 75 | 76 | # replace last layer with total cars classes 77 | n_inputs = self.model.fc.in_features 78 | classifier = nn.Sequential(nn.Linear(n_inputs, num_classes)) 79 | self.model.fc = classifier 80 | 81 | def forward(self, x): 82 | 83 | return self.model(x) 84 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/model/squeezenet.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | from torchvision.models import squeezenet 3 | from CarInfoTeller.base import BaseModel 4 | 5 | 6 | class SqueezeNet(BaseModel): 7 | def __init__(self, num_classes=196, use_pretrained=False): 8 | super(BaseModel, self).__init__() 9 | self.model = squeezenet.squeezenet1_0(pretrained=use_pretrained) 10 | 11 | self.model.num_classes = num_classes 12 | 13 | # # replace last layer with total cars classes 14 | self.model.classifier[1] = nn.Conv2d(512, num_classes, kernel_size=(1, 1), stride=(1, 1)) 15 | 16 | def forward(self, x): 17 | return self.model.forward(x) 18 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/model/wide_resnet.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch.nn.functional as F 3 | 4 | 5 | def conv3x3(in_planes, out_planes, stride=1): 6 | return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=True) 7 | 8 | 9 | def cfg(depth): 10 | depth_lst = [18, 34, 50, 101, 152] 11 | assert (depth in depth_lst), "Error : Resnet depth should be either 18, 34, 50, 101, 152" 12 | cf_dict = { 13 | '18': (BasicBlock, [2, 2, 2, 2]), 14 | '34': (BasicBlock, [3, 4, 6, 3]), 15 | '50': (Bottleneck, [3, 4, 6, 3]), 16 | '101': (Bottleneck, [3, 4, 23, 3]), 17 | '152': (Bottleneck, [3, 8, 36, 3]), 18 | } 19 | 20 | return cf_dict[str(depth)] 21 | 22 | 23 | class BasicBlock(nn.Module): 24 | expansion = 1 25 | 26 | def __init__(self, in_planes, planes, stride=1): 27 | super(BasicBlock, self).__init__() 28 | self.conv1 = conv3x3(in_planes, planes, stride) 29 | self.bn1 = nn.BatchNorm2d(planes) 30 | self.conv2 = conv3x3(planes, planes) 31 | self.bn2 = nn.BatchNorm2d(planes) 32 | 33 | self.shortcut = nn.Sequential() 34 | if stride != 1 or in_planes != self.expansion * planes: 35 | self.shortcut = nn.Sequential( 36 | nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=True), 37 | nn.BatchNorm2d(self.expansion*planes) 38 | ) 39 | 40 | def forward(self, x): 41 | out = F.relu(self.bn1(self.conv1(x))) 42 | out = self.bn2(self.conv2(out)) 43 | out += self.shortcut(x) 44 | out = F.relu(out) 45 | 46 | return out 47 | 48 | 49 | class Bottleneck(nn.Module): 50 | expansion = 4 51 | 52 | def __init__(self, in_planes, planes, stride=1): 53 | super(Bottleneck, self).__init__() 54 | self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=1, bias=True) 55 | self.bn1 = nn.BatchNorm2d(planes) 56 | self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=True) 57 | self.bn2 = nn.BatchNorm2d(planes) 58 | self.conv3 = nn.Conv2d(planes, self.expansion*planes, kernel_size=1, bias=True) 59 | self.bn3 = nn.BatchNorm2d(self.expansion*planes) 60 | 61 | self.shortcut = nn.Sequential() 62 | if stride != 1 or in_planes != self.expansion*planes: 63 | self.shortcut = nn.Sequential( 64 | nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=True), 65 | nn.BatchNorm2d(self.expansion*planes) 66 | ) 67 | 68 | def forward(self, x): 69 | out = F.relu(self.bn1(self.conv1(x))) 70 | out = F.relu(self.bn2(self.conv2(out))) 71 | out = self.bn3(self.conv3(out)) 72 | out += self.shortcut(x) 73 | out = F.relu(out) 74 | 75 | return out 76 | 77 | 78 | class ResNet(nn.Module): 79 | def __init__(self, depth, num_classes): 80 | super(ResNet, self).__init__() 81 | self.in_planes = 16 82 | 83 | block, num_blocks = cfg(depth) 84 | 85 | self.conv1 = conv3x3(3,16) 86 | self.bn1 = nn.BatchNorm2d(16) 87 | self.layer1 = self._make_layer(block, 16, num_blocks[0], stride=1) 88 | self.layer2 = self._make_layer(block, 32, num_blocks[1], stride=2) 89 | self.layer3 = self._make_layer(block, 64, num_blocks[2], stride=2) 90 | self.linear = nn.Linear(64*block.expansion, num_classes) 91 | 92 | def _make_layer(self, block, planes, num_blocks, stride): 93 | strides = [stride] + [1]*(num_blocks-1) 94 | layers = [] 95 | 96 | for stride in strides: 97 | layers.append(block(self.in_planes, planes, stride)) 98 | self.in_planes = planes * block.expansion 99 | 100 | return nn.Sequential(*layers) 101 | 102 | def forward(self, x): 103 | out = F.relu(self.bn1(self.conv1(x))) 104 | out = self.layer1(out) 105 | out = self.layer2(out) 106 | out = self.layer3(out) 107 | out = F.avg_pool2d(out, 8) 108 | out = out.view(out.size(0), -1) 109 | out = self.linear(out) 110 | 111 | return out 112 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/test_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ResNet152-AutoAugment", 3 | "n_gpu": 1, 4 | 5 | "arch": { 6 | "type": "ResNet152", 7 | "args": { 8 | "use_pretrained": true, 9 | "num_classes": 196 10 | } 11 | }, 12 | "data_processing": { 13 | "type": "CarsDataLoader", 14 | "args":{ 15 | "mode": "test", 16 | "data_dir": "data_processing/datasets/testing/extracted/", 17 | "metas": "data_processing/datasets/cars_metas/cars_test_annos_withlabels.mat", 18 | "resize_width": 299, 19 | "resize_height": 299, 20 | "batch_size": 4, 21 | "shuffle": false, 22 | "validation_split": 0.0, 23 | "num_workers": 1, 24 | "limit": null 25 | } 26 | }, 27 | "metrics": [ 28 | "accuracy", "top_k_accuracy", "f1" 29 | ], 30 | "log_dir": "saved/" 31 | } 32 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/utils/__init__.py: -------------------------------------------------------------------------------- 1 | from .util import * 2 | -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/utils/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarInfoTeller/utils/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/utils/__pycache__/util.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarInfoTeller/utils/__pycache__/util.cpython-37.pyc -------------------------------------------------------------------------------- /CarTeller/CarInfoTeller/utils/util.py: -------------------------------------------------------------------------------- 1 | import json 2 | from pathlib import Path 3 | from datetime import datetime 4 | from collections import OrderedDict 5 | 6 | 7 | def ensure_dir(dirname): 8 | dirname = Path(dirname) 9 | if not dirname.is_dir(): 10 | dirname.mkdir(parents=True, exist_ok=False) 11 | 12 | def read_json(fname): 13 | with fname.open('rt') as handle: 14 | return json.load(handle, object_hook=OrderedDict) 15 | 16 | def write_json(content, fname): 17 | with fname.open('wt') as handle: 18 | json.dump(content, handle, indent=4, sort_keys=False) 19 | 20 | class Timer: 21 | def __init__(self): 22 | self.cache = datetime.now() 23 | 24 | def check(self): 25 | now = datetime.now() 26 | duration = now - self.cache 27 | self.cache = now 28 | return duration.total_seconds() 29 | 30 | def reset(self): 31 | self.cache = datetime.now() -------------------------------------------------------------------------------- /CarTeller/CarTypeTellerMore/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarTypeTellerMore/__init__.py -------------------------------------------------------------------------------- /CarTeller/CarTypeTellerMore/car_type_more_main.py: -------------------------------------------------------------------------------- 1 | from imageai.Detection import ObjectDetection, VideoObjectDetection 2 | import matplotlib.pyplot as plt 3 | import os 4 | import cv2 5 | import base64 6 | 7 | def car_type_more_tell_video(path): 8 | execution_path = os.getcwd() 9 | 10 | detector = VideoObjectDetection() 11 | detector.setModelTypeAsRetinaNet() 12 | detector.setModelPath(os.path.join(execution_path, "resnet50_coco_best_v2.0.1.h5")) 13 | detector.loadModel("fast") 14 | 15 | detector.detectObjectsFromVideo(input_file_path=os.path.join(execution_path, path), 16 | output_file_path=os.path.join(execution_path, "test"), 17 | frames_per_second=20, log_progress=True) 18 | print("success") 19 | 20 | def car_type_more_tell(img): 21 | """ 22 | 汽车类型识别(多车): 23 | :param img: cv2格式 24 | :return: 返回预测图片, 和各类车的种类 25 | """ 26 | type_dict = {"car_count": 0, 27 | "bus_count": 0, 28 | "motorcycle_count": 0, 29 | "bicycle_count": 0, 30 | "truck_count": 0} 31 | 32 | execution_path = os.getcwd() 33 | detector = ObjectDetection() 34 | detector.setModelTypeAsRetinaNet() 35 | detector.setModelPath(os.path.join(execution_path, "resnet50_coco_best_v2.0.1.h5")) 36 | detector.loadModel() 37 | detections_img, detections_list = detector.detectObjectsFromImage(input_image=img, 38 | input_type="array", output_type="array") 39 | for eachObject in detections_list: 40 | if eachObject["name"] == 'car': 41 | type_dict["car_count"] += 1 42 | if eachObject["name"] == 'truck': 43 | type_dict["truck_count"] += 1 44 | if eachObject["name"] == 'bus': 45 | type_dict["bus_count"] += 1 46 | if eachObject["name"] == 'motorcycle': 47 | type_dict["motorcycle_count"] += 1 48 | if eachObject["name"] == 'bicycle': 49 | type_dict["bicycle_count"] += 1 50 | return detections_img, type_dict 51 | 52 | 53 | def image_to_base64(image_np): 54 | image = cv2.imencode('.jpg', image_np)[1] 55 | image_code = str(base64.b64encode(image))[2:-1] 56 | return image_code 57 | 58 | if __name__ == "__main__": 59 | #img = cv2.imread("./test.jpg") 60 | #detections_img, type_dict = car_type_more_tell(img) 61 | #print(detections_img) 62 | #string=image_to_base64(detections_img) 63 | #print(string) 64 | #plt.figure() 65 | #plt.imshow(detections_img) 66 | #plt.show() 67 | #print(type_dict) 68 | car_type_more_tell_video("./videoplayback.avi") 69 | -------------------------------------------------------------------------------- /CarTeller/CarTypeTellerOne/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/CarTypeTellerOne/__init__.py -------------------------------------------------------------------------------- /CarTeller/CarTypeTellerOne/car_type_one_main.py: -------------------------------------------------------------------------------- 1 | import torch as t 2 | import torch.nn as nn 3 | from torchvision import models, transforms 4 | from torch.utils.data import Dataset 5 | from torch.autograd import Variable 6 | from PIL import Image 7 | import os 8 | 9 | 10 | batch_size = 1 11 | num_classes = 5 12 | learning_rate = 0.0002 13 | model_path = "./vgg.pth" 14 | use_gpu = t.cuda.is_available() 15 | print(use_gpu) 16 | car_types = ["Bus", "Car", "Truck", "Motorcycle", "Tricycle"] 17 | test_transforms = transforms.Compose([ 18 | transforms.Resize(256), 19 | transforms.RandomResizedCrop(224), 20 | transforms.ToTensor(), 21 | transforms.Normalize((.5, .5, .5), (.5, .5, .5)) 22 | ]) 23 | 24 | 25 | class TsetDataSet(Dataset): 26 | def __init__(self, imgs, transform): 27 | self.transform = transform 28 | self.imgs = imgs 29 | 30 | def __len__(self): 31 | return len(self.imgs) 32 | 33 | def __getitem__(self, index): 34 | image = self.imgs[index][0] 35 | image = self.transform(image) 36 | return image, self.imgs[index][1] 37 | 38 | 39 | class VGGNet(nn.Module): 40 | def __init__(self): 41 | super(VGGNet, self).__init__() 42 | net = models.vgg16(pretrained=True) 43 | net.classifier = nn.Sequential() 44 | self.features = net 45 | self.classifier = nn.Sequential( 46 | nn.Linear(512 * 7 * 7, 512), 47 | nn.ReLU(True), 48 | nn.Dropout(), 49 | nn.Linear(512, 128), 50 | nn.ReLU(True), 51 | nn.Dropout(), 52 | nn.Linear(128, num_classes) 53 | ) 54 | 55 | def forward(self, x): 56 | x = self.features(x) 57 | x = x.view(x.size(0), -1) 58 | x = self.classifier(x) 59 | return x 60 | 61 | 62 | def car_type_one_tell(img): 63 | """ 64 | 汽车类型识别(单车) 65 | :param img: PIL格式图片 66 | :return: 返回类型字符串 67 | """ 68 | tfms = transforms.Compose([ 69 | transforms.Resize(256), 70 | transforms.RandomResizedCrop(224), 71 | transforms.ToTensor(), 72 | transforms.Normalize((.5, .5, .5), (.5, .5, .5)) 73 | ]) 74 | img = tfms(img).unsqueeze(0) 75 | model = VGGNet() 76 | 77 | if use_gpu: 78 | model.load_state_dict(t.load(model_path)) 79 | model.cuda() 80 | else: 81 | #model = t.nn.DataParallel(model) 82 | model.load_state_dict(t.load(model_path, map_location="cpu")) 83 | # 测试 84 | model.eval() 85 | if use_gpu: 86 | with t.no_grad(): 87 | batch_x = Variable(img).cuda() 88 | else: 89 | with t.no_grad(): 90 | batch_x = Variable(img) 91 | out = model(batch_x) 92 | pred = t.max(out, 1)[1] 93 | pred_types = pred.data.cpu().numpy().tolist() 94 | print(car_types[pred_types[0]]) 95 | 96 | 97 | if __name__ == "__main__": 98 | img = Image.open("./test.jpg") 99 | car_type_one_tell(img) 100 | 101 | -------------------------------------------------------------------------------- /CarTeller/DriverBehavior/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTeller/DriverBehavior/__init__.py -------------------------------------------------------------------------------- /CarTeller/app/__init__.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from logging.handlers import RotatingFileHandler 3 | from imp import reload 4 | import sys 5 | import os 6 | from flask_cors import CORS 7 | from flask import Flask 8 | from flask_sqlalchemy import SQLAlchemy 9 | 10 | reload(sys) 11 | # sys.setdefaultencoding('utf-8') 12 | 13 | app = Flask(__name__, template_folder='../templates', static_folder='../static') 14 | CORS(app, supports_credentials=True) 15 | app.secret_key=os.urandom(24) 16 | app.config.from_object("config") 17 | db = SQLAlchemy(app) 18 | 19 | from app import views,models -------------------------------------------------------------------------------- /CarTeller/app/database.py: -------------------------------------------------------------------------------- 1 | 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import scoped_session, sessionmaker 4 | from sqlalchemy.ext.declarative import declarative_base 5 | from config import SQLALCHEMY_DATABASE_URI 6 | 7 | engine = create_engine(SQLALCHEMY_DATABASE_URI, convert_unicode=True) 8 | db_session = scoped_session(sessionmaker(autocommit=False, 9 | autoflush=False, 10 | bind=engine)) 11 | Base = declarative_base() 12 | Base.query = db_session.query_property() 13 | 14 | def init_db(): 15 | from app.models import User 16 | from app.models import Record 17 | Base.metadata.create_all(bind=engine) -------------------------------------------------------------------------------- /CarTeller/app/models.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | 3 | from app import db 4 | from datetime import datetime 5 | 6 | class User(db.Model): 7 | username = db.Column(db.String(255), primary_key=True) 8 | password = db.Column(db.String(255)) 9 | key_token = db.Column(db.String(255), unique=True) 10 | count_access = db.Column(db.INT) 11 | 12 | def __init__(self,username,password,key_token,count_access): 13 | self.username = username 14 | self.password = password 15 | self.key_token = key_token 16 | self.count_access = count_access 17 | 18 | def __repr__(self): 19 | return '<用户是 %r>' % self.username 20 | 21 | def serialize(self): 22 | return { 23 | "username": self.username, 24 | "password": self.password, 25 | "key_token": self.key_token, 26 | "count_access": self.count_access 27 | } 28 | 29 | 30 | class Record(db.Model): 31 | id = db.Column(db.Integer,primary_key=True,autoincrement=True) 32 | username = db.Column(db.String(255)) 33 | msg = db.Column(db.String(255)) 34 | time = db.Column(db.DateTime,default=datetime.now()) 35 | url = db.Column(db.String(255)) 36 | 37 | def __init__(self,username,msg,time,url): 38 | self.username = username 39 | self.msg = msg 40 | self.time = time 41 | self.url = url 42 | 43 | def __repr__(self): 44 | return '<用户%s在%s访问>' % self.username, self.time 45 | 46 | def serialize(self): 47 | return { 48 | "username": self.username, 49 | "msg": self.msg, 50 | "time": self.time.strftime('%c'), 51 | "url": self.url 52 | } 53 | -------------------------------------------------------------------------------- /CarTeller/car_teller.py: -------------------------------------------------------------------------------- 1 | from CarBoardTeller.car_board_main import car_board_tell 2 | from CarInfoTeller.car_info_main import car_info_tell 3 | from CarTypeTellerMore.car_type_more_main import car_type_more_tell 4 | from CarTypeTellerOne.car_type_one_main import car_type_one_tell 5 | from DriverBehavior.behavior_main import behavior_tell 6 | from CarAttributeTeller.car_attribute_main import car_attribute_tell 7 | import os 8 | 9 | class CarTeller: 10 | @staticmethod 11 | def car_board_tell(img): 12 | old = os.getcwd() 13 | os.chdir("./CarBoardTeller") 14 | try: 15 | temp = car_board_tell(img) 16 | finally: 17 | os.chdir(old) 18 | return temp 19 | 20 | @staticmethod 21 | def car_info_tell(img): 22 | old = os.getcwd() 23 | os.chdir("./CarInfoTeller") 24 | try: 25 | temp = car_info_tell(img) 26 | finally: 27 | os.chdir(old) 28 | return temp 29 | 30 | @staticmethod 31 | def car_type_more_tell(img): 32 | old = os.getcwd() 33 | os.chdir("./CarTypeTellerMore") 34 | try: 35 | temp = car_type_more_tell(img) 36 | finally: 37 | os.chdir(old) 38 | return temp 39 | 40 | @staticmethod 41 | def car_type_one_tell(img): 42 | old = os.getcwd() 43 | os.chdir("./CarTypeTellerOne") 44 | try: 45 | temp = car_type_one_tell(img) 46 | finally: 47 | os.chdir(old) 48 | return temp 49 | 50 | @staticmethod 51 | def behavior_tell(img): 52 | old = os.getcwd() 53 | os.chdir("./DriverBehavior") 54 | try: 55 | temp = behavior_tell(img) 56 | finally: 57 | os.chdir(old) 58 | return temp 59 | 60 | @staticmethod 61 | def car_attribute_tell(img): 62 | old = os.getcwd() 63 | os.chdir("./CarAttributeTeller") 64 | try: 65 | temp = car_attribute_tell(img) 66 | finally: 67 | os.chdir(old) 68 | return temp 69 | 70 | ''' 71 | def base64_cv2(base64_str): 72 | imgString = base64.b64decode(base64_str) 73 | nparr = np.fromstring(imgString,np.uint8) 74 | image = cv2.imdecode(nparr,cv2.COLOR_BAYER_BG2BGR) 75 | return image 76 | 77 | 78 | if __name__ == '__main__': 79 | #img = Image.open("./CarTypeTellerOne/test.jpg") 80 | #img = cv2.imread("./CarTypeTellerMore/test.jpg") 81 | img=base64_cv2(str) 82 | print(type(img)) 83 | #img = io.imread("./CarInfoTeller/test.jpg") 84 | # img = cv2.imread("./CarBoardTeller/test.jpg") 85 | #img = cv2.imread("./DriverBehavior/test.jpg") 86 | #print(CarTeller.car_info_tell(img)) 87 | car_info_li, pros_li = CarTeller.car_info_tell(img) 88 | ''' 89 | -------------------------------------------------------------------------------- /CarTeller/config.py: -------------------------------------------------------------------------------- 1 | 2 | import os 3 | 4 | dbhost = 'localhost:3306' 5 | dbuser = 'root' 6 | dbpass = 'root' 7 | dbname = 'flask1' 8 | DB_URI = 'mysql+pymysql://' + dbuser + ':' + dbpass + '@' + dbhost + '/' +dbname 9 | 10 | basedir = os.path.abspath(os.path.dirname(__file__)) 11 | # SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db') 12 | SQLALCHEMY_DATABASE_URI = DB_URI 13 | SQLALCHEMY_TRACK_MODIFICATIONS = True 14 | SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository') 15 | -------------------------------------------------------------------------------- /CarTeller/manage.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from flask_script import Manager, Server 4 | from app import app 5 | 6 | manager = Manager(app) 7 | manager.add_command("runserver", 8 | Server(host="10.0.2.9", port=8000, use_debugger=True)) 9 | 10 | if __name__ == '__main__': 11 | from werkzeug.contrib.fixers import ProxyFix 12 | app.wsgi_app = ProxyFix(app.wsgi_app) 13 | app.run(debug=True,host='10.0.2.9',port=8000) 14 | -------------------------------------------------------------------------------- /CarTypeTellerOne/.idea/CarTypeTeller.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /CarTypeTellerOne/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /CarTypeTellerOne/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CarTypeTellerOne/CarTypeTeller/.idea/CarTypeTeller.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /CarTypeTellerOne/CarTypeTeller/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /CarTypeTellerOne/CarTypeTeller/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CarTypeTellerOne/CarTypeTeller/models/CarTypeTeller.py: -------------------------------------------------------------------------------- 1 | import torch as t 2 | import torch.nn as nn 3 | from torchvision import models, transforms 4 | from torch.utils.data import DataLoader, Dataset 5 | from torch.autograd import Variable 6 | from PIL import Image 7 | import io 8 | 9 | batch_size = 1 10 | num_classes = 5 11 | learning_rate = 0.0002 12 | model_path = "../checkpoints/vgg.pth" 13 | use_gpu = t.cuda.is_available() 14 | print(use_gpu) 15 | car_types = ["Bus", "Car", "Truck", "Motorcycle", "Tricycle"] 16 | test_transforms = transforms.Compose([ 17 | transforms.Resize(256), 18 | transforms.RandomResizedCrop(224), 19 | transforms.ToTensor(), 20 | transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) 21 | ]) 22 | 23 | 24 | class CarTypeTeller: 25 | @staticmethod 26 | def tell(imgs): 27 | test_datasets = TsetDataSet(imgs, test_transforms) 28 | test_dataloader = DataLoader(test_datasets, batch_size=batch_size) 29 | 30 | model = VGGNet() 31 | if use_gpu: 32 | model.load_state_dict(t.load(model_path)) 33 | model.cuda() 34 | else: 35 | model = t.nn.DataParallel(model) 36 | model.load_state_dict(t.load(model_path, map_location="cpu")) 37 | 38 | # 测试 39 | model.eval() 40 | outcome = [] 41 | for batch_x in test_dataloader: 42 | if use_gpu: 43 | with t.no_grad(): 44 | batch_x = Variable(batch_x).cuda() 45 | else: 46 | with t.no_grad(): 47 | batch_x = Variable(batch_x) 48 | out = model(batch_x) 49 | pred = t.max(out, 1)[1] 50 | pred_types = pred.data.cpu().numpy().tolist() 51 | outcome.append(car_types[pred_types[0]]) 52 | final_str = "" 53 | for str in outcome: 54 | final_str += str 55 | return final_str 56 | 57 | 58 | class TsetDataSet(Dataset): 59 | def __init__(self, imgs, transform): 60 | self.transform = transform 61 | self.imgs = imgs 62 | 63 | def __len__(self): 64 | return len(self.imgs) 65 | 66 | def __getitem__(self, index): 67 | image = self.imgs[index] 68 | image = self.transform(image) 69 | return image 70 | 71 | 72 | class VGGNet(nn.Module): 73 | def __init__(self): 74 | super(VGGNet, self).__init__() 75 | net = models.vgg16(pretrained=True) 76 | net.classifier = nn.Sequential() 77 | self.features = net 78 | self.classifier = nn.Sequential( 79 | nn.Linear(512 * 7 * 7, 512), 80 | nn.ReLU(True), 81 | nn.Dropout(), 82 | nn.Linear(512, 128), 83 | nn.ReLU(True), 84 | nn.Dropout(), 85 | nn.Linear(128, num_classes) 86 | ) 87 | 88 | def forward(self, x): 89 | x = self.features(x) 90 | x = x.view(x.size(0), -1) 91 | x = self.classifier(x) 92 | return x 93 | 94 | 95 | 96 | 97 | 98 | if __name__ == "__main__": 99 | img = Image.open(r"D:\AllProjects\Pytorch\CarTypeTeller\data\test\3.jpg") 100 | imgs = [img] 101 | print(CarTypeTeller.tell(imgs)) 102 | 103 | -------------------------------------------------------------------------------- /CarTypeTellerOne/CarTypeTeller/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/CarTypeTellerOne/CarTypeTeller/models/__init__.py -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CarTeller 2 | 汽车识别(包括车牌、车型、车品牌、属性、及驾驶员违规行为识别检测) 3 | 4 | ---------------项目文件说明--------------- 5 | 6 | html文件夹内内容:本项目Web端前端代码实现 7 | 8 | CarTeller文件夹内容:本项目服务器端和后端深度学习代码的实现,包括(服务器端:app文件夹内内容,以及后端:汽车的属性识别、车型识别、车辆检测、车牌识别、 驾驶员违规行为检测)。 9 | 10 | CarInfoTeller文件夹内容:拥有车型识别的训练代码内容(CarTeller文件夹主要为训练完后使用的代码,所以没有将车型识别的训练代码加入,现在单独补上) 11 | 12 | 【注意:其他的识别训练代码由于不是很多就没有和使用代码分离,所以在CarTeller里,没有单独补发】 13 | 14 | ---------------各个部分作者说明--------------- 15 | 16 | html文件夹内内容: 17 | 18 | 主要作者:wqx 19 | 五个功能界面,个人信息界面,历史界面以及其功能。接口文档微调。 20 | 登录功能,滑块检测功能,界面弹窗效果。 21 | 协作者:cj 22 | 登录界面,API界面及部分调整 23 | 24 | AndroidPart文件夹内容: 25 | 26 | 作者:cjj 27 | 登录、注册界面,tab滑动切换Fragments,从手机存储读取照片,基于okHttp框架的以Json为载体的数据传输和解析逻辑 28 | ,通过http协议与服务器交互进行几种车辆识别。 29 | 30 | CarTeller文件夹内容: 31 | 32 | 服务器端: 33 | flask文件内内容,主要作者:gxk (flask+gunicorn) 34 | 服务器环境配置和项目部署,主要作者:gxk(centos7+flask+gunicorn+mysql,apache) 35 | 主要配置centos7环境,部署flask项目和html项目,与前端配合调试,将模型整合到flask项目中并调试 36 | 后台深度学习用于汽车识别代码: 37 | 38 | 车牌识别(CarBoardTeller): 主要作者 : cj 39 | 技术:OpenCV + SVM 40 | 41 | 车辆检测(CarTypeTellerMore):多车检测类型并统计各种车数量 :主要作者:cj 42 | 重要库:ImageAI 43 | 44 | 车辆检测(CarTypeTellerOne):单车分类检测: 主要作者:zhj 45 | 数据集:自己制作寻找 46 | 网络:VGG16 47 | 48 | 车型识别(CarInfoTeller):识别汽车品牌: 主要作者:zhj 49 | 数据集:Stanford Cars 196种常见汽车车型和其年份品牌信息 50 | 网络:ResNet152 51 | 52 | 驾驶员行为检测(DriverBehavior):识别驾驶员在车上的各种违规行为(9种,如使用手机等) 主要作者: zhj 53 | 数据集:Kaggle的State Farm Distracted Driver Detection 54 | 网络:ResNet152 55 | 56 | 属性检测(CarAttribute):调用百度API 57 | 58 | 【我们是一个团队,中间避免不了相互协作、帮助,共同调试BUG,所以各个板块除了主要作者外,还有团队其他人员提供的各种支持,比如最终一起调试,一起寻找数据集,一起为前端界面提出自己的想法等等】 59 | 60 | 61 | 需要搭配的环境 62 | 63 | 1. pytorch 1.0.1版本 torchvision 0.2.2版本 64 | 2. imageai 库 65 | 3. keras tensorflow框架 66 | 4. effecient-net 67 | 5. opencv 68 | 6. 如果要运行训练,需要安装cuda 69 | -------------------------------------------------------------------------------- /html/123.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 83 | 84 | 85 | 86 | 111 | 112 | 113 | 114 | 123 |
124 |

网购

125 |
126 |

1F 男装

127 |
    128 |
  • 129 |
  • 130 | 131 |
132 |
133 | 134 |
135 |

2F 女装

136 |
    137 |
  • 138 |
  • 139 | 140 |
141 |
142 |
143 |

3F 美妆

144 |
    145 |
  • 146 |
  • 147 | 148 |
149 |
150 |
151 |

4F 数码

152 |
    153 |
  • 154 |
  • 155 | 156 |
157 |
158 |
159 |

5F 母婴

160 |
    161 |
  • 162 |
  • 163 | 164 |
165 |
166 |
167 | 168 | 169 | 170 | 171 | -------------------------------------------------------------------------------- /html/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) HTML5 Boilerplate 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 7 | of the Software, and to permit persons to whom the Software is furnished to do 8 | so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /html/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /html/doc/TOC.md: -------------------------------------------------------------------------------- 1 | [HTML5 Boilerplate homepage](https://html5boilerplate.com/) 2 | 3 | ## Getting started 4 | 5 | * [Usage](usage.md) — Overview of the project contents. 6 | * [FAQ](faq.md) — Frequently asked questions along with their answers. 7 | 8 | ## HTML5 Boilerplate core 9 | 10 | * [HTML](html.md) — Guide to the default HTML. 11 | * [CSS](css.md) — Guide to the default CSS. 12 | * [JavaScript](js.md) — Guide to the default JavaScript. 13 | * [Everything else](misc.md). 14 | 15 | ## Development 16 | 17 | * [Extending and customizing HTML5 Boilerplate](extend.md) — Going further 18 | with the boilerplate. 19 | 20 | ## Related projects 21 | 22 | The [H5BP organization](https://github.com/h5bp) maintains several projects 23 | that complement HTML5 Boilerplate, projects that can help you improve different 24 | aspects of your website/web app (e.g.: the performance, security, etc.). 25 | 26 | * [Server Configs](https://github.com/h5bp/server-configs) — Fast and 27 | smart configurations for web servers such as Apache and Nginx. 28 | * [Apache](https://github.com/h5bp/server-configs-apache) 29 | * [Google App Engine (GAE)](https://github.com/h5bp/server-configs-gae) 30 | * [Internet Information Services (IIS)](https://github.com/h5bp/server-configs-iis) 31 | * [lighttpd](https://github.com/h5bp/server-configs-lighttpd) 32 | * [Nginx](https://github.com/h5bp/server-configs-nginx) 33 | * [Node.js](https://github.com/h5bp/server-configs-node) 34 | * [Front-end Developer Interview Questions](https://github.com/h5bp/Front-end-Developer-Interview-Questions) 35 | -------------------------------------------------------------------------------- /html/doc/css.md: -------------------------------------------------------------------------------- 1 | [HTML5 Boilerplate homepage](https://html5boilerplate.com/) | [Documentation 2 | table of contents](TOC.md) 3 | 4 | # The CSS 5 | 6 | HTML5 Boilerplate's CSS includes: 7 | 8 | * [Normalize.css](#normalizecss) 9 | * [main.css](#maincss) 10 | 11 | This starting CSS does not rely on the presence of 12 | [conditional class names](https://www.paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/), 13 | [conditional style sheets](https://css-tricks.com/how-to-create-an-ie-only-stylesheet/), 14 | or [Modernizr](https://modernizr.com/), and it is ready to use no matter what 15 | your development preferences happen to be. 16 | 17 | 18 | ## Normalize.css 19 | 20 | In order to make browsers render all elements more consistently and in line 21 | with modern standards, we include 22 | [Normalize.css](https://necolas.github.io/normalize.css/) — a modern, HTML5-ready 23 | alternative to CSS resets. 24 | 25 | As opposed to CSS resets, Normalize.css: 26 | 27 | * targets only the styles that need normalizing 28 | * preserves useful browser defaults rather than erasing them 29 | * corrects bugs and common browser inconsistencies 30 | * improves usability with subtle improvements 31 | * doesn't clutter the debugging tools 32 | * has better documentation 33 | 34 | For more information about Normalize.css, please refer to its [project 35 | page](https://necolas.github.com/normalize.css/), as well as this 36 | [blog post](http://nicolasgallagher.com/about-normalize-css/). 37 | 38 | 39 | ## main.css 40 | 41 | Several base styles are included that build upon `Normalize.css`. These 42 | styles: 43 | 44 | * provide basic typography settings that improve text readability 45 | * protect against unwanted `text-shadow` during text highlighting 46 | * tweak the default alignment of some elements (e.g.: `img`, `video`, 47 | `fieldset`, `textarea`) 48 | * style the prompt that is displayed to users using an outdated browser 49 | * and more... 50 | 51 | These styles are included in [main.css](https://github.com/h5bp/html5-boilerplate/blob/master/dist/css/main.css). See the [main.css](https://github.com/h5bp/main.css) project [documentation](https://github.com/h5bp/main.css/blob/master/README.md#features) for a full discussion of these styles. 52 | -------------------------------------------------------------------------------- /html/doc/faq.md: -------------------------------------------------------------------------------- 1 | [HTML5 Boilerplate homepage](https://html5boilerplate.com/) | [Documentation 2 | table of contents](TOC.md) 3 | 4 | # Frequently asked questions 5 | 6 | * [Why is the Google Analytics code at the bottom? Google recommends it be 7 | placed in the ``.](#why-is-the-google-analytics-code-at-the-bottom-google-recommends-it-be-placed-in-the-head) 8 | * [How can I integrate Bootstrap with HTML5 9 | Boilerplate?](#how-can-i-integrate-bootstrap-with-html5-boilerplate) 10 | * [Do I need to upgrade my site each time a new version of HTML5 Boilerplate is 11 | released?](#do-i-need-to-upgrade-my-site-each-time-a-new-version-of-html5-boilerplate-is-released) 12 | * [Where can I get help with support 13 | questions?](#where-can-i-get-help-with-support-questions) 14 | 15 | --- 16 | 17 | ### Why is the Google Analytics code at the bottom? Google recommends it be placed in the ``. 18 | 19 | The main advantage of placing it in the `` is that you will track the 20 | user's `pageview` even if they leave the page before it has been fully loaded. 21 | 22 | Here's a handy quote from [Mathias Bynens](https://mathiasbynens.be/notes/async-analytics-snippet#comment-50) about our placement choice. 23 | >I should point out that it’s Google — not me — recommending to place this 24 | script before all other scripts in the document. The only real advantage is to 25 | catch a pageView call if your page fails to load completely (for example, if 26 | the user aborts loading, or quickly closes the page, etc.). Personally, I 27 | wouldn’t count that as a page view, so I actually prefer to place this script 28 | at the bottom, after all other scripts. This keeps all the scripts together and 29 | reinforces that scripts at the bottom are the right move. (Usually I 30 | concatenate and minify all my scripts into one .js file — the GA snippet being 31 | the suffix.) 32 | 33 | ### Do I need to upgrade my site each time a new version of HTML5 Boilerplate is released? 34 | 35 | No, just as you don't normally replace the foundation of a house once it 36 | was built. However, there is nothing stopping you from trying to work in the 37 | latest changes, but you'll have to assess the costs/benefits of doing so. 38 | 39 | ### Where can I get help with support questions? 40 | 41 | Please ask for help on 42 | [StackOverflow](https://stackoverflow.com/questions/tagged/html5boilerplate). 43 | -------------------------------------------------------------------------------- /html/doc/js.md: -------------------------------------------------------------------------------- 1 | [HTML5 Boilerplate homepage](https://html5boilerplate.com/) | [Documentation 2 | table of contents](TOC.md) 3 | 4 | # The JavaScript 5 | 6 | Information about the default JavaScript included in the project. 7 | 8 | ## main.js 9 | 10 | This file can be used to contain or reference your site/app JavaScript code. 11 | If you're working on something more advanced you might replace this file 12 | entirely. That's cool. 13 | 14 | ## plugins.js 15 | 16 | This file can be used to contain all your plugins, such as jQuery plugins and 17 | other 3rd party scripts for a simple site. 18 | 19 | One approach is to put jQuery plugins inside of a `(function($){ ... 20 | })(jQuery);` closure to make sure they're in the jQuery namespace safety 21 | blanket. Read more about [jQuery plugin 22 | authoring](https://learn.jquery.com/plugins/#Getting_Started). 23 | 24 | By default the `plugins.js` file contains a small script to avoid `console` 25 | errors in browsers that lack a `console`. The script will make sure that, if 26 | a console method isn't available, that method will have the value of empty 27 | function, thus, preventing the browser from throwing an error. 28 | 29 | ## vendor 30 | 31 | This directory can be used to contain all 3rd party library code. 32 | 33 | Minified versions of the latest jQuery and Modernizr libraries are included by 34 | default. You may wish to create your own [custom Modernizr 35 | build with the online builder](https://www.modernizr.com/download/) or [command 36 | line tool](https://modernizr.com/docs#command-line-config). 37 | -------------------------------------------------------------------------------- /html/doc/usage.md: -------------------------------------------------------------------------------- 1 | [HTML5 Boilerplate homepage](https://html5boilerplate.com/) | [Documentation 2 | table of contents](TOC.md) 3 | 4 | # Usage 5 | 6 | The most basic usage of HTML5 Boilerplate is to create a static site or simple 7 | app. Once you've downloaded or cloned the project, that process looks something 8 | like this: 9 | 10 | 1. Set up the basic structure of the site. 11 | 2. Add some content, style, and functionality. 12 | 3. Run your site locally to see how it looks. 13 | 4. Deploy your site. 14 | 15 | Cool, right? _It is_. That said, the smart defaults, baseline elements, default 16 | attribute values and various other utilities that HTML5 Boilerplate offers can 17 | serve as the foundation for whatever you're interested in building. 18 | 19 | Even the basic use-case of a simple static site can be enhanced by manipulating 20 | the code through an automated build process. Moving up in complexity HTML5 21 | Boilerplate can be integrated with whatever front-end framework, CMS or 22 | e-commerce platform you're working with. Mix-and-match to your heart's content. 23 | Use what you need (toss it in a blender if you need to) and discard the rest. 24 | HTML5 Boilerplate is a starting point, not a destination. 25 | 26 | ## Basic structure 27 | 28 | A basic HTML5 Boilerplate site initially looks something like this: 29 | 30 | ``` 31 | . 32 | ├── css 33 | │ ├── main.css 34 | │ └── normalize.css 35 | ├── doc 36 | ├── img 37 | ├── js 38 | │ ├── main.js 39 | │ ├── plugins.js 40 | │ └── vendor 41 | │ ├── jquery.min.js 42 | │ └── modernizr.min.js 43 | ├── .editorconfig 44 | ├── .htaccess 45 | ├── 404.html 46 | ├── browserconfig.xml 47 | ├── favicon.ico 48 | ├── humans.txt 49 | ├── icon.png 50 | ├── index.html 51 | ├── robots.txt 52 | ├── site.webmanifest 53 | ├── tile.png 54 | └── tile-wide.png 55 | ``` 56 | 57 | What follows is a general overview of each major part and how to use them. 58 | 59 | ### css 60 | 61 | This directory should contain all your project's CSS files. It includes some 62 | initial CSS to help get you started from a solid foundation. [About the 63 | CSS](css.md). 64 | 65 | ### doc 66 | 67 | This directory contains all the HTML5 Boilerplate documentation. You can use it 68 | as the location and basis for your own project's documentation. 69 | 70 | ### js 71 | 72 | This directory should contain all your project's JS files. Libraries, plugins, 73 | and custom code can all be included here. It includes some initial JS to help 74 | get you started. [About the JavaScript](js.md). 75 | 76 | ### .htaccess 77 | 78 | The default web server configs are for Apache. For more information, please 79 | refer to the [Apache Server Configs 80 | repository](https://github.com/h5bp/server-configs-apache). 81 | 82 | Host your site on a server other than Apache? You're likely to find the 83 | corresponding server configs project listed in our [Server Configs 84 | ](https://github.com/h5bp/server-configs/blob/master/README.md) repository. 85 | 86 | ### 404.html 87 | 88 | A helpful custom 404 to get you started. 89 | 90 | ### browserconfig.xml 91 | 92 | This file contains all settings regarding custom tiles for IE11 and Edge. 93 | 94 | For more info on this topic, please refer to 95 | [Microsoft's Docs](https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/dn320426(v=vs.85)). 96 | 97 | ### .editorconfig 98 | 99 | The `.editorconfig` file is provided in order to encourage and help you and 100 | your team to maintain consistent coding styles between different 101 | editors and IDEs. [Read more about the `.editorconfig` file](misc.md#editorconfig). 102 | 103 | ### index.html 104 | 105 | This is the default HTML skeleton that should form the basis of all pages on 106 | your site. If you are using a server-side templating framework, then you will 107 | need to integrate this starting HTML with your setup. 108 | 109 | Make sure that you update the URLs for the referenced CSS and JavaScript if you 110 | modify the directory structure at all. 111 | 112 | If you are using Google Universal Analytics, make sure that you edit the 113 | corresponding snippet at the bottom to include your analytics ID. 114 | 115 | ### humans.txt 116 | 117 | Edit this file to include the team that worked on your site/app, and the 118 | technology powering it. 119 | 120 | ### robots.txt 121 | 122 | Edit this file to include any pages you need hidden from search engines. 123 | 124 | ### Icons 125 | 126 | Replace the default `favicon.ico`, `tile.png`, `tile-wide.png` and Apple 127 | Touch Icon with your own. 128 | 129 | If you want to use different Apple Touch Icons for different resolutions please 130 | refer to the [according documentation](extend.md#apple-touch-icons). 131 | -------------------------------------------------------------------------------- /html/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/favicon.ico -------------------------------------------------------------------------------- /html/humans.txt: -------------------------------------------------------------------------------- 1 | # humanstxt.org/ 2 | # The humans responsible & technology colophon 3 | 4 | # TEAM 5 | 6 | -- -- 7 | 8 | # THANKS 9 | 10 | 11 | 12 | # TECHNOLOGY COLOPHON 13 | 14 | CSS3, HTML5 15 | Apache Server Configs, jQuery, Modernizr, Normalize.css 16 | -------------------------------------------------------------------------------- /html/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/icon.png -------------------------------------------------------------------------------- /html/img/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/.gitignore -------------------------------------------------------------------------------- /html/img/app.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/app.jpg -------------------------------------------------------------------------------- /html/img/behavior.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/behavior.jpeg -------------------------------------------------------------------------------- /html/img/behavior2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/behavior2.png -------------------------------------------------------------------------------- /html/img/car1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/car1.jpg -------------------------------------------------------------------------------- /html/img/car2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/car2.jpg -------------------------------------------------------------------------------- /html/img/car3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/car3.jpg -------------------------------------------------------------------------------- /html/img/car4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/car4.jpg -------------------------------------------------------------------------------- /html/img/car5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/car5.jpg -------------------------------------------------------------------------------- /html/img/car6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/car6.jpg -------------------------------------------------------------------------------- /html/img/car7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/car7.jpg -------------------------------------------------------------------------------- /html/img/carAttribute_main.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/carAttribute_main.jpg -------------------------------------------------------------------------------- /html/img/carBoard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/carBoard.jpg -------------------------------------------------------------------------------- /html/img/carBoard_main.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/carBoard_main.jpg -------------------------------------------------------------------------------- /html/img/carCount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/carCount.png -------------------------------------------------------------------------------- /html/img/carInfo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/carInfo.jpg -------------------------------------------------------------------------------- /html/img/carInfo_main.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/carInfo_main.jpg -------------------------------------------------------------------------------- /html/img/carTeller_main.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/carTeller_main.jpg -------------------------------------------------------------------------------- /html/img/carTeller_temp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/carTeller_temp.jpg -------------------------------------------------------------------------------- /html/img/carTypeApp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/carTypeApp.jpg -------------------------------------------------------------------------------- /html/img/carType_main.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/carType_main.jpg -------------------------------------------------------------------------------- /html/img/driverBehavior.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/driverBehavior.jpg -------------------------------------------------------------------------------- /html/img/intro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/intro.png -------------------------------------------------------------------------------- /html/img/login2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/login2.jpg -------------------------------------------------------------------------------- /html/img/login_body_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/login_body_bg.jpg -------------------------------------------------------------------------------- /html/img/phoneDect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/phoneDect.png -------------------------------------------------------------------------------- /html/img/roll_board1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/roll_board1.jpg -------------------------------------------------------------------------------- /html/img/roll_board2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/roll_board2.jpg -------------------------------------------------------------------------------- /html/img/roll_board3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/roll_board3.jpg -------------------------------------------------------------------------------- /html/img/timg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/img/timg.jpg -------------------------------------------------------------------------------- /html/jpg/12019-07-12107_04_23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/jpg/12019-07-12107_04_23.jpg -------------------------------------------------------------------------------- /html/jpg/12019-07-12107_07_14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/jpg/12019-07-12107_07_14.jpg -------------------------------------------------------------------------------- /html/jpg/12019-07-12107_08_26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/jpg/12019-07-12107_08_26.jpg -------------------------------------------------------------------------------- /html/jpg/12019-07-12107_09_01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/jpg/12019-07-12107_09_01.jpg -------------------------------------------------------------------------------- /html/jpg/12019-07-12107_09_22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/jpg/12019-07-12107_09_22.jpg -------------------------------------------------------------------------------- /html/layui/css/modules/code.css: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.4 MIT License By https://www.layui.com */ 2 | html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} -------------------------------------------------------------------------------- /html/layui/css/modules/layer/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/css/modules/layer/default/icon-ext.png -------------------------------------------------------------------------------- /html/layui/css/modules/layer/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/css/modules/layer/default/icon.png -------------------------------------------------------------------------------- /html/layui/css/modules/layer/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/css/modules/layer/default/loading-0.gif -------------------------------------------------------------------------------- /html/layui/css/modules/layer/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/css/modules/layer/default/loading-1.gif -------------------------------------------------------------------------------- /html/layui/css/modules/layer/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/css/modules/layer/default/loading-2.gif -------------------------------------------------------------------------------- /html/layui/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/font/iconfont.eot -------------------------------------------------------------------------------- /html/layui/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/font/iconfont.ttf -------------------------------------------------------------------------------- /html/layui/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/font/iconfont.woff -------------------------------------------------------------------------------- /html/layui/font/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/font/iconfont.woff2 -------------------------------------------------------------------------------- /html/layui/images/face/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/0.gif -------------------------------------------------------------------------------- /html/layui/images/face/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/1.gif -------------------------------------------------------------------------------- /html/layui/images/face/10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/10.gif -------------------------------------------------------------------------------- /html/layui/images/face/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/11.gif -------------------------------------------------------------------------------- /html/layui/images/face/12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/12.gif -------------------------------------------------------------------------------- /html/layui/images/face/13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/13.gif -------------------------------------------------------------------------------- /html/layui/images/face/14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/14.gif -------------------------------------------------------------------------------- /html/layui/images/face/15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/15.gif -------------------------------------------------------------------------------- /html/layui/images/face/16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/16.gif -------------------------------------------------------------------------------- /html/layui/images/face/17.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/17.gif -------------------------------------------------------------------------------- /html/layui/images/face/18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/18.gif -------------------------------------------------------------------------------- /html/layui/images/face/19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/19.gif -------------------------------------------------------------------------------- /html/layui/images/face/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/2.gif -------------------------------------------------------------------------------- /html/layui/images/face/20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/20.gif -------------------------------------------------------------------------------- /html/layui/images/face/21.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/21.gif -------------------------------------------------------------------------------- /html/layui/images/face/22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/22.gif -------------------------------------------------------------------------------- /html/layui/images/face/23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/23.gif -------------------------------------------------------------------------------- /html/layui/images/face/24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/24.gif -------------------------------------------------------------------------------- /html/layui/images/face/25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/25.gif -------------------------------------------------------------------------------- /html/layui/images/face/26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/26.gif -------------------------------------------------------------------------------- /html/layui/images/face/27.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/27.gif -------------------------------------------------------------------------------- /html/layui/images/face/28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/28.gif -------------------------------------------------------------------------------- /html/layui/images/face/29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/29.gif -------------------------------------------------------------------------------- /html/layui/images/face/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/3.gif -------------------------------------------------------------------------------- /html/layui/images/face/30.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/30.gif -------------------------------------------------------------------------------- /html/layui/images/face/31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/31.gif -------------------------------------------------------------------------------- /html/layui/images/face/32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/32.gif -------------------------------------------------------------------------------- /html/layui/images/face/33.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/33.gif -------------------------------------------------------------------------------- /html/layui/images/face/34.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/34.gif -------------------------------------------------------------------------------- /html/layui/images/face/35.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/35.gif -------------------------------------------------------------------------------- /html/layui/images/face/36.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/36.gif -------------------------------------------------------------------------------- /html/layui/images/face/37.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/37.gif -------------------------------------------------------------------------------- /html/layui/images/face/38.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/38.gif -------------------------------------------------------------------------------- /html/layui/images/face/39.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/39.gif -------------------------------------------------------------------------------- /html/layui/images/face/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/4.gif -------------------------------------------------------------------------------- /html/layui/images/face/40.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/40.gif -------------------------------------------------------------------------------- /html/layui/images/face/41.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/41.gif -------------------------------------------------------------------------------- /html/layui/images/face/42.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/42.gif -------------------------------------------------------------------------------- /html/layui/images/face/43.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/43.gif -------------------------------------------------------------------------------- /html/layui/images/face/44.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/44.gif -------------------------------------------------------------------------------- /html/layui/images/face/45.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/45.gif -------------------------------------------------------------------------------- /html/layui/images/face/46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/46.gif -------------------------------------------------------------------------------- /html/layui/images/face/47.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/47.gif -------------------------------------------------------------------------------- /html/layui/images/face/48.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/48.gif -------------------------------------------------------------------------------- /html/layui/images/face/49.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/49.gif -------------------------------------------------------------------------------- /html/layui/images/face/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/5.gif -------------------------------------------------------------------------------- /html/layui/images/face/50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/50.gif -------------------------------------------------------------------------------- /html/layui/images/face/51.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/51.gif -------------------------------------------------------------------------------- /html/layui/images/face/52.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/52.gif -------------------------------------------------------------------------------- /html/layui/images/face/53.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/53.gif -------------------------------------------------------------------------------- /html/layui/images/face/54.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/54.gif -------------------------------------------------------------------------------- /html/layui/images/face/55.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/55.gif -------------------------------------------------------------------------------- /html/layui/images/face/56.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/56.gif -------------------------------------------------------------------------------- /html/layui/images/face/57.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/57.gif -------------------------------------------------------------------------------- /html/layui/images/face/58.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/58.gif -------------------------------------------------------------------------------- /html/layui/images/face/59.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/59.gif -------------------------------------------------------------------------------- /html/layui/images/face/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/6.gif -------------------------------------------------------------------------------- /html/layui/images/face/60.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/60.gif -------------------------------------------------------------------------------- /html/layui/images/face/61.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/61.gif -------------------------------------------------------------------------------- /html/layui/images/face/62.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/62.gif -------------------------------------------------------------------------------- /html/layui/images/face/63.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/63.gif -------------------------------------------------------------------------------- /html/layui/images/face/64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/64.gif -------------------------------------------------------------------------------- /html/layui/images/face/65.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/65.gif -------------------------------------------------------------------------------- /html/layui/images/face/66.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/66.gif -------------------------------------------------------------------------------- /html/layui/images/face/67.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/67.gif -------------------------------------------------------------------------------- /html/layui/images/face/68.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/68.gif -------------------------------------------------------------------------------- /html/layui/images/face/69.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/69.gif -------------------------------------------------------------------------------- /html/layui/images/face/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/7.gif -------------------------------------------------------------------------------- /html/layui/images/face/70.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/70.gif -------------------------------------------------------------------------------- /html/layui/images/face/71.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/71.gif -------------------------------------------------------------------------------- /html/layui/images/face/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/8.gif -------------------------------------------------------------------------------- /html/layui/images/face/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/layui/images/face/9.gif -------------------------------------------------------------------------------- /html/layui/lay/modules/carousel.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.4 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
    ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
"].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
  1. '+o.replace(/[\r\t\n]+/g,"
  2. ")+"
"),c.find(">.layui-code-h3")[0]||c.prepend('

'+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); -------------------------------------------------------------------------------- /html/layui/lay/modules/flow.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.4 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)}); -------------------------------------------------------------------------------- /html/layui/lay/modules/laypage.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.4 MIT License By https://www.layui.com */ 2 | ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
"].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); -------------------------------------------------------------------------------- /html/layui/lay/modules/laytpl.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.4 MIT License By https://www.layui.com */ 2 | ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)}); -------------------------------------------------------------------------------- /html/layui/lay/modules/rate.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.4 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,i={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,a){return layui.onevent.call(this,n,e,a)}},l=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n="rate",t="layui-rate",o="layui-icon-rate",s="layui-icon-rate-solid",u="layui-icon-rate-half",r="layui-icon-rate-solid layui-icon-rate-half",c="layui-icon-rate-solid layui-icon-rate",f="layui-icon-rate layui-icon-rate-half",v=function(e){var l=this;l.index=++i.index,l.config=a.extend({},l.config,i.config,e),l.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},v.prototype.render=function(){var e=this,i=e.config,l=i.theme?'style="color: '+i.theme+';"':"";i.elem=a(i.elem),parseInt(i.value)!==i.value&&(i.half||(i.value=Math.ceil(i.value)-i.value<.5?Math.ceil(i.value):Math.floor(i.value)));for(var n='
    ",u=1;u<=i.length;u++){var r='
  • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
  • ":n+=r}n+="
"+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)}); -------------------------------------------------------------------------------- /html/layui/lay/modules/util.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.4 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(t){"use strict";var e=layui.$,i={fixbar:function(t){var i,n,a="layui-fixbar",o="layui-fixbar-top",r=e(document),l=e("body");t=e.extend({showHeight:200},t),t.bar1=t.bar1===!0?"":t.bar1,t.bar2=t.bar2===!0?"":t.bar2,t.bgcolor=t.bgcolor?"background-color:"+t.bgcolor:"";var c=[t.bar1,t.bar2,""],g=e(['
    ',t.bar1?'
  • '+c[0]+"
  • ":"",t.bar2?'
  • '+c[1]+"
  • ":"",'
  • '+c[2]+"
  • ","
"].join("")),s=g.find("."+o),u=function(){var e=r.scrollTop();e>=t.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};e("."+a)[0]||("object"==typeof t.css&&g.css(t.css),l.append(g),u(),g.find("li").on("click",function(){var i=e(this),n=i.attr("lay-type");"top"===n&&e("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,n)}),r.on("scroll",function(){clearTimeout(n),n=setTimeout(function(){u()},100)}))},countdown:function(t,e,i){var n=this,a="function"==typeof e,o=new Date(t).getTime(),r=new Date(!e||a?(new Date).getTime():e).getTime(),l=o-r,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=e);var g=setTimeout(function(){n.countdown(t,r+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],e,g),l<=0&&clearTimeout(g),g},timeAgo:function(t,e){var i=this,n=[[],[]],a=(new Date).getTime()-new Date(t).getTime();return a>6912e5?(a=new Date(t),n[0][0]=i.digit(a.getFullYear(),4),n[0][1]=i.digit(a.getMonth()+1),n[0][2]=i.digit(a.getDate()),e||(n[1][0]=i.digit(a.getHours()),n[1][1]=i.digit(a.getMinutes()),n[1][2]=i.digit(a.getSeconds())),n[0].join("-")+" "+n[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=12e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(t,e){var i="";t=String(t),e=e||2;for(var n=t.length;n/g,">").replace(/'/g,"'").replace(/"/g,""")},event:function(t,n,a){n=i.event[t]=e.extend(!0,i.event[t],n)||{},e("body").on(a||"click","*["+t+"]",function(){var i=e(this),a=i.attr(t);n[a]&&n[a].call(this,i)})}};!function(t,e,i){"$:nomunge";function n(){a=e[l](function(){o.each(function(){var e=t(this),i=e.width(),n=e.height(),a=t.data(this,g);(i!==a.w||n!==a.h)&&e.trigger(c,[a.w=i,a.h=n])}),n()},r[s])}var a,o=t([]),r=t.resize=t.extend(t.resize,{}),l="setTimeout",c="resize",g=c+"-special-event",s="delay",u="throttleWindow";r[s]=250,r[u]=!0,t.event.special[c]={setup:function(){if(!r[u]&&this[l])return!1;var e=t(this);o=o.add(e),t.data(this,g,{w:e.width(),h:e.height()}),1===o.length&&n()},teardown:function(){if(!r[u]&&this[l])return!1;var e=t(this);o=o.not(e),e.removeData(g),o.length||clearTimeout(a)},add:function(e){function n(e,n,o){var r=t(this),l=t.data(this,g)||{};l.w=n!==i?n:r.width(),l.h=o!==i?o:r.height(),a.apply(this,arguments)}if(!r[u]&&this[l])return!1;var a;return t.isFunction(e)?(a=e,n):(a=e.handler,void(e.handler=n))}}}(e,window),t("util",i)}); -------------------------------------------------------------------------------- /html/per_info.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | 个人资料 11 | 12 | 13 | 42 | 44 | 68 | 69 | 70 | 71 | 72 | 73 | 74 |
75 |
76 | 77 | 78 | 91 | 109 |
110 | 111 |
112 | 113 |











114 |
115 |
116 |
117 | 账户信息 118 |
119 |
120 |

用户名:***

121 |


密码:********

122 |


key_token:********

123 |
124 |
125 |
126 |
127 | 128 | 132 |
133 | 134 | 135 | 136 | 137 | 144 | 145 | 146 | -------------------------------------------------------------------------------- /html/robots.txt: -------------------------------------------------------------------------------- 1 | # www.robotstxt.org/ 2 | 3 | # Allow crawling of all content 4 | User-agent: * 5 | Disallow: 6 | -------------------------------------------------------------------------------- /html/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "", 3 | "name": "", 4 | "icons": [{ 5 | "src": "icon.png", 6 | "type": "image/png", 7 | "sizes": "192x192" 8 | }], 9 | "start_url": "/?utm_source=homescreen", 10 | "background_color": "#fafafa", 11 | "theme_color": "#fafafa" 12 | } 13 | -------------------------------------------------------------------------------- /html/tile-wide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/tile-wide.png -------------------------------------------------------------------------------- /html/tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaoRobb/CarTeller/055b646328e2b07ec9bc666ed9e180ee7c5de8ca/html/tile.png --------------------------------------------------------------------------------