色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>野生動物探測器開源分享

野生動物探測器開源分享

2022-10-31 | zip | 0.28 MB | 次下載 | 免費

資料介紹

描述

在科羅拉多州和其他擁有大量野生動物種群的州,人類與野生動物之間的沖突并不少見(城鎮中的熊和駝鹿、涉及麋鹿的交通事故等)

我決定通過創建一個檢測運動、拍照并使用機器學習算法分析它以采取某種行動(嚇跑它、點亮標志、通知當局)。此外,該設備跟蹤環境數據,以幫助研究人員跟蹤可能導致更多野生動物遭遇的遷徙模式和條件,它還檢測野火以防止不必要的破壞。

?
pYYBAGNY5nuACeNLAA9XERvSk2Y998.jpg
檢測裝置

分類

該項目的主要重點是機器學習野生動物分類。我通過訓練 TensorFlow 來使用來自 Google 圖片的數據來識別四種特定的動物物種,從而實現了這一點。所有的初始訓練都是在計算機上使用為 TensorFlow 和一千多張野生動物圖片預先配置的 docker 機器圖像完成的。一旦 TensorFlow 被訓練,圖形文件被優化以在移動設備上運行,然后它可以被用來在 Android Things 設備上運行,方法是拍攝一張圖像,調整它的大小,然后通過 TensorFlow 運行它以確定該圖像是否包含一個我們預先訓練的分類,以及到什么置信水平。

一旦確定了動物,就必須對這些數據進行處理。根據您的情況,您可以使用額外的硬件來閃光、播放聲音或做任何其他事情。對于這個原型,我將 Android Things 連接到 Firebase 后端,以便簡單地保存圖像和分類信息。

?
poYBAGNY5oiANoSQAAAvK5SdqaE792.jpg
設備拍攝的圖像
?

?

?
pYYBAGNY5oyAAc4yAACCU3dURqw296.png
Firebase 上保存的檢測結果
?

將信息存儲在 Firebase 上后,您可以創建一個輔助應用程序來接收有關動物存在的通知,或者只是存儲該數據以用于研究目的。

此外,如果您希望無需檢查 Firebase 即可看到結果,您可以在此項目中添加 LCD 屏幕。您可以在此處找到 Gautier Mechling為 1601 系列 LCD 屏幕提供的易于使用的驅動程序。

創建 TensorFlow 分類文件

您要做的第一件事是確保 TensorFlow 在您的計算機上并且可以正常工作。這可能相當復雜,我發現在生成訓練文件的整個過程中使其正常工作的最簡單方法是安裝和使用Docker。該程序將允許您在計算機上運行為 TensorFlow 預配置的虛擬機。

一旦你安裝了 Docker 并讓它在你的計算機上運行,??你應該打開它的首選項并為你的虛擬機設置內存使用。我將我的內存設置為使用 7 GB 內存,這可能超出了您的需要,但我花了幾天時間試圖讓 TensorFlow 正確創建所需的訓練圖表而不會崩潰,然后我才意識到虛擬機內存不足。

?
poYBAGNY5o-ASVk0AAB1jm9RC_8529.jpg
?

一旦你安裝了 Docker 并在你的機器上啟動它,你需要從終端運行它并下載一個鏡像。對于此示例,我在 macOS 下運行,因此對于您的平臺,命令可能會有所不同。

docker run -it -v $HOME/tf_files:/tf_files gcr.io/tensorflow/tensorflow:latest-develcd /tensorflowgit pullgit checkout v1.0.1

當一切都完成設置后,您應該在終端中出現如下提示:

root@1643721c503b:/tensorflow#

此時,您需要一組圖像來訓練 TensorFlow。我使用Fatkun Batch Download Image Chrome 插件從 Google 搜索中批量下載返回的圖像。安裝插件后,您可以搜索要分類的任何內容并開始選擇要保存的圖像。

?
pYYBAGNY5pGAD78TAADRvcovjy0663.jpg
?

為了使命名更容易,您可能還需要進入“更多選項”部分,讓插件在下載圖像時重命名它們。

?
pYYBAGNY5pOAEku6AAAkpOJz1mM886.jpg
?

接下來,您需要將正在使用的圖像移動到主目錄下的tf_files文件夾中,這是我們在初始化 docker 機器時創建的文件夾。對于此示例,我的圖像目錄稱為TensorFlowTrainingImages 每個可分類項目都應該在該目錄中有自己的文件夾,如下所示。

?
poYBAGNY5paABo04AAA86IZJAMs568.jpg
?

設置好目錄后,您可以從 Docker 終端使用以下命令開始重新訓練:

python tensorflow/examples/image_retraining/retrain.py \  
--bottleneck_dir=/tf_files/bottlenecks \  
--how_many_training_steps 3000 \  
--model_dir=/tf_files/inception \  
--output_graph=/tf_files/graph.pb \  
--output_labels=/tf_files/labels.txt \  
--image_dir /tf_files/TensorFlowTrainingImages

上面的命令會生成bottlenecks ,本質上是最終分類數據傳遞使用的數據,以及用于分類的圖形和標簽文件。

從現在開始,我們使用 TensorFlow 運行的操作可能需要幾分鐘到一個多小時,具體取決于您計算機的速度。當重新訓練命令運行時,您應該會在終端中看到很多類似于以下內容的輸出:

Step 130: Train accuracy = 95.0%2017-04-12 18:21:28.495779: 
Step 130: Cross entropy = 0.2503392017-04-12 18:21:28.748928: 
Step 130: Validation accuracy = 92.0% (N=100) 

生成瓶頸后,您將擁有一個graph.pb文件和一個代表您的數據的labels.txt文件。雖然這些格式在您的計算機上運行分類時效果很好,但它們在放入 Android 應用程序時往往不起作用。您將需要優化它們。

首先運行/configure 命令。接受所有默認值。

配置完成后,運行以下命令來設置優化工具。這一步在我的機器上完成了大約一個小時。

bazel build tensorflow/python/tools:optimize_for_inference

構建優化工具后,您可以使用它通過 bazel 優化您的圖形文件。

bazel-bin/tensorflow/python/tools/optimize_for_inference \  
--input=/tf_files/graph.pb \  
--output=/tf_files/optimized_graph.pb \  
--input_names=Mul \  
--output_names=final_result

現在您的優化圖已經生成,您可以在您的主目錄的tf_files文件夾中找到它和您的標簽。

?
pYYBAGNY5piAT5fUAAAwf88zCwo339.jpg
?

一旦你有了優化的圖表,你就可以將它包含在你的 Android Things 項目中以與之交互。如果您查看該項目的源代碼,您可以看到使用 Camera2 API 獲取圖像并將其傳遞給TensorFlowImageClassifier.java進行分類的 Java 代碼。您還可以找到將分類圖像上傳到 Firebase 的代碼,如下所示

private void uploadAnimal(Bitmap bitmap, final Detection detectedAnimal) { 
   ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
   bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); 
   byte[] data = outputStream.toByteArray(); 
   FirebaseStorage storage = FirebaseStorage.getInstance(); 
   StorageReference storageReference = storage.getReferenceFromUrl( 
   	FIREBASE_STORAGE_URL).child(System.currentTimeMillis() + ".jpg"); 
   UploadTask uploadTask = storageReference.putBytes(data); 
   uploadTask.addOnFailureListener(new OnFailureListener() { 
       @Override 
       public void onFailure(@NonNull Exception exception) { 
       } 
   }).addOnSuccessListener(new OnSuccessListener() { 
       @Override 
       public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
           handleNotificationForImage(taskSnapshot.getDownloadUrl(), 
                                      detectedAnimal); 
       } 
   }); 
} 

環境傳感器

雖然能夠識別野生動物很棒,但這里有機會做更多的事情。如果這些設備之一設置在荒野中,您還可以添加傳感器來保存天氣信息并將其報告給您的后端。對于我的原型,我包括了一個濕度傳感器、溫度和壓力傳感器、一個火焰探測器(理論上當周圍沒有人時通知某人野火)、一個空氣質量傳感器和一個紫外線傳感器。其中一些在附加到 Android Things 方面有其獨特的挑戰,我將在下面介紹。

數字傳感器

連接到野生動物探測器的最簡單的傳感器是火焰探測器和運動探測器。這些傳感器在低電平空閑,但在檢測到火焰或運動時切換到高電平。使用 Android Things 的外圍 I/O API,這些傳感器是最容易支持的,因為設備只需要監聽狀態的變化。

對 HC SR501 和火焰探測器的支持都遵循這個類的模式

@SuppressWarnings({"unused", "WeakerAccess"})
public class HCSR501 implements AutoCloseable {
   public enum State {
       STATE_HIGH,
       STATE_LOW;
   }
   public interface OnMotionDetectedEventListener {
       void onMotionDetectedEvent(State state);
   }
   private Gpio mMotionDetectorGpio;
   private OnMotionDetectedEventListener mOnMotionDetectedEventListener;
   private boolean mLastState;
   public HCSR501(String pin) throws IOException {
       PeripheralManagerService pioService = new PeripheralManagerService();
       Gpio HCSR501Gpio = pioService.openGpio(pin);
       try {
           connect(HCSR501Gpio);
       } catch( IOException | RuntimeException e ) {
           close();
           throw e;
       }
   }
   private void connect(Gpio HCSR501Gpio) throws IOException {
       mMotionDetectorGpio = HCSR501Gpio;
       mMotionDetectorGpio.setDirection(Gpio.DIRECTION_IN);
       mMotionDetectorGpio.setEdgeTriggerType(Gpio.EDGE_BOTH);
       mLastState = mMotionDetectorGpio.getValue();
       mMotionDetectorGpio.setActiveType(mLastState ? Gpio.ACTIVE_HIGH : Gpio.ACTIVE_LOW);
       mMotionDetectorGpio.registerGpioCallback(mInterruptCallback);
   }
   private void performMotionEvent(State state) {
       if( mOnMotionDetectedEventListener != null ) {
           mOnMotionDetectedEventListener.onMotionDetectedEvent(state);
       }
   }
   private GpioCallback mInterruptCallback = new GpioCallback() {
       @Override
       public boolean onGpioEdge(Gpio gpio) {
           try {
               if( gpio.getValue() != mLastState ) {
                   mLastState = gpio.getValue();
                   performMotionEvent(mLastState ? State.STATE_HIGH : State.STATE_LOW);
               }
           } catch( IOException e ) {
           }
           return true;
       }
   };
   public void setOnMotionDetectedEventListener(OnMotionDetectedEventListener listener) {
       mOnMotionDetectedEventListener = listener;
   }
   @Override
   public void close() throws IOException {
       mOnMotionDetectedEventListener = null;
       if (mMotionDetectorGpio != null) {
           mMotionDetectorGpio.unregisterGpioCallback(mInterruptCallback);
           try {
               mMotionDetectorGpio.close();
           } finally {
               mMotionDetectorGpio = null;
           }
       }
   }
}

模擬傳感器

Android Things 的模擬傳感器有點棘手。雖然設備可能具有板載模數轉換器 (ADC),但它并未在 Android Things 平臺上啟用。為了解決這個問題,我使用了 MCP3008 ADC 芯片來讀取模擬輸入并將其轉換為可以在 Android Things 板上讀取的 int。這是通過一種快速而骯臟的“bit banged”方法完成的,因此您可以更改引腳以匹配您可用的任何內容。使用 ADC,我能夠添加對空氣質量傳感器和紫外線傳感器的支持。以下代碼是我用于 MCP3008 的代碼,并且在我使用過的多個 Android Things 項目中被證明是有價值的。

public class MCP3008 {
   private final String csPin;
   private final String clockPin;
   private final String mosiPin;
   private final String misoPin;
   private Gpio mCsPin;
   private Gpio mClockPin;
   private Gpio mMosiPin;
   private Gpio mMisoPin;
   public MCP3008(String csPin, String clockPin, String mosiPin, String misoPin) {
       this.csPin = csPin;
       this.clockPin = clockPin;
       this.mosiPin = mosiPin;
       this.misoPin = misoPin;
   }
   public void register() throws IOException {
       PeripheralManagerService service = new PeripheralManagerService();
       mClockPin = service.openGpio(clockPin);
       mCsPin = service.openGpio(csPin);
       mMosiPin = service.openGpio(mosiPin);
       mMisoPin = service.openGpio(misoPin);
       mClockPin.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
       mCsPin.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
       mMosiPin.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
       mMisoPin.setDirection(Gpio.DIRECTION_IN);
   }
   public int readAdc(int channel) throws IOException {
       if( channel < 0 || channel > 7 ) {
           throw new IOException("ADC channel must be between 0 and 7");
       }
       initReadState();
       initChannelSelect(channel);
       return getValueFromSelectedChannel();
   }
   private int getValueFromSelectedChannel() throws IOException {
       int value = 0x0;
       for( int i = 0; i < 12; i++ ) {
           toggleClock();
           value <<= 0x1;
           if( mMisoPin.getValue() ) {
               value |= 0x1;
           }
       }
       mCsPin.setValue(true);
       value >>= 0x1; // first bit is 'null', so drop it
       return value;
   }
   private void initReadState() throws IOException {
       mCsPin.setValue(true);
       mClockPin.setValue(false);
       mCsPin.setValue(false);
   }
   private void initChannelSelect(int channel) throws IOException {
       int commandout = channel;
       commandout |= 0x18; // start bit + single-ended bit
       commandout <<= 0x3; // we only need to send 5 bits
       for( int i = 0; i < 5; i++ ) {
           if ( ( commandout & 0x80 ) != 0x0 ) {
               mMosiPin.setValue(true);
           } else {
               mMosiPin.setValue(false);
           }
           commandout <<= 0x1;
           toggleClock();
       }
   }
   private void toggleClock() throws IOException {
       mClockPin.setValue(true);
       mClockPin.setValue(false);
   }
   public void unregister() {
       if( mCsPin != null ) {
           try {
               mCsPin.close();
           } catch( IOException ignore ) {
               // do nothing
           }
       }
       if( mClockPin != null ) {
           try {
               mClockPin.close();
           } catch( IOException ignore ) {
               // do nothing
           }
       }
       if( mMisoPin != null ) {
           try {
               mMisoPin.close();
           } catch( IOException ignore ) {
               // do nothing
           }
       }
       if( mMosiPin != null ) {
           try {
               mMosiPin.close();
           } catch( IOException ignore ) {
               // do nothing
           }
       }
   }
}

不支持的硬件

不幸的是,DHT11 濕度傳感器使用以納秒為間隔觸發的信號協議,但 Android 平臺僅支持低至毫秒。因此,Android Things 無法直接支持 DHT11。但是,有一種解決方法。使用帶有 Arduino 的 ATMega328p,我能夠將信息從 DHT11 讀取到 Arduino 芯片,并使用 I2C 將該信息發送到 Android Things 設備。

?
pYYBAGNY5p2AKUg3AAA9Zo7Lgiw391.png
?

您可以通過在 Android 中打開與該地址的連接來使用自定義地址讀取 I2C

PeripheralManagerService service = new PeripheralManagerService();
mHumidity = service.openI2cDevice(BoardDefaults.getHumidityI2cBus(), 0x08);

在上面的示例中,我們使用的自定義地址是8 。在 ATMega328p 上運行的 Arduino 代碼中,您可以將該地址與 Wire 庫一起使用。

#import 
#include 
 
dht11 DHT11;
 
#define DHT11PIN 13
 
uint8_t humidity;
 
void setup() {
 Wire.begin(8);                // join i2c bus with address #8
 Wire.onRequest(requestEvent); // register event
}
 
void loop() {
 int chk = DHT11.read(DHT11PIN);
 humidity = DHT11.humidity;
 delay(1000);
}
 
void requestEvent() {
 Wire.write(humidity);
}

預先編寫的驅動程序

雖然添加對數字 I/O 的支持很容易,但還有一件事更容易:使用已經編寫的代碼。對于 BMP280,我能夠從 Google 的官方驅動程序庫中引入一個預先編寫的驅動程序,讓我無需太多工作或時間就可以從該環境傳感器讀取信息。您可以在此處找到 Google 預先編寫的示例,因為其中有一些可能對您使用 Android Things 組合在一起的任何項目有用。這些驅動程序很容易進入您的項目,就像將它們添加到您的 gradle 依賴項中一樣

dependencies {
   compile 'com.google.android.things.contrib:driver-bmx280:0.2'
   provided 'com.google.android.things:androidthings:0.4-devpreview'
}

對于這個項目,我還使用 GPS 驅動程序將位置數據添加到 Firebase,盡管您可以從您使用的任何網絡連接中檢索該數據。

網絡連接

在當前狀態下,野生動物探測器只是使用無線網絡連接互聯網。雖然這不是最實用的,特別是考慮到它很可能在沒有現成的無線連接的區域使用,但可以輕松修改它以支持蜂窩連接或任何其他更合適的連接。

相機

這里的相機有點棘手。目前 Android Things 不完全支持 USB 攝像頭,但您可以將它們視為 UART 設備。如果您不想為您的相機編寫驅動程序,您也可以使用藍牙相機,因為 Android Things 確實支持藍牙連接。如果您將 Raspberry Pi 與 Android Things 一起使用,則可以使用標準的帶狀電纜攝像頭,使用 Android 的攝像頭 API,無需太多麻煩。

更多細節

雖然這個項目有很多事情要做,但可以在附加的源項目中找到更多詳細信息。如上所述,一旦您生成了 TensorFlow 圖,您應該能夠下載源代碼并將圖文件替換為您嘗試檢測的任何內容。對于 Firebase 支持,您還需要創建自己的免費Firebase 項目并將憑據復制到項目中。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數據手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 中文字幕在线不卡日本v二区 | 无码国产欧美日韩精品 | 亚洲a视频在线观看 | 黑粗硬大欧美在线视频 | 欧美XXXX69学生HD | 青青热久精品国产亚洲AV无码 | 超碰 无码 中文字幕 | 欧美大香线蕉线伊人久久 | 国产精品爽爽久久久久久蜜桃 | 姉调无修版ova国语版 | 娇妻玩4P被三个男人伺候电影 | 麻豆三级电影 | 久久亚洲AV无码精品午色夜麻豆 | 无人区日本电影在线观看 | 最近中文字幕完整版高清 | md2.pud 麻豆传媒官网 | 中文字幕亚洲乱码熟女在线萌芽 | 免费看a毛片 | 免费看黄色一级 | 99久久久久国产精品免费 | 精品久久中文字幕有码 | 好男人社区 | 爱情岛aqdlttv | 亚洲高清毛片一区二区 | 国产成人欧美日韩在线电影 | 99精品成人无码A片观看金桔 | 久久青草热热在线精品 | 国产精品日韩欧美一区二区三区 | 456亚洲人成在线播放网站 | 姉调无修版ova国语版 | 久久这里只精品热在线18 | 国产成人拍精品免费视频爱情岛 | 18禁在线无遮挡羞羞漫画 | 内射气质御姐视频在线播放 | 国产精品麻豆高潮刺激A片 国产精品麻豆a在线播放 | 99精品中文字幕在线观看 | 孕妇泬出白浆18P | 日本XXXXZZX片免费观看 | 深喉吞精日本 | 日韩AV成人无码久久精品老人 | 99精品久久 |